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中的一些类型转换函数小结
Feb 10 Python
python基础教程之python消息摘要算法使用示例
Feb 10 Python
常用python编程模板汇总
Feb 12 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
详解Python中的文件操作
Aug 28 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Python设计模式之策略模式实例详解
Jan 21 Python
Python中的集合介绍
Jan 28 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python元组的概念知识点
Nov 19 Python
python调用摄像头的示例代码
Sep 28 Python
SpringBoot首页设置解析(推荐)
Feb 11 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实现的登录,注册及密码修改功能分析
2016/11/25 PHP
php微信公众号开发模式详解
2016/11/28 PHP
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Python通过正则表达式选取callback的方法
2015/07/18 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
Python中bisect的使用方法
2019/12/31 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
使用Python构造hive insert语句说明
2020/06/06 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
编辑找工作求职信范文
2013/12/16 职场文书
青年文明号事迹材料
2014/01/18 职场文书
学生自我评语大全
2014/04/18 职场文书
无工作证明怎么写
2015/06/15 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
python flask框架快速入门
2021/05/14 Python
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
Go语言特点及基本数据类型使用详解
2022/03/21 Golang