一、什么是迭代器:

 迭代是Python最强大的功能之一,是访问集合元素的一种方式。

  迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

  迭代器是一个可以记住遍历的位置的对象。

  迭代器的特点:只能往前不会后退。

  迭代器有两个基本的方法:__iter__ 和 __next__或者iter()和next()。

    1、iter方法:返回迭代器对象本身

    2、next方法:返回迭代器的下一个元素

  可迭代的:只要对象本身有__iter__方法,那它就是可迭代的。

  字符串,列表或元组对象都可用于创建迭代器:

  1. list = [1,2,3,4] #list列表
  2. r = iter(list)用iter方法将list转成迭代器赋值给r
  3. print(next(r)) #用next方法使用迭代器r,并输出结果
  4. print(next(r)) #因为迭代器是一次性的,so,要想看下面的内容,\
  5. # 还得用next方法使用迭代器r,并输出结果
  6. ----------------以下是输出结果--------------------

>>> print(next(r))
1
>>> print(next(r))
2
>>> print(next(r))
3
>>> print(next(r))
4
>>>

二、迭代器的优点:

1、迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件);

2、迭代器与列表比较,迭代器是惰性计算的,更节省内存。

三、迭代器的缺点:

1、无法获取迭代器的长度,使用不如列表索引取值灵活;

2、一次性的,只能往后取值,不能倒着取值。就像象棋里卒一样不能倒着走。

用代码展示如下:

  1. 下面来用代码展示一下吧:
  2. >>> d={"a":1,"b":2,"c":3}  #定义了一个字典
  3. >>> r = iter(d)  #用iter方法将字典转成了一个迭代器并赋值给r
  4. >>> while True:  #定义了一个死循环
  5. ... print(next(r))  #用next调用迭代器r
  6. ...
  7. a    #一直循环next的话,超出了元素的个数的时候就会报错
  1. b
    c

Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration #报错的内容

正确的代码如下:

  1. while循环
    d = {"a":1,"b":2,"c":3}
  2. r = iter(d)
  3. while True: #加上try之后,它会自己判断,超出后会自动break
  4. try:
  5. print(next(r))
  6. except StopIteration:
  7. break
    ----------输出内容-------------

a
b
c

  1. d = {"a":1,"b":2,"c":3}
  2. for i in d: #for循环,遍历字典的中的每一个元素
  3. print(i)
  4. ----------输出-----------
  5. a
  6. b
  7. c

总结:不难看出for的作用是遍历迭代器——对一个迭代器(实现了 __next__)或者可迭代对象(实现了 __iter__)。

查看可迭代对象与迭代器对象:

  1. #查看是否是可迭代对象(True为是,False为否)
  2. print(isinstance(s,Iterable)) #------>True
  3. print(isinstance(l,Iterable)) #------>True
  4. print(isinstance(t,Iterable)) #------>True
  5. print(isinstance(d,Iterable)) #------>True
  6. print(isinstance(set1,Iterable)) #------>True
  7. print(isinstance(f,Iterable)) #------>True
  8.  
  9. #查看是否是迭代器
  10. f.__next__()
  11. print(isinstance(s,Iterator)) #--------->False #字符串
  12. print(isinstance(l,Iterator)) #--------->False #列表
  13. print(isinstance(t,Iterator)) #--------->False #元组
  14. print(isinstance(d,Iterator)) #--------->False #字典
  15. print(isinstance(set1,Iterator)) #--------->False #集合
  16. print(isinstance(f,Iterator)) #--------->True #文件

四、生成器

定义:

    在 Python 中,使用了 yield 的函数被称为生成器(generator)。

    跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

    在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

  下面用实例使用 yield 实现斐波那契数列:

  1. def fibonacci(n): #生成器函数-斐波那契数列
  2. a,b,counter = 0,1,0
  3. while True:
  4. if (counter > n):
  5. return
  6. yield a
  7. a,b=b,a+b
  8. counter += 1
  9. f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
  10.  
  11. while True:
  12. try:
  13. print(next(f),end=" ")
  14. except StopIteration:
  15. break

生成器与return有何区别?

  return只能返回一次函数就彻底结束了,而yield能返回多次值。

  函数在暂停以及继续下一次运行时的状态是由yield保存

  return作用:

  在一个生成器中,如果没有return,则默认执行到函数完毕;

  如果遇到return,在执行过程中 return,则直接抛出 StopIteration 终止迭代。

  

python基础之迭代器协议和生成器(二)的更多相关文章

  1. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  2. python基础之迭代器协议和生成器

    迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...

  3. python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. python基础之 迭代器回顾,生成器,推导式

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  5. python 迭代器协议和生成器

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代 ...

  6. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  7. python学习------迭代器协议和生成器

    一.递归和迭代 递归:自己调用自己 举例解释:问路   A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...

  8. Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器

    Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...

  9. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

随机推荐

  1. Pig、Hive、MapReduce 解决分组 Top K 问题(转)

    问题: 有如下数据文件 city.txt (id, city, value) cat city.txt 1 wh 5002 bj 6003 wh 1004 sh 4005 wh 2006 bj 100 ...

  2. 简明python教程三-----函数

    函数通过def关键字定义.def关键字后跟一个函数的表标识符名称,然后跟一对圆括号. 圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. def sayHello(): p ...

  3. python 测试代码

    1.使用print()打印 测试代码最简单的就是添加一些print()语句.然而产品开发中,需要记住自己添加的所有print()语句并在最后删除,很容易出现失误. 2.使用pylint.pyflake ...

  4. http post url参数封装(key token 及校验码)

    post请求本来是一种很常见的web请求方式,相信许多项目都有一系列的封装工具类. 今天遇着一个特殊的需求. 需要在post的请求url内封装相应的token 与及key相关的值,这就奇怪了,url封 ...

  5. Spring 配置log4j和简单介绍Log4J的使用

    Log4j 是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事 件记录器.UNIX Syslog守护进程等 ...

  6. logback logback.xml 常用配置详解(转)

    本文转自:http://my.oschina.net/looly/blog/298675 推荐参考:http://blog.csdn.net/haidage/article/details/67945 ...

  7. 在 Mac OS 上编译 OBS

    本文转自:在 Mac OS 上编译 OBS | www.samirchen.com 安装环境 第一步,做准备工作,安装编译 OBS 所需要的环境,流程如下: // 给当前用户添加 /usr/local ...

  8. Python3:数字类型和字符串类型的相互转换

    Python3:数字类型和字符串类型的相互转换 一.python中字符串转换成数字 方法1: 类中进行导入:import string str='555'num=string.atoi(str)num ...

  9. Block作为返回值时的使用

    昨天使用一个小例子简单说明了下Block作为参数时的使用. 今天再来复习一下Block作为返回值使用时的情况,先贴一小段热门第三方框架Masonry的官方sample code: [view1 mas ...

  10. NOIP 马拦过河卒

    描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘 ...