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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。& H2 S; A2 H5 v+ v* S& L* o$ n- w2 Q
一、生成器:具有生成能力,只负责生成/ t0 s" E; y1 y8 e5 l  |
1 j; W0 d) M. X* q
1. 概念引入:同xrang,仅生成,只有在运行时才创建 6 k% a6 a1 C" F
2. 特点:. C+ p  S/ k7 W8 ?
a.函数内有yield的函数就是生成器函数
' ]9 Z! x* ?* ?9 Q b.执行生成器函数时,只创建生成器,内部代码不执行
3 R4 j+ Q0 |1 i& s. J, ]2 \ c.执行__next__方法,函数内部代码开始执行,至下一个yield中止
" d1 l6 F- I9 W& ~; `9 \  N d.当函数遇到return时,则整体退出,不再执行之后的代码6 [+ F: b8 F+ f
3. 代码:
5 I' E* q- O- B: [# !usr/bin/env python5 N. }) w# u" \0 m4 |$ l  g" r6 T
# -*- coding:utf-8 -*-
% @; ]/ c3 c$ Ldef xrang(): # 生成器函数" A; o7 g8 a5 D6 S8 ?0 Y+ m
print(11)  k: A  C; G+ j* I
yield 1
8 b. j$ m( L* w: u! a print(22)
- ~! y$ g6 }. ?- l" ` yield 22 {. Y# I: N  \) i- `# a& O
# return
/ @  r# a+ Y. X6 F+ }7 _3 C print(33)4 {* p# O2 h+ H) b- C; u7 |0 G
yield 3* e3 y7 I: o4 I5 c0 `# w
r = xrang() # 生成生成器
$ i! i5 K0 p8 K! P# 执行函数时
- c! P; c6 w4 _- Uret = r.__next__() # 执行函数,至yield中止,结果:11
4 ^8 a0 ^# _. \* s& w1 wprint(ret) # 返回值为yield值,结果:1' j4 s$ ~9 l: ?# [5 N
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22- Y6 l; N4 E( C1 h$ ]1 T4 C1 u' ?, \
print(ret) # 返回值为yield值,结果:2' ]# y( E  \/ a
# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。
5 y* T( p' F. s6 c+ V! g: c5 ^( lret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:339 r, \, {2 v6 t' q0 {6 U( V
print(ret) # 返回值为yield值,结果:3
1 }, p5 M7 i% M5 V( L* v 二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486) a( h1 D  V$ A0 `9 j
1. 特点* W: a6 S8 X: T2 g# Z3 w) e
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容( d& ^# t, k% g" D
b.不能随机访问集合中的某个值 ,只能从头到尾依次访问
% M1 Z; s2 O5 w# e6 uc.访问到一半时不能往回退: ^$ I0 k3 D; p  n" B+ w
d.便于循环比较大的数据集合,节省内存
! w5 r" l, F5 G- x* m# v; n 2. __next__
$ ]& s, }! \, c$ C# w8 ^* D 见上例
; d2 D3 O( h' T0 s; U 3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。
! a5 @! b; e) L' Y% W& q8 q5 |. D7 Q# !usr/bin/env python3 U! @% z3 g& z) y6 J9 T+ G8 z
# -*- coding:utf-8 -*-. E' J# _$ i6 w2 p# H5 o7 ~0 o4 V3 H1 v
def rang(n): # 生成器函数( g. k+ t# ^/ {+ V8 P- `
start = 0
. s$ c/ i5 l- @, P- b6 D while True:* W; z  l: `6 k- d! h
if n < start:/ B4 ^: X1 T* t) Z
return
9 d0 z: u$ F, M9 x yield start
; r* j" }% o' }4 g+ r3 D start += 1
4 d0 u1 p+ V5 tfor i in rang(10):' w/ E6 u0 X* m# v# H7 L
print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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