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中的变量及其命名和打印
Mar 11 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
Tensorflow 实现修改张量特定元素的值方法
Jul 30 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
python tornado修改log输出方式
Nov 18 Python
使用python实现画AR模型时序图
Nov 20 Python
python psutil监控进程实例
Dec 17 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
php 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
php日期操作技巧小结
2016/06/25 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
基层工作经历证明
2014/01/13 职场文书
学校介绍信范文
2014/01/14 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
高中生军训感言
2015/08/01 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Python数据分析之绘图和可视化详解
2021/06/02 Python
Python字典和列表性能之间的比较
2021/06/07 Python
golang中的struct操作
2021/11/11 Golang