迭代器

 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. SpringBoot和SpringCloud的区别?

    SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个微服务之间提供 ...

  2. 如何获取 topic 主题的列表?

    bin/kafka-topics.sh --list --zookeeper localhost:2181

  3. jvm-learning-类加载器分类

    public class ClassLoaderTest { public static void main(String[] args) { //获取系统类加载器 ClassLoader syste ...

  4. JdbcTemplate ?

    JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据 类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处 理.

  5. 解释 Java 堆空间及 GC?

    当通过 Java 命令启动 Java 进程的时候,会为它分配内存.内存的一部分用于 创建堆空间,当程序中创建对象的时候,就从对空间中分配内存.GC 是 JVM 内 部的一个进程,回收无效对象的内存用于 ...

  6. centos 7环境下安装jdk

    在此之前已经安装了xshell并能传输文件. 1.下载对应版本的jdk:jdk-8u191-linux-x64.tar.gz 2.上传到centos的目录下 3.解压jdk的gz包,命令: tar - ...

  7. ROS机器人操作系统相关书籍、资料和学习路径

    作者:Top Liu链接:https://zhuanlan.zhihu.com/p/30391098来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文是易科机器人实验 ...

  8. HTML5与类有关的扩充

    对于传统HTML而言,HTML5是一个叛逆.所有之前的版本对JavaScript接口的描述都不过三言两语,主要篇幅都用于定义标记,与JavaScript相关的内容一概交由DOM规范去定义. 而HTML ...

  9. github账号&文章选题

    ----------------------------------------------------------- https://github.com/yanpanjiao     github ...

  10. vue引入swiper

    https://github.com/surmon-china/vue-awesome-swiper/blob/master/examples/03-pagination.vue https://su ...