python的yield用法,python中的yield语句是如何工作的

  python的yield用法,python中的yield语句是如何工作的

  Yield是python函数定义中常用的关键字,其目的是返回一个可用于迭代的生成器(for loop)。应用场景通常是需要返回一系列包含循环的值的函数。

  为了充分理解yield关键字的用法,我们必须知道单词repeatable、repeatable、iterator和generator的含义。接下来,我将逐一介绍这些词的含义及其对应的用法。

  可重复和可重复的迭代

  迭代是一种操作。许多数据本身就是容器,包含各种类型的其他数据,如列表、字典和元组。实际使用这些容器时,往往需要一个一个地获取数据。例如,for.in通常用于打印列表中的数据。这种一个一个获取数据的过程叫做迭代。#标识符

  a _ list=[ 1,2,3 ]

  对于列表中的I:

  我是印刷品(一)

  可重复性是一个对象的特性,如可重复的plut、可重复的元组、可重复的字典、可重复的字符串和可重复的文件对象。因为数据可以从这些数据类型中逐一获取。

  迭代器(迭代器)。

  迭代器是一种一次只能检索一个数据元素的对象。如果在迭代器上重复调用next()方法,可以将迭代变量作为参数放入next()中,依次获取以下元素:如果迭代器中没有元素,调用next()方法会抛出StopIteration异常。迭代器的_ _ iterator _ _()方法返回迭代器本身,所以是可重复的。defliebiao(:

  forxinrange(10):

  产量x

  g=列标() )

  #0

  打印(下一页)g))

  #1

  打印(下一页)g))

  #2

  打印(下一页)g))

  #3

  打印(下一页)g))

  #4

  打印(下一页)g))

  #

  g.__iter__(

  生成函数和生成器。

  生成器是一个特殊的函数,内部有yield表达式,调用时会返回一个特殊的迭代器,叫做generator。deffunc(:

  1次返回

  defgen(:

  产量1

  打印(类型)功能)#

  打印(类型)gen ) #

  print(type(func)))))))

  打印(类型(通用) ) ) ) ) ) )

  产量公式

  如上所述,如果函数定义包含yield表达式,则该函数是生成函数,而不是正则函数。实际上yield只能用来定义生成器函数。

  与传统函数不同,当调用生成器函数时,该函数中的代码不会立即执行,而是返回给生成器迭代器。当返回的生成器调用成员方法时,将执行相应生成器函数中的代码。defsquare(:

  forxinrange(4):

  产量x ** 2

  square_gen=square(

  对于square_gen中的x:

  打印(x)是

  如上所述,for循环调用iter()函数来获取生成器。然后,调用next)函数将生成器中的下一个值代入X;实施回收机构。所以上面的for循环可以是genitor=square_gen.__iter__()

  虽然正确:

  X=geniter.next(#python3是__next__))

  打印(x)是

  注意,square是一个生成器函数;作为返回值,已经是迭代器的square_gen的迭代器__iter__()返回自身。所以geniter对应的生成函数是平方的。

  X=geniter.next)),square函数从上一个暂停位置执行到下一个yield表达式,将yield关键字后的表达式列表返回给调用者,然后再次暂停。请注意,每次从暂停中恢复时,生成器函数的内部变量、指令指针和内部求值栈都与暂停时完全相同。

  改变自己的说法

  如果不知道生成器函数,也就是带yield关键字的函数,可以理解为:

  在函数开头,输入result=list();

  用Result替换每个yield表达式yield expr。追加(EXPR);

  在函数末尾,插入返回结果。

  也就是yield的本质函数返回一个可重复的列表。

  产量优势

  介绍了这么多定义和使用方法,为什么还要用yield?有什么好处?

  在许多情况下,有必要一次在一个容器中检索一些数据,但是如果用这种方式只检索一些元素,就没有必要检索容器中的所有元素。例如,如果容器中有10,000个现有元素,但只需要前5个元素,通常有以下两种解决方案。

  获取容器中的所有元素,取出前五个;

  从一开始,容器中的元素是一个一个重叠的,五个元素重叠才停止。

  显然,如果容器中元素的数量非常大,比如10 ** 8,或者容器中元素的体积非常大,后一种方案可以节省大量的时间和空间开销。

  现在,假设有一个函数的产生(返回值)是一个列表。如你所知,只有一种方法,就是每次都重复调用方为函数返回的值。如果一个函数生成列表中的每个元素,或者生成所有元素需要很长时间,那么可以使用yield将函数改为生成器函数,然后一次只生成一个元素,这样就节省了很多开销。

  Python学习网,免费在线学习python平台,敬请关注!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: