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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
Python显示进度条的方法
Sep 20 Python
在Python中处理时间之clock()方法的使用
May 22 Python
Python实现二维有序数组查找的方法
Apr 27 Python
python操作mysql数据库
Mar 05 Python
Python下载网络小说实例代码
Feb 03 Python
python unittest实现api自动化测试
Apr 04 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
python实现人机猜拳小游戏
Feb 03 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
windows xp下安装pear
2006/12/02 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python对列表的操作知识点详解
2019/08/20 Python
python基于opencv检测程序运行效率
2019/12/28 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
什么是serialVersionUID
2016/03/04 面试题
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
销售部主管岗位职责
2013/12/18 职场文书
中秋晚会活动方案
2014/08/31 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
办公用品管理制度
2015/08/04 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
python之基数排序的实现
2021/07/26 Python
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript