关于python:深入理解Python中的迭代器与生成器

38次阅读

共计 1719 个字符,预计需要花费 5 分钟才能阅读完成。

一、迭代器(Iterators)

在 Python 中,迭代器是一个能够记住遍历的地位的对象。迭代器对象从汇合的第一项元素开始拜访,直到所有的元素被拜访完完结。迭代器只能往前不会后退。字符串,元组或列表等可迭代对象都能够用于创立迭代器。

迭代器实现了两个根本的办法,别离是 __iter__()next()

my_tuple = ("apple", "banana", "cherry")
my_iter = iter(my_tuple)

print(next(my_iter))
print(next(my_iter))
print(next(my_iter))

这段代码中,首先咱们定义了一个元组 my_tuple,而后通过 iter() 函数失去了这个元组的迭代器 my_iter。之后,咱们通过 next() 函数来顺次拜访这个迭代器中的元素。

二、自定义迭代器

咱们也能够创立本人的迭代器对象。要创立一个迭代器对象,你须要定义一个类,而后在这个类中实现 __iter__()__next__() 办法。

上面是一个简略的自定义迭代器的例子:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    x = self.a
    self.a += 1
    return x

my_class = MyNumbers()
my_iter = iter(my_class)

print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))

在这段代码中,咱们定义了一个 MyNumbers 类,这个类实现了 __iter__()__next__() 办法,因而它能够被视为一个迭代器类。咱们能够创立这个类的对象,并通过 iter() 函数失去它的迭代器。

三、生成器(Generators)

生成器是一种非凡的迭代器,然而你不须要去实现类的 __iter__()__next__() 办法。一个函数只有蕴含了 yield 语句,那么这个函数就是一个生成器。

生成器是一种使用方便的创立迭代器的办法。上面是一个简略的生成器的例子:

def my_gen():
  n = 1
  print('This is printed first')
  yield n

  n += 1
  print('This is printed second')
  yield n

  n += 1
  print('This is printed last')
  yield n

a = my_gen()
next(a)
next(a)
next(a)

在这段代码中,my_gen 是一个生成器函数,它应用了 yield 语句。咱们能够间接调用 next() 函数来获取生成器中的下一个值。

四、生成器表达式

生成器表达式是 Python 的一种高级个性,它是一种十分简洁并且高效的创立生成器的形式。它的语法模式与列表推导式十分类似,只不过把方括号 [] 换成了圆括号 ()

上面是一个生成器表达式的例子:

gen = (x**2 for x in range(10))

for value in gen:
    print(value)

在这个例子中,gen 是一个生成器,它应用了生成器表达式 (x**2 for x in range(10)) 来创立。这个生成器会生成 0 到 9 的平方数。而后,咱们能够通过 for 循环来迭代这个生成器,并打印出每个生成的值。

与列表推导式相比,生成器表达式的劣势在于它不会一次性生成所有的元素,而是在每次迭代时才生成下一个元素。因而,当你须要解决的序列十分大,或者你只须要解决序列的前几个元素时,应用生成器表达式能够节俭大量的内存。

五、总结

迭代器和生成器是 Python 中十分重要的概念。它们都提供了一种高效的解决序列的形式。了解和纯熟应用迭代器和生成器,能够帮忙你写出更简洁、更高效的 Python 代码。

在理论的开发中,咱们常常会用到这两个概念。例如,在解决大量数据时,应用生成器能够防止一次性加载所有的数据,从而节俭内存。而在须要自定义数据结构时,实现迭代器则能够使得你的数据结构反对 for 循环等迭代操作。

因而,深刻了解 Python 中的迭代器和生成器是每一个 Python 开发者必备的常识。

正文完
 0