Python 生成器yield原理及用法

目录
  • 前言
  • 1. 什么是yield?
  • 2. yield 原理
  • 3. yield 常见用法
  • 总结

前言

在Python中存在两种好用的功能迭代器与生成器。当我们刚开始接触到时,会简单的认为迭代只不过是处理列表、集合等序列中元素而已。然而,它们的功能并非如此。

当我们遇到一个列表[1,2,3,4,5,6]需要进行遍历时,我们可以使用如下方法:

  • for循环遍历打印
  • next()方法打印

同时,我们也可以创建个性化的迭代器对象、构造生成器函数等等。

Python中迭代器协议主要用到了两个魔法方法:__iter__(),__next__()

  • __iter__() 方法创建一个具有__next__()方法的迭代器对象
  • __next__() 方法返回下一个迭代器对象

Python中只具有迭代操作的生成器,也是属于迭代器的。在Python中,我们可以使用yield的函数来实现生成器。

本期,我们将详细介绍生成器相关原理和用法,Let's go~~~

1. 什么是yield?

首先我们需要认识一生成器(generator),从字面意思上理解,循环计算的操作方式。在Python中,提供一种可以边循环边计算的机制。

生成器是解决使用序列存储大量数据时,内存消耗大的问题。我们可以根据存储数据的某些规律,演算为算法,在循环过程中通过计算得到,这样可以不用创建完整序列,从而大大节省占用空间。

yield 是实现生成器方法之一,当函数使用yield方法,则该函数就成为了一个生成器。调用该函数,就等于创建了一个生成器对象。

2. yield 原理

一个生成器,主要是通过循环反复调用next()方法,直到捕获异常。

具有 yield方法的函数也是一个生成器,创建如下栗子:

def test(n):
    print("starting...")
    while True:
        res = yield n
        print ("res:",res)
g = test(5)
print(next(g))
print("######")
print(next(g))

我们可以看到输出的打印日志:

  • test函数带有yield关键字,说明它是一个生成器,不会进行执行
  • 当test函数遇到next()方法时,开始执行test函数内部步骤
  • 直到程序遇到yield关键字时,程序会中止
  • 直到下一次的next()方法唤醒,执行yield后续步骤,print()方法。这时候,res没有被赋值。
  • 再次进入循环while内部步骤,同理遇到yield关键字中止循环

当我们需要对生成器里的元素进行赋值时,我们可以调用.send()方法:

因此,带yield的函数具体内部执行操作为:

  • yield 方法:相当于Return作用,程序遇到yield则直接中止后续步骤
  • 当再次调用生成器时,next()方法会唤醒,并继续执行yield后续步骤
  • 还可以调用send()方法,可以唤醒,并传入一个值,继续执行yield后续步骤

生成器是可迭代的,每一次只可读一次。因此常常与for循环一起组合使用。

3. yield 常见用法

我们通常可以使用带有yield的函数来创建生成器来替代包含大量数据的序列。

import sys
def test(n):
    print("start")
    while n > 0:
        yield n
        n-=1
    print("end")
a = [x for x in range(1000)]
b= test(1000)
print("a内存大小:",sys.getsizeof(a))
print("b内存大小:",sys.getsizeof(b))

总结

本期,我们主要对生成器及关键字yield的相关细节点进行学习。生成器是迭代器的一中,只用来迭代操作。生成器内部主要是调用next()方法或send()方法来访问下一个迭代器对象。我们可以定义带有yield关键字的函数来实现生成器,yield相当于return作用,但是可以支持传参。

