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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。) j1 F* _+ U) e  b) z' g
一、生成器:具有生成能力,只负责生成7 T) n/ A5 l' J
+ W- Q: V* q9 ]
1. 概念引入:同xrang,仅生成,只有在运行时才创建 ) s- a+ n9 |7 r$ m) i. y/ L
2. 特点:, x/ g8 x' Z" t0 Y, L; e& `
a.函数内有yield的函数就是生成器函数
, q& O- k; R: a/ ^/ X7 V" Y b.执行生成器函数时,只创建生成器,内部代码不执行
* e3 s; R$ }, _# s3 `, S; } c.执行__next__方法,函数内部代码开始执行,至下一个yield中止
+ r4 A8 y% f" r; a/ ?/ @( r) C d.当函数遇到return时,则整体退出,不再执行之后的代码
& F4 I: \9 a9 Z1 S5 n& [3. 代码:
+ c: C* ]2 o0 p" w6 N# !usr/bin/env python
' D! X9 @' H0 z: i% d# -*- coding:utf-8 -*-
" ~5 C# i2 W0 @$ a  S$ r$ ^! Vdef xrang(): # 生成器函数
& k* p% J( y/ L print(11)8 N- r' ~# V8 S) k. w8 R* a2 u
yield 1
; M, i: f/ c/ k: L7 h7 S4 l/ j print(22)
' O2 G0 z" y2 U/ I yield 2
2 s5 F( m* `/ x! m- g # return
) |* g) i$ `7 b# R4 x+ s print(33)
7 }9 Z9 X0 @. C/ E yield 3; o% b; w- o4 S- r4 o
r = xrang() # 生成生成器
4 Z' z% P8 X8 f# 执行函数时
1 o; n; c- ?+ U1 _ret = r.__next__() # 执行函数,至yield中止,结果:11
' d( p7 ?4 v3 `0 hprint(ret) # 返回值为yield值,结果:1: N3 v$ `* D. d) R+ v( {7 E- o
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22
+ _0 k) ]% g. R6 R2 O7 c% `print(ret) # 返回值为yield值,结果:2
8 U3 M) X& d% t. m! L1 B6 ?) m# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。
5 D9 V5 X% j  ~, xret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:33
% c: f( K& m8 n6 Z3 k, \print(ret) # 返回值为yield值,结果:3! [* S8 l& t. ?3 n, o( C$ a; E
二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 4868 O% K$ \6 \2 T+ N+ S
1. 特点
" X6 Y- g  o7 R" w: c6 l- g a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容: ~, n2 C" F/ o5 ~9 V* Z9 z
b.不能随机访问集合中的某个值 ,只能从头到尾依次访问
/ }' m) X+ r8 c; `" [! j  i* J# dc.访问到一半时不能往回退
+ c) U5 w- g: n7 \, ]* J! g; fd.便于循环比较大的数据集合,节省内存
% s& D/ l) U4 x; k7 ^# T7 y 2. __next__
7 |9 W4 }8 A1 T! o5 ^5 M  o 见上例
1 I7 u3 a8 U) {5 r# Y; ^3 x 3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。' k2 Z/ ]( e; V) G
# !usr/bin/env python$ J8 l9 w! ]4 i/ o7 x" K
# -*- coding:utf-8 -*-- Q$ n- n! b4 h8 a
def rang(n): # 生成器函数
0 v& E' G; c% F2 O; I7 t  u! [ start = 04 c0 y* @2 ^* K) p* {1 l" c1 ?, A
while True:7 t' \  ]$ t; W" O, y
if n < start:
/ V, q7 E$ L  |/ D return# y1 f3 N# _: g8 g" G6 Y' g& o* H
yield start! }" x, ^) E2 `1 A6 A: l6 _( {
start += 1! J4 v3 q( G$ D2 x
for i in rang(10):) p. o# l8 h9 `  _  A/ |
print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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