具体文章:ALEX的文章 https://www.cnblogs.com/alex3714/articles/5765046.html

串行的并行效果:

 import time

 def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield print("[%s]包子来了,被[%s]吃了!" %(baozi,name)) # c = consumer("小胡胡") #已经变成生成器,接下来每一步都要用next
# c.__next__()
# a1= "鸡肉馅"
# c.send(a1)
# c.__next__() def producer(name):
c = consumer('A') #已经变成迭代器,接下来都要用next
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(15):
a = ['茴香鸡蛋','茴香肉','韭菜鸡蛋','韭菜肉','白菜粉条鸡蛋','白菜肉','猪肉大葱',\
'牛肉大葱','羊肉胡萝卜','猪肉芹菜','猪肉菠菜','鸡蛋菠菜韭菜','纯肉馅','香菇肉','酸菜馅']
time.sleep(1)
print("[%s]做了1个\033[31;1m[%s]包子\033[0m,分两半一人一半!"%(name,a[i]))
c.send(a[i])
c2.send(a[i]) producer("Tiger")

运行结果:

 A 准备吃包子啦!
B 准备吃包子啦!
老子开始准备做包子啦!
[Tiger]做了1个[茴香鸡蛋]包子,分两半一人一半!
[茴香鸡蛋]包子来了,被[A]吃了!
[茴香鸡蛋]包子来了,被[B]吃了!
[Tiger]做了1个[茴香肉]包子,分两半一人一半!
[茴香肉]包子来了,被[A]吃了!
[茴香肉]包子来了,被[B]吃了!
[Tiger]做了1个[韭菜鸡蛋]包子,分两半一人一半!
[韭菜鸡蛋]包子来了,被[A]吃了!
[韭菜鸡蛋]包子来了,被[B]吃了!
[Tiger]做了1个[韭菜肉]包子,分两半一人一半!
[韭菜肉]包子来了,被[A]吃了!
[韭菜肉]包子来了,被[B]吃了!
[Tiger]做了1个[白菜粉条鸡蛋]包子,分两半一人一半!
[白菜粉条鸡蛋]包子来了,被[A]吃了!
[白菜粉条鸡蛋]包子来了,被[B]吃了!
[Tiger]做了1个[白菜肉]包子,分两半一人一半!
[白菜肉]包子来了,被[A]吃了!
[白菜肉]包子来了,被[B]吃了!
[Tiger]做了1个[猪肉大葱]包子,分两半一人一半!
[猪肉大葱]包子来了,被[A]吃了!
[猪肉大葱]包子来了,被[B]吃了!
[Tiger]做了1个[牛肉大葱]包子,分两半一人一半!
[牛肉大葱]包子来了,被[A]吃了!
[牛肉大葱]包子来了,被[B]吃了!
[Tiger]做了1个[羊肉胡萝卜]包子,分两半一人一半!
[羊肉胡萝卜]包子来了,被[A]吃了!
[羊肉胡萝卜]包子来了,被[B]吃了!
[Tiger]做了1个[猪肉芹菜]包子,分两半一人一半!
[猪肉芹菜]包子来了,被[A]吃了!
[猪肉芹菜]包子来了,被[B]吃了!
[Tiger]做了1个[猪肉菠菜]包子,分两半一人一半!
[猪肉菠菜]包子来了,被[A]吃了!
[猪肉菠菜]包子来了,被[B]吃了!
[Tiger]做了1个[鸡蛋菠菜韭菜]包子,分两半一人一半!
[鸡蛋菠菜韭菜]包子来了,被[A]吃了!
[鸡蛋菠菜韭菜]包子来了,被[B]吃了!
[Tiger]做了1个[纯肉馅]包子,分两半一人一半!
[纯肉馅]包子来了,被[A]吃了!
[纯肉馅]包子来了,被[B]吃了!
[Tiger]做了1个[香菇肉]包子,分两半一人一半!
[香菇肉]包子来了,被[A]吃了!
[香菇肉]包子来了,被[B]吃了!
[Tiger]做了1个[酸菜馅]包子,分两半一人一半!
[酸菜馅]包子来了,被[A]吃了!
[酸菜馅]包子来了,被[B]吃了!

