📅  最后修改于: 2020-01-17 14:42:02             🧑  作者: Mango
在许多情况下,我们需要访问类似迭代器的对象。一种方法是使用生成器循环,但这会延长程序员的工作量和时间。Python通过为该任务提供内置方法__iter __()来简化此任务。
__iter __()函数返回给定的对象(数组,集合,元组等,或自定义对象)的迭代器。它创建一个可以使用__next __()函数,一次访问一个元素的对象,通常在处理循环时会很方便。
语法 :
iter(object)
iter(callable, sentinel)
如果我们迭代了迭代器所有元素,错误StopIterationError会出现.
__iter __()函数返回遍历给定对象的每个元素的迭代器对象。可以通过__next __()函数访问下一个元素。对于可调用对象和Sentinel值,将进行迭代,直到找到Sentinel值或到达元素末尾为止。无论如何,原始对象都不会被修改。
代码1:
# Python代码展示iter()
listA = ['a','e','i','o','u']
iter_listA = iter(listA)
try:
print( next(iter_listA))
print( next(iter_listA))
print( next(iter_listA))
print( next(iter_listA))
print( next(iter_listA))
print( next(iter_listA)) #StopIteration错误
except:
pass
输出:
a
e
i
o
u
代码2:
# Python代码,展示如何使用iter()
lst = [11, 22, 33, 44, 55]
iter_lst = iter(lst)
while True:
try:
print(iter_lst.__next__())
except:
break
输出:
11
22
33
44
55
代码3:
# Python代码,展示基础的iter()
listB = ['Cat', 'Bat', 'Sat', 'Mat']
iter_listB = listB.__iter__()
try:
print(iter_listB.__next__())
print(iter_listB.__next__())
print(iter_listB.__next__())
print(iter_listB.__next__())
print(iter_listB.__next__()) #StopIteration error
except:
print(" \n报错 'StopIterationError'",
"已经迭代到头了.")
输出:
Cat
Bat
Sat
Mat
报错 'StopIterationError' 已经迭代到头了.
代码4:用户定义的对象(使用OOPS)
# Python代码,展示iter()的面向对象
class Counter:
def __init__(self, start, end):
self.num = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.num > self.end:
raise StopIteration
else:
self.num += 1
return self.num - 1
# 测试代码
if __name__ == '__main__' :
a, b = 2, 5
c1 = Counter(a, b)
c2 = Counter(a, b)
# 不使用iter(),打印范围
print ("不使用iter(),打印范围")
for i in c1:
print ("吃更多的芒果, 计算中 ", i, end ="\n")
print ("\n使用iter()打印范围\n")
# 方法2-使用iter()
obj = iter(c2)
try:
while True: # 打印直到报错
print ("吃更多的芒果, 计算中 ", next(obj))
except:
# when StopIteration raised, Print custom message
print ("\n你已经撑死,游戏结束")
输出:
不使用iter(),打印范围
吃更多的芒果, 计算中 2
吃更多的芒果, 计算中 3
吃更多的芒果, 计算中 4
吃更多的芒果, 计算中 5
使用iter()打印范围
吃更多的芒果, 计算中 2
吃更多的芒果, 计算中 3
吃更多的芒果, 计算中 4
吃更多的芒果, 计算中 5
你已经撑死,游戏结束