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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
对django中foreignkey的简单使用详解
Jul 28 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 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.ini中date.timezone设置分析
2011/07/29 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
Open and Print a Word Document
2007/06/15 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
Js获取事件对象代码
2010/08/05 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python程序设计入门(4)模块和包
2014/06/16 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python实现烟花小程序
2019/01/30 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
浅析Python中字符串的intern机制
2020/10/03 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
MYSQL支持事务吗
2013/08/09 面试题
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
MySQL常见优化方案汇总
2022/01/18 MySQL