2015/9/19 Python基础(15):变量作用域及生成器
变量作用域
标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性。也就是,我们可以在程序的那个部分去访问一个制定的标识符。
全局变量与局部变量
定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。
全局变量的一个特征是除非被删除掉,否则它们将存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的,然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。在那一刻,一个新的局部变量名为那个对象创建了,一旦函数完成,框架被释放,变量会离开作用域。
global 语句
如果将全局变量的名字声明在一个函数体内的时候,全局变量的名字能被局部变量覆盖掉。为了明确地引用一个已命名得全局变量,必须使用global语句,语法如下:
global var1[, var2...varN]
闭包
在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).定义在外部函数内的但由内部函数引起或者使用的变量称为自由变量。closure在函数式编程中是一个重要的概念, Scheme和Haskell便是函数式编程中两种。
闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。
下面举一个简单的例子:
>>> def addup(number):
def addup_in(number_in):
print number_in
return number+number_in
return addup_in >>> add = addup(5) #这个值传给了number
>>> add(1) #这个值传给了number_in
1
6
>>> add(5) #这个值传给了number_in
5
10
作用域与lambda
Python的lambda匿名函数遵循和标准函数一样的作用域规则。一个lambda表达式定义了新的作用域,就像函数定义,所以这个作用域除了局部lambda函数,对于程序其他部分,该作用域都是不能进行访问的。
生成器
生成器源于迭代器,迭代器的作用是调用获得下个元素的next(),如果我们想要迭代中以某种方式生成下一个值并返回next()调用。这就是开发出生成器的动机之一。
生成器是一个带yield语句的函数。一个函数或者子程序只返回一次,但一个生成器能暂停执行并返回一个中间结果——那就是yield语句的作用。当生成器的next()方法被调用是,它会准确地从离开的地方继续。
简单的生成器特性
与迭代器相似,生成器以另外的方式运作:当到达一个真正返回或者函数结束没有更多的值返回(当调用next()),一个StopIteration异常就会抛出。
下面是一个简单的生成器例子:
>>> def simpleGen():
yield 1
yield '2 --> punch!' >>> myG = simpleGen()
>>> myG.next()
1
>>> myG.next()
'2 --> punch!'
>>> myG.next() Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
myG.next()
StopIteration
由于for循环有next()调用和对StopIteration的处理,可以用for循环迭代穿过一个生成器。
>>> for eachItem in simpleGen():
print eachItem 1
2 --> punch!
加强的生成器特性
除了用next()来获得下个生成的值,用户可以将值送回生成器[send()],在生成器中抛出异常,以及要求退出[close()]
由于双向的动作涉及到叫做 send()的代码来向生成器发送值(以及生成器返回的值发送回来),现在yield语句必须是一个表达式,因为当回答生成器中继续执行的时候,你或许正在接收一个进入的对象。下面是一个展示着写特性的简单例子,这是个简单的闭包例子:
>>> def counter(start_at=0):
count = start_at
while True:
val = (yield count)
if val is not None:
count = val
else:
count += 1 >>> count = counter(5)
>>> count.next()
5
>>> count.next()
6
>>> count.send(9)
9
>>> count.next()
10
>>> count.close()
>>> count.next() Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
count.next()
StopIteration
2015/9/19 Python基础(15):变量作用域及生成器的更多相关文章
- Python基础之变量作用域
一.分类: 二.变量名的查找规则: 三.局部变量: 四.全局变量: 五.global语句: 六.nonlocal语句: 七.基础代码: # 全局变量:当前.py文件内部都可访问 g01 = 100 d ...
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- python 函数及变量作用域及装饰器decorator @详解
一.函数及变量的作用 在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- (转)python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- 19.python基础试题(三)
转载: 老男孩 Python 基础知识练习(三):https://www.cnblogs.com/nulige/p/6128674.html 1.列举布尔值为 False 的值空,None,0, Fa ...
- Python中的变量作用域
python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...
- Python 再谈变量作用域与变量引用
再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...
随机推荐
- Python高级编程-itertoos模块
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先我们看看itertools模块提供的几个“无限”迭代器, import itertools naturals = ...
- 20170413B端业务访问故障排查思路
现象: 1.全国用户电视端页面无法显示,刷不出版面. 2.后端服务无法打开,报错,504,502 显示服务器端业务故障超时. 3.其他业务也出现缓慢情况,并不严重. 排查: 1.系统服务排查,常规 ...
- 如何在Python 2.X中也达到类似nonlocal关键字的效果
nonlocal关键字时Python 3.X中引入的,目的是让内层函数可以修改外层函数的变量值,而该关键字在Python 2.X中是不存在的.那么,要在Python 2.X中达到类型达到类似nonlo ...
- (beta冲刺5/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进后端完成安卓端接口的开发 在测试中发现返回地图接口存在错误(待修复) 推进 ...
- ACM 第五天
匈牙利算法(二分图匹配) C - Courses Consider a group of N students and P courses. Each student visits zero, one ...
- Zigbee安全基础篇Part.3
原文地址: https://www.4hou.com/wireless/14294.html 导语:在之前的文章中提供了ZigBee协议及其安全功能的简要概述.在本文中,我们将探讨可在ZigBee网络 ...
- 3ds Max学习日记(五)
把实验室要用的小工具做了出来后,忙里偷闲,把第四章没看完的视频看完了.修改器(modifier)什么的还是挺好玩的. FFD,车削,倒角,倒角剖面,对称,挤出,晶格,扭曲,融化,弯曲,网格平滑 ...
- phpcms 模型
- str.substring(beginIndex,endIndex)-008
// 将字符串str前n位放在后面,返回新的字符串 public String headToTail(String str,int n){ if(n==0){ System.out.println(s ...
- Java基础之开关语句详解
switch 语句是单条件多分支的开关语句,它的一般格式定义如下(其中break语句是可选的): switch(表达式) { case 常量值: 若干个语句 break; case 常量值: 若干个 ...