Python迭代器生成器与生成式

什么是迭代

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

例如for循环

  1. a = ['abc', 123, ['4', 45]]
  2. for i in a:
  3. print(i)
  4. #==========输出=============
  5. abc
  6. 123
  7. ['4', 45]

for就是把这个列表迭代了一遍,但是根据迭代的定义每一次迭代得到的结果会作为下一次迭代的初始值。这也没看到用了上一次的值啊。

这里介绍两个函数__iter__()__next__,一个可迭代序列(同时它也是一个对象),它有一个__iter__()方法,可以返回一个迭代器对象,这个迭代器对象里面有一个__next__()方法,它可以将迭代器对象一个一个向下迭代。

例如上例

  1. a = ['abc', 123, ['4', 45]]
  2. #print(a.__iter__())
  3. x = a.__iter__()
  4. print(x.__next__())
  5. print(x.__next__())
  6. print(x.__next__())
  7. ##其实还有一种迭代形式,一个调用内置方法一个调用外部方法罢了
  8. x = iter()
  9. next(x)
  10. next(x)
  11. next(x)
  12. x = iter(a)
  13. print(next(x))
  14. print(next(x))
  15. print(next(x))
  16. #===========输出结果=========
  17. abc
  18. 123
  19. ['4', 45]
  20. abc
  21. 123
  22. ['4', 45]

但是如果再加一个print(x.__next__())的话python会抛出一个异常。

然后我们可以结合while循环就可以大致猜出for迭代时的内部执行机理了。

  1. a = ['abc', 123, ['4', 45]]
  2. y = a.__iter__()
  3. while True:
  4. try:
  5. print(y.__next__())
  6. except StopIteration:
  7. break
  8. #===========输出================
  9. abc
  10. 123
  11. ['4', 45]

这样就把列表a迭代完了。

什么是生成式

要创建一个列表,就要有一个中括号,里面的数据就是列表的内容。如果我要创建一个列表,列表里面有按顺序的1~100所有的整数,一个一个输入吗?

有人可能说用循环,例如

  1. x = []
  2. for i in range(1, 101):
  3. x.append(i)

确实这样是可以的,但是有了生成式可能会更加简单一点

  1. x = [i for i in range(1, 101)]

再中括号里面,一个应该写入数据的地方放一个循环,在C语言看来这简直就是疯了。不过这也体现了python的灵活强大。

其实中括号里面除了加for循环还能加条件判断,例如

  1. x = [i for i in range(1, 101) if i % 2 and not i % 3]
  2. #列举出所有1~100能被3整除不能被2整除的数

除了list列表有这种操作以外,还有字典可以这样操作

字典

  1. dict1 = {i:i + 1 for i in range(1, 101)if i % 2 and not i % 3 }

执行结果

  1. {3: 4, 9: 10, 15: 16, 21: 22, 27: 28, 33: 34, 39: 40, 45: 46, 51: 52, 57: 58, 63: 64, 69: 70, 75: 76, 81: 82, 87: 88, 93: 94, 99: 100}

应该能看出点什么来了,也挺简单。

什么是生成器

就是有一个跟return差不多的东西yieldreturn返回之后程序就退出了,但是yield会把程序暂停,然后等你需要的时候来继续执行,但是跟return又有一点不一样,yield是迭代器的一种,返回的是一个生成器对象,需要借用next()函数来进行迭代。

其实yield就是一种特殊的迭代器。

  1. def sc1():
  2. yield 'one'
  3. yield 'two'
  4. def sc2():
  5. return 'one'
  6. s1 = sc1()
  7. s2 = sc2()
  8. print(type(s1))
  9. print(type(next(s1)))
  10. print(type(s2))

输出

  1. <class 'generator'>
  2. <class 'str'>
  3. <class 'str'>

对于生成器的使用,最简单的例如

  1. def sc():
  2. print('进入函数1')
  3. yield 'one'
  4. print('进入函数2')
  5. yield 'two'
  6. s = sc()
  7. print(next(s))
  8. print(next(s))
  9. #============输出===========
  10. 进入函数1
  11. one
  12. 进入函数2
  13. two

使用与迭代器几乎一模一样

用这个生成一个斐波拉契数列可以这样写

  1. def feb(x):
  2. count = 0
  3. a = 0
  4. b = 1
  5. while count < x:
  6. yield a
  7. a, b = b, a + b
  8. count += 1

这样就会生成一个斐波拉契数列前x项的可迭代序列

可以测试一下,用for循环迭代它

  1. for i in feb(10):
  2. print(i,end=' ')

输出

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

Python迭代器生成器与生成式的更多相关文章

  1. Python 迭代器&生成器

    1.内置参数     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice ...

  2. python 迭代器 生成器

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

  3. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  4. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  5. Python迭代器生成器,私有变量及列表字典集合推导式(二)

    1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...

  6. Python迭代器,生成器,装饰器

    迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...

  7. 4.python迭代器生成器装饰器

    容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...

  8. python迭代器生成器

    1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...

  9. Python迭代器生成器,模块和包

      1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法.    其中__it ...

随机推荐

  1. pandas 取 groupby 后每个分组的前 N 行

    原始数据如下: (图是从 excel 截的,最左1行不是数据,是 excel 自带的行号,为了方便说明截进来的) 除去首行是标题外,有效数据为 28行 x 4列 目前的需求是根据 partition ...

  2. Boost Started on Unix Variants

  3. 【c++ Prime 学习笔记】第10章 泛型算法

    标准库未给容器添加大量功能,而是提供一组独立于容器的泛型算法 算法:它们实现了一些经典算法的公共接口 泛型:它们可用于不同类型的容器和不同类型的元素 利用这些算法可实现容器基本操作很难做到的事,例如查 ...

  4. JVM:类加载与字节码技术-1

    JVM:类加载与字节码技术-1 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 类文件结构 字节码指令 下面的内容在后续笔记中: 编译期处理 类加载阶段 类 ...

  5. Scrum Meeting 0507

    零.说明 日期:2021-5-7 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 测试 测试 cyy ...

  6. [对对子队]会议记录4.14(Scrum Meeting 5)

    今天已完成的工作 刘子航 ​ 工作内容:设计第2,3关 ​ 相关issue:设计关卡2,3 吴昭邦 ​ 工作内容:制作场景,暂时解决了坐标错位问题 ​ 相关issue:实现游戏场景中的必要模型 何瑞 ...

  7. [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考

    一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...

  8. 使用Keil下载Hex文件进STM32

    前言 初学STM32时,是通过串口1把Hex文件下载进STM32的,需要一个串口模块,而且还要设置BOOT0和BOOT1电平,然后通过FlyMcu软件进行下载,这也是一种不错的方法,这里我要介绍的是使 ...

  9. 洛谷 P2120 [ZJOI2007] 仓库建设

    链接: P2120 题意: 有 \(n\) 个点依次编号为 \(1\sim n\).给出这 \(n\) 个点的信息,包括位置 \(x_i\),所拥有的的物品数量 \(p_i\),在此建设一个仓库的费用 ...

  10. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...