python生成器之关键字yield、自定义range功能、其他常见的内置函数
1.Typora软件的使用、编程和编程语言、五大组成部分、三大核心硬件、操作系统2.while+continue、while+else、for循环、range关键字、数据类型内置方法3.字典,元组,元组内置方法、相关面试题 、 集合的内置方法 、字符编码 、文件操作 、函数4.文件相关操作,读写模式,操作方法,读操作优化,多用户注册和多用户下的登录功能5.成员、身份运算符、流程控制、分支结构、if嵌套、循环结构.....6.正则表达式、re模块7.pycharm如何使用、注释符号、变量、命名规范、变量值的三大特性、垃圾回收机制、基本数据类型8.str、list、dict、bool、tuple、set、程序与用户交互、格式化输出、基本运算符9.相对导入、绝对导入、软件开发目录规范10.字符串,列表的内置方法(增加、修改、删除) 、可变类型与不可变类型 、字典 ,元组,集合的内置方法、队列和栈的概念11.递归函数,算法之二分法
12.python生成器之关键字yield、自定义range功能、其他常见的内置函数
13.os模块、序列化模块、pickle和json的区别14.可迭代对象、迭代器对象、异常捕获、for循环的原理、迭代取值和索引取值的对比15.算法之二分法、三元表达式、列表生成式、字典生成式(了解)、匿名函数、常见的内置函数16.time模块、datetime模块、random模块、sys模块17.模块18.关于装饰器19.函数参数的两大分类,位置参数,默认参数,名称空间的概念,名字的查找顺序20.深浅拷贝、第三方模块的下载与安装、开发流程21.subprocess模块、hashlib模块、日志模块22.内部数据的存储原理、发展史、分类、解释器、编程软件pycharm23.员工管理系统、字符编码、文件操作24.文件内指针的移动 、内数据的修改 、函数(次函数非数学中的函数)(非常重要)25.魔术方法(内置方法),反射,异常之自定义异常生成器
生成器的背景:
"""
l = [1, 2, 3]
我们现在定义的列表,内部元素都比较少,占用的内存也是比较少的,我们几乎可以忽略,
但是,如果我现在让你定义一个列表,里面存放100w个元素,可是呢,我们只用到了前面或者后面几个元素,
其他元素很少用,如果我们把这100w个元素都写在列表里,并且每次使用的使用都打印了,
会出现什么问题?
所以,这个时候就会占用大量的内存空间,这些空间就被浪费了,针对这个问题,该如何优化一下呢
优化的方法就是利用生成器:
如果你不用这些数据,那么在你打印的时候,我给给你一个对象,不给你具体的数据,
你什么时候使用这些数据,我在给你
"""
生成器解决的问题是什么?
就是节省内存空间
range(10) 在python3中是一个生成器,节省了内存空间
到底如何使用?
def index():
print('from index')
yield 123,234,345
"""
函数里面只要出现了yield关键字,那么,该函数就有普通的函数变成了生成器,
就不在执行该函数了
"""
res=index()
# print(res) # <generator object index at 0x000001F5008287B0>
# 要想使用生成器只需要使用next取值即可
# 我们使用next取值,每next一次,代码走到第一个yield处停止,
print(res.__next__()) # None (123, 234, 345)
# print(res.__next__()) # None 再次执行next,会从上一次yield的位置处往下继续走,走到遇到第二个yield停止
"""如果你打印next的结果,就会返回yield关键字后面的数据"""
# 当yield关键字后面的数据用逗号隔开,有多个的时候,会以元组的形式返回
生成器的使用场景
1. 节省内存
2. 不确定数据大小
3. 流式处理数据
4. 无限的数据
自定义range功能
'''range方法其实就是一个可迭代对象'''
range(10)
range(1, 10)
range(1, 10, 2)
# range函数不能用了,我让你写一个跟range函数一样的功能? 使用生成器来做:yield
# range()
# None:假 not None
def my_range(start, stop=None, step=1):
# 判断传了一个参数还是两个参数
if not stop:
stop = start # stop=10
start = 0 # start =0
while start < stop:
yield start
start+=step
res=my_range(1, 10)
# print(res.__next__())
# print(res.__next__())
# for i in my_range(10, 100, 2): # __next__
# print(i)
for i in my_range(10): # __next__
print(i)
for循环底层原理:
for 变量名 in 可迭代对象:
循环体代码
yield关键字的传参问题
什么是yield?
yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别代表返回值和是否完成。
yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。
如何传参?
def eat(name):
print('%s正在吃饭' % name)
while True:
food = yield
print('%s正在吃%s' % (name, food))
# 函数里面只要有yield关键字,就不会执行函数,变成了生成器
res=eat('kevin')
# res.__next__()
res.__next__()
"""
1. 把参数传给了yield
2. 执行了__next__取值
"""
res.send('榴莲')
res.send('臭豆腐')
res.send('螺蛳粉')
return和yield的对比
return
1. 函数遇到return直接终止运行
2. return也可以返回多个值
yield
1. 函数遇到yield代码不会立即终止运行,而是"停住"
2. yield也可以返回多个值,以元组的形式返回
3. yield可以把函数变成生成器,而且还支持传参
生成器表达式
列表生成式
res = [i for i in range(10)]
res1 = (i for i in range(10))
print(res1) # 生成器 <generator object <genexpr> at 0x0000018083EA3A50>
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
"""生成器表达式如果你不去__next__,是不会给你造出来数据的"""
迭代器和生成器什么关系?
'''生成器他是特殊的一种迭代器'''
"""
迭代器、生成器我们都可以把它们看成是"工厂"
你什么时候要数据我们就设么时候给你生产
上述这样做的原因:
节省内存空间
"""
生成器表达式 | 列表解析式 |
---|---|
按需计算 (或称惰性求值、延迟计算), 即需要的时候才计算值,可以简单的理解为,每次向生成器对象中要一个元素,这个生成器对象 才会返回一个元素 | 立即返回值 |
返回生成器,生成器也是迭代器, 可以迭代 | 返回的是可迭代对象:列表 |
返回的生成器从头到尾全都取完一遍值之后, 不能再回头取值了 | 从头到尾全都取完一遍值之后,可以从头重新取值 |
常用内置函数
具体使用方法请访问网址:https://www.yuque.com/liyangqit/lb35ya/cddzw1ugdvl8mut9
合集:
python基础
分类:
python快速入门
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY