python(可迭代对象,迭代器,生成器及send方法详解)
一.可迭代对象
对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象,
像列表,元祖,字典等都是可迭代对象
可使用isinstance(obj,Iterable)方法判断
from collections import Iterable,Iterator
l={'':2,'fd':5,'f':6}
l_i=l.__iter__() print(isinstance(l,Iterable))
print(isinstance(l_i,Iterator))
结果:
True
True
二.迭代器
迭代器协议:
对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
符合迭代器协议的就是迭代器。
一个对象是迭代器也是可迭代对象。
from collections import Iterable,Iterator
l={'2':2,'fd':5,'f':6}
l_i=l.__iter__()
s=isinstance(l,Iterable)
print(s)
print(isinstance(l_i,Iterator))
打印结果:
True
True
三.生成器
遵循迭代器协议,相当于一种特殊的迭代器对象
1.生成器表达式
(1)三元表达式(必须是三元)
name = '李'
res='儿子' if name == '李' else '爸爸'
print(res)
打印结果:
儿子
(2)列表解析
所谓列表解析就是列表内包含两元或三元表达式(不能是四元)
l=['蚂蚁%s' %i for i in range(10)]
l1=['蚂蚁%s' %i for i in range(10) if i >5]
print(l)
print(l1)
打印结果:
['蚂蚁0', '蚂蚁1', '蚂蚁2', '蚂蚁3', '蚂蚁4', '蚂蚁5', '蚂蚁6', '蚂蚁7', '蚂蚁8', '蚂蚁9']
['蚂蚁6', '蚂蚁7', '蚂蚁8', '蚂蚁9']
一行代码写出9*9乘法表:
print('\n'.join([' '.join(["%dX%d=%-2d" %(i,m,m*i) for i in range(1,m+1)]) for m in range(1,10)]))
原理:.join()方法处理的结果是一个整体的字符串
(3)生成器表达式
l=['蚂蚁%s' %i for i in range(10)]#列表
l=('蚂蚁%s' %i for i in range(10))#生成器表达式
和列表相比不占用内存,使用一次生成一次
l=('蚂蚁%s' %i for i in range(10))
print(l)
print(l.__next__())
print(l.__next__())
print(next(l))
print(next(l))
运行结果:
<generator object <genexpr> at 0x000002191AFB5BA0>
蚂蚁0
蚂蚁1
蚂蚁2
蚂蚁3 2.生成器函数
优点:
不会立即执行,节省内存。
有需要时用一个现运行出一个,yield会保留当前状态,下次从当前位置继续运行,直到再次碰到yeild。
对比两个过程理解:
过程一(做出一个卖一个,即调用一次现运行出来一个结果)
def product_baozi():
for i in range(100):
print('正在生产包子%s' %i)
yield '一屉包子%s' %i #i=1
print('开始卖包子')
pro_g=product_baozi()
baozi1=pro_g.__next__()
运行结果:
正在生产包子0
过程二:(调用第二次,现运行出来第二个结果)
def product_baozi():
for i in range(100):
print('正在生产包子%s' %i)
yield '一屉包子%s' %i #i=1
print('开始卖包子')
pro_g=product_baozi() baozi1=pro_g.__next__()
baozi1=pro_g.__next__()
打印结果:
正在生产包子0
开始卖包子
正在生产包子1
3.生成器特性
特性一:for循环可以遍历生成器
def eges():
for i in range(5):
yield '鸡蛋%s' %i #i=1
pro_g=eges() for i in pro_g:
print(i)
特性二:生成器只能迭代一次,用完就没了。
with open('人口普查','r',encoding='utf-8') as f:
def g_population():
for i in f:
yield i
print(sum(eval(l)['population'] for l in g_population()))
print(g_population().__next__()) #此句会抛出异常
4.利用生成器实现单线程并发
send()方法,
有一个参数,该参数指定的是上一次被挂起的yield语句的返回值,
并且再次遇到yeild会向send传回一个值。
实例:饭店吃饭
import time
def consetomer():
print('服务员点餐')
time.sleep(5)
for i in range(5):
cai=yield i #接受send的传值,并向下执行,直到结束或遇到下一个yield(此时的yield会向send传回一个值)
print('顾客开始吃第%s个菜' %cai) def canting():
g1=consetomer()
print(g1.__next__())
print('厨师准备做菜')
for i in range(1,5):
time.sleep(1)
print('第%s个菜做好了' %i)
print('第%s个好吃' %g1.send(i)) #传送上一次挂起的yield并等待接受下一次yeild返回值
canting()
打印结果:
服务员点餐
0
厨师准备做菜
第1个菜做好了
顾客开始吃第1个菜
第1个好吃
第2个菜做好了
顾客开始吃第2个菜
第2个好吃
第3个菜做好了
顾客开始吃第3个菜
第3个好吃
第4个菜做好了
顾客开始吃第4个菜
第4个好吃
python(可迭代对象,迭代器,生成器及send方法详解)的更多相关文章
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- Python学习之旅—生成器对象的send方法详解
前言 在上一篇博客中,笔者带大家一起探讨了生成器与迭代器的本质原理和使用,本次博客将重点聚焦于生成器对象的send方法. 一.send方法详解 我们知道生成器对象本质上是一个迭代器.但是它比迭代器对 ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- Python--可迭代对象,迭代器,生成器
记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...
- 闭包在python中的应用,translate和maketrans方法详解
python对字符串的处理是比较高效的,方法很多.maketrans和translate两个方法被应用的很多,但是具体怎么用常常想不起来. 让我们先回顾下这两个方法吧: 1.s.translate(t ...
- Object对象的浅拷贝与深拷贝方法详解
/* ===================== 直接看代码 ===================== */ <!DOCTYPE html> <html> <head& ...
- Python入门之获取当前所在目录的方法详解
#本文给大家讲解的是使用python获取当前所在目录的方法以及相关示例,非常的清晰简单,有需要的小伙伴可以参考下 sys.path 模块搜索路径的字符串列表.由环境变量PYTHONPATH初始化得到. ...
随机推荐
- 并发编程之多线程(Java)
一.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是 ...
- ThinkPHP5通过composer安装Workerman安装失败问题(避坑指南)
$ composer require topthink/think-workerUsing version ^2.0 for topthink/think-worker./composer.json ...
- ES6入门之Promise对象
1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...
- 什么是ECMAScript、什么又是ECMA?
转载:针对于ECMA5Script .ECMAScript6.TypeScript的认识 什么是ECMAScript.什么又是ECMA? Ecma国际(Ecma International)是一家国际 ...
- 年薪500K工程师告诉你,python都能用来做什么?
一提到python,大家脑袋中都会想到「数据分析」.「爬虫」.「人工智能」这些词. 其实python并没有像如上所说的这样「专业」.「高深」的应用,对于初学者来说更是可以从一些超简单又有趣的小项目开始 ...
- B-经济学-基尼指数
目录 基尼指数 一.基尼指数简介 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/ni ...
- session,cookie,sessionStorage,localStorage的相关设置以及获取删除
一.cookie 什么是 Cookie? "cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScrip ...
- .NET GC垃圾回收器
GC垃圾回收器简介 全名: Garbage Collector 原理: 以应用程序的根(root)为基础,遍历应用程序堆(heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡 ...
- 探讨Microsoft Solution Framework(MSF)框架下管理的秘密
hello,同学们,同胞们,同志们,同龄们,这样们,那样们,们们们,我又回来写“论文”了,半年时间没见我发布任何博文,是不是认为我被潜规则了啊,哈哈.我想死你们了.好了,废话不多说,进入今天主题: ...
- phpstorm格式设置不同导致的Git代码无法正常比较
多人开发代码,使用Git作为管理工具,遇到一个问题是 : IDE的格式设置不一样导致的整个文件无法正常的比较. window 和 linux 以及 mac 不同平台的换行符是导致这一个问题比较常见的原 ...