干货丨四年python开发在自定义函数中应用参数传递的心得

对于Python中的参数 , 可以有如下三种:
位置和关键字参数任意数量的位置参数任意数量的关键字参数 。 【干货丨四年python开发在自定义函数中应用参数传递的心得】我们知道对于Python中的名字的解析被称为LGB规则 , 有以下三点1.当在函数中使用一个无限制的名字时 , Python依次查找三个作用域:
局部(Local)全局(Global)内置(Built-in)在第一个发现名字的位置停止 。
2.在函数中赋值一个名字时 , Python总在局部作用域中生成或者改变它 , 除非在函数中对它进行了global的声明 。
3.在函数外部时 , 局部作用域与全局作用域等效 , 都是同一个模块的名字空间 。 这里主要讨论一下在自定义函数中应用参数传递的实现 , 代码如下:
x=1list=[1,2]deffunc(x,y):x=2y[0]='A'func(x,list)print('调用函数后传入的参数变化为:',x,list))调用函数后传入的参数变化为:1['A',2]Processfinishedwithexitcode0unc()对x和被y引用的对象中的组件赋值 ,
x是函数作用域中的局部名字
第1个赋值对调用者没有影响 ,
数y也是个局部的名字
但传递了y[0] , 这是一个可变的对象 , 最后就把list中的第一个位置换掉了!那我们思考一下 , 我还想换掉x=1 , 既利用模块中的x=2 , 该如何操作 。
如果是如下代码块 , 就会报错:
x=1list=[1,2]deffunc(x):globalxx=2func()print('调用函数后传入的参数变化为:',x)globalxSyntaxError:name'x'isparameterandglobalProcessfinishedwithexitcode1我们看到了报错 。 语法错误:x既是参数又是全局变量 。 这样是不对的 , x是不能既做变量又做参数的 。 那么我们换一种方式 , 看看是否可以 。 代码如下:
x=1list=[1,2]deffunc():globalxx=2y[0]='A'func(x,list)print('调用函数后传入的参数变化为:',x)func(x,list)TypeError:func()takes0positionalargumentsbut2weregivenProcessfinishedwithexitcode1好的 , 又出错了 。
对类型的无效操作:
func()可以接收的位置参数是0个 , 但却接收到了2个参数(x,list) 。 这样也是不对的 , 因为我们在deffunc()时候 , func()中并没有位置参数 , 而我们在调用func()时 , 却代入了x,list两个参数 , 就会报错 。
综上所述:fun(x)里有参数x时 , 后面模块内就不可以跟globalx(全局变量) , 但是func()里无参数x时 , 后面可以跟globalx , 把x定义成全局变量 , 但是呢又有个问题 , 就是后面调用函数func()时 , 不能写成func(x) , 否则又会报错TypeError , 是由于前面是func() , 故可接受参数为0
那么该如何操作 , 到达我们想一样换掉x=1 , 使得x=2呢?这里我运用了两个deffunc 。 代码如下:
x=1list=[1,2]deffunc1():globalxx=2func1()deffunc2(y):y[0]='A'func2(list)print('调用函数参数的结果:',x,list)调用函数参数的结果:2['A',2]Processfinishedwithexitcode0最后多说一句 , 这里有我自己整理了一套最新的python系统学习教程 , 包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等 。 想要这些资料的可以关注小编 , 并在后台私信小编:“01”即可领取 。


    推荐阅读