本节内容

1、简书

2、可迭代对象

3、迭代器

4、rang方法

5、总结

一、简述

  我们经常使用for循环去遍历一些序列数据,但是我们有的时间发现for循环的效率很低,而且很占用了大量的硬件资源,但是有的for循环遍历效率很高,而且很节省硬件资源,这是为什么呢?有人说是生成器的原因。

二、可迭代对象

1、for循环数据类型

  • 集合数据类型,如:list、tuple、dict、set、str、bytes(字节)等。
  • 生成器(generator),包括生成器和带yield的生成器函数。

2、定义

  可迭代对象(Iterable):直接用于for循环遍历数据的对象

3、用isinstance()方法判断一个对象是否是Iterable对象

1
2
3
4
5
6
7
8
9
10
11
>>> from  collections import  Iterable
>>> isinstance([],Iterable)  #列表
True
>>> isinstance((),Iterable)  #元组
True
>>> isinstance({},Iterable)  #字典
True
>>> isinstance('abc',Iterable)  #字符串
True
>>> isinstance(100,Iterable)   #整型
False

注:生成器不但可以作用于for循环,还可以被__next__()函数不断调用,并且返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值而抛出的异常。

三、迭代器

1、定义

  迭代器(Iterator):可以用__next__()函数调用并不断的返回下一个值的对象称为迭代器。

2、用isinstance()方法判断一个对象是否是Iterator对象

1
2
3
4
5
6
7
8
9
>>> from  collections import  Iterator
>>> isinstance((i*2 for in range(5)),Iterator)  #生成器
True
>>> isinstance([],Iterator)  #列表
False
>>> isinstance({},Iterator)   #字典
False
>>> isinstance('abc',Iterator)   #字符串
False

通过上面的例子可以看出,生成器都是Iterator对象,但是list、dict、str虽然是Iterable对象,却不是Iterator对象。

3、iter()函数

功能:把list、dict、str等Iterable对象变成Iterator对象。

1
2
3
4
5
>>> from  collections import  Iterator
>>> isinstance(iter([]),Iterator)
True
>>> isinstance(iter({}),Iterator)
True

 4、为什么list、dict、str等数据类型不是Iterator?

  这是因为python的Iterator对象表示的是一个数据流,Iterator对象可以被__next__()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过__next__()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。

注:Iterator甚至可以表示一个无限大的数据流,例如:全体自然数。而使用list是永远不可能存储全体自然数的。

四、rang()方法

在python2.7和python3的range()方法实现的原理是不一样的,下面我们就来用代码看看,代码如下:

