python6_3 迭代器,生成器相关
Posted cooky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python6_3 迭代器,生成器相关相关的知识,希望对你有一定的参考价值。
迭代器:不依赖索引的迭代取值方式
可迭代对象:内置有__iter__方法对象
迭代器对象:执行可迭代对象__iter__()方法得到的返回值
迭代器对象内置有__next__()方法和__iter()方法
有索引的数据类型:字符串,列表,元祖
没有索引:字典,集合,文件
dic = {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} dic_iter = dic.__iter__() print(dic_iter.__next__())
for循环的底层运行机制:
- 先调用in后那个对象的__iter__方法
- 执行迭代器对象的__next__方法,将得到的值赋值in前的变量名
- 循环往复
迭代器的优缺点:
优点:
1.不依赖于索引取值
2.节省内存
缺点:
1.只能取一次值,除非重新得到新的迭代器对象
-----------------------------------------------------------------------------------------------------------------
生成器:自定义迭代器的方式。在函数内有yield关键字,得到一个返回值为生成器对象。
def f1(): print(‘first‘) yield 1 print(‘second‘) yield 2 print(‘third‘) yield g=f1() result=g.__next__() print(result)
模拟一个range函数
def my_range(x, y, step=1):
while x < y:
yield x
x += step
else:
print(‘exception‘)
for item in my_range(1, 10, 2):
print(item)
总结yield:
1.自定义迭代器的方式
2.和return,都有返回值,return只能返回一次
生成器表达式:节省内存
代码1:
l1 = [‘a‘, ‘b‘, ‘c‘, ‘d‘] l2 = (i for i in l1 if i != ‘a‘) print(next(l2))
代码2:获取文件中最长一行的字符数
with open(‘a3.log‘, mode=‘rt‘, encoding=‘utf-8‘) as f: print(max(len(i) for i in f))
以上是关于python6_3 迭代器,生成器相关的主要内容,如果未能解决你的问题,请参考以下文章