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

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):变量作用域及生成器的更多相关文章

  1. Python基础之变量作用域

    一.分类: 二.变量名的查找规则: 三.局部变量: 四.全局变量: 五.global语句: 六.nonlocal语句: 七.基础代码: # 全局变量:当前.py文件内部都可访问 g01 = 100 d ...

  2. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  3. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

  4. python 函数及变量作用域及装饰器decorator @详解

    一.函数及变量的作用   在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...

  5. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  6. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  7. 19.python基础试题(三)

    转载: 老男孩 Python 基础知识练习(三):https://www.cnblogs.com/nulige/p/6128674.html 1.列举布尔值为 False 的值空,None,0, Fa ...

  8. Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...

  9. Python 再谈变量作用域与变量引用

    再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*-   __author_ ...

随机推荐

  1. 业务迁移---web

    #本文是做记录使用,不做为任何参考文档# 迁移代码 将源代码scp至新的server上 搭建服务 yum安装nginx服务 yum install nginx #yum安装 service nginx ...

  2. 将HTML页面页脚固定在页面底部(多种方法实现)

    当一个HTML页面中含有较少的内容时,Web页面的footer部分随着飘上来,处在页面的半腰中间,给视觉效果带来极大的影响,接下来为大家介绍下如何将页脚固定在页面底部,感兴趣的朋友可以了解下 作为一个 ...

  3. forward_list

    一.特性 单向链表,只支持单向顺序访问(不支持快速随机访问),是C++11标准新增的类型 可类比于数据结构——单(向)链表 1. 没有size操作 forward_list为了追求性能,省去了size ...

  4. Alpha冲刺——第一天

    Alpha第一天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  5. JSON解析与序列化

    JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因.更重要的一个原因是,可以把JSON数据结构解析为有用的 JavaScript对象.与XML数据结构要解析成DOM文档而且从中提取 ...

  6. Divide two integers without using multiplication, division and mod operator.

    描述 不能使用乘法.除法和取模(mod)等运算,除开两个数得到结果,如果内存溢出则返回Integer类型的最大值.解释一下就是:输入两个数,第一个数是被除数dividend,第二个是除数divisor ...

  7. JSP在页面加载时调用servlet的方法

    方法:先在JS里面写一个调用servlet的事件(可以利用ajax),然后利用<body>标签的onload调用这个事件. 代码如下: jsp文件代码如下: <%@ page lan ...

  8. Jenkins系列-Jenkins通过Publish over SSH插件实现远程部署

    配置ssh免秘钥登录 安装Publish over SSH插件 插件使用官网:https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plug ...

  9. RT-thread内核之信号量

    一.信号量控制块:在include/rtdef.h中 #ifdef RT_USING_SEMAPHORE /** * Semaphore structure */ struct rt_semaphor ...

  10. Luogu2540 斗地主增强版(搜索+动态规划)

    单纯的暴搜似乎还是很好写的,然而过不了.出完顺子之后答案是可以dp出来的,于是大力搜然后大力dp就好了. dp时强行讨论完了几乎所有拆牌情况,理性愉悦一发. #include<iostream& ...