前言

生成器,只要含有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. 超越队西柚考勤系统--Beta冲刺2

    超越队西柚考勤系统- -beta冲刺2 格式描述 这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业链接 团队名称 超越队(西柚考勤系统) 这个作业的目标 对alpha版本的程序进行改进,代码核 ...

  2. 创建dynamics CRM client-side (二) - Client API

    如果我们想用script来直接在form上做一些修改, 我们需要用到client api 来做交互. 我们可以用以下来理解: Form <---> Client API <---&g ...

  3. Centos7使用docker搭建Sentry

    1.安装docker Sentry 是一款基于 Django实现的错误日志收集和聚合的平台,它是 Python 实现的,但是其日志监控功能却不局限于python,对诸如 Node.js, php,ru ...

  4. PSR标准规范

    PSR标准规范 基本代码规范 PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码: 类的命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范: 类中的常量所有字母都 必须 大写,单 ...

  5. 微信小程序没有找到可以构建的npm包

    如果是云开发小程序 ,cmd窗口进入到小程序根目录下的miniprogram目录, 输入npm init 输入包的相关属性,随便输入即可. 完成后会出现一个package.json文件. 如果是其他类 ...

  6. CAD制图系列之中心线画法

    我们将做个简单的笔记: CAD中心线怎么画 CAD中心线一般为点划线,画法很简单,首先先设置线型 一般步骤为: 1.首先,打开CAD,点击进入图层特性管理器 2.在图层特性管理器中点击线型进行设置 3 ...

  7. PAT_B1002数字分类

    #include<stdio.h> #include<iostream> using namespace std; int main(){ ,a2=,a3=,a5=; ; ; ...

  8. HDU_5602_概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=5602 dp[1][i][j]表示轮到第二个人操作时,第一人总和i,第二人总和j,第一人胜的最小概率(因为每个人都 ...

  9. 视觉光盘,只有我可以贴全世界唯一,Windows上最高级的DOCKER客户端数字, 夜晚点击一个都没有,值班的小编辛苦了

    继上一篇视觉光盘,只有我可以贴全世界唯一,你永远截不到的图片(小编请用人性化语言解释移出首页) 合体了 晚上的小编, 呆了吗? 我看到了少于150字的随笔不允许发布到网站首页 我决定了用我专业的龟式输 ...

  10. Go语言实现:【剑指offer】扑克牌顺子

    ​该题目来源于牛客网<剑指offer>专题. LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)-他随机从中抽出了5张牌,想测测自己的手气 ...