迭代器和生成器

一、迭代器 (概念)

​1.​可迭代协议--->:只要是含有’__iter__’方法的数据类型都是可迭代的数据类型​

判断么某个变量是不是可迭代的:​

第一种方式:

print('__iter__' in dir([])) #是True就是可迭代的,是False就不是.

 

第二种方式:

from collections import Iterable
isinstance([],Iterable)

 

内置函数,判断一个具体的值是不是某个数据类型,括号里前面是具体的值,后面是数据类型.​

 

2.迭代器协议---->:内部含有''__next__''方法和__iter__方法的数据类型就是迭代器

判断一个数据是不是迭代器:

第一种:

print('__iter__' in dir(res.__iter__()) and '__next__' in dir(res.__iter__()))

 

第二种:

from collections import Iterator
r = isinstance(res,Iterator) #r为True即为真,为False即为假​

 

 

可迭代的和迭代器的关系:所有的迭代器都是可迭代的,反之不成立

 

3.创建一个迭代器:

l = []
res = l.__iter__()
print(res)

4.查看在res中但是不在l中的方法的方法:

print(set(dir(res)) - set(dir(l)))

 

相对于可迭代的迭代器中特有的方法:

{'__length_hint__', '__next__', '__setstate__'}res.__lenght_hint__()           #跌迭代器中有多少的元素

res.__setstate__()              #控制迭代器从哪个位置开始迭代

res.__next__()                   #从迭代器中取下一个值​

 

5.迭代器的特点:

  a.具有next和iter两种方法

  b.通过一个__next__多次执行就可以获得这个容器数据类型的所有的值​

  c.迭代器中的值只能取一次 ,不取的时候值不出现 ###重点​

 

6.用途:

  a.for循环内部的循环机制就是迭代器的取值机制​​

  ​b.在for循环执行的过程中,是先把可迭代数据变成迭代器,在​从中一个个的取值

 

7.迭代器的优点:

  a.range生成的就是一个迭代器,创建这个迭代器并不会把这个迭代器的数据一次性生成,只有通过next取值的时候才会生成

  b.所有的for循环与一个这个过程:记住要多少个值,当前该给你什么并且记住下一个该给你什么和当前值和下一个数的关系即可

  c.for循环就是利用迭代器节省内存的优点来处理数据中的变量​

8.特点:

  a.节省内存

  b.惰性运算:​​​记住要多少个值,当前该给你什么并且记住下一个该给你什么和当前值和下一个数的关系即可,可以节省时间

  c.只能一次性取值,并且按顺序取

9.for循环和迭代器的关系:

  无论是可迭代的还是迭代器都是可以被for循环的,如果是循环的迭代器,则循环一次就没了.如果循环的是费迭代器,每一次都相当于从头开始,因为在for循环中每一次循环都会通过__iter__生成一个新的迭代器

二、生成器 

1.概念:通过简单的函数实现的

​   生成器函数: 如果一个函数中含有yield关键字,则该函数即返回一个生成器函数,所有的生成器都是一个迭代器

  迭代器的取值方法都适用于生成器:

    a..通过for循环

    b.通过__next__()函数

    c.使用数据类型的强制转换​ ​​

2.send()函数:

  1.send() 相当于执行一次__next__,并且在yield的时候输入一个值

  2.生成器中send()使用的的过程:​​

    a.生成器函数得到的是一个生成器

    b启动生成器的第一个方法永远是next

    c.从第二个开始,可以是send()c

    d.g.next相当于一个g.send(None)

    e.如果send()发送了值,但是没有接收,也不会报错

 

4.在我们的生成器函数中:

  a.send / __next__ 在函数之外用的

  b.yield / yield from 在函数之内使用的

  c.next + send 的个数等于yield的个数

  d.如果函数中的yield不需要接受参数,只需使用next

  e.生成器和迭代器是一样的,内部的值只能取一次​

 

5.示例程序:​

 

a.监听文件的输入,对文件进行实时的分析:

def get_line():f = open('1',encoding = 'utf-8')while True :line = f.readline().strip()if line :yield line.strip()
line_g = get_line()
for line in line_g:print(line.split(','))​

2.计算移动平均值的例子:

def cail_avg():sum_n =0count = 0while True :if count != 0:num = yield sum_n / countelse:num = yield 0sum_n += numcount += 1
g = cail_avg()
print(g.__next__())
print(g.send(7))
print(g.send(8))
print(g.send(9))​

 

转载于:https://www.cnblogs.com/sanzangdashi3/p/9917580.html

函数风云序列之迭代器与生成器相关推荐

  1. 函数 (四) 迭代器和生成器

    一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...

  2. 函数风云序列之内置函数

    在这里我将常用的内置函数中可以使用外部函数的和必须使用外部函数的内置函数以及常用的函数记录了一下 一.函数内部可以使用外部函数内置函数: 1.min(iterable,key = func)   /  ...

  3. dataloader 源码_pytorch :: Dataloader中的迭代器和生成器应用

    在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader. 为了实现小批量循环读取大型数据集,在Dataloader类具体实现中,使用了迭 ...

  4. Python 可迭代的对象、迭代器和生成器

    Python中可迭代对象和迭代器对象的理解 我们在用for ... in ...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(Iterable),如 ...

  5. python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...

    在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将 ...

  6. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  7. python迭代器创建序列_Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...

  8. 函数、迭代器、生成器、装饰器

    函数 函数基础 一.为什么要使用函数 把重复的代码提取出来,节省代码量 二.函数分类 内置函数,如len(),sun() 自定义函数 三.如何定义函数 def 函数名(参数1,参数2,参数3,...) ...

  9. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar():print("from in the bar.")def foo ...

最新文章

  1. 1004 Counting Leaves (30分) (vector实现)
  2. 第6章-一阶多智体系统一致性-->6.5 带有领航者系统一致性
  3. 对讲业务对讲过程中的几个状态
  4. WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
  5. 用Python爬取Bilibili上二次元妹子的视频
  6. 分布式存储首选,浪潮商用机器FP5466G2服务器测评分析
  7. 先来先服务算法、运行时间最短者优先算法和最高响应比优先调度算法_Linux进程调度:完全公平调度器CFS
  8. Visual C++ 时尚编程百例013(CRect类)
  9. 【MFC】多线程同步—事件
  10. 很多人已经不会用WINDOWS的命令行、DOS命令了
  11. pycharm控制台打印时显示内容,不用省略号代替
  12. mongovue使用简介
  13. 初级java程序员要求_java初级程序猿需要具备的能力?
  14. Python基础班就业免费视频教程分享
  15. hadoop安装(包含hive)
  16. ionic 实时调试android手机
  17. html5清新文艺,清新文艺的短句
  18. Tensorflow中的tf.argmax()函数
  19. excel countif_计算Excel数据COUNTIF COUNTA时出现问题
  20. 羊了个羊3D版,迄今我见过还原度最佳游戏!还支持微信授权和教程视频

热门文章

  1. c语言编程26个字母,菜鸟求助,写一个随机输出26个英文字母的程序
  2. Linux-C TCP简单例子
  3. RKMPP库快速上手--(四)MPP编码入门
  4. java observer_Java观察者模式(Observer)
  5. 家校沟通初创公司“云纸条”,将传统的纸条体验搬至线上,并尝试打造家校互动社区
  6. arch linux必备软件,ArchLinux安装常用软件
  7. Linux启动流程_LK流程_Kmain(0)
  8. 如何解决台式机重装系统后,耳机插入无声音
  9. [数据结构]Python Heapq库--小顶堆
  10. Vue实现音乐播放效果(适合小白学习)