可迭代对象
实现了__iter__方法的对象就叫做可迭代对象。__iter__方法的作用就是返回一个迭代器对象。直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。
•调用可迭代对象的__iter__方法返回一个迭代器对象(iterator)
•不断调用迭代器的__next__方法返回元素
•直到迭代完成后,处理StopIteration异常
迭代器(iterator)
迭代器是一个带状态的对象,他能在你调用next()方法的时候返回下一个值,任何实现了__iter__和__next__()方法的对象都是迭代器,
•__iter__返回迭代器自身,
•__next__返回下一个值,如果没有更多元素了,则抛出StopIteration异常。
class MyIterator:
def __init__(self,begin,end):
self.begin=begin
self.end=end
def __iter__(self):
return self
def __next__(self):
if self.begin==self.end:
raise StopIteration('停止')
x=self.begin
self.begin+=1
return x
# iter_obj=MyIterator(0,3)
# print(next(iter_obj))
# print(next(iter_obj))
# print(next(iter_obj))
# print(next(iter_obj))
for i in MyIterator(0,3):
print(i)
运行结果:
生成器(generator)
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()和__next__()方法了,只需要一个yiled关键字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一种懒加载的模式生成值。
def generator():#生成器
yield 1
yield 2
yield 3
g=generator()
# print(g)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
for i in g:
print(i)
运行结果:
用生成器写打印输出0-4
def my_rang(start,end):
i=start
while i<end:
yield i
i=i+1
for e in my_rang(0,4):
print(e)
运行结果;
生成器表达式
生成器表达式是列表推倒式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。
g=(e for e in (1,2,3,4,5,6))
# print(g)
for i in g:
print(i)
运行结果:
判断是否可以迭代
from collections.abc import Iterable
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance('abc', Iterable))
print(isinstance((x for x in range(10)), Iterable))
print(isinstance(100, Iterable))
运行结果: