Python迭代器笔记
python中的三大器有迭代器,生成器,装饰器,本文重点讲解下迭代器的概念,使用,自定义迭代器等的介绍。
1.概念:
迭代器是一个对象,一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束,迭代器只能往前,不能后退,实质是具备了__next__和__iter__方法的对象
2.可迭代对象:
可以通过for in 等类似操作进行遍历取值的对象,本质是具备了__iter__方法的对象,因为__iter__方法提供了迭代器,实现了遍历位置的记录。在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。
3.代码实现:
3.1通过isinstance()判断
In [1]: from collections import Iterable
In [2]: isinstance({},Iterable)
Out[2]: True
In [3]: isinstance((),Iterable)
Out[3]: True
In [4]: isinstance("",Iterable)
Out[4]: True
In [5]: for item in {}:
...: pass
...:
In [6]: for item in "":
...: pass
...:
In [7]: for item in ():
...: pass
...:
3.2 for in的本质
就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
li = [100, 200, 300, 400]
# for num in li:
# print(num) # 1. 通过调用可迭代对象的__iter__()获取迭代器
# 2. 对迭代器调用__next__进行迭代操作,
# 如果没有抛出StopIteration异常,表示迭代没有结束,把获取到的数据元素放到变量中
# 如果抛出了异常,表示迭代结束,退出执行
# 3. 执行循环体
# 4. 跳转到第2步执行 iterator = li.__iter__() while True:
try:
num = iterator.__next__()
except StopIteration:
break
else:
print(num)
3.3 自定义迭代器
class MyIterable(object):
def __init__(self):
self.container = [] # 定义一个容器 def add(self, item):
self.container.append(item) def __iter__(self):
return Iterator(self.container) # 返回一个迭代器 class Iterator(object):
def __init__(self, container):
self.container = container
self.i = 0 def __next__(self):
if self.i < len(self.container):
count = self.i
self.i += 1
return self.container[count]
else:
raise StopIteration def __iter__(self):
pass mi = MyIterable()
it = mi.__iter__()
mi.add(1)
mi.add(2)
mi.add(3) for item in mi:
print(item) from collections import Iterator print(isinstance(it, Iterator))
3.4 合并迭代器
Python要求定义的迭代器必须实现__iter__(self),并且返回self。通常,一个可迭代对象的迭代器都是固定的,并且,类与类之间需要距离性,对象之间需要相似性,所以通常可迭代对象和迭代器写在一起,就是下面的。
class MyIterable(object):
def __init__(self):
self.container = []
self.i = 0 def add(self, item):
self.container.append(item) def __next__(self):
if self.i < len(self.container):
count = self.i
self.i += 1
return self.container[count]
else:
raise StopIteration def __iter__(self):
return self mi = MyIterable()
mi.add(1)
mi.add(2)
mi.add(3) for item in mi:
print(item)
3.5 迭代器应用场景之实现菲波那切数列
我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
class Fib(object):
def __init__(self, num):
self.num = num
self.num1 = 0
self.num2 = 1
self.i = 0 def __next__(self):
if self.i < self.num:
self.i += 1
temp = self.num1
self.num1, self.num2 = self.num2, self.num1 + self.num2
return temp
else:
raise StopIteration def __iter__(self):
return self fib = Fib(7)
print(list(fib))
4.iter()函数与next()函数
对于可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。iter()函数实际上就是调用了可迭代对象的__iter__方法。
>> li = [1,2,3]
>>> li_iter = iter(li)
>>> next(li_iter)
1
>>> next(li_iter)
2
>>> next(li_iter)
3
>>> next(li_iter)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
Python迭代器笔记的更多相关文章
- 【python学习笔记】9.魔法方法、属性和迭代器
[python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...
- Python学习笔记之生成器、迭代器和装饰器
这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- Python学习笔记(十)
Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...
- Python学习笔记(八)
Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...
- 【python学习笔记】5.条件、循环和其他语句
[python学习笔记]5.条件.循环和其他语句 print: 用来打印表达式,不管是字符串还是其他类型,都输出以字符串输出:可以通过逗号分隔输出多个表达式 import: 导入模块 impo ...
- 【python学习笔记】4.字典:当索引不好用时
[python学习笔记]4.字典:当索引不好用时 字典是python中唯一内建的map类型 创建: key可以为任何不可改变的类型,包括内置类型,或者元组,字符串 通过大括号: phonebook={ ...
随机推荐
- Linux修复系统命令
fsck.ext2(file system check-second filesystem ) 功能说明:检查文件系统并尝试修复错误. 语法:fsck.ext2 [-acdfFnprsStvVy][- ...
- CentOS 6.x安装配置MongoDB 3.4.x
说明: 操作系统:CentOS 5.X 64位 IP地址:192.168.21.128 实现目的: 安装配置MongoDB数据库 具体操作: 一.关闭SElinux.配置防火墙 1.vi /etc/s ...
- alter system set events相关知识
格式:alter system|session set events ‘[eventnumber|immediate] trace name eventname [forever] [, level ...
- C# 抓取网页的img src带参数的图片链接,并下载
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- matlab中 %d,%f,%c,%s代表什么意思
1.%d就是输出整型:%3d就是说按照长度为3的整型输出,比如10,输出就是“_10”,“_”代表空格. 2.%f就是输出小数:%6.2f就是小数点后保留2位,输出总长度为6,比如3.14159,输出 ...
- Java多线程——Lock&Condition
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. package ...
- exportfs命令 NFS客户端问题 FTP介绍 使用vsftpd搭建ftp
exportfs命令 • 常用选项 • -a 全部挂载或者全部卸载 • -r 重新挂载 • -u 卸载某一个目录 • -v 显示共享目录 • 以下操作在服务端上 • vim /etc/exports ...
- mysql 解压版方法
来自http://zhidao.baidu.com/link?url=RtXb2QKYTQ8Yd5TdTS7XHHiupzDaM19vlVBIrHTVmT7ZHi8kG3O9L6D6nnsfTGE-- ...
- linux nginx,php开机启动
nginx开机启动 1.首先,在linux系统的/etc/init.d/目录下创建nginx文件 vim /etc/init.d/nginx 2.加入脚本 #!/bin/bash # nginx St ...
- 近5年常考Java面试题及答案整理(一)
下列面试题都是在网上收集的,本人抱着学习的态度找了下参考答案,有不足的地方还请指正. 1.面向对象的特征有哪些方面? 抽象:将同类对象的共同特征提取出来构造类. 继承:基于基类创建新类. 封装:将数据 ...