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抓取网页正文的源码
Jun 11 Python
python内存管理分析
Apr 08 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
python 回调函数和回调方法的实现分析
Mar 23 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
Python引用计数操作示例
Aug 23 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
Django中间件基础用法详解
Jul 18 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
Python读取和写入Excel数据
Apr 20 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通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
Python使用requests发送POST请求实例代码
2018/01/25 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
python入门教程之基本算术运算符
2020/11/13 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
安全事故检讨书
2014/01/18 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
保密工作整改报告
2014/11/06 职场文书
辞职信的写法
2015/02/27 职场文书
食品安全责任书范本
2015/05/09 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL