迭代器与可迭代对象

简述

迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一
种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器
模式

迭代器

迭代器是这样一个对象,实现了无参数__next__方法,返回序列中的下一个元素,

如果没有元素了,那么抛出StopIteration异常。

迭代器特性

迭代器对象为一次性消费,用完不可再生,

如果要再使用,需要重新获取迭代器;

此外,两个迭代器之间无干扰。

栗子

list1 = [1, 2, 3, 4, 5]

it1 = iter(list1)
print(next(it1)) #
print(next(it1)) # print("\nfor loop")
for x in it1:
print(x) #
#
# print("\nNo interference between two iters")
it2 = iter(list1)
it3 = iter(list1)
print(next(it2)) #
print(next(it3)) #
print(next(it2)) #
print(next(it3)) #

迭代器的作用

(1)for循环

(2)构建和扩展集合类型

(3)逐行遍历文本文件

(4)列表推导、字典推导和集合推导

(5)元组拆包

(6)调用函数时,使用*拆包实参

可迭代对象

如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。

根据可迭代协议,__iter__ 方法实例化并返回一个迭代器,

Python 中的迭代器还实现了__iter__ 方法,因此迭代器也可以迭代。

python迭代对象的流程

在对一个可迭代对象迭代时,具体流程如下

(1) 检查对象是否实现了 __iter__ 方法,如果实现了就调用它,获取一个迭代器

(2)如果没有实现 __iter__ 方法,但是实现了 __getitem__ 方法,
python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素

(3)如果尝试失败,python 抛出 TypeError 异常,通常会提示"x object is not iterable"

迭代器与可迭代对象的关系

python是通过可迭代对象来获取迭代器的。

实际应用

(1)实现一个迭代器对象WeatherIterator,__next__每次返回一个城市的气温信息

(2)实现一个可迭代对象WeatherIterable,__iter__方法返回一个WeatherIterator对象

代码

from collections import Iterable, Iterator
import requests class WeatherIterator(Iterator):
def __init__(self, cities):
self.cities = cities
self.index = 0 def __next__(self):
if self.index == len(self.cities):
raise StopIteration
city = self.cities[self.index]
self.index += 1
return self.get_weather(city) def get_weather(self, city):
url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + city
r = requests.get(url)
data = r.json()['data']['forecast'][0]
return city, data['high'], data['low'] class WeatherIterable(Iterable):
def __init__(self, cities):
self.cities = cities def __iter__(self):
return WeatherIterator(self.cities) def show(w):
for x in w:
print(x) w = WeatherIterable(['北京', '上海', '广州'] * 10)
show(w)

参考资料:《流畅的python》

参考资料:python3实用编程技巧进阶

python-迭代器与可迭代对象的更多相关文章

  1. Python迭代器,可迭代对象,生成器

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...

  2. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  3. python tips:迭代器与可迭代对象

    for循环 for i in s: print(i) 在上述for循环中,不断地将s中的值赋值给i,然后打印出来.这种只针对s中元素的循环称为对s的迭代,能够迭代的s称为可迭代的. python为了实 ...

  4. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  5. python函数之可迭代对象、迭代器的判断

    怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...

  6. 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别

    练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...

  7. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  8. day11-Python运维开发基础(迭代器与可迭代对象、高阶函数)

    1. 迭代器与可迭代对象 # ### 迭代器 """ 迭代器: 能被next方法调用,并且不断返回下一个值的对象,是迭代器(对象) 特征:迭代器会生成惰性序列,它通过计算 ...

  9. Python生成器、迭代器、可迭代对象

    把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.gener ...

  10. Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别

    直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...

随机推荐

  1. php无限极分类方法

    仅供参考: //控制器 $data = M('category')->select(); $datas = D('Category')->_getTree($data, 0,0,TRUE) ...

  2. sklearn数据库-【老鱼学sklearn】

    在做机器学习时需要有数据进行训练,幸好sklearn提供了很多已经标注好的数据集供我们进行训练. 本节就来看看sklearn提供了哪些可供训练的数据集. 这些数据位于datasets中,网址为:htt ...

  3. 服务器资源监控插件(jmeter)

    零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过 实时监控,可以准确的把握不同测试场景下服务器资源消 ...

  4. 对.zip格式的文件进行解压缩

    //第一个参数就是需要解压的文件,第二个就是解压的目录public static boolean upZipFileDir(File zipFile, String folderPath) { Zip ...

  5. C# ref与out关键字解析

    简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 ...

  6. 13树莓派手动安装Home Assistant

    2017-09-05 00:53:02 https://home-assistant.io/docs/installation/raspberry-pi/ 已经安装步骤安装了带桌面的树莓派系统,在SD ...

  7. North American Invitational Programming Contest 2018

    A. Cut it Out! 枚举第一刀,那么之后每切一刀都会将原问题划分成两个子问题. 考虑DP,设$f[l][r]$表示$l$点顺时针一直到$r$点还未切割的最小代价,预处理出每条边的代价转移即可 ...

  8. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习9

    #include <iostream>using namespace std;int main(){ int num; cout<<"Enter number of ...

  9. 封装的head

    //获取浏览器和版本号var userAgent=window.navigator.userAgent, rMsie=/(msie\s|trident.*rv:)([\w.]+)/, rFirefox ...

  10. vue全选反选demo

    <template> <div> <div class="xuanze"> <label><input type=" ...