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

[复制链接]
gating 发表于 2017-12-30 22:19:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
以下为作者学习python时所做的学习笔记,语言上可能不是那么严谨,希望大家多多提交自己的意见,如有错误也请大家能够指出,在此谢谢大家。
/ \: X6 |$ ]" h! _! t# N7 H8 B% n$ w7 m( r一、生成器:具有生成能力,只负责生成
! p! s$ T4 o1 H  K( g6 c3 p0 `
0 G7 Y' u0 J) H/ L7 R% E& a 1. 概念引入:同xrang,仅生成,只有在运行时才创建
) R/ W6 n: m, P 2. 特点:
1 i& r3 t$ i. S9 h4 ? a.函数内有yield的函数就是生成器函数- g' M9 g0 Z; R" s0 o8 a
b.执行生成器函数时,只创建生成器,内部代码不执行
- q  L2 p, Z+ I% j  q0 p, A c.执行__next__方法,函数内部代码开始执行,至下一个yield中止, s* o  W3 q7 P9 F: B
d.当函数遇到return时,则整体退出,不再执行之后的代码
! I& i7 O- Q7 u0 k' F: F# C7 f3. 代码:
0 Z. v5 s$ N7 w% `& [1 I, A) f9 W# !usr/bin/env python
5 w2 I. e: G5 c6 W- R' M9 b) s# -*- coding:utf-8 -*-
: \6 Z8 e9 u. @; G+ odef xrang(): # 生成器函数
; [9 d/ v$ }% ~ print(11)
& q) R3 H# ]( n! f6 u yield 1; f9 ]" P! `6 [& _+ e. Z  {4 t9 q
print(22)! B5 [. d. X3 D  i
yield 2% R6 a, @) h8 {8 Z( h
# return  l# H- N4 q% t
print(33)
( X% C/ b3 J% j; O0 z yield 3  K1 D$ z- h/ x6 Y" {; f5 N% h
r = xrang() # 生成生成器; V- b! O2 ]8 Q5 A& u3 K
# 执行函数时( H& X8 t+ e' I6 H/ I' ^
ret = r.__next__() # 执行函数,至yield中止,结果:11
  s: s5 f3 ]9 y: e- Gprint(ret) # 返回值为yield值,结果:1
: U8 h* @& l1 Y# l, F. |ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:22
7 g- v. m3 ]) g% [+ iprint(ret) # 返回值为yield值,结果:23 u6 @: v% E8 N+ @* n
# 如果加入return,此时会报错,且__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常。
( S. o9 {& j3 S, y. _; Z, @/ }ret = r.__next__() # 从上次中止位置开始执行函数,至下一个yield中止,结果:339 v9 P" |. I  d
print(ret) # 返回值为yield值,结果:3; F* e( d" U1 m
二、迭代器:具有访问能力,不要求事先准备好整个迭代过程中所有的元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。对了,作者建了个小群,有兴趣的亲们可以入群一起聊天,学习,交流:145 010 4860 z+ n7 f; B5 d* C& ~1 r$ s
1. 特点  T7 O$ Y( m% r  }. I
a.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
9 O& K8 a9 x4 z( h9 Nb.不能随机访问集合中的某个值 ,只能从头到尾依次访问# x7 [6 d1 W1 G# {; u* ]" Y
c.访问到一半时不能往回退
$ k7 y1 h0 l8 A( o3 Q/ k1 X& _d.便于循环比较大的数据集合,节省内存
% E! s( I% g0 o1 j4 |. M 2. __next__
  @* z; `5 _9 l/ } 见上例1 t; Q$ L1 F7 t- @, @- M0 X5 e" t5 s
3. for循环:Python将对关键字in后的对象调用iter函数获取迭代器,然后调用迭代器的next方法获取元素,直到抛出StopIteration异常。对迭代器调用iter函数时将返回迭代器自身,所以迭代器也可以用于for语句中,不需要特殊处理。( A* S. o" }+ ]1 ~, Y+ i% w
# !usr/bin/env python
1 z7 l% ^+ Z; ~& N/ @" e( R* V# -*- coding:utf-8 -*-8 h# J, @9 C9 V5 ?
def rang(n): # 生成器函数
3 c: ~  x% ^# w2 L start = 0
& i  r  ?1 ~9 b+ f7 ^# V while True:6 s: h; |- b- _0 u- U( z( h* B
if n < start:
6 m  d# X& O, s0 k. ~( o return$ ?+ d5 `# r5 Y. }9 w
yield start; U7 I! P' O- e$ x1 V4 O
start += 1( e% _5 u# j& a9 ^; Z
for i in rang(10):
7 o3 w* j/ Z0 E4 c" Y print(i)
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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