迭代器

 1 #迭代器定义:
2 #类中得有__iter__和__next__两个方法
3 #__iter__方法放回对象本身,即:self(是迭代器对象)
4 #__next__方法,返回下一个数据,若是没有了,要抛出一个 StopIteration异常
5
6 class Li(object):
7 def __init__(self):
8 self.counter=0
9
10 def __iter__(self):
11 return self
12 def __next__(self):
13 self.counter += 1
14 if self.counter==5:
15 raise StopIteration()
16 return self.counter
17 obj1=Li()
18
19 #测试返回迭代器对象本身,可以循环
20 #结果为:1 2 3 4
21 v1=obj1.__iter__()
22 for item in v1: #这里v1换成obj1结果一样
23 print(item)
24 #for循环首先执行迭代器对象的__iter__方法,获取到其返回值(self)
25 #然后for循环反复执行其__next__方法,每执行一次就赋值给item
26 #for循环依赖于迭代器
27
28
29
30 #测试obj1.__next__(),写几个执行几次,直到报错
31 #与obj1.__next__()等同的是自带的next(obj1)
32
33 print(dir(v1)) #dir查其方法

生成器

 1 #生成器(特殊的迭代器)
2 #编写方式和表现形式不同罢了
3 def func():
4 yield 1
5 yield [1, 2, 3, 4, ]
6 yield {'name':'Kant','age':18}
7 #创建生成器对象(内部是根据生成器类generator创造出对象),其内部也有__iter__和__next__两个方法
8 obj=func() #生成器对象
9
10 #print(next(obj))
11 for i in obj:
12 print(i) #生成上面完全一样的东西
13 #也是基于迭代器去取值
14 print(dir(obj))

可迭代对象

 1 #如果一个类中有__iter__方法且返回一个迭代器对象;则我们称这个类创建的对象为可迭代对象
2 #列表 字典 都是可迭代对象
3
4 #
5 class Li(object):
6 def __init__(self):
7 self.counter = 0
8
9 def __iter__(self):
10 return self
11
12 def __next__(self):
13 self.counter += 1
14 if self.counter == 5:
15 raise StopIteration()
16 return self.counter
17
18
19
20
21 class Foo(object):
22 def __iter__(self):
23 obj=Li()
24 return obj #return一个迭代器对象obj
25 #也可以直接写成return Li()
26
27 obj=Foo() # 创建可迭代对象obj(有__iter__方法,无__next__方法)
28 print(dir(obj))
29 for i in obj:
30 print(i)
31 #循环可迭代对象的时候,内部先执行obj.__iter__并且获取迭代器对象
32 #然后不断循环迭代器对象的__next__方法
33
34 #判断是可迭代对象还是迭代器
35 from collections.abc import Iterator,Iterable
36 #Iterator迭代器(有__iter__和__next__两个方法)
37 #Iterable是否可迭代(有__iter__并且返回一个迭代器对象)
38 v1=[1,2,3,4,] #为可迭代对象
39 print(isinstance(v1,Iterator)) #False,不是迭代器
40 print(isinstance(v1,Iterable)) #True,可以迭代
41 obj66=Li() #为迭代器对象
42 print(isinstance(obj66,Iterable)) #True,因为它也返回自身(迭代器)
43
44 #判断一个东西是否为可迭代对象
45 def judge(obj):
46 if isinstance(obj,Iterable):
47 if isinstance(obj,Iterator):
48 print('这是一个迭代器对象')
49 else:
50 print('这是一个可迭代对象')
51 else:
52 print('这个对象不可迭代')
53
54 judge(v1)
55 #这是一个可迭代对象

Python 迭代器、生成器、可迭代对象的更多相关文章

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

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...

  2. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  3. python 迭代器/生成器/迭代对象

    生成器: 带有yield的函数 迭代器:带有next 方法的对象,可以作为内建函数next的参数 迭代对象:带有__iter__方法的对象,__iter__方法返回迭代器 -------------- ...

  4. 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别

    练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...

  5. python tips:迭代器与可迭代对象

    for循环 for i in s: print(i) 在上述for循环中,不断地将s中的值赋值给i,然后打印出来.这种只针对s中元素的循环称为对s的迭代,能够迭代的s称为可迭代的. python为了实 ...

  6. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  7. python函数之可迭代对象、迭代器的判断

    怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...

  8. python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

  9. Python迭代器&生成器&装饰器

    1. 迭代器 1.1 可迭代对象(Iterator) 迭代器协议:某对象必须提供一个__next__()方法,执行方法要么返回迭代中的下一项,要么引起一个Stopiteration异常,以终止迭代(只 ...

  10. Python迭代器生成器与生成式

    Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...

随机推荐

  1. The Http request is not acceptable for the requested resource.

    一.问题来源 最近给第三方做了一个我们系统的免密登陆,开发完成本地测试没有问题,但是第三方调用免密登陆接口并跳转之后报如下错误: The Http request is not acceptable ...

  2. SpringBoot和SpringCloud?

    SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间 ...

  3. jQuery--子元素过滤

    1.子元素过滤器介绍 :nth-child 获得指定索引的孩子,从1开始 :first-child 获得第一个孩子 :last-child 获得最后一个孩子 :only-child 获得独生子 2.代 ...

  4. 如何监控 Elasticsearch 集群状态?

    Marvel 让你可以很简单的通过 Kibana 监控 Elasticsearch.你可以实时查看你 的集群健康状态和性能,也可以分析过去的集群.索引和节点指标.

  5. OGNL(Object-Graph Navigation Language)使用

    OGNL表达式:https://www.jianshu.com/p/6bc6752d11f4 Apache OGNL:http://commons.apache.org/proper/commons- ...

  6. 学习GlusterFS(三)

    glusterfs,GNU cluster file system,创始人Anand Babu Periasamy,目标:代替开源Lustre和商业产品GPFS,glusterfs是什么: cloud ...

  7. C# 正则表达式判断是否是有效的文件、文件夹路径

    C# 正则表达式判断是否是有效的文件.文件夹路径 省流 /// <summary> /// 是否有效的文件,文件夹路径 /// </summary> /// <param ...

  8. ros中关于节点、话题、服务以及自定义消息等在终端中的常用命令

    以下面的计算力图说明 节点相关常用命令 在终端中查看项目中有哪些节点命令:rosnode list 有了节点信息想要查看节点中到底发布订阅了哪些话题,作为服务端服务类型或者作为客户端需要的服务类型以上 ...

  9. 002.MEMS应用在开关电源上,实现大功率超小型化

    设计任务书 1.有关MEMS还有待具体了解 2.有关开关电源的目前难题也需要了解

  10. APICloud案例源码、模块源码、考试源码、开发工具大集合!赶快收藏

    APICloud专注于APP开发定制技术,多年来不停为开发者奉献更多的资源.此次,APICloud将以往的的资源进行更新.整合,以合集的形式分享给广大的用户. APICloud应用案例源码合集 API ...