16、迭代器

本文深入探讨了Python中的迭代器和生成器。迭代器允许不依赖索引取值,节省内存,适用于大型数据处理。生成器是自定义迭代器,通过yield实现函数状态保存,按需生成值,进一步优化内存使用。文中还介绍了三元表达式、列表和字典生成式,以及如何利用这些特性提升代码效率和可读性。
摘要由CSDN通过智能技术生成

迭代器

迭代定义:迭代不等于循环,迭代是基于上次执行的结果来进行下一次的循环。
迭代器的作用:可以不依赖于索引进行取值
可迭代对象:有__iter__()内置方法的数据类型都是可迭代对象。可迭代对象可通过__iter__()转换为迭代对象
迭代对象:同时包含__iter__()和__next__()内置方法的类型是迭代对象。迭代对象通过__iter__()转换仍然为起本身
字符串、列表、字典、元组、集合、文件等都是可迭代对象,但是集合和字典无法通过索引取值
L1="jiafjaf"
L2=["fjiafj",12]
L3={"name":"lzz","age":24}
L4=("faef",123)
L5={"fjaf",134,"po"}
with open("b.txt",mode="rt",encoding="utf-8") as f:
    res=f.read()
    res.__iter__()
L1.__iter__()
L2.__iter__()
L3.__iter__()
L4.__iter__()
L5.__iter__()
迭代对象是解释器内置的 方法使得我们可以不通过索引进行取值,for循环也是基于迭代对象而产生的一种循环取值的方法
无论是可迭代对象还是迭代对象都包含__iter__()方法,是为了方便for循环的统一取值,
L={"name":"lzz","age":24}
res=iter(L)
while True:
    try:
        print(next(res))
    except StopIteration:
        break
while循环结合迭代对象进行循环取值;迭代对象值取完后会抛出StopIteration异常,上述也包含了异常处理
for循环本质也是基于迭代对象和异常处理进行取值的,具体执行过程如下:
1. for循环遍历的条件是可迭代对象,也就是会加上__iter__()方法
2. for循环会调用__next__()方法对迭代对象进行取值,并将其赋值给变量i
3. for循环也会在值取完后抛出的异常进行处理
上述循环使用for进行遍历,很简单
L={"name":"lzz","age":24}
for i in L:
	print(i)

迭代器的优缺点

优点:
1. 迭代器占用的内存空间很少
2. 迭代器可以不依赖于索引进行取值
缺点:
1. 迭代器只能按照顺序依次取值

生成器–自定义的迭代器

定义:只要函数内包含yield的都是生成器(自定义迭代器)
yield和return的区别:
			yield会返回其后的值;yield会记录此时函数的状态,下次调用next是会继续运行。
			return也会返回其后的值;但是return之后的代码不会在执行    
def func1():
    print("123")
    yield 1
    print("456")
    yield 2
    print("789")
gen=func1()    #此时调用函数并不会执行函数体代码,而是生成了一个生成器
print(type(gen),next(gen))  #每次调用next都会返回yield后的值
print(type(gen),next(gen))
print(type(gen),next(gen))
yield表达式用法
def func():
    print("开始执行任务")
    while True:
        print("任务名称")
        x=yield  12345
        print(x)
        print("任务完成")

g=func()  #此时g为生成器
print(type(g),g)
g.send(None)  #此时函数开始运行,停留到yield等待传参,此时返回值为12345
g.send("lzz")
三元表达式
为使得代码看起来更加简洁,python内置的一种格式
def func(x,y):
   print(x) if x>=y else print(y)  
func(2,1)
生成式
列表生成式
l=["ren.com","xing.com","bing.com","fu.com","xiaoming","xiaohua"]
new=[ i for i in l if i.endswith("com")]
# for i in l:
#     if i.endswith("com") :
#         new.append(i)
print(new)
 字典生成式
l=["ren.com","xing.com","bing.com","fu.com","xiaoming","xiaohua"]
new={i:None for i in l if "g" in i}
print(new)
元组生成式生成的并不是元组而是生成器
l=["ren.com","xing.com","bing.com","fu.com","xiaoming","xiaohua"]
new_l=(name for name in l if name.endswith("com"))
print(type(new_l),new_l)     #此时生成的new_l是一个生成器
for i in new_l:
    print(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据工匠大壮

请狠狠粗暴的爱我!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值