python(九)迭代器和生成器
一、迭代
迭代就是逐个并且单向访问容器 (这里的容器暂时指数据类型,比如list和dict) 中的元素的行为。举个例子:将一个长度为五的数组逐个从头到尾(即单向)打印的方式称之为迭代。如下图。
>>> list = [1,2,3,4,5]
>>> for i in list:
... print i
...
1
2
3
4
5
二、迭代器
1、迭代器概念
迭代器简单的说就是可以对数据(这里指可以迭代的数据)进行迭代行为的对象。
可以通过以下两个方面描述迭代器[4]:
1)、iter 返回的是迭代器对象本身。用在for 和 in 上面。
2)、每次调用next() 方法返回迭代器的下一个元素,当没有元素可以返回就会抛出异常;
迭代器可以理解为可以逐个并单向访问容器中元素的游标。
而迭代器对象只能迭代一次,也就是返回最后的值后,再继续访问,只会返回异常。
下面举个例子(2):
>>> list = [1,2,3,4,5]
>>> iterator = iter(list)
>>> iterator.next()
1
>>> iterator.next()
2
>>> iterator.next()
3
>>> iterator.next()
4
>>> iterator.next()
5
>>> iterator.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
2、迭代器的实现[4]:
接下通过定义一个迭代器来实现迭代功能, 这个是官方文档的例子[4]:
先定义(个人觉得这个例子不合适,有个更好的找不到,自己也暂时想不出)
class Counter(object):
def __init__(self, low, high):
self.current = low
self.high = high def iter(self):
'Returns itself as an iterator object'
return self def next(self):
'Returns the next value till current is lower than high'
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
再实现
test1 = Counter(1,3).iter()
print "test1"
print next(test1)
print next(test1)
print next(test1) test2 = Counter(1,3)
print "test2"
print next(test2)
print next(test2)
print next(test2)
print next(test2)
这是输出
#test1 的输出
test1
1
2
3
#test2 的输出
test2
1
2
3
StopIteration
注意test2的next调用超过里面的元素就会抛出异常
三、生成器
生成器也是迭代器,但比迭代器多了一个关键字yeild. 这个yield功能替代了迭代器的iter 和 next 功能。
我在参考的时候看到一个概况的很好的说法。
“yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象(转自[2], 作者:廖雪峰)”
举个例子(3),先定义一个生成器
def counter_generator(low, high):
while low <= high:
yield low
low += 1
实现
i= counter_generator(1, 3)
print(i.next())
print(i.next())
print(i.next())
print(i.next())
输出
1
2
3
StopIteration
再举个例子(4),先定义一个生成器
>>> def fab(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a, b = b, a + b
... n = n + 1
>>> f = fab(5)
>>> print f.next() #这里返回的值可以当做 'b' 的值
1
>>> print f.next()
1
>>> print f.next()
2
>>> print f.next()
3
>>> print f.next()
5
>>> print f.next()
StopIteration
参考:
[1] Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解[2]:
http://blog.csdn.net/dawningblue/article/details/72629362
[2] Python yield 使用浅析
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
[3] Iterator - Python Wiki
https://wiki.python.org/moin/Iterator
[4] python官方文档定义
https://pymbook.readthedocs.io/en/latest/igd.html
python(九)迭代器和生成器的更多相关文章
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- 【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- Python之迭代器,生成器
迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...
- python之迭代器、生成器与面向过程编程
目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...
- day13 python学习 迭代器,生成器
1.可迭代:当我们打印 print(dir([1,2])) 在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...
- Python之迭代器及生成器
一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...
随机推荐
- Echarts关于仪表盘
https://blog.csdn.net/zc763375777/article/details/53837391 来无事,制作不一样的图标一发,领导让把仪表盘做成百分条,我TM也是醉了,大体样式如 ...
- 第二十四节,TensorFlow下slim库函数的使用以及使用VGG网络进行预训练、迁移学习(附代码)
在介绍这一节之前,需要你对slim模型库有一些基本了解,具体可以参考第二十二节,TensorFlow中的图片分类模型库slim的使用.数据集处理,这一节我们会详细介绍slim模型库下面的一些函数的使用 ...
- android studio adb.exe已停止工作(全面成功版 进程的查询和开启)
先输入adb看是否存在. 如果不存在则:在系统path里添加C:\Users\nubia\AppData\Local\Android\sdk\platform-tools 因为这个目录里有adb 或者 ...
- zend studio报错
Problems encountered while setting project description. Cannot create linked resource '/.org.eclipse ...
- 常见的Dos命令
dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录 注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 cd.. : 退回到上一级目 ...
- 【优秀的Sketch插件】PaintCode for Sketch for Mac 1.1
[简介] PaintCode for Sketch 是一款结合了PaintCode和Sketch两款软件强大功能的插件,今天和大家分享最新的1.1版本,支持Sketch 40+版本,这个插件能够让你的 ...
- CodeForces1073E 数位dp+状压dp
http://codeforces.com/problemset/problem/1073/E 题意 给定K,L,R,求L~R之间最多不包含超过K个数码的数的和. 显然这是一道数位dp,在做的过程中会 ...
- 剑指Offer_编程题_13
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. class So ...
- 剑指Offer_编程题_1
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Sol ...
- angular,vue,react的基本语法—动态属性、事件绑定、ref,angular组件创建方式
基本语法: 动态属性: vue: v-bind:attr="msg" :attr="msg" react: attr={msg} angular [attr]= ...