Python 可迭代對象、迭代器、生成器概念理解

建議先看我上次發的作用域、閉包的概念

再看完廖老師的關於面向對象的高級編程,或者先看    定製類

再看 完全理解Python迭代對象、迭代器、生成器

再看 python迭代器與生成器詳解

最好有自己的思考,有時候雖然描述不同,但內核是一樣的

 

print(type(range))
print(type(range(5)))
print(next(iter(range(5))))
runfile('E:/test3.py', wdir='E:')
<class 'type'>
<class 'range'>
0
def testFun():
    temp = [lambda x : i*x for i in range(4)]
    return temp

dis.dis('for f in testFun(): print(f(2))')            
  1           0 SETUP_LOOP              26 (to 28)
              2 LOAD_NAME                0 (testFun)
              4 CALL_FUNCTION            0
              6 GET_ITER
        >>    8 FOR_ITER                16 (to 26)
             10 STORE_NAME               1 (f)
             12 LOAD_NAME                2 (print)
             14 LOAD_NAME                1 (f)
             16 LOAD_CONST               0 (2)
             18 CALL_FUNCTION            1
             20 CALL_FUNCTION            1
             22 POP_TOP
             24 JUMP_ABSOLUTE            8
        >>   26 POP_BLOCK
        >>   28 LOAD_CONST               1 (None)
             30 RETURN_VALUE


for f in testFun():
    i = 7
    print(f.__closure__[0].cell_contents)
    
3
3
3
3

能夠透徹理解下面這個例子,那就應該是理解的差不多了

'''

Python 的閉包的後期綁定導致的 late binding,這意味着在閉包中的變量是在內部函數被調用的時候被查找。所以結果是,當任何 testFun() 返回的函數被調用,在那時,i 的值是在它被調用時的周圍作用域中查找

 

'''

IN:
def testFun():
   temp = [lambda x : i*x for i in range(4)]
   return temp

def testFun2():
   temp = (lambda x : i*x for i in range(4))
   return temp

gen = testFun2()

print([f(2) for f in testFun()])
print([f(2) for f in testFun2()])
print([f(2) for f in gen])
print([f(2) for f in gen])

OUT:
[6, 6, 6, 6]
[0, 2, 4, 6]
[0, 2, 4, 6]
[]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章