原文参考:https://baijiahao.baidu.com/s?id=1605521786183411929&wfr=spider&for=pc
可迭代:在Python中如果一个对象有iter( )方法或getitem( )方法,则称这个对象是可迭代的(Iterable);其中iter( )方法的作用是让对象可以用for ... in循环遍历,getitem( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。换句话说,两个条件只要满足一条,就可以说对象是可迭代的。显然列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的。当然因为Python的“鸭子类型”,我们自定义的类中只要实现了iter( )方法或getitem( )方法,也是可迭代的。
class Weather():
def __init__(self, citys):
self.citys = citys
def __iter__(self):
return iter(self.citys)
wea = Weather(['苏州', '兰州', '西安'])
for x in wea:
print(x)
迭代器:在Python中如果一个对象有iter( )方法和next( )方法,则称这个对象是迭代器(Iterator);其中iter( )方法是让对象可以用for ... in循环遍历,next( )方法是让对象可以通过next(实例名)访问下一个元素。注意:这两个方法必须同时具备,才能称之为迭代器。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。
class WeatherIterable():
def __init__(self, cities):
self.cities = cities
self.index = 0
def __iter__(self):
return iter(self.cities)
def __next__(self):
if self.index == len(self.cities):
raise StopIteration
res = self.cities[self.index]
self.index += 1
return res
if __name__ == "__main__":
a = WeatherIterable(['上海', '北京', '厦门'])
while True:
print(next(a))
sleep(1)
通过对定义的分析和比较我们得知:迭代器都是可迭代的,但可迭代的不一定是迭代器;可用for ... in循环的都是可迭代的,可用next( )遍历的才是迭代器;next( )是单向的,一次只获取一个元素,获取到最后一个元素后停止;在可迭代的对象中提前存储了所有的元素,而迭代器是惰性的,只有迭代到了某个元素,该元素才会生成,迭代之前元素可以是不存在的,迭代之后元素也可以被销毁,因此迭代器在处理大量数据甚至无限数据时具有加载数据快、占用内存小等优势。
判断对象是否为可迭代对象,可迭代器对象:
from collections import Iterable, Iterator
isinstance(x, Iterable)
isinstance(x, Iterator)
生成器函数:定义生成器函数generator与定义普通函数是一样的,唯一的不同生成器函数中有一个或多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,而yield将数据返回后仍然继续运行函数,因此最后生成器函数返回的是一个迭代器对象。下图的代码定义了一个生成器函数用于对字符串的顺序进行翻转。