TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
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 |
|