Py迭代和迭代器,生成器,生产者和消费者模型
迭代器iter
1.迭代的含义:
一个人不知道他就说第二个人知道,然后去找第二个人。第二个人不知道
就说第三个人知道,然后去找第三个人
2.递归的含义:
不知道就第二个人问第三个,还不知道就第三个人问第四个。如果第四
个知道了就告诉第三个,第三个告诉第二个,一直反复
然后告诉给原来问路的那个人
3.迭代器协议:
对象必须要提供一个next的下一步的方法。就像生孩子传宗接代一样,要按着
一个方法一代接一代下去,也有可能会出现异常,终止迭代。(只能接着往下
走没有后退的路)
4.可迭代对象:实现了迭代器协议的对象。
5.for循环只能遍历可迭代对象。
(字符串,列表,元组,字典,集合,文件对象)这些其实不是可迭代对象,因为
他们没有.next的附加方法,但是在for调用他们的时候,调用了他们内部的__iter__
方法,把他们都变成了可迭代对象。
x='hello' #变字符串的成可迭代
diedai = x.__iter__()
print(diedai.__next__()) #本句也可以改成print(next(diedai))
print(diedai.__next__())
dic={'a':1,'b':2} #变字典的成可迭代
died=dic.__iter__()
print(died.__next__())
print(died.__next__())
died1=dic.values().__iter__()
print(died1.__next__())
print(died1.__next__())
生成器
1.生成器定义:
,不用执行iter方法,它本身就是可迭代对象。它可以直接用.next()。生成器很
节省内存,next()显示下一个之后上一个会被删掉。
2.生成器在python内有两种表达方式
第一种:
器函数。
def test():
yield 1
yield 'sb'
yield 'nt'
g=test()
print(g.__next__())
print(g.__next__())
第二种:生成器表达式
首先需要了解三元表达式
name='alex'
res='sb' if name == 'alex' else 'shuai' #本句为3元表达式
#如果名字是alex就把sb赋值给res,if的结果写在前面,而else的结果帅写后面
print(res)
还需要了解一下列表解析
#列表解析
egglist=[] #建立一个空的列表
for i in range(10):
egglist.append('鸡蛋%s' %i)
print(egglist)
#接下来用列表解析优化
l=['鸡蛋%s' %i for i in range(10)]
#用列表解析和三元表达式弄出标签大于5的鸡蛋
l1=['鸡蛋%s' %i for i in range(10) if i>5]
print(l)
print(l1)
接下来来说生成器表达式
laomuji=('鸡蛋%s' %i for i in range(10))
#此时laomuji就已经是生成器表达式,可迭代对象
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
实例:现做现卖包子
#使用__next__()是走到yield的位置就跳出,下一次next从当前跳出位置开始
def product_baozi():
for i in range(1,100): #循环做包子
print('正在生产包子')
yield '第 %s 个包子' %i #第一次调用next来到这跳出,下一次next调用从这开始
print('开始卖包子')
pro_g=product_baozi()
print(pro_g.__next__())
print(pro_g.__next__())
print(pro_g.__next__())
实例2:统计出字典中的每个地方的人口占据的人口比例
{'name':'北京','population':'10'}
{'name':'山东','population':'1000'}
{'name':'山西','population':'30010'}
{'name':'河北','population':'15200'}
{'name':'台湾','population':'750'}
程序:
#采用readline函数进行实现 算出人口比例
f=open('人口','r',encoding='utf8')
ret1=[]
ret=[]
i=0
i1=0
while i<5:
ret=eval(f.readline())
ret1.append(int(ret['population']))
i=i+1
qiuhe=sum(ret1)
print(qiuhe)
while i1<5:
print('%s %%' %(ret1[i1]/qiuhe))
i1=i1+1
#采用生成器来做
def getpopulation():
f=open('人口','r',encoding='utf8')
for i in f:
yield i
g=getpopulation()
qiuhe=0
qiuhe=sum(int(eval(i1)['population']) for i1 in g) #先看右边生成器迭代取每列,然后
print(qiuhe) #看左边把每列转换字符串,取人口,变数字型
g=getpopulation()
for p in g:
pnumber=int(eval(p)['population'])
print(pnumber/qiuhe)
生产消费者模型:
采用生成器yield可以达到这个效果
1.首先需要了解启动生成器的第三种方法
之前只学过__next__和next()两种方法,还有一种方法用send
# def test():
# print('开始了')
# yield 1
# print('第一次')
# yield 2
# t=test()
# t.send(None) #用none的话和t.__next__()没区别
#send的优势是可以将一个值赋值给yield的那一行位置的形参
def test1():
print('开始了')
shit=yield 1
print('第一次',shit)
fuck=yield 2
print('第2次')
print(fuck)
yield 3
t=test1()
t.send(None) #光标运行至yield1
res2=t.send('m870') #此时m870将传递给yield1然后传给shit,而且光标将运行到yield2
t.send('m8') #当前光标在yield2,传m8给yeild2给fuck,而且光标运行到yield3
print('\n')
print(res2) #而且可以通过res2来接收yield的ruturn值
2.接下来来看并发的生产消费模型
import time
def consumer(name):
print('我是%s,我准备开始吃包子' %name)
while 1:
time.sleep(1)
print('包子生产好了')
baozi=yield
print('我是%s,我开始吃%s包子' %(name,baozi))
def producer(name,eattime):
c1=consumer(name) #启动生成器
c1.__next__() #光标移动至yield
for i in range(eattime):
time.sleep(1)
c1.send('第%s个屎馅' %i) #将屎馅传给yield传给baozi,因为while一直循环,光标到下一次yeild
producer('沙比',3)
Py迭代和迭代器,生成器,生产者和消费者模型的更多相关文章
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- 生产者和消费者模型producer and consumer(单线程下实现高并发)
#1.生产者和消费者模型producer and consumer modelimport timedef producer(): ret = [] for i in range(2): time.s ...
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
1.简单的小例子: 下面这个例子主要观察的是: 一个对象的wait()和notify()使用情况! 当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对 ...
- Python之生产者&、消费者模型
多线程中的生产者和消费者模型: 生产者和消费者可以用多线程实现,它们通过Queue队列进行通信. import time,random import Queue,threading q = Queue ...
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...
- Spring MVC 使用介绍(七)—— 注解式控制器(三):生产者与消费者模型
一.MIME类型 MIME类型格式:type/subtype(;parameter)? type:主类型,任意的字符串,如text,如果是*号代表所有 subtype:子类型,任意的字符串,如html ...
- 守护进程,互斥锁,IPC,队列,生产者与消费者模型
小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...
- python queue和生产者和消费者模型
queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...
- python并发编程之守护进程、互斥锁以及生产者和消费者模型
一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...
- 人生苦短之我用Python篇(队列、生产者和消费者模型)
队列: queue.Queue(maxsize=0) #先入先出 queue.LifoQueue(maxsize=0) #last in fisrt out queue.PriorityQueue( ...
随机推荐
- Centos上配置nginx+uwsgi+负载均衡配置
负载均衡在服务端开发中算是一个比较重要的特性.因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理后端,Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以 ...
- Python:大神用的贼溜的实用技巧分享
整理字符串输入 整理用户输入的问题在编程过程中极为常见.通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作.但是如果问题很复杂,可能有更好的方法来解决: ...
- 怎样用Python自制好看的指数估值图
对于以定投指数的方式理财的朋友,最需要关注的指标便是各个指数的估值,在指数低估时买入,高估时卖出,那如何制作一张估值图来跟踪指数的估值情况呢?本文就从0到1介绍如何用 Matplotlib 画一张漂亮 ...
- MySQL 存储函数的创建、调用、查找
MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数 1.创建存储函数:使用 create function关键字 2.调用存储函数: 3.示例: ...
- xxfpmW 的诞生过程
最近因为在win 服务器搭建php服务,发现php-cgi.exe 很容易崩溃,看cpu和硬盘都没有暴涨,也不知道啥原因,网上查发现有一款xxfpm 小应用可以解决这个问题,但这个应用是2011年开发 ...
- 22. Generate Parentheses生成指定个括号
生成指定个数的括号,这些括号可以相互包括,但是一对括号的格式不能乱(就是配对的一个括号的左括号要在左边,右括号要在右边) 思维就是从头递归的添加,弄清楚什么时候要添加左括号,什么时候添加右括号 有点像 ...
- [leetcode]203. Remove Linked List Elements链表中删除节点
这道题很基础也很重要 重点就是设置超前节点 public ListNode removeElements(ListNode head, int val) { //超前节点 ListNode pre = ...
- 首秀:Markdown学习笔记
# Markdown学习 ## 标题 ### 三级标题 #### 四级标题 ## 字体 **Hello,World!** *Hello,World!* ***Hello,World!*** ~~Hel ...
- [ABP教程]第一章 创建服务端
Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...
- 对数几率回归(逻辑回归)原理与Python实现
目录 一.对数几率和对数几率回归 二.Sigmoid函数 三.极大似然法 四.梯度下降法 四.Python实现 一.对数几率和对数几率回归 在对数几率回归中,我们将样本的模型输出\(y^*\)定义 ...