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

给深度学习入门者的Python快速教程基础篇之 生成器(Generator)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
给深度学习入门者的Python快速教程基础篇之 生成器(Generator)4 |  Z1 s; q3 X$ p8 {  k; J
生成器(Generator)
9 c3 f# [% ?! O9 u9 e7 c5 V! n7 M4 P; D; R$ u1 D3 n- `! ?
生成器是迭代器的一种,形式上看和函数很像,只是把return换成了yield,在每次调用的时候,都会执行到yield并返回值,同时将当前状态保存,等待下次执行到yield再继续:
6 U6 u# E  d( f% v5 J" M# 从10倒数到02 [( S4 Y; E7 X' ]1 I
def countdown(x):
% F2 G+ y/ H) w; T( Swhile x >= 0:" p$ T' t/ H8 U. z4 @
yield x
& H. ~, ~% c# Rx -= 1
0 a2 e% O- g& Y/ y( W* L+ W  Q* o( h" _% g! D
for i in countdown(10):3 k$ |) ~3 ~3 Q' L
print(i)
' ~- y4 Z, q9 ~3 z
' H6 p9 k. A( t4 O* v# 打印小于100的斐波那契数7 k2 ~6 }1 N, w2 [
def fibonacci(n):
, k6 S9 Z5 q+ r& H7 n( Ra = 0
5 z! y1 J0 P7 [) d; @1 Y$ e( C5 vb = 1
( G5 _& S7 _; D0 {while b < n:
1 Y5 a! x; o+ j( Tyield b
- J5 n- G- F4 R" [) d5 `a, b = b, a + b1 c3 c  z- E% a: e2 k% |

4 N7 `# g5 ?% S! o# C% Y" r, bfor x in fibonacci(100):  j( M8 {9 A9 b; I, g" `8 J- m7 c
print(x)
9 c8 I# R1 }- L
  {9 [% ~  X& k1 g6 h/ B& a生成器和所有可迭代结构一样,可以通过next()函数返回下一个值,如果迭代结束了则抛出StopIteration异常:, M) V: i9 \* S5 |9 z7 _# J
a = fibonacci(3)
* W- D/ r( J% bprint(next(a)) # 1
. e' q3 b% J% _8 @' N$ Lprint(next(a)) # 1- J( F* z5 X- g2 R' v% o/ j# j
print(next(a)) # 2
4 b% Z. C6 m$ H  N8 pprint(next(a)) # 抛出StopIteration异常
: k# ~$ B2 N4 r! C
- i$ Y! B: T  tPython3.3以上可以允许yield和return同时使用,return的是异常的说明信息:
3 D. W/ l: b; b5 ^$ Q# Python3.3以上可以return返回异常的说明3 E, w& V* y+ }! o7 k' H2 k3 s
def another_fibonacci(n):, m! q: `8 h0 _9 ^; I. J* g: [& @/ O6 T
a = 0) y0 j! k5 e- G) s0 A# U
b = 1
4 W& Z  r( Q: j* twhile b < n:
& \2 X4 U' _/ o5 o9 J, W' |; iyield b
0 r0 A: }0 Y: @- o& @* o6 Ra, b = b, a + b
  ^( N3 M$ n0 c" nreturn "No more ..."
* o& O, Z( T9 @  G: h! s1 _3 k2 l$ P# k- t; L: k  I3 _
a = another_fibonacci(3)
5 W, @  J; ]* l7 P0 J/ O/ y4 Nprint(next(a)) # 1
0 b9 T# y! ]( Z0 o* V6 Cprint(next(a)) # 1
3 _) I$ O" |/ r: |# {" {print(next(a)) # 27 [$ \( u1 F) t& y
print(next(a)) # 抛出StopIteration异常并打印No more消息
' o& S7 g4 V6 ?9 b! K" R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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