Python迭代器(Iterator)

这篇具有很好参考价值的文章主要介绍了Python迭代器(Iterator)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、迭代器

迭代是访问集合元素的一种方式

迭代器是一个可以记住遍历位置的对象。迭代器对象从第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。

二、可迭代对象

能用for循环遍历的对象

三、iter()、next()函数 for循环大体过程

iter()获取一个可迭代对象的迭代器

nums = [1, 2, 3, 4]	# 是可迭代对象
print(type(nums))	# <class 'list'>
nums_iter = iter(nums)	# 是迭代器
print(type(nums_iter))	# <class 'list_iterator'>

next()获取迭代器的数据

nums = [1, 2, 3, 4]	# 可迭代对象
nums_iter = iter(nums)	# 迭代器
num = next(nums_iter)
print(num)
num = next(nums_iter)
print(num)

for循环的过程可以通过上面的iter()和next()函数来实现,即:
1、先调用iter(),将nums当作实参,得到nums这个可迭代对象的迭代器
2、调用next(),将上一步得到的迭代器 进行取值
3、将上一步取出来的值 赋值给num这个变量
4、执行for循环体中的代码,print(num)
5、重复执行2/3/4步,当nums中所有数据都获取完毕后,会在下一次调用next的时候产生Stopiteration异常。只不过 for循环中自带了异常处理,当它遇到Stopiteration异常的时候,会自动结束for循环

四、自定义"迭代器"

iter 方法

迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用 next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。

实际上,在使用 next()函数的时候,调用的就是迭代器对象的 next 方法(Python2中是对象的next()方法)。

所以想要构造一个迭代器,就要实现它的 __next__方法。

但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现 __iter__方法,而 __iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的 __iter__方法返回自身即可。

  • 一个实现了__iter__方法和__next__方法的对象,就是迭代器
    可以使用 isinstance() 判断一个对象是否是Iterator对象
from collections.abc import Iterable

class MyList(object):
	def __init__(self):
		self.container = []
	
	def __iter__(self):	# 只要有此方法最下面的结果就是True
		pass

	def add(self, item):
		self.container.append(item)

myList = MyList()
mylist.add(11)
mylist.add(22)
mylist.add(33)

print(isinstance(mylist, Iterable))	# 如果结果是True 则表示mylist一定是可迭代对象,否则是不可迭代对象

总结:如果定义类时,有__iter__方法,那么这个类创建出来的对象一定是可迭代对象

__next__方法

from collections.abc import Iterable
from collections.abc import Iterator

class MyList(object):
	"""自定义的一个可迭代对象"""
	def __init__(self):
		self.items = []

	def add(self, val):
		self.items.append(val)

	def __iter__(self):
		# 这个方法有两个功能
		# 1.标记用当前类创建出来的对象一定是 可迭代对象
		# 2.当调用iter()函数的时候 这个方法会被自动调用 它返回自己指定的哪个迭代器
		return MyIterator()

class MyIterator(object):
	"""自定义的供上面可迭代对象使用的一个迭代器"""
	def __init__(self):
		pass

	def __next__(self):
		# 这个方法有两个功能
		# 1.标记当前类创建出来的对象(当然还必须有__iter__方法)一定是迭代器
		# 2.当调用next()函数的时候 这个方法会被自动调用 它返回一个数据
		pass

	def __iter__(self):
		pass

mylist = MyList()	# 可迭代对象
mylist_iter = iter(mylist)	# 当对mylist调用iter()函数的时候,会自动调用MyList类中的__iter__方法,返回的就是mylist这个可迭代对象的迭代器

print("mylist是否是可迭代对象", isinstance(mylist, Iterable))	# True
print("mylist是否是迭代器", isinstance(mylist, Iterator))	# False

print("mylist_iter是否是可迭代对象", isinstance(mylist_iter, Iterable))	# True
print("mylist_iter是否是迭代器", isinstance(mylist_iter, Iterator))	# True

# next(mylist_iter)
  • 总结:__iter__方法、__next__方法 与 iter()函数、next()函数的区别是,
    1. 当对一个可迭代对象调用iter()函数时,它会自动调用这个可迭代对象的__iter__方法,这个方法返回的对象当作迭代器
    2. 当对一个迭代器对象调用 next()函数时,它会自动调用这个迭代器对象的__next__方法,这个方法返回想要那个数据
    3. 迭代器对象 一定是 可迭代对象;可迭代对象 不一定是 迭代器

五、案例升级

from collections.abc import Iterable
from collections.abc import Iterator