迭代器

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list列表tuple元组dict字典set集合str字符串等;

一类是generator(生成器),包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

 >>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

小结

  1. 凡是可作用于for循环的对象都是迭代对象类型;
  2. 凡是可作用于next()函数的对象都是迭代器类型,它们表示一个惰性计算的序列,不运行就不执行;
  3. 集合数据类型如listdictstr等是迭代对象但不是迭代器,不过可以通过iter()函数获得一个迭代器对象。

并行效果&迭代器的更多相关文章

  1. R︱foreach+doParallel并行+联用迭代器优化内存+并行机器学习算法

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 接着之前写的并行算法paralle ...

  2. python迭代器生成器

    1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...

  3. Python学习笔记九:装饰器,生成器,迭代器

    装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...

  4. python笔记-4(装饰器、生成器、迭代器)

    一.熟练掌握装饰器的原理 (在装饰器学习的过程中,查了看了很多资料,个人感觉走了很多的弯路,这个笔记,分享我的理解,希望能帮助到一些人.本文对装饰器的描述,侧重点是条理与逻辑思路,想通过从无到有的方式 ...

  5. 【python】-- 装饰器、迭代器、生成器

    装饰器 装饰器本质是函数,是用来装饰其他函数,顾名思义就是,为其他的函数添加附件功能的. 一.装饰器原则: 不能修改被装饰函数的源代码 不能修改被装饰函数的调用方式 def logging(): pr ...

  6. Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  7. Day4-Python3基础-装饰器、迭代器

    今日内容: 1.高阶函数 2.嵌套函数 3.装饰器 4.生成器 5.迭代器 1.高阶函数 定义: a:把一个函数名当作实参传给函数 a:返回值包含函数名(不修改函数的调用方式) import time ...

  8. Iterator(迭代器)-对象行为型模式

    1.意图 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 2.别名 Cursor-游标. 3.动机 一个聚合对象,应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的 ...

  9. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

随机推荐

  1. Eqaulize Prices

    There are n products in the shop. The price of the ii-th product is aiai. The owner of the shop want ...

  2. Java下载文件时文件名中的中文变成下划线,其他正常

    将 utf-8 转换成 ISO8859-1 编码 response.addHeader("Content-Disposition", "attachment;filena ...

  3. 利用ansible-playbook一键部署ELK(ElasticSearch,logstash and kibana)

    一.部署前环境介绍: es集群5台(es01,es02,es03,es04,es05),logstash服务器1台(logstash2),kibana服务器1台(kibana2),模拟apache服务 ...

  4. CTF_论剑场 头像

    首先打开链接发现这个链接是一个头像 然后下载这个头像 通过hxd分析一下 在编辑中查找 flag 然后发现flag是一个用base64 加密的一串文字 然后我们将这串文字 解密 然后再通过md5 32 ...

  5. mysql 随笔

    (select GROUP_CONCAT(car_brand_name separator ',') carBrandName,supplier_id from ycej_supplier_carbr ...

  6. 关于反射中如何剔除实体类中serialVersionUID字段

    Field[] fields = t.getClass().getDeclaredFields(); //这里为了剔除serialVersionUID Field[] tempArr = new Fi ...

  7. 优酷1080p的kux格式文件怎么转换为MP4格式?

    直接使用优酷自己的FFMPEG解码! 格式为:"优酷ffmpeg.exe的安装地址" -y -i ".kux文件储存地址" -c:v copy -c:a cop ...

  8. Go_file操作

    1. FileInfo package main import ( "os" "fmt" ) func main() { /* FileInfo:文件信息 in ...

  9. .NET core 部署到Docker +Docker Protainer管理实现

    .NET core 部署到Docker +Docker Protainer管理实现 上次说到将.net core的应用程序发布到Linux中(https://www.cnblogs.com/Super ...

  10. GitBook的账号注册和安装使用(一)

    1.GitBook账号注册 GitBook原注册地址  https://legacy.gitbook.com/join 改为: https://www.gitbook.com/ (1)注册账号:htt ...