如果在一个类中定义__iter__方法,那么这个类的实例就是一个迭代器。__iter__方法需要返回一个迭代器,所以就需要返回对象本身即可(也就是self)。当对象每迭代一次时,就会调用迭代器中的另外一个特殊成员方法__next__。该方法需要返回当前迭代的结果。
- 通过自定义迭代器对由星号(*)组成的直角三角形的每一行进行迭代,然后通过for循环进行迭代,输出一定行数的直角三角形
# 可无限迭代直角三角形的行
class RightTriangle:
def __init__(self):
super().__init__()
self.n = 1
def __next__(self):
# 通过字符串的乘法获取直角三角形每一行的字符串,每一行字符串的长度是2*n-1
result = '*' * (2 * self.n - 1)
# 行数加1
self.n += 1
return result
# 该方法必须返回一个迭代器
def __iter__(self):
return self
rt = RightTriangle()
for e in rt:
if len(e) > 20:
break
print(e)
输出结果:
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
- 定义一个迭代器类,用于无限迭代斐波那契数列
# 可无限制迭代斐波那契数列
class Fibonacci:
# 在构造方法中定义两个变量a和b,用来表示斐波那契数列的最开始的两个值
def __init__(self):
super().__init__()
self.a = 0
self.b = 1
def __next__(self):
result = self.a
self.a, self.b = self.b, self.a + self.b
return result
def __iter__(self):
return self
fibs = Fibonacci()
for fib in fibs:
print(fib, end=' ')
if fib > 500:
break
输出结果:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
- 将迭代器转换为列表
# 可无限制迭代斐波那契数列
class Fibonacci:
# 在构造方法中定义两个变量a和b,用来表示斐波那契数列的最开始的两个值
def __init__(self):
super().__init__()
self.a = 0
self.b = 1
def __next__(self):
result = self.a
self.a, self.b = self.b, self.a + self.b
if result > 500:
raise StopIteration
return result
def __iter__(self):
return self
fibs = Fibonacci()
print(list(fibs))
输出结果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]