生成器&迭代器

生成器的特性
1、生成器是一个有yield关键字的函数对象,yield暂停并保存并返回调用结果
2、第一次通过next开始运行这个函数,以后每次next就从yield开始继续运行函数
3、可以用send给生成器的yield关键字传值并激活函数
'''
生成器:循环n次找出第n个元素
可以由上一个数据推算出下一个数据。
一边循环一边计算的机制叫做生成器
'''
# 列表生成式,列表的初始化[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l = [abs(i) for i in range(10)]
# 变成生成器,相当于准备了一个算法,
# 不访问不会生成数据,取数据只能通过for循环一个一个取
# 生成器有g.__next__()方法,
# 取出当前存储值的下一个值,不能往后退,
# 一次只能迈一步,不能迈大步子
g = (i*2 for i in range(10)) '''
自定义生成器
用函数实现斐波那契数列长度10
1,1,2,3,5,8,13,21,34,55..
'''
def fib(length):
n, a, b = 0, 0, 1
while(n < length):
print(b)
a, b = b, a+b
n += 1 # 把fib变为生成器
def fib(length):
n, a, b = 0, 0, 1
while(n < length):
yield b
a, b = b, a+b
n += 1
return "生成器结束"
fib_generator = fib(10)
print(fib_generator.__next__())
print(fib_generator.__next__())
# 有了生成器后可以让函数停在某个地方,
# 做点其他事之后回来继续运行
# 让主线程可以来回调用不同的函数,
# 在各个工作之间不停的切换
print("做点其他的事情.........")
for i in fib_generator:
print(i) # 让生成器运行到结束(如果能结束的话)
while True:
try:
print("斐波那契:",next(fib_generator))
except StopIteration as e:
print("生成器函数结束后的返回值:",e.value)
break
# 生成器第一次调用next方法就开始执行生成器函数,执行到yield返回给next方法。
# 第二次执行next就接着上一次的yield后执行,执行到yield又返回,依次类推
# yield的作用是暂停并记住当前状态,并返回
# 生成器中return的作用是异常的时候打印消息
通过生成器并行计算实现单线程下的异步=单线程下的并行效果=协程
协程是比线程更小的单位
因为CPU效率高,可以很快的运行和在不同的任务中来回切换
生产者消费者模式:
'''
生产者消费者模型:一个负责生产producer包子,一个负责吃consumer包子
__next__()只是启动yield,send(value)即启动yield又给yield传值value
消费者不停的吃,生产者不停的喂,
生产者可以有很多,消费者也可以有很多,喂的方式也是灵活的
''' def consumer(name): # 消费者
while True:
print("[%s]准备吃包子了" % name)
baozi = yield
# print(baozi,name)
print("包子[%s]来了,被[%s]吃了" % (baozi, name)) def producer(con):
for i in range(4):
print("开始做包子喂给消费者了----------------")
con.send(i) c = consumer("张三")
c.__next__()
producer(c) '''
[张三]准备吃包子了 # 执行c.__next__()后打印
开始做包子喂给消费者了----------------
包子[0]来了,被[张三]吃了
[张三]准备吃包子了
开始做包子喂给消费者了----------------
包子[1]来了,被[张三]吃了
[张三]准备吃包子了
开始做包子喂给消费者了----------------
包子[2]来了,被[张三]吃了
[张三]准备吃包子了
开始做包子喂给消费者了----------------
包子[3]来了,被[张三]吃了
[张三]准备吃包子了
'''

123

1

1

1

1

1

之前学的yield的更多相关文章

  1. asyncio协程与并发

    并发编程 Python的并发实现有三种方法. 多线程 多进程 协程(生成器) 基本概念 串行:同时只能执行单个任务 并行:同时执行多个任务 在Python中,虽然严格说来多线程与协程都是串行的,但其效 ...

  2. Python的生成器和生成器表达式

    一,生成器和生成器表达式 什么是生成器,生成器实质就是迭代器,在python中有三种方式来获取生成器: 1. 通过生成器函数 和普通函数没有区别,里面有yield的函数就是生成器函数,生成器函数在执行 ...

  3. 一篇夯实一个知识点系列--python生成

    写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...

  4. 新手学python(3):yield与序列化

    1 Yield生成器 Yield是我在其他语言中没有见过的一个属性,算是python的一大特色,用好之后可以使代码更简洁.考虑一个简单的例子,文件的遍历.要遍历一个目录下的所有文件需要递归的操作.如果 ...

  5. 跟vczh看实例学编译原理——零:序言

    在<如何设计一门语言>里面,我讲了一些语言方面的东西,还有痛快的喷了一些XX粉什么的.不过单纯讲这个也是很无聊的,所以我开了这个<跟vczh看实例学编译原理>系列,意在科普一些 ...

  6. C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(二)

    前言 在上篇文章中我得出结论,遍历迭代器修改迭代器中项目的值未生效,是因为使用了yield return,并且每次遍历迭代器都执行返回迭代器的方法.这篇文章是接着上篇文章,从代码实现的角度来验证出现这 ...

  7. .NET yield

    .Net Yield 其实比较简单,手动yield,一学就会. public static class GalaxyClass { public static void ShowGalaxies() ...

  8. 使用C# yield关键字来提高性能和可读性

    对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量.我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子. 为了让你对yield有一些快速概览 ...

  9. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. [AaronYang]C#人爱学不学[4]

    本文章不适合入门,只适合有一定基础的人看.我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下.但写的内容也可能含有其他版本framework的 ...

随机推荐

  1. No.1.2

    列表标签 无序列表 标签名 说明 ul 表示无序列表的整体,用于包裹li标签 li 表示无序列表的每一项,用于包含每一行的内容 有序列表 标签名 说明 ol 表示有序列表的整体,用于包裹li标签 li ...

  2. TCP 协议之三次握手(一)

    (声明:本文是阅读此文的总结笔记) 面试中对于该知识点的考察频繁,一般作为面试的暖场问题,你能够答出多少,答得多深刻,条理多清晰,给面试官的印象真的很重要. 三次握手的过程 TCP是面向连接的,全双工 ...

  3. Kettle初使用

    Kettle的使用还是比较简单,但使用过程中会遇到一些问题: 1.mysql8以上版本连接数据库的时候汇报如下错误: 解决方法:参考链接:https://www.cnblogs.com/wuzaipe ...

  4. File、Files、Path、Paths

    一.Path.Paths 和 File.Files // Paths 工具类,用于获取 Path 实例 Path path = Paths.get("files/Data.txt" ...

  5. Mac预览怎么用 Mac预览功能实用技巧大全

    Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具 ...

  6. OSS管理文件(Java)

    工具类 package com.panchina.util; import com.alibaba.druid.util.StringUtils; import com.aliyun.oss.Http ...

  7. 杭电OJ--1048-C++实现

    #include <iostream>#include<vector>#include<string>#include<cctype>#include& ...

  8. 贪心算法_Leetcode刷题_7/100

    贪心算法 采用贪心策略,保证每次操作是局部最优的,从而使随后结果是全局最优的. 455.分配饼干 贪心策略:尽量把最小的饼干分配给胃口最小的孩子. 我的代码: 算法描述: 将孩子的胃口值g和拥有的饼干 ...

  9. 英国延长 UKCA 标记截止日期

    政府于 2022 年 11 月 14 日宣布,企业将有 2 年的时间来应用新的 UKCA 产品标记.在 2024 年 12 月 31 日之前,企业可以选择使用 UKCA 或 CE 标志,之后企业只能使 ...

  10. RabbitMq的部署(docker)和操作(python)详解

    一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信. ...