可迭代对象

可迭代对象类型:list,dict,tuple,str,set,deque等

如何判断一个对象是否是可迭代对象,可以通过dir()方法看它里面有没有__iter__方法,如果有这个方法就是可迭代对象。

迭代器对象

上述的可迭代对象类型都不是迭代器,那什么是迭代器?

迭代器对象相对可迭代对象无非就是多了个__next__方法。

所以迭代器是在可迭代的基础上实现的。要创建一个迭代器,我们首先得有一个可迭代对象。

现在就来看看,如何创建一个可迭代对象,并以可迭代对象为基础创建一个迭代器。

from collections.abc import Iterable, Iterator, Generator

class Aiterable(object):
def __init__(self, num):
self.start = num def __iter__(self):
return Aiterator(self.start) # 返回一个迭代器 class Aiterator(object):
def __init__(self, start):
self.start = start def __iter__(self):
return self def __next__(self):
if self.start > 0:
self.start = self.start-1
return self.start
raise StopIteration if __name__ == '__main__':
a = Aiterable(5)
print(isinstance(a,Iterable)) # True
print(isinstance(a,Iterator)) # False
t = Aiterator(5)
print(isinstance(t,Iterator)) # True 正式因为Aiterator里面有__next__方法
iter = iter(a)
print(isinstance(iter,Iterator)) # True
print(iter.__next__())
print(iter.__next__())
print(iter.__next__())
print(iter.__next__())

for循环的过程就是将可迭代对象转换为迭代器对象,再不断调用__next__方法

生成器

生成器是在迭代器的基础上,再实现了yield

生成器的创建方式有两种

  • 列表生成式
L = (x*x for x in range(10))
print(isinstance(L,Generator)) # True
  • 实现yield函数
# 实现了yield的函数
def mygen(n):
now = 0
while now < n:
yield now
now += 1 if __name__ == '__main__':
gen = mygen(10)
print(isinstance(gen, Generator)) # True

生成器的激活/运行方式有两种

  • 使用next()
  • 使用gengerator.send(None)

示例:

def mygen(n):
now = 0
while now < n:
yield now
now += 1 if __name__ == '__main__':
gen = mygen(4) # 通过交替执行,来说明这两种方法是等价的。
print(gen.send(None))
print(next(gen))
print(gen.send(None))
print(next(gen))

生成器的执行状态

  • GEN_CREATED 等待开始执行
  • GEN_RUNNING 解释器正在执行(只有在多线程应用中才能看到这个状态)
  • GEN_SUSPENDED 在yield表达式处暂停
  • GEN_CLOSED 执行结束

示例:

from inspect import getgeneratorstate

def mygen(n):
nums = 0
while nums < n:
yield nums
nums += 1
raise StopIteration # 注意自己编写生成器时要在结束时抛stop异常 if __name__ == '__main__':
gen = mygen(2)
print(getgeneratorstate(gen)) print(next(gen))
print(getgeneratorstate(gen)) print(next(gen))
gen.close() # 手动关闭/结束生成器
print(getgeneratorstate(gen))

向生成器发送消息

def mygen(n):
nums = 0
while nums < n:
# rec = yield可以接收外部程序通过send()发送的信息,并赋值给rec
rec = yield nums # yield nums是将nums return给外部调用程序。
if rec is None:
rec = 1
nums += rec
raise StopIteration if __name__=="__main__":
gen = mygen(10)
print(next(gen)) # 【坑】注意第一次一定要next或者send(None)来启动
print(gen.send(2))
print(next(gen))
print(gen.send(4)) # 输出
0
2
3
7

python 可迭代对象,迭代器,生成器的区别及使用的更多相关文章

  1. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  2. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  3. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  4. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  5. Python--可迭代对象,迭代器,生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

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

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

  7. Python可迭代对象、迭代器和生成器

    Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...

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

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

  9. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  10. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

随机推荐

  1. Docker系列(一):Docker简单介绍

    Docker简介: 多语言和框架:支持多语言和框架以及语言框架的扩展机制 多服务:开放的核心服务以及服务的扩展机制 多云和多IaaS技术:支持多种IaaS技术和多云的部署,包括公有云和私有云 Dock ...

  2. Git reset的参数

    (1) 默认的mixed参数:git reset commit_id,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段. (2) soft 参数:gi ...

  3. <Django> 高级(其他知识点)

    1. 管理静态文件 什么是静态文件? 项目中的CSS.图片.js都是静态文件 配置静态文件(settings.py) # Static files (CSS, JavaScript, Images) ...

  4. 使用vue-cli搭建vue项目简单教程

    一直没有时间来写些东西,今天就写写vue脚手架吧,初建一个vue项目. vue是近段时间来特别火的一个mvvm框架,小巧.简单.易学,如果你的前端基础还好的话,学起来挺简单的.官网地址: https: ...

  5. Mysql图解安装向导

    注:本次安装为解压缩版: 1.设置Mysql环境变量: MYSQL_HOME: D:\Java\MySql\mysql-5.7.9-winx64 PATH: %MYSQL_HOME%\bin; 2.安 ...

  6. SUMMARY | 二分查找

    package Search; public class biSearch { //标准的二分查找 public static int stdBiSearch(int[] array,int keyV ...

  7. bind()的模拟实现

    上一篇对call和apply的模拟实现做了一个梳理,可参见:模拟实现call.apply,下面将具体研究一下bind啦啦啦 1. bind和call/apply的差别 bind方法会创建一个新函数,返 ...

  8. SPOJ694 New Distinct Substrings

    New Distinct Substrings 题目大意 给定一个字符串,求本质不同的子串个数 题解 SA常见思想:每一个子串都是某个后缀的前缀 考虑每一个后缀的贡献,首先他拥有n - sa[i]个( ...

  9. DOM节点的创建、插入、删除

    值得注意的是:节点的创建.插入以及删除都是操作父级容器.(1)创建var newDiv = documnet.createElement('div'); ——创建的元素只能操作一次 (2)插入/追加a ...

  10. 迅雷 API 接口说明文档 -调用迅雷自动下载

    我们可以利用迅雷提供的开放API接口来自动下载文件.详细的接口说明大家可以看下面的. 先要说明一下的就是 迅雷的API接口是用 .com 来调用的 首先就是脚本了,各种语言写法不同,我这里提供用vbs ...