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来编写HTTP服务器的超级指南
Feb 18 Python
Python中常用信号signal类型实例
Jan 25 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
matplotlib给子图添加图例的方法
Aug 03 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Django框架实现的普通登录案例【使用POST方法】
May 15 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
python分别打包出32位和64位应用程序
Feb 18 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
python内置模块之上下文管理contextlib
Jun 14 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读取3389的脚本
2014/05/06 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
php实现记事本案例
2020/10/20 PHP
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
PyQt5实现拖放功能
2018/04/25 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python tkinter窗口最大化的实现
2019/07/15 Python
python list多级排序知识点总结
2019/10/23 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL