迭代器

 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. String s = new String("xyz");创建了几个字符串对象?

    两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象.

  2. Ribbon负载均衡能干什么?

    (1)将用户的请求平摊的分配到多个服务上 (2)集中式LB即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至 ...

  3. springmvc对前台参数的接收

    一.基本数据类型的接收 代码: @RequestMapping("/selectRegion") public BaseResult<?> method(String ...

  4. jQuery--事件案例(鼠标提示)

    1.文字提示 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  5. windows服务器下frp实现内网穿透

    一.操作步骤 1.服务器:首先在服务器上解压到相应目录并配置frps.ini文件如下: 2.服务器:按下windows+R输入cmd进入命令窗口,进入到安装目录下运行frps.exe -c frps. ...

  6. Java 线程数过多会造成什么异常?

    1.线程的生命周期开销非常高 2.消耗过多的 CPU 资源 如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置.大量空 闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争  ...

  7. 学习Apache(二)

    反向代理负载均衡之APACHE 一.反向代理1.1 介绍反响代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将 ...

  8. CSS3新特性的概述

    CSS3的新特性大致分为以下六类 1.CSS3选择器 2.CSS3边框与圆角 3.CSS3背景与渐变 4.CSS3过渡 5.CSS3变换 6.CSS3动画 下面分别说一说以上六类都有哪些内容 CSS3 ...

  9. Hibernate快速上手

    一. Hibernate介绍 1. Hibernate简介 Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层 ...

  10. 体验了一把最近很火的开源项目-MASA Blazor

    前言 很惭愧直到去年底才接触到Blazor.那什么是Blazor呢?相信大家都看过官方文档的详细说明,另外MASA团队也有不错的说明介绍 .用官方的话说Blazor是一个交互式客户端Web UI的框架 ...