2015/9/19 Python基础(14):变量作用域及生成器

变量作用域
标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性。也就是,我们可以在程序的那个部分去访问一个制定的标识符。
全局变量与局部变量
定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。
全局变量的一个特征是除非被删除掉,否则它们将存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的,然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。在那一刻,一个新的局部变量名为那个对象创建了,一旦函数完成,框架被释放,变量会离开作用域。

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
时间: 2024-10-24 16:46:56

2015/9/19 Python基础(14):变量作用域及生成器的相关文章

2015/9/19 Python基础(15):变量作用域及生成器

变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域.全局变量的一个特征是除非被删除掉,否则它们将存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的,然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动.当一个函数调用出现时,其局部变量就进入声明它们的作用域.在那一刻,一个新的

2015/9/18 Python基础(14):函数式编程

这篇写了忘发.现在补上. Python不是也不大可能成为一种函数式的编程语言,但是它支持许多有价值的函数式编程语言构建.也有些表现的像函数式编程机制但是从传统上也不能认为是函数式编程语言的构建.Python提供的以四中内建函数和lambda表达式的形式出现. 匿名函数与lambda lambda [arg1, [arg2, ... argN]]:expression Python允许用lambda关键字创造匿名函数.匿名是因为不需要以标准的方式来声明.然而,作为函数,它们也能有参数.一个完整的l

2015/9/15 Python基础(12):模块和包

模块是用来组织 Python 代码的方法,而包则是用来组织模块的. 当代码量很大时,我们一般会把代码分成几个有组织的代码段,然后每个代码段之间有一定的联系.代码单之间是共享的,所以Python允许调入一个模块,允许使用其他模块的属性利用之前的工作成果,实现代码重用.那些自我包含并且有组织的代码片段就是模块(module),将其他模块中属性附加到你的模块中的操作较导入(import) 模块是逻辑上的说法,而它们在物理层是一个个独立的文件,模块的文件名就是模块的名字加拓展名.py.与其他可以导入类的

python基础(变量,常量,python变量内存管理,变量的三个特征,花式赋值,注释 )

python基础 变量 定义:变量用来描述世间万物变化的状态 组成: 变量名:接收变量值 赋值符号:把变量值赋值给变量名 变量值:就是一个数值 注意: 变量名由数字/字母/下划线组成,不能以数字开头 变量名不能以下关键字命名 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global',

2015/8/29 Python基础(3):数值

数字提供了标量储存和直接访问,是不可更改类型,每次变更数值会产生新的对象.Python支持多种数字类型,包括整型.长整型.布尔型.双精度浮点.十进制浮点和复数.在Python中,变量并不是一个盒子,而是一个指针指向装变量值的盒子.对于不可更改类型来说,没办法改变盒子的内容,但是可以指向一个新的盒子.我们没办法删除一个数值对象,仅可以不再使用它.内存管理是由Python自己接管的.可以使用del语句来删除引用,但那样的话,这个引用(也就是变量)就不能使用了,除非给它一个新值 >>> ani

python基础3 - 变量的基本使用和命名

4.变量的基本使用 4.1 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值 = 左边是变量名 = 右边是存储在变量中的值 变量名 = 值 变量定义之后,后续就可以直接使用了 4.2 变量的类型 在内存中创建一个变量,会包括: 名称.保存的数据.存储数据的类型.地址(标示) 在 Python 中定义变量是 不需要指定类型(在其他很多高级语言中都需要) 数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型

Python基础之变量和变量实现的简单乘法运算

上篇我们知道了关于python的一个hello world的简单程序代码,现在我们来了解关于python里面的变量,我们来了解下,变量是什么? 变量:变量是为了存储程序运算过程中的一些中间结果,为了方便之后的调用,同一变量可以重新赋值. 变量的特点:具有描述性的标记,存储在内存里. 我们来看个列子,简单了解变量乘法运算: x = 3 y = 9 z = x * y print("3*9=",z) print("z=",z) 如图所示:左代码,右交互器输出结果. 我们

python基础_变量

变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值= 左边是一个变量名= 右边是存储在变量中的值 变量名 = 值 变量定义之后,后续就可以直接使用了 1) 变量演练1 -- iPython # 定义 qq_number 的变量用来保存 qq 号码 In [1]: qq_number = "1234567"

python基础_变量进阶

变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本