迭代器与生成器
Posted 1naonao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器与生成器相关的知识,希望对你有一定的参考价值。
迭代器
迭代的对象
可迭代的对象
凡有_iter_方法的对象,都是可迭代对象
可迭代对象:python内置str,list.,tuple,dict,set,file
可迭代对象
可迭代对象执行__iter__方法得到返回值,并且可迭代对象会有一个__next__方法。
s='hello'
iter_s = s._iter_()
while true:
try:
print(iter_s__next__())
except stoplteration:
break
?
h
e
l
l
o
迭代器对象:执行可迭代对象__iter__方法,拿到返回值就是迭代器对象。
特点:
1,内置__next__方法,执行该方法会拿到迭代器对象中的一个值
2,内置__iter__方法,执行该方法会拿到迭代器本身
3,文件本身就是迭代器本iey身
缺点:
1,取指麻烦只能一个一个取,值取了就没了
2,无法使用len()方法获取长度
for循环原理
for循环称为迭代器循环,in后必须是可迭代对象
因为迭代器使用__iter__
后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。
由于对可迭代对象使用__iter__
方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__
后才会吐出一个一个值。如lis = [1,2,3,4,5,...]
相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__
相当于一只老母鸡,如果你需要蛋,只需要__next__
即可。
三元表达式与列表推导式
条件成立的返回值if条件else不成立时的返回值
x = 10
y = 20
print(f'x if x>y else y:x if x>y else y')
x if x>y else y:20
列表推导式
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]
类似于
res=[]
for item1 in iterable1:
if condition1:
for item2 in iterable2:
if condition2
...
for itemN in iterableN:
if conditionN:
res.append(expression)
print(F"[i for i in range(10)]: [i for i in range(10)]")
[i for i in range(10)]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(F"[i**2 for i in range(10)]: [i**2 for i in range(10)]")
[i**2 for i in range(10)]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
字典生成式
print(i:i**2 for i in range(10))
0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81
zip()方法
keys = ['name', 'age', 'gender']
values = ['nick', 19, 'male']
res = zip(keys, values)
print(F"zip(keys,values): zip(keys,values)")
info_dict = k: v for k, v in res
print(f"info_dict: info_dict")
zip(keys,values): <zip object at 0x11074c088>
info_dict: 'name': 'nick', 'age': 19, 'sex': 'male'
生成器
yield关键字
yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。
def func():
print(1)
yield
print(2)
g = func()
print(g)
<generator object func at 0x10ddb6b48>
总结
yield:
- 提供一种自定义迭代器的方式
- yield可以暂停住函数,并提供当前的返回值
yield和return:
- 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
- 不同点:return只能返回一次之;yield可以返回多次值
生成式表达式与列表推导式
- 列表推导式[]换成()就是生成器表达式
- 有点:省内存,一次只产生一个值在内存中
- 列表推导式相当于给你一筐鸡蛋, 生成器表达式相当于给你一只老母鸡
# 列表推导式
with open('52.txt', 'r', encoding='utf8') as f:
nums = [len(line) for line in f]
print(max(nums))
# 生成器表达式
with open('52.txt','r',encoding='utf8') as f:
nums = (len(line) for line in f)
print(max(nums)) # ValueError: I/O operation on closed file.
以上是关于迭代器与生成器的主要内容,如果未能解决你的问题,请参考以下文章