找回密码
 注册
关于网站域名变更的通知
查看: 300|回复: 1
打印 上一主题 下一主题

完全理解 Python 迭代对象、迭代器、生成器之可迭代对象

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-11-13 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    完全理解 Python 迭代对象、迭代器、生成器之可迭代对象3 _4 R/ b+ W: c
    可迭代对象(iterable)
      J9 i5 h6 B5 Q- g! x/ r很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等。但凡是可以返回一个迭代器的对象都可称之为可迭代对象# u4 B4 d6 F( S& z2 W
    >>> x = [1, 2, 3]
    / b3 A, ]0 R* i+ J  }# F7 Q>>> y = iter(x)
    7 d" d/ K" X  J/ q>>> z = iter(x)! R* m+ Z3 S) g( B
    >>> next(y)$ C7 B- N+ w: r( H5 B
    1
    2 p5 E0 ~2 F7 J6 Y5 D+ L) ]! D>>> next(y); Y# Y8 i$ b9 M3 [+ Z
    2
    # u0 i7 |  m9 K0 Z* z) \4 _6 N>>> next(z)  b' R/ ~4 P0 S$ z
    1/ o  D- n4 u7 @
    >>> type(x)8 ]6 a# q) ?1 ]# \8 x5 j
    ; _+ H3 S  K. S5 r% l* }
    >>> type(y)
    ; k5 `( _  c, L6 b1 R2 n" c
    7 u/ z4 t- |# D! [3 F这里x是一个可迭代对象,可迭代对象和容器一样是一种通俗的叫法,并不是指某种具体的数据类型,list是可迭代对象,dict是可迭代对象,set也是可迭代对象。y和z是两个独立的迭代器,迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。, `/ b. K0 Z* Q! V: Y9 I0 [; t

    * z* r- L5 }8 l6 x$ h; E* ~当运行代码:
    ; d- |$ F  {$ o3 mx = [1, 2, 3]
    & t+ ]( _5 O2 T7 ^* U) ?' hfor elem in x:  h2 M+ f( g! X# U
    ...
    + s, q0 |5 w/ A1 g3 X! T: O6 R反编译该段代码,你可以看到解释器显示地调用GET_ITER指令,相当于调用iter(x),FOR_ITER指令就是调用next()方法,不断地获取迭代器中的下一个元素,但是你没法直接从指令中看出来,因为他被解释器优化过了。
    6 t8 H8 i8 T& P>>> import dis# S: A5 H: q4 P1 d- {( Q3 S, j; I6 A# ]
    >>> x = [1, 2, 3]6 ?0 K$ r/ d2 C% P
    >>> dis.dis('for _ in x: pass')9 I2 K% N+ R3 m. g0 y2 \
    1 0 SETUP_LOOP 14 (to 17)
    * n7 u) q8 A& S1 j3 LOAD_NAME 0 (x)( E$ ?' {- ^) V; B
    6 GET_ITER
    2 N$ h% l' i) _$ }+ \>> 7 FOR_ITER 6 (to 16), W3 u" p3 E9 k- y/ Z% C3 S
    10 STORE_NAME 1 (_)7 B0 K/ q; Z" W, |! v  k+ @1 `
    13 JUMP_ABSOLUTE 7
    3 [+ D7 h" ~' @0 M>> 16 POP_BLOCK* T- D% Q3 }5 m  L) \
    >> 17 LOAD_CONST 0 (None)
    : R3 p% v' l# R20 RETURN_VALUE
    2 U5 w2 a# }) p4 P0 g; ~- b' l
    ( S5 Q6 V5 Z6 Z$ l$ R: J3 J

    4 i. R& g6 g+ Z, J
    ) g$ B2 Y, O& u* M1 r. M* @
    $ W3 t5 f/ z8 A) A" M/ e; r0 n
    1 ~% h& c! C& k, _! {% F

    6 c0 Y4 O) C! |: L4 J2 J, [3 S

    - K$ q6 ^, O+ e/ Q9 t
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-23 09:22 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表