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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。
2 [2 o+ |- b! V一、生成器:具有生成能力,只负责生成$ J) I! E9 U% U/ u

: f9 B; M2 M* C9 s5 [0 s 1. 概念引入:同xrang,仅生成,只有在运行时才创建
! e1 H1 D; D6 f0 \0 _. H 2. 特点:- f2 Q. _+ R6 g5 w- D- ^  ~' V
a.函数内有yield的函数就是生成器函数2 P- c9 h4 D1 n9 ~* `6 c" H, j
b.执行生成器函数时,只创建生成器,内部代码不执行
: T* C* M4 C2 y* e c.执行__next__方法,函数内部代码开始执行,至下一个yield中止
& v/ n9 ^; |& F d.当函数遇到return时,则整体退出,不再执行之后的代码, C! N0 i  v8 p4 F% n4 }) b
3. 代码:9 S, U5 G" d% v# d
# !usr/bin/env python
1 b7 a( l2 z* w# -*- coding:utf-8 -*-- B& ^3 C. W/ X5 n( l
def xrang(): # 生成器函数
, K& j: b5 \8 n  n print(11)
7 Z! k9 P$ P! O- k yield 1( ^2 E8 p7 @& C. t
print(22)
/ `5 H4 J, p7 D$ c9 j# r yield 2( V1 y/ f8 a- n* z0 P
# return) |2 G2 T+ T: F8 X  k: K0 w
print(33)" t) d; f# W9 l, H6 r6 h) ]; t
yield 3* r$ a6 W- P  Z# }, n/ B. z
r = xrang() # 生成生成器! T3 J* L& e. z) W
# 执行函数时
3 q! j$ `( J; N5 K, Kret = r.__next__() # 执行函数,至yield中止,结果:11
; o6 Z: v0 h' P8 Qprint(ret) # 返回值为yield值,结果:1
% E$ q! g; A/ P, L6 j1 Bret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22
" ?5 J  M. q8 R" nprint(ret) # 返回值为yield值,结果:2
! C) ]7 T) E. Q4 L( @& q( v# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。+ t& R  V  G) u, l, Q" c
ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:33! R$ K* k3 b, c4 a. V) M
print(ret) # 返回值为yield值,结果:3
& h% Q# e1 {2 B9 J 二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 486/ k" O$ a6 x2 {5 c
1. 特点" N; a: K6 _: Z8 w4 c) \- J1 H
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
+ i5 E% ~5 o4 v! N* ?b.不能随机访问集合中的某个值 ,只能从头到尾依次访问' U; l/ o/ k9 @# N" b$ O; Q
c.访问到一半时不能往回退2 e, ~; R7 ?. N# T. X' s
d.便于循环比较大的数据集合,节省内存# i7 U% N1 L, f. L( q
2. __next__7 g; u% ?/ Z" `7 e  ]/ z+ n$ f
见上例
. I: ^7 G# [+ l. ^% [  c' M 3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。' j7 s5 q6 y: m, r2 i: Y
# !usr/bin/env python# J1 M$ w4 q+ u
# -*- coding:utf-8 -*-
* G9 B4 g; J- r$ I, N& }def rang(n): # 生成器函数
+ s6 `" _. r3 g/ A) E start = 09 E; ?  O% a/ K7 [' e  ]
while True:; P; D& m4 P& S* |
if n < start:. I( N  B6 b) @9 W5 h
return
0 D% _$ _5 }$ s- x4 m% E! \ yield start
: b" f1 X) e7 m1 L start += 1
8 G6 L4 H+ a9 cfor i in rang(10):
6 A% b5 [3 F, V8 l' L print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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