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中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
回调函数的意义以及python实现实例
Jun 20 Python
python绘制双柱形图代码实例
Dec 14 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
Python3爬虫全国地址信息
Jan 05 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
如何在python中执行另一个py文件
Apr 30 Python
django orm模块中的 is_delete用法
May 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
Protoss兵种对照表
2020/03/14 星际争霸
PHPEXCEL 使用小记
2013/01/06 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
PHP获取当前完整URL地址的函数
2014/12/21 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
深入讲解Python中的迭代器和生成器
2015/10/26 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
班级安全教育实施方案
2014/02/23 职场文书
公证委托书模板
2014/04/03 职场文书
文明班级建设方案
2014/05/15 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
2016年公司新年寄语
2015/08/17 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
python删除csv文件的行列
2021/04/06 Python