python迭代器

python迭代器

概念

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

关于迭代器的使用

迭代器是一个可以记住遍历位置的对象,它可以从集合的第一个元素开始访问,知道所有元素都被访问结束,但它只能向前,不能后退

字符串,列表,元组对象都可用于创建迭代器

两个重要方法

  1. iter() 创建迭代器对象

  2. next() 将指针移动到下一个元素

     list = [1,2,3]
     it = iter(list)
     print(next(it))
    

在访问第一个元素时,也要使用 next() 方法

遍历方法

for 循环遍历

list = [1,2,3]
it = iter(list)
for x in it:
	print(x,end=',')

使用 next() 方法

import sys

list = [1,2,3]
it = iter(list)
while True :
	try:
		print( next(it) )
	except StopIteration
		sys.exit()	# 退出程序

创建一个迭代器

要先了解关于 面向对象 相关知识

在把一个类作为迭代器使用时,需要在类中实现两个方法__iter__(self)__next__(self)

关于这两个方法

__iter__(self)方法返回一个特殊的迭代器对象,该对象实现了__next__(self)方法并通过 StopIteration异常表示迭代的完成
__next__(self)方法会返回下一个迭代器对象

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

myclass = MyNumber()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))

StopIteration

StopIteration异常用于标识迭代器的完成,防止出现无限循环,通过捕获该异常,判断是否已经结束遍历

在创建迭代器时,我们可以在__next__(self)方法中设置条件,触发StopIteration异常来结束迭代

class MyNumber:
	def __iter__(self):
		self.a = 1
		return self
	def __next__(self):
		if self.a <= 10
			x = self.a
			self.a += 1
			return x
		else
			raise StopIteration

myclass = MyNumber()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))

生成器

在python中,使用了 yield 的函数被称为 生成器

和普通函数不同,生成器是一个返回迭代器的函数,只用于迭代器操作,本质上,生成器就是一个迭代器。

在调用生成器时,每次遇到 yield ,函数都会暂停执行,并保存当前所有的运行信息,返回 yield 的值,并在下一次执行 next() 方法时从当前位置继续执行

import sys

def function(n):		#生成器函数
	a,b,counter = 0,1,0
	while True:
		if counter<=10 :
			return
		yield a
		a,b = b,a+b
		counter += 1

f = function(10)
while True:
	try:
		print(next(f),end=" ")
	except StopIteration
		sys.exit()

0 1 1 2 3 5 8 13 21 34 55

以官方示例为例,在初始化完成后,在next() 执行时,执行到 yield ,方法暂停执行,并返回 a,当再一次调用时,方法从上一次执行到的 yield 处下一行继续执行,直到再次遇到 yield,并返回 a 的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值