迭代器

 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. python方面

    (113条消息) re.sub()用法的详细介绍_jackandsnow的博客-CSDN博客_re sub Python slice() 函数 | 菜鸟教程 (runoob.com) (111条消息) ...

  2. ThreadPoolTaskExecutor原理、详解及案例

    为什么要用线程池? 服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的. 构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请 ...

  3. Oracle入门基础(六)一一子查询

    SQL> --查询工资比SCOTT高的员工信息 SQL> --1. SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SA ...

  4. vue中的全局组件和局部组件的应用

    1全局组件 vue框架: https://www.vue-js.com/?tab=all 组件树 solt 内置分发组件 应用见局部组件 2局部组件 2.1局部组件的使用:生子 - 挂子 - 用子 & ...

  5. centos 7环境下安装jdk

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

  6. 学习heartbeat-05 实现web服务高可用

    一.环境介绍 说明:所有案例在虚拟机(VMware)上完成 操作系统:centos 6.5 64bit 高可用软件:heartbeat 3.0.4 Web应用服务器:apache httpd 2.2. ...

  7. 插值方法 - Newton多项式(非等距节点)

    不多话.Nowton插值多项式(非等距节点)代码: 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Mar 25 15: ...

  8. 【静态页面架构】CSS之链接和图像

    CSS架构 一.链接: 链接元素:通过使用a元素的href属性设置跳转到指定页面地址 <style> a{ color: blue; text-decoration: none; } a: ...

  9. 《深入理解ES6》笔记—— JavaScript中的类class(9)

    ES5中的近类结构 ES5以及之前的版本,没有类的概念,但是聪明的JavaScript开发者,为了实现面向对象,创建了特殊的近类结构. ES5中创建类的方法:新建一个构造函数,定义一个方法并且赋值给构 ...

  10. python-班级人员信息统计

    输入a,b班的名单,并进行如下统计. 输入格式: 第1行::a班名单,一串字符串,每个字符代表一个学生,无空格,可能有重复字符.第2行::b班名单,一串字符串,每个学生名称以1个或多个空格分隔,可能有 ...