Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

您现在的位置:首页 > 技术文档 > python入门

Python函数学习笔记

来源:中文源码网    浏览:122 次    日期:2024-05-16 05:58:16
【下载文档:  Python函数学习笔记.txt 】


Python函数学习笔记
局部名字静态检测 Python探测局部作用域的时候:是在python编译代码时检测,而不是通过他们在运行时的赋值。 正常的情况下,没在函数中复制的名字将在包含它的模块中查找: >>> x=99 >>> def selector(): ... print x ... >>> selector() 99 但是: >>> def selector(): ... print x ... x=100 ... >>> selector() Traceback (most recent call last): File "", line 1, in ? File "", line 2, in selector UnboundLocalError: local variable 'x' referenced before assignment 会得到未定义名字的错误。 当 交互式输入或从一个模块中导入时,python读取并编译这段代码,当编译时python查看x的赋值,并决定在函数中任何地方x都将是个局部名字。到后 来函数真的运行,print执行时,赋值还没有发生,python会说你正在使用一个未定义的名字。根据他的名字规则,应该是局部的x在赋值前被使用了。 解决办法: 如果你想打印全局x,你应该在global语句中声明:(这意味着该赋值也改变全局x,而不是局部x) >>> def selector(): ... global x ... print x ... x=88 ... >>> selector() 99 如果你想打印出全局赋值,在设定一个局部的,导入包含它的模块并用限定得到这个全局的版本: >>> x=99 >>> def selector(): ... import __main__ ... print __main__.x ... x=88 ... print x ... >>> selector() 99 88 限定(.x部分)从一个名字空间对象中得到一个值。交互环境的名字空间是一个叫做__main__的模块。 嵌套函数可以嵌套作用域(在新版本中和老版本中不同) >>> def outer(x): ... def inner(i): ... print i, ... if i: inner(i-1) ... inner(x) ... >>> outer(3) 3 2 1 0 使用默认值保存引用 >>> def outer(x): ... def inner(i,self=inner): ... print i, ... if i:self(i-1) ... inner(x) ... >>> outer(3) Traceback (most recent call last): File "", line 1, in ? File "", line 2, in outer UnboundLocalError: local variable 'inner' referenced before assignment 解决原则:最简单的方式总是最正确的方式 >>> def inner(i): ... print i, ... if i:inner(i-1) ... >>> def outer(x): ... inner(x) ... >>> outer(3) 3 2 1 0 默认的可变对象 >>> def saver(x=[]): ... x.append(1) ... print x ... >>> saver([2]) [2, 1] >>> saver() [1] >>> saver() [1, 1] >>> saver() [1, 1, 1] 问题是,这里只有一个列表对象――def执行时生成的一个。在每一次函数被调用时,你不会得到新的列表对象,而是原列表对象的增长。 解决办法:如果那不是你想要的行为,简单的移动默认值到函数体中。只要代码里的值在每一次函数运行时都执行,你每次将得到一个新的对象: >>> def saver(x=None): ... if x is None: ... x=[] ... x.append(1) ... print x ... >>> saver([2]) [2, 1] >>> saver() [1] >>> saver() [1] >>> saver() [1] 上 面的if语句几乎可以被赋值x=x or []代替,因为python的or将返回他的操作对象中的一个:如果没有参数被传递,x默认为None,所以or在右侧返回一个生成的空列表。但这不完全 一样,当传递的是空列表时,函数将扩展并返回一个新生成的列表,而不是向前面的版本那样扩展并返回一个被传递的列表(表达式变成[] or [],这将计算出新的列表)

相关内容