python核心編程-第十一章-我的筆記(二)

     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
相關文章
相關標籤/搜索