1 生成器函数的含义

    生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法。相较迭代器而言,生成器简单使用。

2 生成器的创建方式

  2.1 生成器表达式

    把列表推导式的[] 修改为(),如

(i for i in range(1, 10000) if i % 2 == 0)

  代码执行界面如下:

    

  2.2 生成器函数

    (1)在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。简单来说,生成器函数就是函数

    中包含 yield语句的函数。

        yield语法:yield [返回值]     ([] 表示可选参数)。

        yield的作用:yield可以去阻断当前的函数执行。当使用next()(或.__next__())函数,会让函数继续执行,yield后面的值作为next()函数

      返回值,当执行到下一个 yeild时,又会被暂停挂起。

        yield与return的区别:yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行;而return返回后,函数

      状态终止。
    (2)代码实例

 def mylist():
for i in range(3):
print("列表的第%s个元素:" % i, end="")
yield i ml = mylist() # 创建一个生成器
print(next(ml))
print(next(ml))
print(next(ml))
print(next(ml)) # 当生成器遍历完后,再遍历就会报错

     代码执行顺序示意图:

      

3 生成器的遍历

  3.1 next()或.__next__()遍历,代码如下 

  

 # 方式1
ml = (i for i in range(1, 10) if i % 2 == 0)
print("next()方式遍历结果:", end="")
print(ml.__next__(), end=" ,")
print(ml.__next__(), end=" ,")
print(ml.__next__(), end=" ,")
print(ml.__next__()) # 方式2
ml2 = (i for i in range(1, 10) if i % 2 == 0)
print(".__next__()方式遍历结果:", end="")
print(next(ml2), end=" ,") # next()相当于 生成器.__next__()
print(next(ml2), end=" ,")
print(next(ml2), end=" ,")
print(next(ml2))

  上面代码执行结果如下:
  

  3.2 for in方式遍历,代码如下,

 ml = (i for i in range(1, 10) if i % 2 == 0)
print("for in 遍历结果为;", end=" ")
for i in ml:
print(i, end=", ")

  上面代码执行结果为:

    


4 关闭生成器
  命令:生成器名称.close()  ,例如 ml.close()。

  注意:生成器只会遍历一次,当关闭生成器或者遍历一遍后,后续如果再调用,会抛出StopIteration异常提示。下次如果想继续重新遍历,必须先重新创建生成器。

python——函数之生成器的更多相关文章

  1. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  2. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  3. Python函数(十一)-生成器

    首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> ...

  4. Python函数-5 生成器

    生成器有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的.比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表 ...

  5. python 函数之装饰器,迭代器,生成器

    装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...

  6. Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)

    一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e.  substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...

  7. Python函数——列表推导式、生成器与迭代器

    列表推导式 产生背景 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? 第一种方法: a = [1,3,4,6,7,7,8,9 ...

  8. python中的生成器函数是如何工作的?

    以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...

  9. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

随机推荐

  1. Java网络编程的Java流介绍

    前言 网络程序所做的很大一部分工作都是简单的输入输出:将数据字节从一个系统移动到另一个系统.Java的I/O建立于流(stream)之上.输入流读取数据,输出流写入数据.过滤器流(filter)流可以 ...

  2. sshfs基于ssh挂载远程目录

    为了像本地一样访问远程主机上的目录,通常我们会在远程主机上使用nfs来导出目录,并在本地主机上mount这个nfs文件系统.如果是windows系统,则使用cifs或samba的方式来访问. 但可能我 ...

  3. Flask入门第二天

    一.请求钩子 在客户端和服务器交互的过程中,有些准备工作或稍微工作是需要处理的,比如:在请求开始时,建立数据库连接:在请求开始时,根据需求进行权限校验:在请求结束时,指定数据的交互格式等.为了让每个视 ...

  4. [PHP] php + phpstudy + phpstrom + xdebug + postman开启调试

    主体 php + phpstudy + phpstrom + xdebug + postman + vue + chrome 使用的是前后端分离的开发方式,vue 在 webpack 通过代理进行请求 ...

  5. 行为型---命令模式(Command Pattern)

    命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能. ...

  6. MVC查找排序分页学习

    2018-08-07 16:04:11 实现常用功能(Index.cshtml中) 1.查找 2.用户名排序(点击用户名) 3.分页功能(数据库MVCDemo可以添加用户) 源代码参考如下: 链接:  ...

  7. Echarts3.0 引入百度地图(转载)

    转载来源: https://blog.csdn.net/yc_1993/article/details/52431989 Echarts3.0引入百度地图 update: 由于目前echarts3.8 ...

  8. 【微服务No.4】 API网关组件Ocelot+Consul

    介绍: Ocelot是一个.NET API网关.该项目针对的是使用.NET运行微服务/面向服务架构的人员,他们需要一个统一的入口进入他们的系统.然而,它可以处理任何说HTTP并在ASP.NET Cor ...

  9. nginx ssl证书

    server { listen ; server_name xxx.com; root "/home/www/website"; ssl on; ssl_certificate / ...

  10. Java高并发--CPU多级缓存与Java内存模型

    Java高并发--CPU多级缓存与Java内存模型 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 CPU多级缓存 为什么需要CPU缓存:CPU的频率太快,以至于主存跟 ...