Python3中的迭代器

1:for循环遍历

在Python中for循环可以用于遍历任何序列类型,包括列表,元组,字符串,但是不能用与遍历整数,代码如下:

# 遍历列表
t = [1,2,3]
for x in t:
	print(x)

# 遍历元组
t = (1,2,3,)
for x in t:
	print(x)

# 遍历字符串
t = '123'
for x in t:
	print(x)

t = 123
for x in t:  # TypeError: 'int' object is not iterable
	print(x)

for循环为什么不能用于整数呢,从报错信息(TypeError: 'int' object is not iterable)可知,int 不是一个可以迭代对象,在Python中是否可迭代或者是否能够for循环遍历需要遵守Python中的迭代协议。
2:迭代协议:(包括两种对象)
     可迭代对象(Iterable):里面包含了__iter__()
     迭代器对象(Iterator):里面包含了__iter__() 和 __next__()

列表,字符串,元组,字典是可迭代对象,整数不是:测试代码如下

>>> lst = [1,2,3]
>>> print('__iter__' in dir(lst),'__next__' in dir(lst))
True False
>>> s='ixusy88'
>>> print('__iter__' in dir(s),'__next__' in dir(s))
True False
>>> s=(1,2,3,)
>>> print('__iter__' in dir(s),'__next__' in dir(s))
True False
>>> d={'age':18}
>>> print('__iter__' in dir(d),'__next__' in dir(d))
True False
>>> i = 100
>>> print('__iter__' in dir(i),'__next__' in dir(i))
False False
>>> 

在for循环执行过程中,Python会自动调用对象的__iter__()方法,从而返回一个迭代器对象,再使用这个迭代器对象调用__next__()方法获取序列中的一个元素,每次调用都获取下一个元素,直到结束抛出StopIteration异常。

lst = [1,2,3,4]
for x in lst:
	print(x)


I = lst.__iter__()
while 1:
	try:
		x = I.__next__()
	except StopIteration:
		break
	print(x)

手工迭代:

>>> lst = [1,2,3,4]
>>> lst
[1, 2, 3, 4]
>>> I = lst.__iter__()
>>> I
<list_iterator object at 0x0000022502A679B0>
>>> I.__next__()
1
>>> I.__next__()
2
>>> I.__next__()
3
>>> I.__next__()
4
>>> I.__next__()
Traceback (most recent call last):
  File "<pyshell#65>", line 1, in <module>
    I.__next__()
StopIteration
>>> print('__iter__' in dir(I),'__next__' in dir(I))
True True
>>> 

3:自定义迭代器
 

# 斐波那契函数
# 
class Fibonacci:
	def __init__(self,n):
         self.a = 0
         self.b = 1
         self.max_cnt = n
	def __next__(self):
         self.a, self.b = self.b, self.a+self.b
         if self.a > self.max_cnt:
         	raise StopIteration
         return self.a
	def __iter__(self):
         return self

fib = Fibonacci(100)
print(fib)

for x in fib:
	print(x)

print('*'*30)

for x in Fibonacci(200):
	print(x)

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章