生成器函数以及生产消费模型

1.生成器函数,即最终的输出用yield替代return,其他形式不变的函数,而且相比于return,输入yield函数不会立即停止

 1 def test():
 2     print(‘你好‘)
 3     return 10
 4 def test_1():
 5     print(‘你好‘)
 6     yield 10
 7 a = test()
 8 print(a)
 9 b = test_1()
10 print(b)    #<generator object test_1 at 0x00000000024F3570> 首次运行时不会执行任何操作,只是变成可迭代对象而已 11 print(b.__next__())  #只有在对其执行next函数操作时才会有打印值 你好 10

2.生成器函数每次执行到yield都会保留函数状态,让函数执行的光标停在当前位置

def test():
    yield 1
    yield 2
    yield 3
a = test()
print(a)   #<generator object test at 0x00000000024C3138>
print(a.__next__())   #1
print(a.__next__())   #2
print(a.__next__())   #3
print(a.__next__())   #直接报错,因为yield后面的输出只能取一次,取完在取则报错

3.相对于return,yield会保留函数当前状态,只有在调用的时候才会执行,而且一次一次的执行,不会因为一次执行全部操作而占据太大的内存导致卡机等(比如下面的代码如果100变成很大很大的数字,第一种执行方法一定会卡)

 1 def test():
 2     ret = []
 3     for i in range(100):
 4         ret.append(‘people%s‘ %i)
 5     print(ret)
 6 test()    #直接打印所有的people
 7 def test_1():
 8     for i in range(100):
 9         yield i
10 a = test_1()
11 for a1 in a:
12     print(a1)    #相比于return一次占据所有打印出people的内存,这种一个个的取显然更省内存

4.列表解析与生成器表达式:下面的代码与上面的代码意义相同,提供了一种简便表示列表的方法与生成器表达式的表示方法

a = [‘people%s‘ %i  for i in range(100)]print(a)b = (‘people%s‘ %i  for i in range(100))print(list(b))

5.send(a):重要函数,一般与yield一起操作(在yield之后输入),会将a替代yield的返回值被变量接受

def test():
    file = yield 0
    print(file)
    yield None
a = test()
print(a.__next__())
a.send(‘aini‘)

6.生产消费者模型:同时运行以下两个函数,相当于只运行一个函数(两个函数互相衔接),比其他方法更省内存(重要)

 1 import time
 2 def buy(name):
 3     print(‘卖辣条啦!‘)
 4     time.sleep(2)
 5     while True:
 6         latiao = yield
 7         time.sleep(1)
 8         print(‘%s吃了第%s包辣条‘ %(name,latiao))
 9
10 def sell():
11     s1 = buy(‘aaa‘)
12     s1.__next__()
13     for i in range(1,11):
14         s1.send(i)
15     time.sleep(3)
16     print(‘诶呀卧槽,aaa撑死啦!‘)
17 sell()

原文地址:https://www.cnblogs.com/lzjdsg/p/10180227.html

时间: 2024-10-04 20:25:41

生成器函数以及生产消费模型的相关文章

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

python学习笔记-Day11 (线程、进程、queue队列、生产消费模型、携程)

线程使用 ###方式一 import threading def f1(arg): print(arg) t = threading.Thread(target=f1, args=(123,)) t.start() # start会调用run方法执行 # t是threading.Thread类的一个对象 # t.start()就会以线程的方式执行函数,可以使用pycharm ctrl选择start方法 # 找到Thread类的start方法,在start方法的注释中就已经写明,会去调用run()

Python基础-----生成器函数(生产者消费者模型)

#!/usr/bin/env python# -*- coding:utf-8 -*- # yield x相当于return 控制的是函数的返回值# 在定义生成器函数的yield时,可以给yield赋值# x = yield的另一个特性,接收send传过来的值,赋给x# send类似于__next__()方法,不过生成器刚启动时,不能send一个不为None的值,# 所以先要运行__next__()方法现启用生成器. '''def test(): print('开始生产~~~') fir = y

队列、生产消费模型.html

一.python 队列: 概述: import queue 都是在python内存中创建,python进程退出,则队列清空 可通过pycharm查看这些队列类的方法 先进先出队列: q = queun.Queue( [10] ) # 创建一个 "先进先出" 队列,最多接受10个数据,放第11个时会卡主,不加参数默认为0,即无限多个 q.qsize() # 查看当前队列中元素个数 q.maxsize # 队列最大个数 q.put(33, [ timeout=2] ) # 等待2秒,若2秒

Python学习之路并发编程--信号量、事件、队列及生产消费模型

1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一个计数器,在同一时内,只能有指定数量的进程来执行某一段被控制的代码. import time,random from multiprocessing import Process,Semaphore def singing(i,sem): ''' :param i: 随机生成20个数的值 :para

Day9 进程同步锁 进程队列 进程池 生产消费模型

进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. 1 from multiprocessing import Process,Lock #引用函数 2 import time 3 def work(name,mutex): 4 mutex.acquire() #在这里加入锁 5 print('task <%s> is runing' %name) 6

JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/ 前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先把界面弄好啦 1 public class BallUI extends JPanel { 2 3 private ArrayList<Ball> li = new ArrayList<Ball>(); 4 5 public static void main(String[] args

生产消费模型

import time def comsumer(): need = input("请问需要多少包子:") return need def producer(n): res = [] for i in range(1,n+1): time.sleep(0.2) res.append('包子%s' %i) return res while True: n = int(comsumer()) m = producer(n) print(m,'\n这是您的%s个包子,请收好,欢迎下次光临'