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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
Python实现豆瓣图片下载的方法
May 25 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python内建模块struct实例详解
Feb 02 Python
代码分析Python地图坐标转换
Feb 08 Python
在CMD命令行中运行python脚本的方法
May 12 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
python not运算符的实例用法
Jun 30 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
星际玩家的三大定律
2020/03/04 星际争霸
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
this和执行上下文实现代码
2010/07/01 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
优秀大学生的自我评价
2014/01/16 职场文书
军训教官感言
2014/03/02 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
毕业典礼邀请函
2015/01/31 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python