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