前言:

之前学习Python自动化,接触了不少python的学习,对生成器印象尤其深,网上也看了很多介绍,下面主要是这些概念的个人学习整理(如侵删)。

正文:

如要创建一个非常大的列表,受到内存限制,列表容量肯定也是有限的,而且很多时候,访问只是几个元素,剩余的空间更是白白浪费,

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素,Python的生成器就为之而生。

Python这门语言中,生成器毫无疑问是最有用的特性之一,也是使用的最不广泛的Python特性之一。因为其他很多语言并无生成器这个概念

生成器(generator):一边循环一边计算的机制,不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。

创建一个generator:

方案一:

只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]>>>L

[0,1, 4, 9, 16, 25, 36, 49, 64, 81]>>> g = (x * x for x in range(10))>>>g at 0x1022ef630>

创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator,可以通过next()函数获得generator的下一个返回值:

>>>next(g)

0>>>next(g)1

>>>next(g)4

.

.

.

>>>next(g)64

>>>next(g)81

>>>next(g)

Traceback (most recent call last):

File"", line 1, in StopIteration

方案二:

yield的使用:

在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器,yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器,以斐波拉契数列(Fibonacci)为例

著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

deffib(max):

a, b= 0, 1

while a

a, b= b, a + b

运行:

for n in fib(6):

print(n)

1

1

2

3

5

8

迭代器(Iterator)

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

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

查看帮助文档help(Iterator),可知道,Iterable继承自object,Iterator继承自Iterable

可以使用isinstance()判断一个对象是否是Iterator

>>> from collections import Iterator

>>> isinstance((x for x in range(10)), Iterator)

True

>>> isinstance([], Iterator)

False

>>> isinstance({}, Iterator)

False

>>> isinstance('abc', Iterator)

False

生成器既能使用for循环,也能被next()函数调用并不断返回下一个值,所有:

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。

可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以:

Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

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

python generator长度_Python 高级特性之:生成器(generator)和迭代器(Iterator)相关推荐

  1. python切片迭代_Python高级特性 切片 迭代解析

    切片:方便截取list.tuple.字符串部分索引的内容 正序切片 语法:dlist = doList[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素 ...

  2. python generator输出_python 高级特性:Generator(生成器)

    格式对比: List Imprehensions 格式:[ 语句 for .. in ..] Generator 格式:(语句 for .. in ..) 区别:List存储的是具体内容,每个元素都占 ...

  3. 廖雪峰python学习笔记之高级特性

    写在前面 寒假时本科舍友的一句话点醒梦中人-你的python基础还没弄明白吧!猛地一想好像确实如此,还停留在随插随用的程度,并且对于迭代器,函数式编程等等,没有深刻理解,所以项目做起来也是空中楼阁,所 ...

  4. python循环构建多个类_Python高级特性:Python迭代、生成器、列表生成式

    迭代 给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历称为迭代(Iteration). 在java和C语言中,迭代是通过循环list的下标来完成的,Pyth ...

  5. python高级特性_Python高级特性

    参考原文 开篇:高级特性是用来简化我们常用操作的特性,合理利用高级特性可以使代码更简洁.明了. 切片 取list或tuple中的指定索引范围的操作,用循环十分繁琐,因此Python提供了切片(Slic ...

  6. python简述列表特征_python高级特性简介

    Python中的五种特性:切片,迭代,列表生成式,生成器,迭代器. 切片 切片就相当于其他语言中的截断函数,取部分指定元素用的. L = list(range(100)) #利用切片取部分元素 pri ...

  7. python 廖雪峰_廖雪峰的Python系列教程(20)——高级特性之生成器

    生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...

  8. python高级特性是什么意思_Python高级特性

    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list[1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  9. python装饰器特性iy雾_Python高级特性: 12步轻松搞定Python装饰器

    没法让装饰器变得简单,但是通过一步步的剖析,能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂 1.函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字 ...

最新文章

  1. 用C#计算1000以内含1的数字
  2. mysql主从同步 sql_mysql主从同步报错;Slave_SQL_Running: No
  3. 启明云端分享|基于ESP32的1.54智能屏应用于无叶风扇、微波炉、空净器等,支持WIFI和蓝牙
  4. plsql连不上oracle6,是否遇到PLSQL Developer连不到oracle数据库呢
  5. 盘点神奇却少为人知的IntelliJ IDEA快捷键
  6. Python数据挖掘和机器学习
  7. leetcode-reverse words in a string
  8. dedecms m view.php,dedecms在php7下的使用方法 织梦dedecsm后台一片空白的解决方法
  9. 阿里巴巴 JAVA 开发手册
  10. CART与ID3的区别C4.5离散化的过程
  11. 光纤收发器的6个指示灯说明
  12. 通信、电子保研经验贴,北京理工大学+中国科学院大学空天所
  13. U盘安装原版(安装版)WIN10系统
  14. bzoj 3811: 玛里苟斯【线性基+期望dp】
  15. @Register指令
  16. 代码编写软件,代码编写软件推荐。
  17. 【正点原子MP157连载】第一章 本书学习方法-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  18. python socket 实现域名转IP
  19. 【Python学习笔记】1.Python简介
  20. linux升级安装失败,更新Ubuntu 16.04系统中安装Adobe Flash更新失败的解决

热门文章

  1. hpux 下查看内存的的大小的几种方法:
  2. quartz mysql 报错_7月27 mysql quartz 连接报错
  3. 基于JAVA+SpringMVC+MYSQL的进销存管理系统
  4. 帝国 listenews.php,帝国cms7.2后台信息列表页批量添加tags
  5. 数据库服务器操作系统查询命令行,MySQL命令行客户端命令
  6. [转] @JoinColumn 详解 (javax.persistence.JoinColumn)
  7. 树状数组 Binary Indexed Tree/Fenwick Tree
  8. c#发送简单的post、get请求
  9. 58天 -算法 openJudge百炼 2787-凑24 - 递归
  10. jsp文件命名规范_代码规范整理