迭代器生成器

迭代器:

迭代器对象指的是即内置有__iter__又内置有__next__方法的对象


l=[1,2,3] iter_l=l.__iter__()
#得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身

print(iter_l) print(iter_l.__next__()) #调用迭代器对象的__next__取值 print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__())

<list_iterator object at 0x005A3150>
Traceback (most recent call last):
1
2
3
File "F:/back01/hansu.py", line 261, in <module>
print(iter_l.__next__())
StopIteration           #取完后,再取抛出异常



dic={'a':1,'b':2,'c':3}
iter_dic=dic.__iter__()
while 1:
try:
k=next(iter_dic)
print(k,dic[k])
except StopIteration:
break


a 1
b 2
c 3

#优点:
  - 提供一种统一的、不依赖于索引的迭代方式
  - 惰性计算,节省内存
#缺点:
  - 无法获取长度(只有在next完毕才知道到底有几个值)
  - 一次性的,只能往后走,不能往前退

生成器:
还有yield的函数就是一个生成器
def func():
    print('1')
    yield 1
    print('2')
    yield 2



ret=func()
print(ret)
print(ret.__next__())  #等同迭代器的取值
print(ret.__next__())

<generator object func at 0x020E93C0>  #func()的执行结果就是创建了一个生成器对象,或者迭代器对象
1
1
2
2

def my_range(start,stop,step=1):
while start < stop:
yield start
start+=step




obj=my_range(1,7,2)
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
for i in obj:
print(i)
原文地址:https://www.cnblogs.com/wuxi9864/p/9893812.html