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

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

$ G* R) Y8 [9 ^' N5 q 1. 概念引入:同xrang,仅生成,只有在运行时才创建
; v; ?) X7 j- k% L4 H 2. 特点:8 d" ^0 R9 |: i3 g& f
a.函数内有yield的函数就是生成器函数9 S' k7 u' b& O6 @' u' }
b.执行生成器函数时,只创建生成器,内部代码不执行
. s0 M4 Q! ?' G1 H6 ^. y: x c.执行__next__方法,函数内部代码开始执行,至下一个yield中止: n) h/ N% m6 J$ U4 `
d.当函数遇到return时,则整体退出,不再执行之后的代码5 R7 G, ]3 {4 }
3. 代码:
& A) W5 f9 U4 _3 D$ N' ~# !usr/bin/env python0 S7 w# u1 v4 S% K
# -*- coding:utf-8 -*-; d6 c+ O$ C1 k/ z9 p7 A
def xrang(): # 生成器函数* ^+ j& q3 o; k: R5 Z7 j
print(11)$ j6 i9 N# a5 O6 e1 q
yield 1- y: u* x8 w+ c2 R2 W& C
print(22)
0 _3 H  Q' @/ U- r3 ? yield 2
, N8 t, `8 a! a4 \! G$ [ # return  ^, E4 b  Y% j, N
print(33)- x1 N4 j- ^( Y9 N  t" q& ]- b
yield 3- R: v/ U* B- U. E# Y$ P$ ?
r = xrang() # 生成生成器7 ?5 |) \# S9 M% l1 |+ [
# 执行函数时0 l" |0 m) G9 D5 D9 M% A) C
ret = r.__next__() # 执行函数,至yield中止,结果:11
3 j2 P4 T7 L2 A) Rprint(ret) # 返回值为yield值,结果:1
0 A; C' L% M! x+ M, Dret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22- P3 g; \- B1 K* w# N
print(ret) # 返回值为yield值,结果:2" A4 X) r. {3 ~: T; }
# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。; i$ _. n0 y$ i; W
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:330 `% U7 I6 y# h. a, }
print(ret) # 返回值为yield值,结果:3% A# P) M5 i% X. a1 Z
二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486
; [2 U/ c6 _. h( Q+ q2 F0 F, _2 B 1. 特点% ]$ i9 x; P0 |8 n) j
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容0 {7 N. s) j; s" ]
b.不能随机访问集合中的某个值 ,只能从头到尾依次访问
1 K$ C% ?0 H* lc.访问到一半时不能往回退. M% I4 S/ S1 G4 x& Y" ]
d.便于循环比较大的数据集合,节省内存
# E5 [! Y& X0 V  C6 \$ H# n) F! ` 2. __next__' s7 {0 R$ K3 A7 e; l5 s  t
见上例
; R4 n5 k7 g5 D% m: O 3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。
5 c2 q( e! d3 D2 D# f# !usr/bin/env python
) J8 |$ Y5 M/ r6 k" ^# -*- coding:utf-8 -*-
5 H' {* }5 x+ b* [6 P" P0 r* V. ddef rang(n): # 生成器函数3 E6 F$ w! \4 Q' O" q! Q3 }
start = 0
- n2 E3 \% _0 l$ @) ^: w& T( @* ?. Q while True:8 w( N2 V5 E: M  O
if n < start:
+ q# P) Z5 h3 c8 T. }3 U3 B return
+ A" H& r8 m) u' w5 R2 k yield start9 F* b7 A$ N/ Z. M
start += 1
0 f$ I- K. a0 h1 D/ {2 D, e9 @' Nfor i in rang(10):' n7 G1 Y3 R$ L0 u4 k+ a
print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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