迭代器
迭代定义:迭代不等于循环,迭代是基于上次执行的结果来进行下一次的循环。
迭代器的作用:可以不依赖于索引进行取值
可迭代对象:有__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)