7.3 做用域和 lambda
python
lambda 语句中的表达式有和函数相同的做用域dom
>>> x = 10 >>> def foo(): ... y = 5 ... bar = lambda: x+y ... print bar() ... y = 8 ... print bar() >>> foo() 15 18
7.4 变量做用域和名称空间函数
根据这个例子和输出来理解变量做用域:code
#!/usr/bin/env python j, k = 1, 2 def proc1(): j, k = 3, 4 print "j == %d and k == %d" % (j, k) k = 5 def proc2(): j = 6 proc1() print "j == %d and k == %d" % (j, k) k = 7 proc1() print "j == %d and k == %d" % (j, k) j = 8 proc2() print "j == %d and k == %d" % (j, k)
输出:递归
7.5 递归ci
若是函数包含了对自身的调用,则该函数就是递归的,如:作用域
def factorial(n): if n == 0 or n == 1: return 1 else: return n * factorial(n-1)
7.6 生成器
it
生成器就是一个带有 yield 语句的函数。一般来讲,一个函数或者子程序只返回一个值,但 yield 语句能暂停执行并返回一个中间结果给调用者。当生成器的 next() 方法被调用时,从暂停的地方继续io
7.6.1 简单的生成器特性ast
A. 一个简单的例子:
>>> def simpleGen(): ... yield 1 ... yield '2 --> punch!' ... >>> myG = simpleGen() >>> myG.next() 1 >>> myG.next() 2 --> punch! >>> myG.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
Python 的 for 循环穿过生成器更加简单漂亮
>>> for eachItem in myG: ... print eachItem ... 1 2 --> punch!
B. 稍微复杂些的例子,建立一个带序列并从序列中随机返回一个元素的随机迭代器
>>> from random import randint >>> def randGen(aList): ... while len(aList) > 0: ... yield aList.pop(randint(0, len(aList))) ... >>> for item in randGen(['rock', 'paper', 'scissors']): ... print item ... paper rock scissors