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类方法__init__和__del__构造、析构过程分析
Mar 06 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
pytorch使用Variable实现线性回归
May 21 Python
pow在python中的含义及用法
Jul 11 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
分享PyCharm的几个使用技巧
Nov 10 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 Python
关于python中readlines函数的参数hint的相关知识总结
Jun 24 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与C#的值类型指向区别的详解
2013/05/21 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
Keras搭建自编码器操作
2020/07/03 Python
升职自荐信
2013/11/28 职场文书
十佳教师事迹材料
2014/01/11 职场文书
消防安全管理制度
2014/02/01 职场文书
元旦晚会策划方案
2014/02/18 职场文书
四群教育工作实施方案
2014/03/26 职场文书
高中生评语大全
2014/04/25 职场文书
汽车专业求职信
2014/06/05 职场文书
经营目标管理责任书
2014/07/25 职场文书
消防志愿者活动方案
2014/08/23 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
不同意离婚上诉状
2015/05/23 职场文书
运动会加油稿50字
2015/07/21 职场文书
如何写好开幕词?
2019/06/24 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python