python-迭代器与可迭代对象
迭代器与可迭代对象
简述
迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一
种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器
模式
迭代器
迭代器是这样一个对象,实现了无参数__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-迭代器与可迭代对象的更多相关文章
- Python迭代器,可迭代对象,生成器
迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...
- Python中的可迭代对象与迭代器对象
刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...
- python tips:迭代器与可迭代对象
for循环 for i in s: print(i) 在上述for循环中,不断地将s中的值赋值给i,然后打印出来.这种只针对s中元素的循环称为对s的迭代,能够迭代的s称为可迭代的. python为了实 ...
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- python函数之可迭代对象、迭代器的判断
怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...
- 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别
练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...
- Python中的可迭代对象
Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...
- day11-Python运维开发基础(迭代器与可迭代对象、高阶函数)
1. 迭代器与可迭代对象 # ### 迭代器 """ 迭代器: 能被next方法调用,并且不断返回下一个值的对象,是迭代器(对象) 特征:迭代器会生成惰性序列,它通过计算 ...
- Python生成器、迭代器、可迭代对象
把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.gener ...
- Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别
直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...
随机推荐
- [转] vue之computed和watch
计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...
- James Munkres Topology: Theorem 20.4
Theorem 20.4 The uniform topology on \(\mathbb{R}^J\) is finer than the product topology and coarser ...
- 使用Spring ThreadPoolTaskExecutor实现多线程任务
我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池,线程池 ...
- Spring异步调用原理及SpringAop拦截器链原理
一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...
- Leetcode中值得一做的题
3.longest substring Given a string, find the length of the longest substring without repeating chara ...
- php实现根据字符串生成对应数组的方法
先看看如下示例: <?php $config = array( 'project|page|index' => 'content', 'project|page|nav' => ar ...
- docker修改容器信息,打包等
https://blog.csdn.net/x6_9x/article/details/72891404
- 运行make_datafiles的过程
1. 第一个bug 运行 echo "Please tokenize this text." | java edu.stanford.nlp.process.PTBTokenize ...
- Java 整数型的进制间的互相转换
/** * 整数型, 进制间的互相转换 */ public class IntConversion { public static void main(String[] args) { int num ...
- Grunt connect
使用connect打开指定html方法 由于localhost会直接链接到了index.html,所以我们可以通过base选项设置打开html,这是我的目录,我要打开根目录下的test.html co ...