Python函数学习笔记

时间:2022-10-29 03:51:07 

局部名字静态检测
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,函数,学习笔记
0
投稿

猜你喜欢

  • MySQL5.6基本优化配置

    2024-01-26 07:31:15
  • SQL Server 2008网络协议深入理解

    2024-01-17 02:42:34
  • Python实现截屏的函数

    2023-05-19 11:16:06
  • 深底色页面设计指南[译]

    2009-08-06 18:16:00
  • 使用Jupyter notebooks上传文件夹或大量数据到服务器

    2023-02-26 11:49:16
  • ASP小偷(远程数据获取)程序的入门教程

    2007-09-21 12:48:00
  • BluePrint CSS框架0.9版发布

    2009-06-03 21:02:00
  • Python中hash加密简介及使用方法

    2022-08-16 01:06:06
  • 画pytorch模型图,以及参数计算的方法

    2023-09-25 09:12:58
  • Python读写Excel文件的实例

    2023-03-05 03:25:10
  • 扩展数据库系统选项实现更高的可扩展性

    2009-01-06 11:14:00
  • 在vant中如何使用dialog弹窗

    2024-05-22 10:41:50
  • 标签水平右对齐更适合中文网站

    2009-05-01 11:54:00
  • Yii2框架实现登陆添加验证码功能示例

    2023-11-21 11:36:32
  • 正确使用字体和颜色 让网页内容更易阅读

    2007-09-13 18:45:00
  • python 正则表达式参数替换实例详解

    2022-08-11 18:21:44
  • Python Tornado批量上传图片并显示功能

    2023-08-07 22:33:21
  • Javascript中作用域的详细介绍

    2024-04-18 10:02:09
  • SQL SERVER 建立索引

    2010-07-02 21:01:00
  • 简单代码屏蔽超级链接虚线框

    2008-02-03 11:34:00
  • asp之家 网络编程 m.aspxhome.com