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

本文通过实例详细解析Python中的迭代器、生成器及闭包等概念,并探讨了闭包中的late binding特性,帮助读者彻底掌握这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建议先看我上次发的作用域、闭包的概念

再看完廖老师的关于面向对象的高级编程,或者先看    定制类

再看 完全理解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]
[]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值