|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
给深度学习入门者的Python快速教程基础篇之 生成器(Generator)/ ~1 K1 V5 B- _2 _- D
生成器(Generator)
; ~1 n5 ~$ p4 \& Z% W" z
0 f! i) Z. ` u2 _9 ~, n生成器是迭代器的一种,形式上看和函数很像,只是把return换成了yield,在每次调用的时候,都会执行到yield并返回值,同时将当前状态保存,等待下次执行到yield再继续:
2 T% M3 y' J8 ?: d* `6 _* k6 B# 从10倒数到0$ a5 [& q! L) V$ n
def countdown(x):- s' f; N. g: I
while x >= 0:6 A$ N1 v M/ H) u1 E' \% Y1 y
yield x7 \$ T* L' ^. \9 k5 F4 s
x -= 1; X) Y5 e- _3 d3 s2 N A! e m
2 P& f$ }' O" z5 h
for i in countdown(10):
+ L K0 l) H. n' C; P8 x% tprint(i)4 x1 i$ r& C) V; Q
5 ~2 ]4 ^5 U$ _$ R8 a2 a# 打印小于100的斐波那契数
4 c- K6 n" w4 D( Y. gdef fibonacci(n):0 V. m( a3 e8 Z0 G/ k4 D
a = 0
7 B& I& V: k5 H( ? r/ P" [+ pb = 1+ F* g2 R7 \" O* t% T! n
while b < n:, f B$ T) I& A0 g% [) C
yield b& J9 Z, y7 U% u% A, l8 [
a, b = b, a + b
2 l% T, }# b; M' v+ d5 [- o' r" e
for x in fibonacci(100):
' L( }4 R. k7 z, x' wprint(x): H- D/ p& o9 R* t/ D9 P# {3 `
- o! L4 G; u3 N1 n: K( m
生成器和所有可迭代结构一样,可以通过next()函数返回下一个值,如果迭代结束了则抛出StopIteration异常:
; s) Q. P$ \3 b3 Ya = fibonacci(3)) K0 x( K, K d% f3 f
print(next(a)) # 1' b6 p$ f( m# |6 R- p, j
print(next(a)) # 1
4 L* S& J8 z; gprint(next(a)) # 2* P* B9 A0 z/ y8 c( r
print(next(a)) # 抛出StopIteration异常- u' Z- W& [8 K$ S2 G2 ]1 C
. ^9 F- N7 |3 h+ g$ g3 l% N9 jPython3.3以上可以允许yield和return同时使用,return的是异常的说明信息:# a8 C3 M- R4 [' W9 p8 L4 S/ R+ t6 t
# Python3.3以上可以return返回异常的说明3 o' y3 X `8 ?5 P: }8 w, M, b
def another_fibonacci(n):
?' `) j+ ~& N* P5 {' N1 T, n* Fa = 02 r0 w. s5 A3 N
b = 17 Y C! N/ Q/ {
while b < n:" p# |5 i( s4 b4 {
yield b
T6 T& M: F' b9 B" M& ?a, b = b, a + b
# \7 W4 \5 h! B" j8 [2 Z, qreturn "No more ..."
+ R7 \. Z* L4 u4 G9 S7 r1 B/ s1 u6 R# E8 {! |$ i. l
a = another_fibonacci(3)
. `! ?- B" S# |: i9 Tprint(next(a)) # 1$ {" U2 V! `' {/ D8 j* }
print(next(a)) # 1
d+ N+ p3 v" t6 H6 @print(next(a)) # 2" ], \; d, d2 Q8 E$ w/ \# a
print(next(a)) # 抛出StopIteration异常并打印No more消息 |
7 x- A9 O- x/ s, ]0 v) z |
|