Python函数学习笔记


Posted in Python onOctober 07, 2008

局部名字静态检测
Python探测局部作用域的时候:是在python编译代码时检测,而不是通过他们在运行时的赋值。
正常的情况下,没在函数中复制的名字将在包含它的模块中查找:
>>> x=99
>>> def selector():
... print x
...
>>> selector()
99
但是:
>>> def selector():
... print x
... x=100
...
>>> selector()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", 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 "<stdin>", line 1, in ?
File "<stdin>", 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 [],这将计算出新的列表)

Python 相关文章推荐
Python版微信红包分配算法
May 04 Python
Python基于动态规划算法计算单词距离
Jul 25 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
python线程信号量semaphore使用解析
Nov 30 Python
python实现的分层随机抽样案例
Feb 25 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 Python
Python日期操作学习笔记
Oct 07 #Python
wxPython 入门教程
Oct 07 #Python
新手该如何学python怎么学好python?
Oct 07 #Python
Python 调用VC++的动态链接库(DLL)
Sep 06 #Python
Python urlopen 使用小示例
Sep 06 #Python
Python 网络编程起步(Socket发送消息)
Sep 06 #Python
Python  __getattr__与__setattr__使用方法
Sep 06 #Python
You might like
浅析php学习的路线图
2013/07/10 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
javascript的函数作用域
2014/11/12 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
python日志logging模块使用方法分析
2019/05/23 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
pyspark 随机森林的实现
2020/04/24 Python
详解python算法常用技巧与内置库
2020/10/17 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
大专自我鉴定范文
2013/10/01 职场文书
营销与策划专业毕业生求职信
2013/11/01 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
司机职责范本
2014/03/08 职场文书
医院院务公开实施方案
2014/05/03 职场文书
企业计划生育责任书
2015/05/09 职场文书
经费申请报告
2015/05/15 职场文书
远程教育学习心得体会
2016/01/23 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang