python基础之迭代器协议和生成器(二)
一、什么是迭代器:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器是一个可以记住遍历的位置的对象。
迭代器的特点:只能往前不会后退。
迭代器有两个基本的方法:__iter__ 和 __next__或者iter()和next()。
1、iter方法:返回迭代器对象本身
2、next方法:返回迭代器的下一个元素
可迭代的:只要对象本身有__iter__方法,那它就是可迭代的。
字符串,列表或元组对象都可用于创建迭代器:
list = [1,2,3,4] #list列表
r = iter(list)用iter方法将list转成迭代器赋值给r
print(next(r)) #用next方法使用迭代器r,并输出结果
print(next(r)) #因为迭代器是一次性的,so,要想看下面的内容,\
# 还得用next方法使用迭代器r,并输出结果
----------------以下是输出结果--------------------
>>> print(next(r))
1
>>> print(next(r))
2
>>> print(next(r))
3
>>> print(next(r))
4
>>>
二、迭代器的优点:
1、迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件);
2、迭代器与列表比较,迭代器是惰性计算的,更节省内存。
三、迭代器的缺点:
1、无法获取迭代器的长度,使用不如列表索引取值灵活;
2、一次性的,只能往后取值,不能倒着取值。就像象棋里卒一样不能倒着走。
用代码展示如下:
下面来用代码展示一下吧:
>>> d={"a":1,"b":2,"c":3} #定义了一个字典
>>> r = iter(d) #用iter方法将字典转成了一个迭代器并赋值给r
>>> while True: #定义了一个死循环
... print(next(r)) #用next调用迭代器r
...
a #一直循环next的话,超出了元素的个数的时候就会报错
b
c
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration #报错的内容
正确的代码如下:
while循环
d = {"a":1,"b":2,"c":3}
r = iter(d)
while True: #加上try之后,它会自己判断,超出后会自动break
try:
print(next(r))
except StopIteration:
break
----------输出内容-------------
a
b
c
d = {"a":1,"b":2,"c":3}
for i in d: #for循环,遍历字典的中的每一个元素
print(i)
----------输出-----------
a
b
c
总结:不难看出for的作用是遍历迭代器——对一个迭代器(实现了 __next__)或者可迭代对象(实现了 __iter__)。
查看可迭代对象与迭代器对象:
#查看是否是可迭代对象(True为是,False为否)
print(isinstance(s,Iterable)) #------>True
print(isinstance(l,Iterable)) #------>True
print(isinstance(t,Iterable)) #------>True
print(isinstance(d,Iterable)) #------>True
print(isinstance(set1,Iterable)) #------>True
print(isinstance(f,Iterable)) #------>True #查看是否是迭代器
f.__next__()
print(isinstance(s,Iterator)) #--------->False #字符串
print(isinstance(l,Iterator)) #--------->False #列表
print(isinstance(t,Iterator)) #--------->False #元组
print(isinstance(d,Iterator)) #--------->False #字典
print(isinstance(set1,Iterator)) #--------->False #集合
print(isinstance(f,Iterator)) #--------->True #文件
四、生成器
定义:
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。
下面用实例使用 yield 实现斐波那契数列:
def fibonacci(n): #生成器函数-斐波那契数列
a,b,counter = 0,1,0
while True:
if (counter > n):
return
yield a
a,b=b,a+b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True:
try:
print(next(f),end=" ")
except StopIteration:
break
生成器与return有何区别?
return只能返回一次函数就彻底结束了,而yield能返回多次值。
函数在暂停以及继续下一次运行时的状态是由yield保存
return作用:
在一个生成器中,如果没有return,则默认执行到函数完毕;
如果遇到return,在执行过程中 return,则直接抛出 StopIteration 终止迭代。
python基础之迭代器协议和生成器(二)的更多相关文章
- (转)python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- python 迭代器协议和生成器
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代 ...
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python学习------迭代器协议和生成器
一.递归和迭代 递归:自己调用自己 举例解释:问路 A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...
- Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器
Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...
- python基础8 -----迭代器和生成器
迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...
随机推荐
- “技术产品”面向市场的表达方法思辨——BY Me
“技术产品”面向市场的表达方法思辨 首先,我们来看看“技术产品”在面向市场去表达的时候,怎么表述是容易被市场接受和理解的,“目标受众是谁?”.“市场切入点是什么?”,做到有的放矢,打动目标受众.切中其 ...
- python库numpy的reshape的终极解释
a = np.arange(2*4*4) b = a.reshape(1,4,4,2) #应该这样按反序来理解:最后一个2是一个只有2个元素的向量,最后的4,2代表4×2的矩阵,最 ...
- phpexcel导出带生成图片完美案例
// 导出exl public function look_down(){ $id = I('get.id'); $m = M ('offer_goods'); $where['offer_id'] ...
- 算法:LRU(最近最少使用)
算法:LRU(最近最少使用) 本文参考自小灰文章:https://mp.weixin.qq.com/s/B5xiVeW22ZumbI9KfrYJSg LRU算法 什么是LRU算法 LRU算法又称最近最 ...
- org.springframework-jdbc
Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate 博客分类: spring JDBCSpringSQL编程数据结构 今天看了下Spr ...
- ThinkPHP框架基础知识三
一.JS文件与Css文件存放位置 其实JS与Css文件放在任意位置都可以找到,只要路径正确就行. 在TP框架中我们访问的所有文件都要走入口文件index.php,相当于访问的是index.php页面. ...
- PAT 天梯赛 L1-011. A-B 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-011 AC代码 #include <iostream> #include <cstdio&g ...
- nodejs两个例子
1.nodejs多线程 var cluster=require("cluster");//ͨ¹ýcluster¿ÉÒÔ·Ö³öһЩ×ÓÏß³Ì var http=requir ...
- c9.io
老常时间没写了,这次是真碰到心动的东西了,赶快给大家奉献上来. (先上图!) (Cloud9 IDE,云端IDE,简单一点就是运行在浏览器中的IDE,你不需要安装任何东西, 只要打开任何一个浏览器,甚 ...
- redis 笔记03 RDB 持久化、AOF持久化、事件、客户端
RDB 持久化 1. RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据. 2. SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器. 3. BGSAVE由子进程执行保 ...