Python 入门之 Python三大器 之 生成器
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三大器 之 生成器的更多相关文章
- Python 入门之 Python三大器 之 装饰器
Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...
- Python 入门之 Python三大器 之 迭代器
Python 入门之 Python三大器 之 迭代器 1.迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象 (我们可以通过dir()方法去判断一个 ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python 入门之Python简介
Python 入门之Python简介 1.Python简介: (1) Python的出生: python的创始人为吉多·范罗苏姆(Guido van Rossum)(中文名字:龟叔).1989年的 ...
- Python入门之 Python内置函数
Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...
- Python 入门之Python基础数据类型及其方法
Python 入门之Python基础数据类型 1. 整型:int 用于计算,用于比较 (在赋值的时候先执行等号右边的内容) 1.1 整数的加 a = 10 b = 20 print(a + b) 结果 ...
- Python 入门之Python基础知识
Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python
知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...
随机推荐
- JSON.parse 测试
第一种 报错 var t = JSON.parse(""); console.log(t); 第二种 正常 var t = JSON.parse('{"AA": ...
- PHP技术分享-起始时间戳和结束时间戳的方法
php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime.下面兄弟连PHP培训 首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日 ...
- [LightOJ1008]Fibsieve`s Fantabulous Birthday 题解
前言 扫了一眼网上的题解,都是找规律. 估计就我一个蒟蒻在打二分. 题解 设一个" ┐"形为一层. 我们二分查找该数在那一层,然后就可以直接计算它的位置了. 代码 #include ...
- BeanPostProcessor和BeanFactoryPostProcessor的区别
官方文档: 在Spring核心的1.8章节 使用BeanPostProcessor自定义Bean BeanPostProcessor 接口定义了您可以实现的回调方法,以提供您自己的(或覆盖容器的默认) ...
- vue相关基础知识
参考文章: Vue 项目里戳中你痛点的问题及解决办法(更新) vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践
- 7.Python编码规范(PEP 8)
在讲解具体的 Python 编码规范之前,先来看看图 1 中的代码: 图 1 两段功能相同的 Python 代码 对比图 1 中的两段代码你会发现,它们所包含的代码时完全相同的,但很明显,右侧的代码编 ...
- DVWA--XSS(DOM)
0X01爱之先了解 DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容.结构以及样式. DOM型XSS其实是一种特殊类型 ...
- 使用http-server在本地搭建一个HTTP服务器
安装http-server 在控制台中输入 npm install http-server -g 进行全局安装 共享资源 进入需要共享资源的目录,比如 D:\,然后在控制台中输入 http-serve ...
- Window下PHP环境配置使用Redis总结
什么是Redis? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.它和Memcached类似,它支持存储的 ...
- 使用discriminator实现鉴别器
1在人员接口实现方法 public Employee getEmpByIdStep(Integer id); 2在映射文件进行配置 <!-- public Employee getEmpById ...