博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python-迭代器-生成器-1
阅读量:4993 次
发布时间:2019-06-12

本文共 2386 字,大约阅读时间需要 7 分钟。

今日内容:

1.迭代器:

iterable:形容词,可迭代的

from clooections import Iterable (检测一个对象是否可迭代)

"_ _iter_ _":这个方法导致了yield数据类型的可迭代

iter:

只要是包含了“双下划线iter”方法的数据类型就是可迭代的 -- 可迭代协议(数据类型和Python解释器定下来的协议)

print([1,2,3]._ _iter_ _())

iterator: 名词 迭代器

迭代器:就是实现了能从其中一个一个的取出值来

lis_iterator = [1,2,3].__iter__()print(set(dir(lis_iterator)) - set(dir([1,2,3])))

迭代器中有__next__ 和__iter__方法 -- 迭代器协议

lis_iterator = [1,2,3].__iter__()from collections import Iteratorprint(isinstance(lis_iterator,Iterator))print(isinstance([1,2,3],Iterator))

在Python里  你学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器

可迭代对象:

  可迭代协议:含有__iter__方法的对象

from collections import Iterator

print(isinstance(要检测的对象, Iterator))

迭代器和可迭代对象之间的关系:

  迭代器包含可迭代对象 

  迭代器 = 可迭代对象.__iter__()

 

可迭代对象 并不能用

迭代器 -- 它不关心值的索引状态

lst_iterator = [1,2,3].__iter__()print(lst_iterator.__next__())print(lst_iterator.__next__())print(lst_iterator.__next__())while True:      try:            print(lst_iterator.__next__())      except StopIteration:            break

for 可以是一个可迭代对象  也可以是一个迭代器

为什么要有迭代器  迭代器存在的本质是什么?

  1.能够对Python中的基本数据类型进行统一遍历,不需要关心每一个值分别是什么

  2.它可以节省内存 -- 惰性运算

f = open("file","w") 文件句柄就是一个迭代器

range(1000).__iter__() range就是一个可迭代对象

for:

  1.天生的,比如文件句柄

  2.后天的,可迭代对象.__iter__()

 

生成器:

Iterator:迭代器

Gerator:生成器

生成器就是迭代器,生成器是我们自己写的

  生成器函数

  生成器表达式

def generator_func(): # 生成器函数      print(123)      yield 'aaa' # 相当于return      print(456)      yield 'cccc'g = generator_func()print(g.__next__())print(g.__next__())

带yield关键字的函数就是生成器函数

生成器函数在执行的时候返回一个生成器,不执行生成器函数中的内容

从生成器中取值:

  1.__next__ 有记过yield就可以取几次

  2.for循环取值 正常取 for i in g:

  3.其他数据类型进行强制转换list(g)返回一个列表,里边装着生成器的所有内容

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

   生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。

def generator():      yield      yield 2g = generator()for i in g:      print(i)print(list(g))g1 = generator()g2 = generator()for i in generator():      print(i)print(list(generator()))
def get_clothing():      for cloth in range(1,2000000):            yield '第%s件衣服'%clothgenerate = get_clothing()print(get_clothing().__next__())for i in range(50):      print(generate.__next__())for i in get_clothing():      print(i)      if i == '第100件衣服':            break
#yield fromdef func2():      yield from [1,2,3]      yield from 'ABC'g = func2()for i in g:      print(i)

总结:

可迭代对象   内部有__iter__ 迭代器      内部有__itre__ __next__ 生成器   --    就是迭代器 自己写的迭代器 生成器函数 yield/yield from

 

 

转载于:https://www.cnblogs.com/chengdajing/articles/7474619.html

你可能感兴趣的文章
Python操作MySQL数据库
查看>>
自动化部署之jenkins及简介
查看>>
CodeForces 1152D Neko and Aki's Prank
查看>>
Python 用pygame模块播放MP3
查看>>
inline必须在定义、实现都标记
查看>>
从单链表到循环链表
查看>>
百度招聘无处不在!
查看>>
丢失控制文件恢复实验记录--3(当前的控制文件损坏,归档日志文件损坏且备份的控制文件是旧的情况恢复数据库)...
查看>>
Ganglia监控MySQL
查看>>
反射和动态导入模块
查看>>
信息社会
查看>>
Mysql存储引擎概念特点介绍及不同业务场景选用依据
查看>>
关于Java类Calendar做统计时 获取日期的一些常见操作
查看>>
从程序员转向淘宝店主的探索
查看>>
openstack 中国联盟公开课參会总结
查看>>
约瑟夫环问题详解 (c++)
查看>>
Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法
查看>>
BZOJ.3990.[SDOI2015]排序(DFS)
查看>>
hdu 1358
查看>>
“-fembed-bitcode is not supported on versions of iOS prior to 6.0” 错误
查看>>