前言

生成器,只要含有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. 认识JPA以及如何使用JPA(1)

    一:JDBC是什么? JDBC统一了Java应用程序访问数据库的标准. 二:什么是JPA? JPA统一了Java应用程序使用使用ORM框架的方式. 配置文件说明: 三:使用JPA的第一个实例. 1.创 ...

  2. 解决apt-get安装软件包的时候遇到E: Sub-process /usr/bin/dpkg returned an error code (1)问题

    在用apt-get安装软件包的时候遇到E: Sub-process /usr/bin/dpkg returned an error code (1)问题,解决方法如下:   cd /var/lib/d ...

  3. CUDA学习(二)之使用clock()函数

    clock()函数是C/C++中的计时函数,相关的数据类型是clock_t,使用clock函数可以计算运行某一段程序所需的时间,如下所示程序计算从10000000逐渐减一直到0所需的时间. #incl ...

  4. Python趣味入门01:你真的了解Python么?

    小牛叔倾情出品,史上更简单有趣的Python入门系列教程,用认真.上心的原创带你飞. 0.Why Python ? 什么入门用python,其实这和它的气质有关,根据CHM(计算机历史博物馆)网站介绍 ...

  5. Oracle操作语句--增加/删除

    1.删除1980年雇员的雇员信息: delete  from myemp where     hiredate between to_date('1980-1-1','yyyy-mm-dd') and ...

  6. 刚安装了ftp之后无法使用root访问,服务器发回了不可路由的地址。使用服务器地址代替。

    真的艰辛,用了整整一个下午加晚上,才把服务器搭建好,中间真的好多坑... 错误1: vsftpd正确配置: vsftpd.conf: pam_service_name=vsftpduserlist_e ...

  7. java 利用POI 读取Execel数据的真实行数

    java 利用poi 读execel文件的操作,读取总的数据行数一般是通过调用 sheet.getLastRowNum() ;可是这样有时候会出现一些问题,例如,当其中一行的数据的确都为空,可是其原本 ...

  8. 使用sass语法生成自己的css的样式库

    前言 先说一下 sass 和 scss的区别 sass 是一种缩进语法(即没有花括号和分号,只使用换行 缩进的方式去区别子元素,PS:这是我个人的理解) scss 是css-like语法  (它的语法 ...

  9. ntp时间服务器 时间同步

    具体两种模式 1.服务器数量比较少,可以直接与时间服务器同步 2.本地服务器较多,在本地自建时间同步服务器,     时间同步的两个命令 ntpd :         校准时间,一点点的校准过来时间的 ...

  10. Nexus 安装运维手册

    1. Nexus 安装与配置 1.1 下载Nexus 登录https://www.sonatype.com/download-oss-sonatype,下载最新的Nexus版本. 我这里使用的是nex ...