到此这篇关于Python 生成器yield原理及用法的文章就介绍到这了,更多相关Python 生成器yield内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中的生成器和yield详细介绍

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: 复制代码 代码如下: >>> squares=[n*n for n in range(3)] >>> for i in squares:  print i   0 1 4 这种创建列表的操作很常见,称为列表推导.但是像列表这样的迭代器,比如str.file等,虽然用起来很方便,但有一点,它们是储存在内存中的,如果值很大,会很麻烦. 而生成器表达式不同,它执行的计算与列表包含相同,但会迭代的

  • 举例详解Python中yield生成器的用法

    yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的). yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个普通的函数,而是一个生成器.当该函数被调用时不会自动执行,而是暂停,见第一个例子: 例1: >>> def mygenerator(): ... print 'start...' ... yield 5 ... >>> mygenerator()

  • Python中yield返回生成器的详细方法

    目录 一.迭代器 二.生成器 三.yield 1.例子一 2.例子二 总结 最简单.直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器. 要理解 yield 的作用,必须理解生成器是什么? 在理解生成器之前,必须先理解迭代器. 一.迭代器 逐项读取列表,称为迭代. mylist = [1, 2, 3] for i in mylist: # 可迭代对象 print(i) 列表解析式同样是一个迭代器. mylist = [x*x fo

  • python3.6生成器yield用法实例分析

    本文实例讲述了python3.6生成器yield用法.分享给大家供大家参考,具体如下: 今天看源码的时候看到了一个比较有意思的函数:yield 功能与return类似,都是返回定义的函数的一个结果,不同的是return返回后这次调用函数就结束了,除了返回值,其余临时变量都会被清除.而yield会停止在当前步,并保留其余变量的值,等下次调用该函数时,从yield的下一步继续往下运行. yield的好处是如果函数需要很大的内存,比方说需要计算并返回一个很大的数列,如果用return,我们只能用一个l

  • 详解Python3中yield生成器的用法

    任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器. 使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next()方法返回序列值. c = count(5) c.__next__() #python 3.4.3要

  • python生成器/yield协程/gevent写简单的图片下载器功能示例

    本文实例讲述了python生成器/yield协程/gevent写简单的图片下载器功能.分享给大家供大家参考,具体如下: 1.生成器: '''第二种生成器''' # 函数只有有yield存在就是生成器 def test(i): while True: i += 1 res = yield i print(res) i += 1 return res def main(): t = test(1) # 创建生成器对象 print(next(t)) # next第一次执行从上到下,yield是终点 p

  • Python中生成器和yield语句的用法详解

    在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数")对于大多数学生是没有问题的.但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是"生成器和yield关键字".我猜这对大多数新手Python程序员也是如此. 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字.我想让这个问题有所改善.在这篇文章中,我将解

  • Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例

    本文实例讲述了Python 生成器,迭代,yield关键字,send()传参给yield语句操作.分享给大家供大家参考,具体如下: demo.py(生成器,yield关键字): # 生成器是一个特殊的迭代器.可以用for...in遍历. # 带有yield关键字的函数,不再是一个函数,而是一个生成器模板.调用该模板会返回一个生成器对象. def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < all_num

  • python生成器和yield关键字(完整代码)

    下列代码用于先体验普通列表推导式和生成器的差别: # def add(): #     temp = ["姓名", "学号", "班级", "电话"] #     dic = {} #     lst = [] #     for item in temp: #         inp = input("请输入{}:".format(item)) #         if inp == "exit

  • Python 生成器yield原理及用法

    目录 前言 1. 什么是yield? 2. yield 原理 3. yield 常见用法 总结 前言 在Python中存在两种好用的功能迭代器与生成器.当我们刚开始接触到时,会简单的认为迭代只不过是处理列表.集合等序列中元素而已.然而,它们的功能并非如此. 当我们遇到一个列表[1,2,3,4,5,6]需要进行遍历时,我们可以使用如下方法: for循环遍历打印 next()方法打印 同时,我们也可以创建个性化的迭代器对象.构造生成器函数等等. Python中迭代器协议主要用到了两个魔法方法:__i

  • Python生成器generator原理及用法解析

    前言 生成器generator 生成器的本质是一个迭代器(iterator) 要理解生成器,就要在理解一下迭代,可迭代对象,迭代器,这三个概念 Python生成器generator简介 iteration, iterable, iterator 迭代(iteration):在python中迭代通常是通过for...in...来实现的.而且只要是可迭代对象iterable,都能进行迭代. 可迭代对象(iterable):Python中的任意的对象,只要它定义了可以返回一个迭代器的 __iter__

  • Python生成器定义与简单用法实例分析

    本文实例讲述了Python生成器定义与简单用法.分享给大家供大家参考,具体如下: 一.什么是生成器 在Python中,由于受到内存的限制,列表容量肯定是有限的.例如我们创建一个包含一亿个元素的列表,Python首先会在内存中开辟足够的空间来存储这个包含一亿个元素的列表,然后才允许用户去使用这个列表,这就可能会导致以下问题: 1.内存中没有足够的内存空间开存储这个列表,从而导致列表无法创建 2.即使列表成功创建,然而仍会消耗很长的时间,导致程序效率低下 3.若用户只想访问列表前面的几个元素,则后面

  • Python装饰器原理与用法分析

    本文实例讲述了Python装饰器原理与用法.分享给大家供大家参考,具体如下: 1.装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能 2.装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装饰器不能修改被装饰的函数的调用方式 3.实现装饰器的知识储备 (1) Python中函数即'变量' a.变量在Python中的存储 x='Tomwenxing' y=x [说明]: 当Python解释器遇到语句x='Tomwenxing'时,它主要完成了两样工作: 1.在

  • python中metaclass原理与用法详解

    本文实例讲述了python中metaclass原理与用法.分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类.在前面一篇文章<python动态创建类>里我们提到过,可以用如下的一个观点来理解什么是metaclass: MyClass = MetaClass() MyObject = MyClass() metaclass是python 里面的编程魔法 同时在前面一篇<python动态创建类>文章里描述动态创建class 的

  • Python多继承原理与用法示例

    本文实例讲述了Python多继承原理与用法.分享给大家供大家参考,具体如下: python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在Python2.3之前,MRO是基于深度优先算法的,自2.3开始使用C3算法,定义类时需要继承object,这样的类称为新式类,否则为旧式类 从图中可以看出,旧式类查找属性时是深度优先搜索,新式类则是广度优先搜索 C3算法

  • Python partial函数原理及用法解析

    这篇文章主要介绍了Python partial函数原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 partial其实是Python模块functools中定义的一个函数,当我们需要经常调用某个函数时,但是其中某些参数是已知的固定值,这样可能会让代码显得冗余,这个时候就可以考虑使用partial函数. 使用 假设我们要做二进制转十进制 int('1000000', base=2) # 64 int('1010101', bas

  • python装饰器原理与用法深入详解

    本文实例讲述了python装饰器原理与用法.分享给大家供大家参考,具体如下: 你会Python嘛? 我会! 那你给我讲下Python装饰器吧! Python装饰器啊?我没用过哎 以上是我一个哥们面试时候发生的真实对白. ----------------------------------------------分割线------------------------------------------------------------------------------ 简言之,python装饰

  • Python openpyxl模块原理及用法解析

    这篇文章主要介绍了Python openpyxl模块原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 此模块不是Python内置的模块需要安装,安装方法如下 pip install openpyxl 注意: 此模块只支持offce 2010,即是电子表格后缀是*.xlsx 1.openpyxl模块常用函数 import openpyxl wb = openpyxl.load_workbook('example.xlsx') ####

随机推荐