python核心编程-第十一章-个人笔记(二)

     7.3  作用域和 lambda

        lambda 语句中的表达式有和函数相同的作用域

>>> x = 10
>>> def foo():
...     y = 5
...     bar = lambda: x+y
...     print bar()
...     y = 8
...     print bar()   
>>> foo()
15
18

    7.4  变量作用域和名称空间

    根据这个例子和输出来理解变量作用域:

#!/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)

    输出:

    python核心编程-第十一章-个人笔记(二)_第1张图片

    7.5  递归

    如果函数包含了对自身的调用,则该函数就是递归的,如:

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n-1)

   7.6  生成器

    生成器就是一个带有 yield 语句的函数。通常来说,一个函数或者子程序只返回一个值,但 yield 语句能暂停执行并返回一个中间结果给调用者。当生成器的 next() 方法被调用时,从暂停的地方继续

   7.6.1  简单的生成器特性

    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

你可能感兴趣的:(python核心编程-第十一章-个人笔记(二))