前言

生成器,只要含有yield关键字的函数都是生成器函数,但yield不能和return共用且需要写在函数内。

生成器,是返回一个迭代器的函数,说白了生成器也是迭代器。

一、生成器简介

1、只要含有yield关键字的函数都是生成器函数。

def generator():
print(1)
yield 'a'
ret = generator() #生成器函数 : 执行之后会得到一个生成器作为返回值
print(ret)
print(ret.__next__())

2、每 yield 一次会保留当前所有的运行信息,返回对应的 yield 值,也相当于可一个一个取值了(和迭代器差不多)

# 也是可一个一个取值,yield 一次就取一次
def generator():
yield 'a'
yield 'b'
yield 'c'
g = generator() # 得到生成器作为返回值 ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)

3、好比如:前面的例子,我要50个数字,你一下子 list 给我全放内存里占用就会比另 range(0,50)的多。

50个数字可能还好,当你不是这种类型数据的时候我担心会不会把内存搞爆?所以生成器是个好东西。

# 对比一下
print(range(50))
print(list(range(50))) 控制台输出:
range(0, 50)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

4、实例:

200万个数字中任意取值,但不可能一下子放200万个数字到内存里。(其实也可以的,你试试吧!)

# 来 200万 个数字
def func():
for i in range(2000000):
yield '200万个数字:%s' % i
g = func() # 取50个
count = 0
for i in g:
count += 1
if count > 50:
break
print(i) # 我只喜欢第100个
for i in g:
count += 1
if count > 100:
print('我只喜欢:', i)
break print(g.__next__()) # +1
print(g.__next__()) # +1
print(g.__next__()) # +1 = 103

二、 生成器进阶

1、yield from:

yield from (a, b):第一次返回值a,第二次返回值b

def func():
a = ''
b = 99999
yield from (a, b)
g = func()
print(g.__next__())
print(g.__next__())

2、send:

①send 获取基本和 next 方法一致
②send 只是在获取下一个值的时候,给上一个值传一个实参
③使用send注意事项:

  • 第一次 yield 必须用 next,因为是给上一个 yield 传一个实参
  • 最后一个 yield 不能接受外部的值,因为send是在获取下一个值的时候使用
def func():
print(1)
qq = yield 11
print(qq)
print(2)
gg = yield 22
res = True
print(res, gg) yield g = func()
print(g.__next__())
print(g.send('send===='))
print(g.send('send222====')) # send 获取基本和 next 方法一致
# send 只是在获取下一个值的时候,给上一个值传一个实参
# 使用send注意事项:
# 第一次 yield 必须用 next
# 最后一个 yield 不能接受外部的值,既不能用 send

欢迎来QQ交流群一起学习:482713805

python-21-生成器又是什么东西?的更多相关文章

  1. Python迭代器生成器与生成式

    Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...

  2. 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用

    本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...

  3. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  4. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

    yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...

  5. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  6. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

  7. python中生成器对象和return 还有循环的区别

    python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...

  8. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  9. Python中生成器和yield语句的用法详解

    Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...

  10. python 列表生成器

    python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...

随机推荐

  1. 用ES7解决异步回调地狱问题

    用了 Promise 其实并没有真正解决回调地狱问题,并且还新增了很多 .then(data => { .... }) 这些很没有意义的 “模板代码”.所以先人们又搞出了generator 和 ...

  2. 数据结构与算法 --- js描述集合

    js描述集合 function Set(){ this.datasource=[]; this.add=add; this.remove=remove; //this.size=size; //thi ...

  3. Docker基础内容之镜像

    概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 下图展示的是Docker镜像的系统结构.其中, ...

  4. springIOC源码接口分析(五):ListableBeanFactory

    一 继承关系 该接口是对BeanFactory的扩展,允许预加载bean定义的BeanFactory可以实现此接口 其目的在于使实现它的BeanFactory能够枚举所有的Bean 该接口不支持分层结 ...

  5. 娱乐往事,年初捡到1G PAR,平淡的日子泛起波澜

    常听说这样的故事 垃圾佬捡到蓝牙键盘,于是配了一台上万的电脑 垃圾佬捡到机箱,于是配了一台带遥控的HTPC 垃圾佬捡到假NAS,于是组了20+T的RAID 而我,不是垃圾佬,更没有捡到过U盘,对突如其 ...

  6. 通信协议之Modbus协议(一)

    Modbus通信协议: 简介:Modbus协议是应用于电子控制器上的一种通用语言 通过此协议,控制器相互之间,控制器经由网络(例如以太网) 和其他设备之间可以通信,他已经成为一种通用工业标准,有啦它 ...

  7. 实验20:IPv6

    实验17-1: IPv6 静态路由 Ø    实验目的通过本实验可以掌握(1)启用IPv6 流量转发(2)配置IPv6 地址(3)IPv6 静态路由配置和调试(4)IPv6 默认路由配置和调试 Ø   ...

  8. Netty学习(1):IO模型之BIO

    概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...

  9. 如何在网页读取用户IP,操作系统版本等数据demo

    我们浏览网页的时候,会不经意间看到,有些地方(如个人的签名档)显示出了个人的IP,操作系统等数据.借助第三方API和请求报头useragent是很容易实现的. <html> <hea ...

  10. SpringBoot使用ELK日志收集ELASTIC (ELK) STACK

    1:资源 # 文档向导 # logstash https://www.elastic.co/guide/en/logstash/current/index.html #kibana https://w ...