博文我们使用Python制作了一个简单的天气预报小程序(天气渐冷,Python小工具让你随时掌握气温变化,做温暖的穿衣达人)。今天,需求有变,如果我们想去旅游,备选方案有北京、上海、广州、新疆等等很多个城市……我们又不知道该选择哪个?那就看下这些城市最近的天气吧!毕竟,为了一段旅程把自己搞生病了也不太值得……
如果使用文章中的小程序,我们每次只能获取到一个城市的天气数据,不好进行对比,而且很浪费时间。有没有办法一次性将你方案中的城市天气预报一次性打印输出呢?
如何实现这一需求?今天,我们就是用迭代器和可迭代对象的原理来实现这一需求。
迭代器对象和可迭代对象
我们知道,Python中迭代器对象,它实现了__next__()方法,当它调用__next__()方法时,返回其中的下一个元素。它不像列表、元组那样一旦生成,就会一次性占用内存空间,它使得我们需要用到迭代器对象里面的元素时,就调用它,平时它不会占用太多内存空间。比如,打开一个大文件,我们可以将文件内容定义为一个迭代器对象。我们使用__next__()方法获取它的下一个迭代内容(Python2.X直接使用next()方法),这样操作可以提升程序性能。
我们通常使用的列表、字典、元组、字符串等等这些数据结构称为可迭代对象(Iterable),它内部实现了__iter__()方法,外部使用iter()方法可以将它转化为一个可迭代对象。但它们不是迭代器(Iterator),只是通过iter()方法可以将这些对象转化为可迭代对象。
迭代器和可迭代对象的区别在于迭代器是用时访问数据,不浪费或者很少浪费内存空间,而可迭代对象范围更加广泛。本质来讲,迭代器就是一种可迭代对象,从编程角度分析可迭代对象就是对象中定义了__iter__()、__getitem__()等魔法方法的对象。我们实例来看一下这两者的区别在哪里?如下图所示。
可迭代对象和迭代器的区别图示制作一个天气预报小程序(使用迭代器和可迭代对象)
通过上面的分析我们知道了迭代器对象和可迭代对象的区别。当我们需要知道很多个城市的天气情况时,先定义一个迭代器对象MyWeatherIterator,继承Iterator对象,并自定义它的__next__()方法。然后,我们将该迭代器对象封装成一个可迭代对象MyWeatherIterable(继承Iterable对象,并实现它的__iter__()方法)。这样,我们就可以像列表、元组等数据结构一样便利地获取其中的信息,而且这样的自定义对象在降低内存消耗方面也很有优势。
首先,定义迭代器对象
具体代码如下图所示。
天气预报迭代器对象然后,将迭代器对象封装成一个可迭代对象
这一步相对来说较为简单,实现它的__iter__()方法,代码如下所示。
将迭代器对象封装成可迭代对象最后,我们获取想要知道城市的天气信息
以下面的列表为例:
cities_lst=[北京,上海,广州,深圳,海南,新疆,敦煌,西安]
foriteminMyWeatherIterable(cities_lst):
print(item)
我们来看下效果,如下所示。
有了它,妈妈再也不担心我感冒了城市:北京:昼夜温差极大,且风力较强,极易发生感冒,请特别注意增减衣服保暖防寒。
:8
城市:上海:天凉,昼夜温差较大,较易发生感冒,请适当增减衣服,体质较弱的朋友请注意适当防护。
:15
广州:昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。
:22
城市:深圳:天气较凉,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。
:21
城市:海南:天气寒冷,且昼夜温差很大,极易发生感冒。请特别注意增加衣服保暖防寒。
:-1
城市:兰州:昼夜温差很大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。
:6
城市:西安:昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。
:14
嗯嗯,想去暖和一点地方嘛,广州、深圳是首选。极易发生感冒的地方就先不去了……
好了,今天的内容就到这里了,怎么样?迭代器和可迭代对象的区别你学会了吗?这可是一个很有Python特点的对象,学会自定义一个迭代器对象和可迭代对象,对于提升程序性能是很有用的,希望大家在使用Python处理大型网络数据流或者是文件流时,首选这两个对象。
未完待续欢迎大家留言