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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。7 Y8 S! x6 D9 d* b4 I+ p
一、生成器:具有生成能力,只负责生成/ h* v( @3 Z8 K

6 a& Q+ p5 @1 o  ] 1. 概念引入:同xrang,仅生成,只有在运行时才创建
4 N* l& ~6 E: A% E' D 2. 特点:6 d% U% B1 {: R0 j  n* w, c
a.函数内有yield的函数就是生成器函数
- Q* y/ u3 j  ?  B! k* A b.执行生成器函数时,只创建生成器,内部代码不执行
  t" j) d" l7 u2 p) ]7 r( l  m  c c.执行__next__方法,函数内部代码开始执行,至下一个yield中止
8 `# W0 \+ ^0 S& ? d.当函数遇到return时,则整体退出,不再执行之后的代码
. f/ H. Z5 g3 u/ y3. 代码:6 D3 j/ \* E- `+ L; ]! k) f8 B) V3 \
# !usr/bin/env python/ _7 J1 A" J) Q/ G+ Q: i7 c. q
# -*- coding:utf-8 -*-
5 ~0 q. i. Q, r; }def xrang(): # 生成器函数6 A( V) r( j2 T+ F
print(11). @0 R7 m, O  ^( q% |( [9 d$ r
yield 1
& D* d$ E+ m6 ^ print(22)
& S. Y  c' e3 s5 y- _ yield 29 ^; T# _" b5 c9 E+ P$ k
# return
' v6 v# |% M( o& q, I print(33)
; Z  U, m4 k4 h# B5 [8 { yield 3
) ~3 x) `- k: T/ U8 cr = xrang() # 生成生成器
7 r" @6 n- C, F# 执行函数时
' X# ?2 R  M2 |2 |3 P( P1 h! Pret = r.__next__() # 执行函数,至yield中止,结果:11
% S; I% D- Z% Uprint(ret) # 返回值为yield值,结果:1
4 }' Z4 l" ~6 q& o$ Hret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22
; S2 _" }2 [- v" Xprint(ret) # 返回值为yield值,结果:2
, T/ q7 e! p6 I# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。; d) |3 L# X) H# u; I( a: p$ u- \
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:33
+ W3 ~2 x" I7 J# A: `6 Uprint(ret) # 返回值为yield值,结果:30 l- l# G1 X. ?! N$ C
二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486
9 F# a' n$ j5 J5 f# K' z$ U 1. 特点, `' o0 j" z6 J$ T) @9 i
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容$ D; u; r& ^  p0 _3 a& G7 d7 U
b.不能随机访问集合中的某个值 ,只能从头到尾依次访问6 ~* G/ d: R# |9 T! X
c.访问到一半时不能往回退
4 D$ z. L' n2 k5 {9 _d.便于循环比较大的数据集合,节省内存% Z( {6 D* z" n  e* x# B6 y2 K& ?
2. __next__
. K# b: Z7 S1 c3 [4 E/ D1 T+ o 见上例7 M* e5 I' m1 c
3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。
/ E4 r9 u4 E- T) C( g# !usr/bin/env python
/ E+ x& x) L/ r2 f7 @# -*- coding:utf-8 -*-# W* P" a. z$ G1 n! y6 [
def rang(n): # 生成器函数
* i* G. V! S; ^0 X start = 0
* n0 r6 A8 c4 r* X. C while True:
5 y# V# r# Y! M3 i: t+ T if n < start:
1 k* ]! ^6 s; x4 E( |' V return2 m2 A' H" h- L  g. j; G4 E
yield start" a% `  p& Z. `. ~! ^
start += 11 a, S) a( _& O8 ?' z
for i in rang(10):
7 ]+ t( Z  o; b$ W1 a print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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