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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。3 F) ^% G) X0 o) |
一、生成器:具有生成能力,只负责生成
3 R; o; D2 D9 o$ @( T+ L2 f& l+ Q; f9 u7 X( M  ~) e0 W
1. 概念引入:同xrang,仅生成,只有在运行时才创建
0 {( @/ V, e. d8 B6 Z- D0 @0 ]* j) {: C. b 2. 特点:. L+ b4 _% x8 {) ~  J
a.函数内有yield的函数就是生成器函数
7 l, t- S  u. i, j b.执行生成器函数时,只创建生成器,内部代码不执行/ S5 a. q9 B, {9 {; a
c.执行__next__方法,函数内部代码开始执行,至下一个yield中止
, F' ?" H. F; j$ L& g- L3 \ d.当函数遇到return时,则整体退出,不再执行之后的代码
. Q" U' x4 q1 G1 _: b$ j! h  P3. 代码:, _; l3 g& [; \! Z8 c3 f* |* w
# !usr/bin/env python8 L$ z# B3 _8 l# e& @
# -*- coding:utf-8 -*-) G, ?  u. K# f: G$ {+ P! d
def xrang(): # 生成器函数
4 u$ ^- D2 V0 x! ? print(11)
! f" f3 T/ M# n- T* @& I yield 1
3 {) R4 ^/ N" B: z( U& f6 c! X! h print(22); d& W+ T7 R' X
yield 2  `5 d( Q: V6 M& @& A/ ?0 h" L
# return
9 q9 P5 x8 E" v- S  c8 u( D0 `& O print(33)
) L  f: U0 k: X yield 3
) |) Q# E! W/ a1 ]7 E! I! Mr = xrang() # 生成生成器
: l4 h0 Y' h( j( w0 B# 执行函数时+ K1 ?9 K  i+ h, D9 \$ B# S
ret = r.__next__() # 执行函数,至yield中止,结果:11: l' F& L* a1 u/ {+ Y7 T8 q
print(ret) # 返回值为yield值,结果:1
/ p# m1 C! z' G, G! S5 T! u* a5 L! Pret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22- [4 \: L$ n$ b  k
print(ret) # 返回值为yield值,结果:2
9 s, Z  h. s8 A2 K3 v9 h0 @/ {0 f) z# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。- K# V8 c. ?# x! a- J9 q
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:33# v! z; j4 c) W
print(ret) # 返回值为yield值,结果:3
9 r' m" w2 P9 ?) o) o' J 二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486
; i% J% w1 \& g  Q( E1 l; g3 i 1. 特点: z0 D- Z( V; Z( ?& r+ k6 @7 e
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
+ S/ ^8 M: X1 A$ C7 J7 i$ e: ob.不能随机访问集合中的某个值 ,只能从头到尾依次访问8 ]& m- G" K' j* R- V. ^
c.访问到一半时不能往回退) l2 c2 {( F' e+ [" V2 Z7 C% i& V
d.便于循环比较大的数据集合,节省内存  O+ L  i$ z, x- E& c
2. __next__
3 W1 }, Q# v* H) w7 f3 D 见上例4 w6 l- L2 ?) v
3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。- V3 r' J  W0 [5 l: A4 f2 s
# !usr/bin/env python
' g" d; ], q) y, |- c# -*- coding:utf-8 -*-
2 C0 i* }5 s, O) Pdef rang(n): # 生成器函数
3 l. L) u; g7 [( f7 o3 i3 R' f; N" q start = 08 c3 b! m( v/ n/ X, K& K/ a
while True:
+ b  ~0 r, V8 {$ I if n < start:
& Y0 b3 d. l1 a; T, K6 `: n return
6 t1 Z, _2 ]* }" q) `  F yield start1 G; q! W7 Q7 @6 J8 R0 ]  w
start += 16 }( L/ i. h# ^. [9 l
for i in rang(10):
% x; C9 T2 X1 j% _' N print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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