测开不得不会的python之函数介绍 学习目录函数的定义这个函数里面, 它的那个参数是固定长度的意思啊, 也就是说了,它有几个参数那是非常明确的。这个函数进行了配置, 配置的内容就是包含不定长的那些参数。在函数的参数部分采用符号*来进行分割操作。函数在传递参数的这个过程里面, 它到底是用的是值传递呢, 还是用的引用传递?函数变量的作用域函数是这样的一组代码段, 这组代码段是可以被重复使用来发挥作用的。函数能够提升代码的重复利用率, 同时简化那些复杂的功能。在之前的几篇文章里面, 我们已经学习了很多内建函数的知识, 例如print()/id()/int()/open()/type()等这些例子, 除此之外, 我们同样也可以自定义函数。函数的定义def 函数名称参数函数体return 返回值 oryield 返回值那位女学生站在书架上面, 脚下踩着书, 就像踩在台阶上一样。这个函数里面, 它的那个参数是固定长度的意思啊, 也就是说了, 它有几个参数那是非常明确的。#函数带一个参数def sum_num(numlist):print(f值汇总结果{sum(numlist)})#不传参数 执行函数会报错sum_num()#报错如下Traceback (most recent call last):File /est.py, line 6, insum_num()TypeError: sum_num() missing 1 required positional argument: numlistsum_num(1,2)#报错如下Traceback (most recent call last):File /test.py, line 5, insum_num(1,2)TypeError: sum_num() takes 1 positional argument but 2 were given#函数有两个参数a和bdef division_twonum(a,b):print(fa/b{a/b})#执行以下函数 传参0和5 执行passdivision_twonum(0,5)#如果a和b搞错了顺序会报错division_twonum(5,0)报错如下分母不能为0Traceback (most recent call last):File /test.py, line 13, indivision_twonum(5,0)File /test.py, line 10, in division_twonumprint(fa/b{a/b})ZeroDivisionError: division by zero拿上面那个例子来说, 去执行下面写的那个函数的时候, 得到的结果全都是一样的。因为这个函数压根儿就不去在乎变量a和变量b它们各自所处的位置是怎么样子的。division_twonum(a0,b5)division_twonum(b5,a0)def division_twonum(a,b2):print(fa/b{a/b})#参数b不传递 使用默认值division_twonum(5)打印结果a/b2.5这个函数呢, 它会接受一个不确定数量的那些参数。def sum_num(*nums):print(fnums {nums}, type(nums)为{type(nums)})print(f值汇总结果{sum(nums)})#传入1到5 数字 执行函数sum_num(1,2,3,4,5)结果如下nums (1, 2, 3, 4, 5), type(nums)为值汇总结果15def sum_num(**nums):print(fnums {nums}, type(nums)为{type(nums)})print(f值汇总结果{sum(nums.values())})#传入keyvalue的关键字参数 执行函数sum_num(a1,b2,c3)结果如下nums {a: 1, b: 2, c: 3}, type(nums)为值汇总结果6def sum_num(*nums,**keys):print(fnums {nums}, type(nums)为{type(nums)})print(fkeys {keys}, type(keys)为{type(keys)})#传入keyvalue的关键字参数 执行函数sum_num(1,2,3,4,5,a1,b2,c3)#结果nums (1, 2, 3, 4, 5), type(nums)为keys {a: 1, b: 2, c: 3}, type(keys)为在函数的参数部分采用符号*来进行分割操作。在函数参数使用的地方, 用星号进行分割, 那么表示的是, 在星号前面的那些参数是位置参数, 而剩下的、也就是在星号后面的那些参数, 则是关键字参数。#举例 定义函数 有a,b,c,d4个参数*位于中间def printnum(a,b,*,c,d):print(fa,b {a} {b})print(fc,d {c} {d})把参数传进去, 然后执行:printnum(1,2,c3,d4)#结果a,b 1 2c,d 3 4printnum(1,2,d4,c3)#结果 跟上面结果一样a,b 1 2c,d 3 4要是把这些参数传进去让程序去执行的话, 那么它就会报错。printnum(1,2,3,4)#结果Traceback (most recent call last):File /test.py, line 25, inprintnum(1,2,3,4)TypeError: printnum() takes 2 positional arguments but 4 were given函数在传递参数的这个过程里面, 它到底是用的是值传递呢, 还是用的引用传递?既不是按照值来进行传递, 也不是通过引用这种方式去进行传递, 其实在调用的时候, 函数所接收到的是由那个参数直接指向着的对象。我们以参数作为列表以及字符串这两个示例来进行说明。因为列表属于可变的数据类型, 而字符串又属于不可变的数据类型, 所以情况有所不同。listA [1,4,3,2]#打印列表的指向的对象的唯一内存地址print(flistA内存地址{id(listA)})#定义一个函数 设置的形参需要传递一个列表def sum_num(numlist):#打印函数的参数传递后对应的内存地址print(fnumlist内存地址{id(numlist)})#对列表修改操作numlist.append(5)#打印修改后的列表print(fnumlist{numlist})#将列表listA传递给函数并执行函数sum_num(listA)#函数执行后打印列表listAprint(flistA{listA})这个函数被运行之后, 它给出的结果就是:listA内存地址4504899072numlist内存地址4504899072numlist[1, 4, 3, 2, 5]listA[1, 4, 3, 2, 5]结果展示出来, 就是函数外部定义的那个列表, 还有在函数内部传递过去作为参数的那个变量, 他们所对应的内存地址实际上是同一个东西, 所以当在函数的里面去对这些参数进行修改的时候, 由于列表是可变类型, 也就是说它本身就支持被修改的这种特性, 其实所做的修改动作并不是针对新的副本, 而是直接在他们共同指向的那个对象上面进行的, 因此最终当把值打印出来的时候, 会观察到两个列表的具体内容是完全一样的。#定义一个字符串strA hello pythonprint(fstrA内存地址{id(strA)})def printstr(str_a):print(fstr_a内存地址{id(str_a)})#修改字符串str_a .print(fstr_a{str_a})print(fstr_a 内存地址{id(str_a)})#执行函数printstr(strA)#打印原变量信息print(fstrA{strA})print(fstrA 内存地址{id(strA)})函数执行结果如下strA内存地址4504812144str_a内存地址4504812144str_ahello python.str_a 内存地址4504903536strAhello pythonstrA 内存地址4504812144结果显示, 函数外定义的字符串和函数内传递的参数对应的内存地址, 是同一个。当在函数内部对参数进行修改的时候, 因为字符串是不可变的, 所以它不支持修改操作。于是乎, 函数内被修改之后的参数, 它就指向了另一个内存地址, 而函数外定义的字符串, 依旧是指向原来的那个对象。函数变量的作用域在函数外面去定义的变量, 因为被当作了全局变量来处理, 所以可以在函数内部去使用它。在函数内部所定义的变量, 只能在当前的这个函数里面去进行使用, 如果是在函数体外面的位置去引用它的话, 系统是会抛出错误信息的, 但是呢, 通过将其声明成为一个全局变量的方式, 就可以使得这个变量在函数的外面也被成功引用。def printstr():global str_bstr_b hello pythonprint(f函数内全局变量str_b{str_b})#执行函数printstr()print(f函数外部使用str_b: {str_b})结果如下函数内全局变量str_bhello python函数外部使用str_b: hello python咱们互相勉励一下, 这话说的是东汉时期班固在《汉书·枚乘传》里面记录的, 原文是“泰山之管穿石, 单极之绠断干。水非石之钻, 索非木之锯, 渐靡使之然也。”。就是指水滴一直不停地往下滴, 最后都能把石头给滴穿。这个比喻是用来说明坚持不懈这个道理, 它表达的意思是, 只要能够集合那些非常细微的力量, 也是完全可以成就那些难得获得的功劳的。感谢读者来进行阅读这个活动, 同时也感谢大家能够认真学习这些内容, 非常感谢每一位读者, 谢谢谢谢大家。