python6_3 迭代器,生成器相关

迭代器:不依赖索引的迭代取值方式 

可迭代对象:内置有__iter__方法对象

迭代器对象:执行可迭代对象__iter__()方法得到的返回值

      迭代器对象内置有__next__()方法和__iter()方法

有索引的数据类型:字符串,列表,元祖

没有索引:字典,集合,文件

dic = {'k1': 'v1', 'k2': 'v2'}

dic_iter = dic.__iter__()

print(dic_iter.__next__())
View Code

 for循环的底层运行机制:

  1. 先调用in后那个对象的__iter__方法
  2. 执行迭代器对象的__next__方法,将得到的值赋值in前的变量名
  3. 循环往复

 迭代器的优缺点:

优点:

1.不依赖于索引取值

2.节省内存

扫描二维码关注公众号,回复: 2681171 查看本文章

缺点:

1.只能取一次值,除非重新得到新的迭代器对象

-----------------------------------------------------------------------------------------------------------------

生成器:自定义迭代器的方式。在函数内有yield关键字,得到一个返回值为生成器对象。

def f1():
    print('first')
    yield 1
    print('second')
    yield 2
    print('third')
    yield

g=f1()
result=g.__next__()
print(result)
View Code

模拟一个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))

猜你喜欢

转载自www.cnblogs.com/cooky/p/9419920.html