|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
给深度学习入门者的Python快速教程基础篇之 生成器(Generator)9 D3 Y' h% L, G6 u7 i/ q- a
生成器(Generator)- Y1 Q# @, z( P5 E; f
3 ?8 W+ S* }8 A( A; ?6 y生成器是迭代器的一种,形式上看和函数很像,只是把return换成了yield,在每次调用的时候,都会执行到yield并返回值,同时将当前状态保存,等待下次执行到yield再继续:, A1 y. D4 L' N2 t
# 从10倒数到0
: f. @: I1 |7 N6 h5 ~) M" w+ {def countdown(x):3 ], t1 k+ A7 ?0 M: o
while x >= 0:4 O! h2 |* ?0 O! L
yield x
. y* \9 g4 {. d5 ^( ~1 mx -= 1
0 k: D; O, V6 W# I/ u9 }* n+ a) O( }1 {7 F
for i in countdown(10):5 D' h' ]" N/ R2 M
print(i)
$ t, M& |$ M2 W x+ p
7 B5 c! D6 w3 L; |) c+ P# 打印小于100的斐波那契数& i c" b, j3 j2 P( k+ J9 t
def fibonacci(n):
7 d. O* h& s" _. ~% }2 e* ia = 0
' B8 ^5 W3 j# w) e! s0 Z- O; \b = 1
$ ]9 B& ~ P& e" w8 U) Wwhile b < n:
5 r: K5 N2 B* f% v Yyield b6 {2 _- X1 S7 C( I+ ~
a, b = b, a + b( o' k S5 ?6 s5 D, V
& |% I; L3 W8 ]4 m$ ^5 vfor x in fibonacci(100):
: Y2 A4 m$ o$ K) \print(x)6 g3 Q9 e# `% _9 _
$ E% M# q3 n3 ]% G
生成器和所有可迭代结构一样,可以通过next()函数返回下一个值,如果迭代结束了则抛出StopIteration异常:7 r/ U P: V* d) V
a = fibonacci(3)
9 j+ t) A: i0 L, j0 nprint(next(a)) # 1& p& Y) E. g2 r# e
print(next(a)) # 19 ]/ K9 X) s1 H7 p F
print(next(a)) # 2
9 `! q" R+ ]$ v: N; e8 H8 [print(next(a)) # 抛出StopIteration异常
) S. X5 Q$ T' v( d( W5 {( j4 g/ p, x
Python3.3以上可以允许yield和return同时使用,return的是异常的说明信息:
$ u5 J. s- U1 x# V7 w* t# Python3.3以上可以return返回异常的说明0 S: r. @! N. y0 K- F
def another_fibonacci(n):
5 j! b$ W, E8 |' m" r- ra = 09 I: r; m5 H/ d& x( i5 l5 m
b = 18 \2 H( ~6 e2 o
while b < n:
" k* |! T$ u6 }/ hyield b( r: g$ w6 Z2 x$ u. B, j! w
a, b = b, a + b' A% N7 a1 _/ N1 l$ B$ A
return "No more ...": y4 l8 ]$ o+ ?& r+ v, j5 \5 ]
% N) C- u, d/ K9 ~1 @8 \. v7 c& U
a = another_fibonacci(3)
% R2 ]. D. C+ S, l1 ]" }3 ]; Xprint(next(a)) # 1
}5 Q0 r$ q, z* n9 f( G) b& eprint(next(a)) # 1
2 x$ Q8 r/ [7 C$ \ y5 h8 q- }print(next(a)) # 2
$ l% S8 z" M- `' ~4 e( Oprint(next(a)) # 抛出StopIteration异常并打印No more消息 |
: B& ^2 R# {, i7 z$ L7 R4 y- j |
|