1
2
3
4
5
6
>>> range(5)  #python2.7
[01234]
>>> xrange(5#python2.7
xrange(5)
>>> range(5)  #python3.5
range(05)

从上面的代码可以看出,在python2.7中rang()只是一个list,在python3中是一个迭代器,python2.7中xrange()跟python3中的range()功能是一样的。

python3中的range()方法实现的原理如下:

1
2
for in range(5):
    pass

实际相当于:

1
2
3
4
5
6
7
8
9
10
# 首先获得Iterator对象:
it = iter([12345])
# 循环:
while True:
    try:
        # 获得下一个值:
        = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

五、总结

  1. 凡是可以作用于for循环的对象都是Iterable类型。
  2. 凡是作用于__next__()函数的对象都是Iterator类型,它们表示一个惰性计算的序列。
  3. 集合数据类型,例如:list、dict、str等,是Iterable但是不是Iterator
  4. 集合数据类型可以通过iter()函数获得一个Iterator对象。

函数和常用模块【day05】:迭代器(六)的更多相关文章

  1. 第六篇:python基础_6 内置函数与常用模块(一)

    本篇内容 内置函数 匿名函数 re模块 time模块 random模块 os模块 sys模块 json与pickle模块 shelve模块 一. 内置函数 1.定义 内置函数又被称为工厂函数. 2.常 ...

  2. 函数和常用模块【day05】:生成器(四)

    本节内容 1.概述 2.列表生成式 3.生成器 4.函数实现生成器 5.生成器表达式 一.概述 我们在使用一组数据时,通常情况下会定义一个列表,然后循环里面的元素,但是你想过没有,如果你只需要使用列表 ...

  3. 函数和常用模块【day05】:文件目录开发规范(七)

    本节内容 1.背景 2.设计目录结构的好处 3.关于readme的内容 4.关于requirements.txt和setup.py 5.关于配置文件的使用方法 一.背景 "设计项目目录结构& ...

  4. 函数和常用模块【day05】:不同目录间进行模块调用(八)

    本节内容 1.背景 2.函数功能解释 3.绝对路径和相对路径 4.不同目录间进行模块调用 一.背景 之前写了软件开发目录规范这篇博客,相信很多人都已经知道,我们在写程序时需要遵循一定的规范,不然,就算 ...

  5. 函数和常用模块【day05】:装饰器高潮(三)

    本节内容 1.概述 2.装饰器定义 3.装饰器定义 4.带参数的生成器 一.概述 我们之前介绍了大幅片的内容,感觉跟装饰器半毛钱关系都没有,其实不然,我们分别详细阐述了高阶函数和内置函数,下面我们就来 ...

  6. 函数和常用模块【day05】:装饰器前戏(二)

    本节内容 嵌套函数 局部作用域和全局作用域的访问顺序 一.嵌套函数 1.定义 在一个函数的函数体内,用def 去声明一个函数,而不是去调用其他函数,称为嵌套函数. 1 2 3 4 5 6 7 8 9 ...

  7. 函数和常用模块【day04】:函数式编程(六)

    本节内容 1.概述 2.介绍 3.定义 一.概述 每当提到函数式编程,很多人都以为就是我们经常写的函数.其实不然. 函数:是定义一段代码的执行过程 函数式编程:输入是确定的,输出也是确定的 二.介绍 ...

  8. 函数和常用模块【day05】:装饰器前奏(一)

    本节内容 定义 原则 实现装饰器的储备知识 函数及变量 高阶函数 一.定义 1.装饰器:本质是函数. 2.功能:用来装饰其他函数,顾名思义就是,为其他的函数添加附件功能的. 二.原则 不能修改被装饰函 ...

  9. 函数和常用模块【day05】:生成器并行计算(五)

    本节内容 1.概述 2.生成器执行原理 3.send()和__next__()方法的区别 4.yield实现并行效果 一.概述 之前只是介绍生成器,那有些同学就说了,这个生成器除了能节省资源,提高工作 ...

随机推荐

  1. [2017BUAA软件工程]第0次作业

    第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 选择计算机专业的一个重要原因是因为计算机专业的就业前景好,由于计算机本身具有的各种优点,现在几乎所有的 ...

  2. 数据驱动测试之——CSV+TestNG

    对于利用Webdriver做自动化的童鞋,对于如何将元素或者输入数据如何和编码分离都应该不会太陌生,本着一边学习一边分享的心态,大概总结了一下关于利用CSV.XML以及Excel来存放数据,然后在结合 ...

  3. VM虚拟机—JVM内存

    JVM在运行时将数据划分为了5个区域来存储,这5个区域图示如下: 其中方法区和堆对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行时线程私有的内存区域. 首先我们熟悉一下一个 J ...

  4. [转帖] Win10 多桌面转换的快捷键

    http://down.52pk.com/zhishi/52202.shtml win10系统中用户除了可以切换任务之外,还可以进行多桌面切换,就像是切换了电脑屏幕一样,可能网友们还都不知道win10 ...

  5. centos7 tar.xz格式文件的解压方法

    现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件格式. 和gzip与bzip2一样,同样支持多文件压缩,但是约定不能将多于一个的目标文件压缩进同一个档案 ...

  6. centos网络yum源的安装

    CentOS使用EPEL YUM源EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHE ...

  7. P2209 [USACO13OPEN]燃油经济性Fuel Economy

    题面 sol:(思想):开一个大根堆和一个小根堆,每次计算到下了一个加油站用掉的油时尽量用小根堆中的元素,且同时删去大根堆中的相应位置的元素,当前加油站如果足够便宜,就可以把大根堆中的元素替换掉: ( ...

  8. BZOJ3718[PA2014]Parking——树状数组

    题目描述 你的老板命令你将停车场里的车移动成他想要的样子.停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直向右边伸展到无穷 ...

  9. BZOJ1283 序列(费用流)

    不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...

  10. MVC 多语言

    最近项目需要用到多语言. 研究了一下,也参考了很多技术文章. 这里贴一下参考地址:http://www.cnblogs.com/unintersky/p/3969612.html 主要步骤我这里简述一 ...