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中文编码问题小结
Sep 28 Python
Django中使用locals()函数的技巧
Jul 16 Python
python使用tkinter实现简单计算器
Jan 30 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
django 修改server端口号的方法
May 14 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
keras导入weights方式
Jun 12 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
python执行js代码的方法
May 13 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
mysq GBKl乱码
2006/11/28 PHP
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
社区平安建设方案
2014/05/25 职场文书
预防煤气中毒方案
2014/06/16 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
赞助商致辞
2015/07/30 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
JavaScript 数组去重详解
2021/09/15 Javascript