迭代器协议

1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

迭代:重复做一件事 iterable(可迭代)对象 支持每次返回自己所包含的一个成员的对象
对象实现了__iter__方法
序列类型,如:list,str,tuple
非序列类型,如:dict,file
用户自定义的一些包含了__iter()或__getitem__()方法的类

dir(对象) #查看对象有没有__iter__方法 

l1.iter() #当你使用这个方法的时候,就在内存中帮你引用了或者说创建了这个对象的迭代器,我们就可以使用__next()方法

迭代器(iterator)又称游标(cursor),它是程序设计的软件设计模式,是一种可在容器物件(container,如列表等)上实现元素遍历的接口

迭代器是一种特殊的数据结构,在python中,它也是以对象的形式存在的

简单理解方法:对于集体中的每一个元素,想要执行遍历,那么针对这个集体的迭代器定义了遍历集体中每一个元素的顺序或方法

在python中迭代器是遵循迭代协议的对象
使用iter()可从任何序列对象中得到迭代器 若要实现迭代器,需要在类中定义next()方法(python3中是__next__())
要使得迭代器指向下一个元素,则使用成员函数next()
在python,是函数next(),而非成员函数 当没有元素时,则引发StopIteration异常

for循环可用于任何可迭代对象 for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象含有需要的next方法

#这里显示的是内存对象通过i2.next()调用就好

 1 #基于迭代器协议
2 li = [1,2,3]
3 diedai_l = li.__iter__()
4 print(diedai_l.__next__())
5 print(diedai_l.__next__())
6 print(diedai_l.__next__())
7 # print(diedai_l.__next__()) # 超出边界报错
8
9 #下标
10 print(li[0])
11 print(li[1])
12 print(li[2])
13 # print(li[3]) # 超出边境报错
14
15 # 用while循环模拟for循环机制
16 diedai_l = li.__iter__()
17 while True:
18 try:
19 print(diedai_l.__next__())
20 except StopIteration:
21 print("迭代完毕,循环终止")
22 break
23
24 # for循环访问方式
25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法
26 # 或者直接diedai_l=iter(l),然后依次执行diedai_l.__next__(),直到捕捉到
27 # StopItearation终止循环
28 # for循环所有的对象的本质都是一样的原理

iter和next实例

yield作用是创建一个生成器对象,函数中使用yield,会返回一个生成器对象

产生偏移和元素 range可在非完备遍历中用于生成索引偏移,而非偏移处的元素 如果同时需要偏移索引和偏移元素,则可以使用enumerate()函数 此内置函数返回一个生成器对象

>>> url= 'www.baidu.com'
>>> enumerate(url) #发现是个内存对象证明这个内置函数是一个生成器对象
<enumerate object at 0x000000000217D3A8>
>>> g1 = enumerate(url)
>>> g1.next()
(0, 'w')

生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器函数 #生成器本身是迭代器

#yield的功能: 1.与return类似,都可以返回值,但不一样的地方,yield可以返回多次值,而return只能返回一次。

2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器

3.遵循迭代器的取值方式obj.next(),触发的是函数的执行,函数暂停与在继续的状态都是由yield保存

如果在函数中调用yield方法会返回一个生成器对象

 def foo():
print("开始啦")
first = yield # return 1 first = None
print("第一次",first)
yield 2
print("第二次")
t = test()
print(test().__next__())
res = t.__next__() # next(t)
print(res)
res = t.send("函数停留在first那个位置,我就是给first赋值的")
print(res) 输出结果
开始啦
None
开始啦
None
第一次 函数停留在first那个位置,我就是给first赋值的
2

yield函数

 

python 生成器和迭代器的更多相关文章

  1. python 生成器和迭代器有这篇就够了

    本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简 ...

  2. 【转】python 生成器和迭代器有这篇就够了

    总结得特别好,转自:https://www.cnblogs.com/wj-1314/p/8490822.html 本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个 ...

  3. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  4. python 生成器,迭代器,闭包,装饰器

    1.生成器,迭代器,闭包,装饰器的优点 生成器就是一类特殊的迭代器 迭代器的优点也即生成器的优点: 1.节约内存.python在使用生成器时对延迟操作提供了支持. 2.迭代到下一次的调用时,所使用的参 ...

  5. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  6. Python生成器、迭代器、可迭代对象

    把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.gener ...

  7. Python生成器,迭代器,可迭代对象

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  8. python 生成器和迭代器介绍

    在正式接触生成器之前,我们先来了解一些概念 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个迭代获取,可以用in.not in关键字判断元素是否包含在容器中. ...

  9. python 生成器与迭代器(yield 用法)

    背景 首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧. 我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的: '''这种方式计算fib ...

随机推荐

  1. 才趟过的一个坑,css造成的Validform表单提交按钮点击无效

    最近入手的一个项目,在开发的过程中,遇到了一个以前没遇到过的问题,废了半天的功夫才弄懂原因,留下足迹,警醒后人,下面开始讲故事啦! 在一个昏天暗地的上午,我一个人照常坐在办公室安静的工作中!项目编码已 ...

  2. Project Euler:99 Largest exponential C++

    Comparing two numbers written in index form like 211 and 37 is not difficult, as any calculator woul ...

  3. 04面向对象编程-02-原型继承 和 ES6的class继承

    1.原型继承 在上一篇中,我们提到,JS中原型继承的本质,实际上就是 "将构造函数的原型对象,指向由另一个构造函数创建的实例". 这里,我们就原型继承的概念,再进行详细的理解.首先 ...

  4. python入门之一python安装及程序运行

    Python 程序要运行,需要先安装python解释器 PVM(这里可对照java的JVM来理解)实际上,你不需要单独安装,直接安装python后就可以了 1.安装python 下载地址:http:/ ...

  5. Hibernate由model类自动同步数据库表结构

    在开发中遇到了个问题,每次测试数据库增加表结构的时候,本地pull下最新代码导致启动报错,上网搜了快速解决办法---->hibernate 配置属性中,hibernate.hbm2ddl.aut ...

  6. Python循环列表删除元素问题

    有人会遇到这种问题,遍历列表,想删除列表中的某几个元素,执行后发现有些并没有删除到, 比如以下代码 a=[1,2,3,4,5,6]print(a) for i in a: if i==3 or i== ...

  7. React——props的使用以及propTypes

    组件的props是只读的,组件不能修改自己的props,在React中,组件可以接受任意的props,如函数,对象,基本类型以及react元素 一.props的使用 1.一些组件并不需要知道自己的ch ...

  8. [AHOI2001]质数和分解

    [AHOI2001]质数和分解 题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形 ...

  9. UI自动化测试简介及Selenium工具的介绍和环境搭建

    自动化测试简介 1.1何为自动化测试? 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程.换言之,就是以程序实现的方式来代替手工测试. 1.2自动化测试分类 分为功能自动化测 ...

  10. 关于 HashTable

    hashTable 的一些认识: 底层使用散列表,存贮键值对,键值非null 使用synchronize 保证线程安全 (线程安全) ■全局变量 //The hash table data. //底层 ...