本节内容

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. IT行业的创新的读后感

    一.什么是创新 创新是以新思维.新发明和新描述为特征的一种概念化过程.它原意有三层含义,第一,更新:第二,创造新的东西:第三,改变.创新是人类特有的认识能力和实践能力,是人类主观能动性的高级表现形式, ...

  2. jisuanqi

    1.jisuanqi 2.https://github.com/12wangmin/text/tree/master 3.计算截图 7+8 清除 4.总结 通过课程设计,主要要达到两个目的,一是检验和 ...

  3. IP工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletReques ...

  4. Golang 数组、切片、映射

    定义数组 var arr1 [5]int //整型类型 fmt.Println(arr1) //[0 0 0 0 0] //赋值 arr1 = [5]int{1, 2, 3, 4, 5} fmt.Pr ...

  5. apache Storm学习之二-基本概念介绍

    2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies Streams Spouts Bolts Stream groupings Reliability ...

  6. mysql复杂查询

    所谓复杂查询,指涉及多个表.具有嵌套等复杂结构的查询.这里简要介绍典型的几种复杂查询格式. 一.连接查询 连接是区别关系与非关系系统的最重要的标志.通过连接运算符可以实现多个表查询.连接查询主要包括内 ...

  7. 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)

    1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...

  8. js字符串和正则表达式

    字符串的生成转换 你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: var myStr = num.toString(); // "19" var myStr ...

  9. git如何拉取指定分支的代码

    问题背景: 新项目还在开发阶段,没有正式对外发布,所以开发同事合并代码到develop上(或者其他名称分支上),而不是到master分支上 通过git拉取代码的时候,默认拉取的是master分支,如下 ...

  10. hdu 3949 XOR (线性基)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...