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 快速排序代码
Nov 23 Python
python基于windows平台锁定键盘输入的方法
Mar 05 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
python框架django基础指南
Sep 08 Python
python实现textrank关键词提取
Jun 22 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
python matplotlib包图像配色方案分享
Mar 14 Python
通过实例简单了解python yield使用方法
Aug 06 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 魔术方法使用说明
2009/10/20 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php mail to 配置详解
2014/01/16 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
深入分析js中的constructor和prototype
2012/04/07 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
浅谈js中的this问题
2017/08/31 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
如何写毕业求职自荐信
2013/11/06 职场文书
求职信格式范本
2013/11/15 职场文书
财务人员个人求职信范文
2013/12/04 职场文书
事务机电主管工作职责
2014/02/25 职场文书
五好家庭事迹材料
2014/12/20 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书