Python 迭代器

Python 迭代器是一个对象,其中包含可计数的数值或元素。你可以使用它来遍历所有这些元素。迭代器使用名为 `__iter__()` 和 `__next__()` 的特殊方法来遍历对象元素。

Python 迭代器与可迭代对象

如果我们能从中获取迭代器,我们就称该对象为可迭代对象。到目前为止,我们已经看到了列表、元组、集合和字典等对象。你可以从这些对象中调用 `iter()`。本节将解释如何使用此类并创建我们自己的无限迭代器,并提供实际示例。

字符串迭代器示例

在此编程语言中,字符串是可迭代对象。这里,我们使用 for 循环遍历字符串中的每个字符并返回该字符。默认情况下,或者说,for 循环会在您不知情的情况下实现迭代器对象概念。

stri = 'tutorialgateway'
 
for x in stri:
    print(x, end = '  ')
t u t o r i a l g a t e w a y

For 循环迭代器示例

在此示例中,我们同时使用了 for 循环和此。在此 Python 编程语言中,我们必须使用 `next()` 函数来从迭代器中返回一个元素或值。

请记住,`next()` 方法一次返回一个项目。因此,对于 n 个项目,您必须使用 n 个 `next()` 语句。这里,我们只使用了一次 `next()`。所以,它返回字符串中的第一个字符。

stng = 'tutorialgateway'
  
for x in stng:
     print(x, end = '  ')
  
print("\n**** Output *****")
itr = iter(stng)
  
print(next(itr))
t u t o r i a l g a t e w a y
**** Output *****
t

我将使用 `next()` 来遍历字符串中的所有字符。这次,迭代器编写了完整的字符串。

sting = 'tutorialgateway'
 
for x in sting:
    print(x, end = '  ')
 
print("\n**** Example *****")
itr = iter(sting)
 
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
t u t o r i a l
**** Example *****
t
u
t
o
r
i
a
l

Python 列表迭代器示例

在此示例中,我们展示了如何遍历 列表 项目并打印它们。

numbers = [10, 20, 30, 40, 50]
 
itr = iter(numbers)
 
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
10
20
30
40
50

在此示例中,我们使用了 `__next__()` 特殊方法。如果您观察最后一条语句,我们试图返回不存在的下一个元素。这就是为什么 `iter` 被称为 `StopIteration`。

numbers = [10, 20, 30, 40, 50]
 
itr = iter(numbers)
 
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
Python Iterator Example

集合迭代器示例

您可以使用此来遍历集合项并返回对象。此程序遍历 集合 中的数字并打印其中的每一个。

mySet = {1, 2, 3, 4, 5}
 
ittr = iter(mySet)
 
print(ittr.__next__())
print(ittr.__next__())
print(ittr.__next__())
print(ittr.__next__())
print(ittr.__next__())
1
2
3
4
5

元组示例

迭代器对象还可以让您在元组上使用它。此程序迭代 元组 项目并在元组中打印每个项目。

fruits = ('Apple', 'Orange', 'Grape', 'Banana', 'Kiwi')
 
fruit_itr = iter(fruits)
 
print(next(fruit_itr))
print(next(fruit_itr))
print(next(fruit_itr))
print(next(fruit_itr))
print(next(fruit_itr))
Apple
Orange
Grape
Banana
Kiwi

在 Python 中创建自己的迭代器

这是一个名为 Counter 的简单类。在此示例中,我们首先在 `__init__` 方法中声明了一个最大值。 `__iter__` 方法用于初始化可迭代对象的值。目前,我们将数字设置为 0。这意味着迭代器从 0 开始。

`__next__` 方法用于从对象中选择下一个元素。在此 Python 方法中,我们使用了 If Else 语句 来检查下一个数字是否大于最大值。如果为 True,则会引发 StopIteration 错误。否则,数字将递增。

class Counter:
 
    def __init__(self, maximum):
        self.maximum = maximum

    def __iter__(self):
        self.number = 0
        return self
 
    def __next__(self):
        number = self.number
 
        if number > self.maximum:
            raise StopIteration
        else:
            self.number = number + 1
            return number
 
numbers = Counter(10)
a = iter(numbers)

print(next(a))
print(next(a))
print(next(a))
Create Own Iterator

上面的代码显示了从 0 到 2 的数字。这是因为我们只使用了 3 次 `next(a)`。在此迭代器程序中,我们使用 for 循环以最大值为 10 迭代 Counter 类。这将打印从 0 到 10 的值。 `__iter__()` 从 0 开始,而 `__next__()` 打印到 10 的元素。

class Counter:
 
    def __init__(self, maximum):
        self.maximum = maximum
 
    def __iter__(self):
        self.number = 0
        return self
 
    def __next__(self):
        number = self.number
 
        if number > self.maximum:
            raise StopIteration
        else:
            self.number = number + 1
            return number
 
for t in Counter(10):
    print(t)
0
1
2
3
4
5
6
7
8
9
10

Python 无限迭代器类

在创建自己的迭代器时,您应该始终小心无限循环。如果您忘记引发错误,您将陷入无限循环。这是一个无限迭代器对象的简单示例。它与上面的示例相同,但我们删除了 If 语句。

class Counter:
 
    def __iter__(self):
        self.number = 0
        return self

    def __next__(self):
        number = self.number

        self.number = number + 1
        return number
      
numbers = Counter()
a = iter(numbers)
 
print(next(a))
print(next(a))
print(next(a))
0
1
2

尽管上面的示例是一个无限迭代器,但您可能没有注意到它。这是因为我们只使用了 3 次 `next()`。所以,让我使用 Counter 类 for 循环来调用一个 iter 函数。请参考 字典 文章。

class Counter:
 
    def __iter__(self):
        self.num = 0
        return self
 
    def __next__(self):
        num = self.num
 
        self.num = num + 1
        return num
     
for t in Counter():
    print(t)

现在您可以看到无限对象了。它会连续执行。

267
268
269
270
271
272
273