📜  Python | 可迭代和迭代器之间的区别

📅  最后修改于: 2020-01-18 14:41:50             🧑  作者: Mango

可迭代是一个对象,特点之一可以遍历。传递给iter()方法时,它将生成一个Iterator 。Iterator是一个对象,用于使用__next __()方法在可迭代对象上进行迭代。迭代器具有 __next__() 方法,该方法返回对象的下一项。
注意,每个迭代器也是可迭代的,但并非每个可迭代都是迭代器。例如,列表是可迭代的,但列表不是迭代器。可以使用函数从可迭代创建迭代器iter()。为了使之成为可能,对象的类要么需要一个方法__iter__,该方法返回一个迭代器,要么需要一个__getitem__具有从index=0开始的顺序索引。
代码1

for city in ["Berlin", "Logan", "Zurich"]:
    print(city)
print("\n")
for city in ("Python", "Perl", "Ruby"):
    print(city)
print("\n")
for char in "Iteration is easy":
    print(char, end = " ")

输出:

Berlin
Logan
Zurich
Python
Perl
Ruby
I t e r a t i o n   i s   e a s y

当执行for循环时,for语句将iter()在该对象上使用。如果此调用成功,则iter调用将返回定义该方法的迭代器对象,该方法__next__()一次访问一个对象的元素。如果没有其他可用元素,则该 __next__()方法将引发StopIteration 异常。for循环一旦捕获到StopIteration异常,就会终止。
让我们使用next()内置函数__next__()调用该方法。
代码2:如果对象“ obj”是可迭代的,则函数“ iterable”将返回True,否则返回False。

# 城市列表
cities = ["Berlin", "Vienna", "Zurich"]
# 初始化对象
iterator_obj = iter(cities)
print(next(iterator_obj))
print(next(iterator_obj))
print(next(iterator_obj))

输出:

34  is iterable :  False
[4, 5]  is iterable :  True
(4, 5)  is iterable :  True
{'a': 4}  is iterable :  True
dfsdf  is iterable :  True
4.5  is iterable :  False