一、迭代

迭代就是逐个并且单向访问容器 (这里的容器暂时指数据类型,比如list和dict) 中的元素的行为。举个例子:将一个长度为五的数组逐个从头到尾(即单向)打印的方式称之为迭代。如下图。

  1. >>> list = [1,2,3,4,5]
  2. >>> for i in list:
  3. ... print i
  4. ...
  5. 1
  6. 2
  7. 3
  8. 4
  9. 5

二、迭代器

1、迭代器概念

迭代器简单的说就是可以对数据(这里指可以迭代的数据)进行迭代行为的对象。

可以通过以下两个方面描述迭代器[4]:

1)、iter 返回的是迭代器对象本身。用在for 和 in 上面。

2)、每次调用next() 方法返回迭代器的下一个元素,当没有元素可以返回就会抛出异常;

迭代器可以理解为可以逐个并单向访问容器中元素的游标。

而迭代器对象只能迭代一次,也就是返回最后的值后,再继续访问,只会返回异常。

下面举个例子(2):

  1. >>> list = [1,2,3,4,5]
  2. >>> iterator = iter(list)
  3. >>> iterator.next()
  4. 1
  5. >>> iterator.next()
  6. 2
  7. >>> iterator.next()
  8. 3
  9. >>> iterator.next()
  10. 4
  11. >>> iterator.next()
  12. 5
  13. >>> iterator.next()
  14. Traceback (most recent call last):
  15. File "<stdin>", line 1, in <module>
  16. StopIteration

2、迭代器的实现[4]:

接下通过定义一个迭代器来实现迭代功能, 这个是官方文档的例子[4]:

先定义(个人觉得这个例子不合适,有个更好的找不到,自己也暂时想不出)

  1. class Counter(object):
  2. def __init__(self, low, high):
  3. self.current = low
  4. self.high = high
  5.  
  6. def iter(self):
  7. 'Returns itself as an iterator object'
  8. return self
  9.  
  10. def next(self):
  11. 'Returns the next value till current is lower than high'
  12. if self.current > self.high:
  13. raise StopIteration
  14. else:
  15. self.current += 1
  16. return self.current - 1

再实现

  1. test1 = Counter(1,3).iter()
  2. print "test1"
  3. print next(test1)
  4. print next(test1)
  5. print next(test1)
  6.  
  7. test2 = Counter(1,3)
  8. print "test2"
  9. print next(test2)
  10. print next(test2)
  11. print next(test2)
  12. print next(test2)

这是输出

  1. #test1 的输出
  2. test1
  3. 1
  4. 2
    3
  5. #test2 的输出
  6. test2
  7. 1
  8. 2
    3
  9. StopIteration

注意test2的next调用超过里面的元素就会抛出异常

三、生成器

生成器也是迭代器,但比迭代器多了一个关键字yeild. 这个yield功能替代了迭代器的iter 和 next 功能。

我在参考的时候看到一个概况的很好的说法。

“yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象(转自[2], 作者:廖雪峰)”

举个例子(3),先定义一个生成器

  1. def counter_generator(low, high):
  2. while low <= high:
  3. yield low
  4. low += 1

实现

  1. i= counter_generator(1, 3)
  2. print(i.next())
  3. print(i.next())
  4. print(i.next())
  5. print(i.next())

输出

  1. 1
  2. 2
  3. 3
  4. StopIteration

再举个例子(4),先定义一个生成器

  1. >>> def fab(max):
  2. ... n, a, b = 0, 0, 1
  3. ... while n < max:
  4. ... yield b
  5. ... a, b = b, a + b
  6. ... n = n + 1
  7. >>> f = fab(5)
  8. >>> print f.next() #这里返回的值可以当做 'b' 的值
  9. 1
  10. >>> print f.next()
  11. 1
  12. >>> print f.next()
  13. 2
  14. >>> print f.next()
  15. 3
  16. >>> print f.next()
  17. 5
  18. >>> print f.next()
  19. 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(九)迭代器和生成器的更多相关文章

  1. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  2. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  3. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  4. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  5. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  6. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  7. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  8. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  9. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

随机推荐

  1. Good Bye 2018 C. New Year and the Sphere Transmission

    传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题意: n 个people,编号1~n,按顺时针方向围城一圈: 初始,编号为1的peo ...

  2. 移动端click事件延时

    在移动端使用click事件会产生300ms的延迟 问题的产生: 移动端存在双击放大的问题,所以在移动端点击事件发生时,为了判断用户的行为(到底是要双击还是要点击),浏览器通常会等待300ms,如果30 ...

  3. (链表 双指针) leetcode 19. Remove Nth Node From End of List

    Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...

  4. C# BackgroundWorker使用总结

    查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(U ...

  5. Linux下FTP虚拟账号环境部署简述

    vsftp的用户有三种类型:匿名用户.系统用户.虚拟用户.1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous.2)本地用户登录:使用系统用户登录,在/etc/passwd中 ...

  6. ECharts基础

    echarts: js引用:<script type="text/javascript" src="js/echarts.js"></scri ...

  7. python3 aes加解密

    # encoding: utf-8 import xlrd import os import yaml import logging.config from Crypto.Cipher import ...

  8. django 跨域解决方案

    使用django-cors-headers模块 github:https://github.com/ottoyiu/django-cors-headers 官方文档中有详细说明 简要配置 1.安装 p ...

  9. 利用salt搭建hadoop集群

    自动化工具有很多..今天总结一下salt安装hadoop 步骤,学习过程. 1,机器列表 hosts文件    只需要将namenode的两台机器上配置 ,不解释了. 2.salt-master在10 ...

  10. C#设计模式(14)——模板方法模式

    1.模板方法模式介绍 提到模板我们经常会想到简历模板/PPT模板等,以简历模板为例,不同的人可以使用一样的简历模板,在填充内容时根据自己的名字/工作经历等填写自己的内容,从而形成不同的简历.在OO中模 ...