可迭代:在Python中如果一个对象有__iter__( )方法,则称这个对象是可迭代的(Iterable);

    其中__iter__( )方法的作用是让对象可以用for ... in循环遍历,列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的

迭代器:在Python中如果一个对象有__iter__( )方法和__next__( )方法,则称这个对象是迭代器(Iterator);其中__iter__( )方法是让对象可以用for ... in循环遍历,__next__( )方法是让对象可以通过next(实例名)访问下一个元素。注意:这两个方法必须同时具备,才能称之为迭代器。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。

 a = [1,2,3,4]
a.__iter__()
#列表是可迭代得
lst_iterator = a.__iter__()
# lst_iterator.__iter__()
#lst_iterator就是一个迭代器。
print(lst_iterator.__next__())
#执行__next__方法可以遍历里面的数字
from collections import Iterator
from collections import Iterable
print(isinstance(lst_iterator,Iterator))
#判断是否是迭代器
print(isinstance(a ,Iterable))
#判断是否是可迭代的

备注:如果迭代器里面的数据遍历完成之后会报错。:stopIteration

异常处理:try,except 可以解决这种问题

 #异常处理,遍历完成之后会报错,可以用异常处理来解决
lis = [1,2,3].__iter__()
while True:
try:
print(lis.__next__())
except StopIteration:
#StopIteration ,报错信息。如果提示这个,则直接break
break

迭代器的优点:

1、能够对python 中的基本数据类型进行统一的遍历,不需要关心每个值是什么。【例如:字典,你必须知道要他们key才可以取值】

2、它可以节省内存

例如: f = open('file','w')文件句柄就是个天生迭代器 ;range(100) 是个可迭代对象。用.__iter__ 可以把他变成一个迭代器

生成器  (Gerator),Iterator(迭代器):生成器就是迭代器,生成器是自己写出来的

 def generator_func():
print('')
yield 1111
g = generator_func()#---生成器的本质就是迭代器
print(g)
ret = g.__next__()
print(ret)
#带yield关键字的函数就是生成器函数
#生成器函数在执行的时候返回一个生成器
#输出:<generator object generator_func at 0x000002897D1F1B88>
#
#
# 错误示范:不能这么操作g = generator_func().__next__()
# 生成器可以强转成列表等 例:list(g)

迭代器是可迭代对象。迭代器 = 可迭代对象.___iter__()

从生成器里取值:

  1、__inter__ 有几个yield就可以取几次

  2、for 喜欢取值

  3、注意:再调用生成器函数的时候,要先获取生成器,再进行next 取值

  4、其他数据类型进行强转,里面装的是生成器所有的值

  5、生成器中的内容只能取一次,按顺序取值,去完为止

  6、生成器中的yield一般都有2个以上。如果一个,就相当于return .

  7、 yield 一般都是和循环一起使用

例:取衣服,用上循环。

 def get_clothing():
for cloth in range(100):
yield ' 第%s件衣服'%cloth
generate = get_clothing()
print(next(generate))#==generate.__next__()
print(next(generate))
print(next(generate))
for i in range(50):#一次性取50件衣服
print(generate.__next__())
# for i in get_clothing():
   if i == '第100件衣服':
      break

 send命令:

 def func():
value = yield 1
yield value
g = func()
print(g.__next__())# 生成器的第一步只能先用next。
print(g.send(10))#到yield位置后,如果有赋值 = 才可以用
#send命令,不然就算send也没用!
#这里send是赋值给value
#send 不仅next的功能,也可以传进去值(赋值操作)
#yield 是返回值
备注:如果send 要多次传值必须要有一个未被返回的yield。
如果value没有接收的值的话,会返回None

1、如果第一个yield 只是为了激活生成器。可以写个装饰器(生成器预激装饰器)

 def wrapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
ret.__next__()
return ret
return inner
@wrapper

 面试题:查看输出结果

例1

 def demo():
for i in range(4):
yield i
g = demo()
g1 = (i for i in g)
g2 = (i for i in g1)
print(list(g1))# g1里面的值已经被list获取,所有g2是个空列表
print(list(g2))
#[0,1,2,3]
#[]

例2 注意:生成器在调用的时候才生效。下面这道题,就是当N = 10 就一直是10,而不是1, 

 def add(n,i):
return n + i
def test():
for i in range(4):
yield i
g = test()#生成器
for n in [1,10]:
g = (add(n,i) for i in g)
# 相当于
#n =1
#g = (add(n,i) for i in test())n
#n =10
#g = (add(n,i) for i in add(1,i) for i in test())
print(list(g))
#此时N =10
#g = (add(n,i) for i in add(10,i) for i in [0,1,2,3])
#10+0,10+1,10+2,10+3
#g = (add(n,i) for i in 10,11,12,13)
#10+10,10+11,10+12,10+13
#输出 [20, 21, 22, 23]

Day 12 :迭代器与生成器的更多相关文章

  1. 从零开始的Python学习Episode 12——迭代器&生成器

    生成器 列表生成式 用于快速地生成一个列表 a = [x*x for x in range(1,9)] print(a) #输出[1, 4, 9, 16, 25, 36, 49, 64] 也可以用于生 ...

  2. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  3. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  4. python函数(5):迭代器和生成器

    迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...

  5. Python3+迭代器与生成器

    转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...

  6. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

  7. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  8. Python编程四大神兽:迭代器、生成器、闭包和装饰器

    生成器 生成器是生成一个值的特殊函数,它具有这样一个特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序 ...

  9. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

随机推荐

  1. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  2. 使用Objective-C的+(void)initialize初始化static变量

    在<Objective C类方法load和initialize的区别>一文中,我介绍了Objective-C对待+(void)initialize和+(void)load两个方法在编译和执 ...

  3. HTML-参考手册: Px、Em 换算工具

    ylbtech-HTML-参考手册: Px.Em 换算工具 1.返回顶部 1. Px.Em 换算工具 以下工具提供了em和px的换算工具. 第一个输入框:设置了网页默认的字体像素 (通常 16px) ...

  4. 网络数据包最大长度 MTU 分片 转发https://blog.csdn.net/singular2611/article/details/52513406

    1.数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值称为最大传输单元,即MTU.以以太网为例,这个值通常是1500字节. 2.对于IP数据包来讲,也有一个长度,在IP包 ...

  5. 3.1 开始使用 redux

    前面我们介绍了 flux 架构以及其开源实现 redux,在这一节中,我们将完整的介绍 redux: redux 介绍 redux 是什么 redux 概念 redux 三原则 redux Store ...

  6. 2019杭电多校第三场hdu6609 Find the answer(线段树)

    Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...

  7. jmeter 读写excel插件编写教程系列(1) -开篇

    不知道为什么,jmeter 竟然不提供 读写excel 的Sampler! 但是在我们自动化接口测试过程中,参数化.保存测试数据,用excel 是比较好的解决方案! 接下来一段儿时间,大虫会抽出一些时 ...

  8. Spring Boot配置随机数

    Spring Boot支持在系统加载的时候配置随机数. 添加config/random.properties文件,添加以下内容: #随机32位MD5字符串 user.random.secret=${r ...

  9. 不走弯路,微信小程序的快速入门?

    微信小程序下载注册地址:https://mp.weixin.qq.com/cgi-bin/wx 微信小程序登开发者平台地址(可以查看小程序APPID):https://mp.weixin.qq.com ...

  10. 一.Python特点

    python第一节 简介 Python介绍 什么样的语言? 解释性语言:开发中没有编译的环节 交互式语言:在命令提示行执行python引擎,直接执行代码 面向对象语言:支持面向对象 优点 a.易学 b ...