前言

生成器,只要含有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. leetcode腾讯精选练习之螺旋矩阵(八)

    螺旋矩阵 题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入:     [          [ 1, 2, 3 ],   ...

  2. 完美实现STM32单总线挂多个DS18B20

    一般常见的STM32的关于DS18B20的例程都是检测一个传感器,代码一般都是跳过ROM检测,直接获取温度值.这种写法并不适用于单总线上挂载多个DS18B20的情况,Sandeepin的这个代码就是针 ...

  3. MySQL基础知识清单

    学习大纲(★为重点,√其次) 一.为什么要学习数据库 二.数据库的相关概念 DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MyS ...

  4. ios---CoreLocation框架实现定位功能

    CoreLocation框架实现定位功能(iOS8.0之后) // // ViewController.m // 定位 // // Created by admin on 2017/9/20. // ...

  5. MYSQL-innobackupex备份脚本

    自动化运维,是数据库管理员的不懈追求.目前出现了一些数据库自动管理平台,但出现时间较短,不够稳定.最常用的工具依然是shell脚本. 现在需要管理的某mysql数据库,数据量在800G,使用dump备 ...

  6. Docker Mysql部署与使用

    参考链接:Docker 安装 Mysql 详解

  7. react中,路由的使用。import {BrowserRouter,Switch,Route} from "react-router-dom";

      import React from "react"; import ReactDom  from "react-dom"; import {BrowserR ...

  8. jQuery下载所有版本

    下载地址:http://www.jq22.com/jquery-info122

  9. 谈下程序设计算法的准备心得与体会-nCov隔离也许帮你提升能力

    最近武汉的n-Cov使得大家只能在家办公了. 在家里的感受是什么样的呢? 1.上班的时候一直在奔跑,现在总算可以有集中的时间来思考一些之前一直没能好好整理的内容 2.时间变得自己可以掌控,优先级有自己 ...

  10. C++ ABI之名字改编(以Qt为例)

    在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编( ...