Python——迭代器,,生成器

迭代器(迭代取值和索引取值的对比)

生成器(自定义的迭代器)(yield

生成器表达式

生成器试题

生成器yield关键字的补充用法(传参数)

常见的内置函数

——————————————————————————

 

———————————————————————————

生成器

背景:
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

 

  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator
python中生成器是自定义迭代器的一种

# 生成器如何使用
关键字:yield

'''
当函数中一旦出现了yield关键字,函数在没有被调用的时候仍然是普通函数,但是只要一调用函数,那么,该函数就不是普通函数了
就变成了生成器
'''
def index():
print('from index')
print('from index')
print('from index')
yield 123,234,345 # 以元组的方式返回
print('second')
print('second')
print('second')
print('second')
yield 'hello'
print('three')
yield

res=index() # res.__iter__()
print(res) # <generator object index at 0x000002CDB20BEA50>

## 生成器其实就是一个自定义的迭代器
# res.__next__() # 只要你调用next方法,代码就会走到函数中第一个yield关键字所在的位置停住
# res.__next__() # 代码从上一次yield停住的地方继续往下执行,走到遇到下一个yield停住
print(res.__next__()) # None 123
print(res.__next__()) # None 123
print(res.__next__()) # None 123

——————————————————————————

生成器习
利用生成器的原理实现range函数的功能

 

 

——————————————————————————
生成器yield的其他用法:

1.类似return 返回值(可以返回多个值)

 

2.生成器开始运行,直到遇到第一个yield,输出返回值并中断生成器的运行。在后续使用next()时,代码会从上一次中断的地方继续运行 

 

3.     yield 和  send

 

 

————————————————————
生成器表达式

列表生成式
res = [name for name in names_list]
print(res) # 就是一个列表

 

res1 = (name for name in names_list)
print(res1)
names_list = ['kevin', 'jerry', 'tony', 'oscar']
res1 = (name for name in names_list)
print(res1) # <generator object <genexpr> at 0x00000218F4569CF0>

 

print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())

 

"""生成器表达式如果不使用数据,就不给你数据"""

 

把迭代器、生成器看成是一个工厂,什么时候需要数据工厂就给你加工数据
目的:就是为了节省内存空间

————————————————————
生成器试题

 

——————————————————————————
yield和return对比
迭代取值
1. 不依赖于索引取值的一种取值方式
2. 不能够重复取值,只能够从左往右固定取值
索引取值
1. 它能够重复取值(通过索引l[0])
2. 它需要是容器类型

迭代取值通常用于遍历整个对象的所有元素,而索引取值则是通过指定索引位置获取特定元素




posted @   拆尼斯、帕丁顿  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示