1、使用iter(obj, sentinel), 返回一个迭代器, sentinel 可省略(一旦迭代到此元素,立即终止)
list1=[1,2,3,4,5,6] ####可迭代对象iterable
for i in list1:
print(i)
out:
1
2
3
4
5
6
t1=iter(list1) ###t1为迭代器iterator
for i in t1:
print(i)
out:
1
2
3
4
5
6
2、这里,我有一个疑问,既然我们可以直接迭代list1,为什么还要创建迭代器t1呢?
(1)一般情况下不需要将可迭代对象封装为迭代器。但是想象一种需要重复迭代的场景,在一个class中我们需要对输入数组进行正序、反序、正序step=1、正序step=2等等等等的多种重复遍历,那么我们完全可以针对每一种遍历方式写一个迭代容器,这样就不用每次需要遍历时都费劲心思的写一堆对应的for循环代码,只要调用相应名称的迭代器就能做到,针对每一种迭代器我们还可以加上类型判断及相应的处理,这使得我们可以不必关注底层的迭代代码实现。
(2)从这种角度来看,你可以将迭代器看做可迭代对象的函数化,有一个非常流行的迭代器库itertools,其实就是如上所说的,他为很多可迭代类型提前定义好了一些列的常见迭代方式,并封装为了迭代器,这样大家就可以很方便的直接通过调用此模块玩转迭代。
https://www.cnblogs.com/leohahah/p/10189281.html
举例:两种迭代器类型
#-*- coding: utf-8 -*-
list=['a','b','c','d','e','f','g','h','i','j']
class iter_standard(object):
def __init__(self,list):
self.list=list
self.len = len(self.list)
self.cur_pos = -1
def __iter__(self):
return self
def __next__(self):
self.cur_pos += 1
if self.cur_pos<self.len:
return self.list[self.cur_pos]
else:
raise StopIteration()
class iter_reverse(object):
def __init__(self,list):
self.list=list
self.len = len(self.list)
self.cur_pos = self.len
def __iter__(self):
return self
def __next__(self):
self.cur_pos -= 1
if self.cur_pos>=0:
return self.list[self.cur_pos]
else:
raise StopIteration()
for e in iter_standard(list):
print (e)
for e in iter_reverse(list):
print (e)
out:
a
b
c
d
e
f
g
h
i
j
j
i
h
g
f
e
d
c
b
a
网友评论