class MyList(object):
	"""自定义的一个可迭代对象"""
	def __init__(self):
		self.items = []
		self.current = 0
	
	def add(self, val):
		self.items.append(val)

	def __iter__(self):
		return self

	def __next__(self):
		if self.current < len(self.items):
			item = self.items[self.current]
			self.current += 1
			return item
		else:
			raise StopIteration	# 抛出异常(不返回None是因为,for循环是一个已实现的功能,它自带iter、next函数,并且带有异常判断,通过这个异常判断来决定是否还需要继续获取迭代器的数据,如果用None来表示数据已获取完毕,但是for循环的代码依然用的异常来判断而不是None,所以for循环会产生死循环)


if __name__ == '__main__':
	mylist = MyList()
	mylist.add(1)
	mylist.add(2)
	mylist.add(3)
	mylist.add(4)
	mylist.add(5)
	
	# mylist_iter = iter(mylist)
	# print(next(mylist_iter))

	# for num in mylist:
	#	print(num)
	nums = list(mylist)	# list在创建一个新的列表的时候,只要是 可迭代对象 就可以放到list中当作实参
	print(nums)

六、for…in… 循环的本质

1.先调用 iter()函数,它会自动调用可迭代对象中的 __iter__方法,此方法返回这个可迭代对象的 迭代器对象
2.对获取到的迭代器不断调用 next()函数,它会自动调用迭代器中的 __next__方法来获取下一个值
3.当遇到 StopIteration异常后循环结束

七、并不是只有for循环能接受可迭代对象

除了for循环外,list、tuple等也能接收文章来源地址https://www.toymoban.com/news/detail-608827.html

八、总结

1.凡是可作用于 for循环的对象都是 Iterable 类型;
2.但是可作用于 next()函数的对象都是 Iterator 类型;
3.集合数据类型如 list、dict、str 等是 Iterable 但不是 Iterator, 不过可以通过 iter() 函数获得一个 Iterator 对象

到了这里,关于Python迭代器(Iterator)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++迭代器(STL迭代器)iterator详解

    要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。 迭代器按照定义方式分

    2024年02月03日
    浏览(45)
  • JS - iterator(迭代器)

    一、 概念        JavaScript原有表示“集合”的数据结构,主要是数组(\\\' Array \\\')和对象(\\\' Object \\\' ),ES6又添加了Map和Set。这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,

    2024年02月07日
    浏览(45)
  • 迭代器 Iterator

    迭代器是一种设计模式,它用于遍历集合或容器中的元素,能够访问集合的元素而无需关心集合的内部结构: 特点: 封装集合访问 :迭代器封装了对集合元素的访问,通过迭代器访问集合中的元素,而无需了解集合的内部结构或实现方式。 统一接口 :迭代器提供了一致的

    2024年02月08日
    浏览(43)
  • 迭代器模式(Iterator Pattern)

    一、定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。 二、优缺点 优点:  1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类

    2024年02月09日
    浏览(43)
  • 【Java杂谈】Iterator(迭代器)的使用

    迭代器是Java提供的一种访问集合的方法,Iterator 是 Java 迭代器最简单的实现,常用来访问ArrayList、HashMap等类的对象。 Iterator是一个接口,ListIterator是Collection API中的接口,它扩展了Iterator接口: 可以使用iterator() 方法: hasNext()方法的作用是没有遍历完成 next()方法有两个作用

    2024年02月10日
    浏览(54)
  • 【 java 集合】使用迭代器 Iterator 遍历集合

    💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜 📝 个人主页:馆主阿牛🔥 🎉 支持我:点赞👍+收藏⭐️+留言📝 📣 系列专栏:java 小白到高手的蜕变🍁 💬格言:要成为光,因为有怕黑的人!🔥 上两篇文章总结了集合体系以及Collection常用方法,本节我们来

    2024年02月07日
    浏览(51)
  • 设计模式--迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern)是一种行为型设计模式,用于提供一种统一的方式来访问一个聚合对象中的各个元素,而不需要暴露该聚合对象的内部结构。迭代器模式将遍历集合的责任从集合对象中分离出来,使得可以在不同的情况下使用不同的迭代方式。 迭代器模式通常包

    2024年02月10日
    浏览(46)
  • 什么是迭代器(Iterator)?如何使用它遍历集合?

    迭代器(Iterator)是一种设计模式,它提供了一种遍历集合(如列表、数组、映射等)中元素的方法,而无需暴露集合内部的表示细节。它将遍历和集合分离,使得可以独立地操作和遍历集合。 在许多编程语言中,迭代器是一个对象,它包含了可以遍历集合的方法。常见的迭

    2024年02月15日
    浏览(43)
  • 设计模式第16讲——迭代器模式(Iterator)

    迭代器模式是一种 行为型 设计模式,它提供了一种 统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式 。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 抽象迭代器(Iterator):定义了遍历聚合对

    2024年02月11日
    浏览(42)
  • java -- 异常处理、Collection、Iterator迭代器、泛型

    Java异常处理的五个: try、catch、finally、throw、throws 在编写程序时,我们必须要考虑程序出现问题的情况 当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包