Python 入门之 Python三大器 之 生成器

1、生成器

(1)什么是生成器?

核心:生成器的本质就是一个迭代器

迭代器是Python自带的

生成器程序员自己写的一种迭代器

def func():
print("这是一个函数")
return "函数"
func() def func():
print("这是一个生成器")
yield "生成器"

(2)生成器的编写方式:

<1> 基于函数编写
<2> 推导式编写

(3)生成器函数:

​ 通过生成器函数构建生成器

<1> 函数体中出现yield代表要声明一个生成器 (generator -- 生成器)

<2> 一个yield 对应 一个 next()

def func():
msg = input("请输入内容")
yield msg
print("这是第二次启动")
yield "生成器2"
yield "生成器3"
yield "生成器4" g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g)) # 生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值

<3>yield 和 return 的区别:

1>相同点:
都是返回内容
都可以返回多个,但是return写多个只会执行一个
2>不同点:
return终止函数 yield是暂停生成器
yield 能够记录当前执行位置

(4)生成器的作用:节省空间

(5)使用场景:

当文件或容器中数据量较大时,建议使用生成器

(6)区别什么是迭代器,什么是生成器?

<1> 通过地址:

​ 迭代器的地址:<list_iterator object at 0x000000987B6E97F0>

​ 生成器的地址:<generator object func at 0x00000087C2A10CA8>

<2> 通过send()方法: (send()方法第一次必须发送None)

没有send()方法就是迭代器
有send()方法就是生成器
def func():
a = yield 1
print(a)
b = yield 2
print(b) g = func()
print(g.send(None)) # send -- 发送
print(g.send("alex")) # send -- 发送
print(g.send("宝元")) # send -- 发送
1>send和next()区别:

​ 相同点:

​ send 和 next()都可以让生成器对应的yield向下执行一次。

​ 都可以获取到yield生成的值。

​ 不同点:

​ 第一次获取yield值只能用next不能用send(可以用send(None))。

​ send可以给上一个yield置传递值。

(7)yield 和 yield from的区别:

yield 将可迭代对象一次性返回

yield from 将可迭代对象逐个返回

def func():
def foo():
print(11)
lst = {"key":1,"key1":2}
yield foo print(func().__next__()) def func():
lst = [1,2,3,45,6]
lst1 = ["alex","wusir","taibi","baoyuan"]
yield from lst
yield from lst1 g = func() for i in g:
print(i) lst = [1,2,3,45,6]
lst1 = ["alex","wusir","taibi","baoyuan"] for i in lst,lst1:
print(i)

(8)可迭代对象、迭代器、生成器的比较:

可迭代对象

​ 优点:list , tuple .str 节省时间,取值方便,使用灵活(具有自己私有方法)

​ 缺点:大量消耗内存

迭代器

​ 优点:节省空间

​ 缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行

生成器

​ 优点:节省空间,人为定义

​ 缺点:不能直接查看值,消耗时间,一次性,不可逆行

Python 入门之 Python三大器 之 生成器的更多相关文章

  1. Python 入门之 Python三大器 之 装饰器

    Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 ​ 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...

  2. Python 入门之 Python三大器 之 迭代器

    Python 入门之 Python三大器 之 迭代器 1.迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象 (我们可以通过dir()方法去判断一个 ...

  3. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  4. Python 入门之Python简介

    Python 入门之Python简介 1.Python简介: (1) Python的出生: ​ python的创始人为吉多·范罗苏姆(Guido van Rossum)(中文名字:龟叔).1989年的 ...

  5. Python入门之 Python内置函数

    Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...

  6. Python 入门之Python基础数据类型及其方法

    Python 入门之Python基础数据类型 1. 整型:int 用于计算,用于比较 (在赋值的时候先执行等号右边的内容) 1.1 整数的加 a = 10 b = 20 print(a + b) 结果 ...

  7. Python 入门之Python基础知识

    Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...

  8. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  9. 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python

    知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...

随机推荐

  1. protocol buffer第一篇:语法介绍

    先理解一下protocol buffer是什么东西. protocol buffer是google发明的一种数据序列化方案,和json是同种类型的玩意,它非常适合在rpc场景下使用.同json一样,p ...

  2. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  3. ex1.c 补

    表达式和符号运用生疏 经常少符号 

  4. 大哥带的MSsql注入(SQL Server)--预习

    ①判断数据库类型and exists (select * from sysobjects)--返回正常为mssql(也名sql server)and exists (select count(*) f ...

  5. rollup的学习

    概述(Overview) Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序.Rollup 对代码模块使用新的标准化格式,这些 ...

  6. kubernetes master 更换ip(单节点)

    问题分析 master ip地址变更以后,我们首先应该检查以下内容: /etc/kubernetes/manifests下面的config配置文件,替换里面对应的ip 相关的证书文件 客户端文件 解决 ...

  7. Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

    if first time to install docker, be noted the docker engine started as root copied from: http://blog ...

  8. mysql根据身份证查询年龄,地址,性别

    elect  case left(idcard,2)  when '11' then '北京市' when '12' then '天津市' when '13' then '河北省' when '14' ...

  9. php 的路由简介 (一个简单的路由模式)

    <?php $_SERVER['REQUEST_URI'] = '/post/edit/1024?foo=bar'; $uri = explode('/', parse_url($_SERVER ...

  10. CentOS 6.7与CentOS 7.3内存查看命令free、top的差异对比

    https://www.centos.bz/2017/08/centos-6-7-centos-7-3-free-top/