Python女神分享教程之Python 3-8 迭代器和生成器

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。0 e0 y0 }  Z1 r. a
一、生成器:具有生成能力,只负责生成3 j. [; ?& C$ `4 h

. w7 P- A5 O1 l+ j 1. 概念引入:同xrang,仅生成,只有在运行时才创建
) a+ J$ f' \5 Q8 } 2. 特点:  ]+ R( U# q% J  L( }* v" R
a.函数内有yield的函数就是生成器函数8 F% ?6 F# p- t: u
b.执行生成器函数时,只创建生成器,内部代码不执行
/ i. W( e9 x4 _* _( e5 M c.执行__next__方法,函数内部代码开始执行,至下一个yield中止3 w+ K# L9 p" j+ h$ \
d.当函数遇到return时,则整体退出,不再执行之后的代码6 F$ Y0 p, I9 x
3. 代码:# [( Z9 F( j, k. y' I2 ^# m
# !usr/bin/env python
! n! q# D  L4 {6 P( m+ k: z' [# -*- coding:utf-8 -*-
* C3 x9 c$ b, @* Z* Idef xrang(): # 生成器函数
. z/ E: {  L0 d; K5 w( O print(11)- O; |) E) n! e: R' n. Q
yield 1
5 c+ M/ x5 U$ G, I' h: d print(22)" e" M6 o7 h: v# _
yield 26 E, h/ N$ q( a: l
# return
1 {& b& {1 K, |: r# b, j. ? print(33)
8 F0 ?. A$ l, r  {! o5 _ yield 3! w2 O: k& K, x* k
r = xrang() # 生成生成器8 e! e% x3 \# A/ O! j3 @
# 执行函数时
: A! @+ y/ i+ h, m1 ?# N8 fret = r.__next__() # 执行函数,至yield中止,结果:11
4 j  v# A! Q6 q: ?/ xprint(ret) # 返回值为yield值,结果:13 V& k$ A8 Z( ~
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22
& \! o. f+ P" q  B  Bprint(ret) # 返回值为yield值,结果:2
1 z( g8 t3 S* P- g2 a- I0 S# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。/ L- }# u+ ]) V$ D) M
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:33
; P, S5 {* c2 K+ `6 r' @0 _print(ret) # 返回值为yield值,结果:3
. W1 i- ?. j( Y0 I' O& [ 二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486+ V0 v; @4 G! X
1. 特点
9 W3 y1 V9 v# R9 u! s a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容$ c6 w1 }" q: U5 q; E
b.不能随机访问集合中的某个值 ,只能从头到尾依次访问
) i; c. [, T  ^" N$ T& f' t5 ic.访问到一半时不能往回退
1 l, P& v/ v6 E  Y* r5 pd.便于循环比较大的数据集合,节省内存% |7 s4 q! ~. B, s6 Z# C# }
2. __next__! E3 E* c* x; }
见上例
8 j, r0 d* l4 ~0 `% F 3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。
+ h4 _* D+ K0 N9 V# !usr/bin/env python
" \# d) ?& H: k# -*- coding:utf-8 -*-
2 C4 z3 j5 J) Z4 c5 N' {( bdef rang(n): # 生成器函数6 A+ S8 X- ]  q/ ]
start = 06 e* C; V2 p: Q- j+ X
while True:
4 m- z' o( u. K9 g2 v- g if n < start:
( r% B/ A3 f6 |( s- h1 z/ A return
0 j, D0 {& J/ Y, z  A+ |% \& B2 F yield start$ ]% |$ m0 d/ i+ a, v2 l
start += 1
8 _9 f- F8 i6 _- q3 y  ffor i in rang(10):9 G5 c9 ^- W1 x+ T+ L! g! ?/ X
print(i)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图