python-21-生成器又是什么东西?
前言
生成器,只要含有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-生成器又是什么东西?的更多相关文章
- Python迭代器生成器与生成式
Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python迭代器,生成器,推导式
可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...
- Python中生成器和yield语句的用法详解
Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
随机推荐
- Python+Flask+MysqL的web技术建站过程
1.个人学期总结 时间过得飞快,转眼间2017年就要过去.这一年,我学习JSP和Python,哪一门都像一样新的东西,之前从来没有学习过. 这里我就用我学习过的Python和大家分享一下,我是怎么从一 ...
- .net core 认证与授权(一)
前言 .net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解. 什么是认证?我们大 ...
- 『开源协议』Creative Commons Attribution 3.0 License . 协议的个人理解,并 转载分享 4000个 精美可商用小图标
为什么会研究 Creative Commons Attribution 3.0 License Creative Commons Attribution 3.0 License 简称 CC3,是 一种 ...
- Ceph 存储集群7-故障排除
Ceph 仍在积极开发中,所以你可能碰到一些问题,需要评估 Ceph 配置文件.并修改日志和调试选项来纠正它. 一.日志记录和调试 般来说,你应该在运行时增加调试选项来调试问题:也可以把调试选项添加到 ...
- 分析Ajax爬取今日头条街拍美图-崔庆才思路
站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...
- POJ_2593_DP
http://poj.org/problem?id=2593 和2479一样. #include<iostream> #include<cstdio> #define MIN ...
- Codeforces_490_E
http://codeforces.com/problemset/problem/490/E dfs,过程要注意细节,特别是当前位置取了与上个数当前位置相同是,若后面不符合条件,则当前位置要重置'?' ...
- Codeforces_711_B
http://codeforces.com/problemset/problem/711/B 比较简单,过程有点繁琐,先找一行包含那个0的行,得到和,以此填出0位置的值,然后判断这个矩阵是否符合条件. ...
- zabbix4.0的安装与配置
#安装zabbix监控首先的先安装LNMP环境,在这里我采用事先准备好的脚本进行安装LNMP环境 脚本内容如下: #!/bin/bash # DATE:Wed Jan # hw226234@126.c ...
- HDU 5558 Alice's Classified Message(后缀数组+二分+rmq(+线段树?))
题意 大概就是给你一个串,对于每个\(i\),在\([1,i-1]\)中找到一个\(j\),使得\(lcp(i,j)\)最长,若有多个最大\(j\)选最小,求\(j\)和这个\(lcp\)长度 思路 ...