深入理解Python中的迭代器与生成器

楼玄
• 阅读 755

一、迭代器(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开发者必备的知识。

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础9——可迭代对象
17可迭代对象list是一个迭代对象可以通过for..in..这类语句遍历读取数的对象称之为可迭代对象pythonli1,2,3foriinli:print(i)17.1什么是可迭代对象可迭代对象1.字符串2.列表3.元组4.字典5.集合满意以下条件的也可以成为可迭代对象1.对象实现了\iter方法
Wesley13 Wesley13
4年前
java并发之CopyOnWriteArraySet
java并发之CopyOnWriteArraySetCopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,持有CopyOnWriteArrayList的内部对象,它的迭代器也是CopyOnWriteArrayList的迭代器,add操作通过addAllAbsent
Stella981 Stella981
4年前
Python三大神器之迭代器详解
我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。可迭代一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定哪个可迭代哪个不可以,你需要用python内建的iter()来帮忙。
Stella981 Stella981
4年前
Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一、切片(Slice)    在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片。python中没有针对字符串的截取函数,需要通过“切片”来完成。  取一个list或tuple的部分元素可以用切片   格式: 假定list或tuple组成的元素组
Stella981 Stella981
4年前
Python3 迭代器与生成器
点击上方Z先生点记,加为星标第一时间收到Python技术干货!转自:Python那些事迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方
Stella981 Stella981
4年前
C++ 之获取map元素[转]
链接:https://www.cnblogs.com/jianfeifeng/p/11089799.html  对于map对象,count成员返回值只能是0或者1,map容器只允许一个键对应一个实例。所以count可有效地表明一个键是否存在。count返回出现的次数。  find返回指向元素的迭代器,如果元素不存在,则返回end迭代器。 
Stella981 Stella981
4年前
Php5.5新特性 Generators详解
在PHP5.5.0版本中,新增了生成器\(Generators)_特性,用于简化实现迭代器接口_(Iterator)\创建简单的迭代器的复杂性。通过生成器,我们可以轻松的使用foreach迭代一系列的数据,而不需要事先在内存中构建要被迭代的对象,大大减少了内存开销。当生成器函数被调用的时候,它会返回一个可迭代的对象,当对该对象进行迭代
Stella981 Stella981
4年前
Python标准库笔记(10) — itertools模块
itertools用于更高效地创建迭代器的函数工具。Python版本3.xitertools提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发。它们的目的是快速有效地使用内存,并且将它们关联在一起以表示更复杂的基于迭代的算法。基于迭代器的代码比使用列表的代码提供了更好的内存消耗特性。因为直
Stella981 Stella981
4年前
Python 迭代器与生成器
python迭代器与生成器说到python迭代器,首先要明确两个概念:Iterable和Iterator,这两个概念还有Generator都是定义在collections模块里的。Iterable意为“可迭代的(对象)”,包括如下两种:1、实现了__getitem__(self,
Stella981 Stella981
4年前
OpenCV访问像素点
三种方法迭代器创建一个Mat::Iterator对象it,通过itMat::begin()来的到迭代首地址,递增迭代器知道itMat::end()结束迭代;while(it!Scr.end<Vec3b()){//(it)00;//蓝色通道置零;
小万哥 小万哥
1年前
NumPy 数组迭代与合并详解
NumPy数组迭代NumPy数组迭代是访问和处理数组元素的重要方法。它允许您逐个或成组地遍历数组元素。基本迭代我们可以使用Python的基本for循环来迭代NumPy数组。一维数组迭代:pythonimportnumpyasnparrnp.array(1
楼玄
楼玄
Lv1
放下屠刀,立地成佛、救人一命,胜造七级浮屠。
文章
4
粉丝
0
获赞
0