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 bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
Python配置mysql的教程(推荐)
Oct 13 Python
import的本质解析
Oct 30 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
python实现贪吃蛇小游戏
Mar 21 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Django model class Meta原理解析
Nov 14 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+DBM的同学录程序(5)
2006/10/09 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
Python中的super()方法使用简介
2015/08/14 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python3匿名函数用法示例
2018/07/25 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python小程序实现刷票功能详解
2019/07/17 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python Zmail模块简介与使用示例
2020/12/19 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
应届毕业生求职信范例分享
2013/12/17 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
工作所在部门证明
2014/09/21 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
《假如》教学反思
2016/02/17 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS