有了它,出门旅游再也不怕感冒了,Pyth

博文我们使用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处理大型网络数据流或者是文件流时,首选这两个对象。

未完待续

欢迎大家留言



转载请注明地址:http://www.dunhuangshizx.com/dhshj/17375.html
  • 上一篇文章:
  • 下一篇文章: 没有了