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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
Python中过滤字符串列表的方法
Dec 22 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 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+mysql查询优化简单实例
2015/01/13 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
用python与文件进行交互的方法
2018/03/01 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
python利用opencv实现颜色检测
2021/02/23 Python
企业安全生产承诺书
2014/05/22 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
单身证明格式样本
2015/06/15 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Python绘画好看的星空图
2022/03/17 Python