基于Python中的yield表达式介绍

python生成器

python中生成器是迭代器的一种,使用yield返回函数值。每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器。

这里可以参考Python函数式编程指南:对生成器全面讲解

注意到yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法。

这个知识点在协程中需要使用。协程的概念指的是在一个线程内,一个程序中断去执行另一个程序,有点类似于CPU中断。这样减少了切换线程带来的负担,同时不需要多线程中的锁机制,因为不存在同时写的问题。

python使用生成器来实现协程,下面看一个python协程应用于生产者消费者问题的例子

def consumer():
 r = 'yield'
 while True:
  #当下边语句执行时,先执行yield r,然后consumer暂停,此时赋值运算还未进行
  #等到producer调用send()时,send()的参数作为yield r表达式的值赋给等号左边
  n = yield r #yield表达式可以接收send()发出的参数
  if not n:
   return
  print('[CONSUMER] Consuming %s...' % n)
  r = '200 OK'

def produce(c):
 c.send(None)
 n = 0
 while n < 5:
  n = n + 1
  print('[PRODUCER] Producing %s...' % n)
  r = c.send(n) #调用consumer生成器
  print('[PRODUCER] Consumer return: %s' % r)
 c.close()

c = consumer()
produce(c)

注意到send需要先调用send(None),因为只有生成器是暂停状态才可以接收send的参数。

为了理解send()恢复生成器的过程,我们可以再看一个例子:

def gen():
 a = yield 1
 print('yield a % s' % a)
 b = yield 2
 print('yield b % s' % b)
 c = yield 3
 print('yield c % s' % c)

r = gen()
x = next(r)
print('next x %s' % x)
y = r.send(10)
print('next y %s' %y)
z = next(r)
print('next z %s' % z)

可以看到实际上y=r.send(10) 的参数10是赋给了a。整个运行过程即执行x=next(r) 之后,gen()执行了yield 1 然后暂停,没有进行对a的赋值。但再调用y=r.send(10) 时赋值过程继续,并把10赋给了a.

以上这篇基于Python中的yield表达式介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观.无论学习任何的东西,概念都是非常重要的.正确树立并掌握一些基础的概念是灵活和合理运用的前提,本文将以一种通俗易懂的方式介绍一下generator和yield表达式. 1. Iterator与Iterable 首先明白两点: Iterator(迭代器)是可迭代对象; 可迭代对象并不一定是Iterato

  • python函数式编程学习之yield表达式形式详解

    前言 yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.最近又重新学习了下,所以整理了下面这篇文章,供自己和大家学习参考,下面话不多说了,来一起看看详细的介绍吧. 先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res) g = foo() next(g) 在上面的例子里,因为foo函数中有yield关键字,所以

  • python之yield表达式学习

    python中有一个略微奇怪的表达式叫yield expression,本文就来探究一下这是个什么东西.一步一步来. iterable 复制代码 代码如下: mylist = [1,2,3] for item in mylist:     print str(item) mylist是一个列表(list),我们可以逐条取出每一个item,这个过程叫做iteration.像list这样可以用"for-in-"依次遍历的对象被称为iterable,其他的iterable还有string.t

  • 基于Python中的yield表达式介绍

    python生成器 python中生成器是迭代器的一种,使用yield返回函数值.每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器. 这里可以参考Python函数式编程指南:对生成器全面讲解 注意到yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法. 这个知识点在协程中需要使用.协程的概念指的是在一个线程内,一个程序中断去执行另一个程序,有点类似于CPU中断.这样减少了切换线程带来的负担,同时不需要多线程中的锁机制,因为不存在

  • 深入浅析Python中的yield关键字

    前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i in range(20): x=yield i print('good',x) if __name__ == '__main__': a=fun() a.__next__() x=a.send(5) print(x) 这段代码很短,但是诠释了yield关键字的核心用法,即逐个生成.在这里获取了两个生成

  • 基于Python os模块常用命令介绍

    1.os.name---判断现在正在实用的平台,Windows返回'nt':linux返回'posix' 2.os.getcwd()---得到当前工作的目录. 3.os.listdir()--- 4.os.remove---删除指定文件 5.os.rmdir()---删除指定目录 6.os.mkdir()---创建目录(只能创建一层) 7.os.path.isfile()---判断指定对象是否为文件.是则返回True. 8.os.path.isdir()---判断指定对象是否为目录 9.os.p

  • python中的lambda表达式用法详解

    本文实例讲述了python中的lambda表达式用法.分享给大家供大家参考,具体如下: 这里来为大家介绍一下lambda函数. lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方 .下面的例子比较了传统的函数定义def与lambda定义方式: >>> def f ( x ,y): ... return x * y ... >>> f ( 2,3 ) 6 >>> g = lambda x ,y: x *

  • 简单谈谈python中的lambda表达式

    最近在coding时发现使用lambda还是有诸多优点的,很多时候代码更整洁,更pythonic,所以在此简单总结一下 1.lambda是什么 举个简单的例子: func = lambda x: x*x def func(x): return x*x 两个func的定义是完全相同的,那两种函数定义方法配合map使用,将list中所有元素求平方,代码会是什么样的, def func(x): return x*x map(func, [i for i in range(10)]) map(lambd

  • 基于Python中求和函数sum的用法详解

    基于Python中求和函数sum的用法详解 今天在看<集体编程智慧>这本书的时候,看到一段Python代码,当时是百思不得其解,总觉得是书中排版出错了,后来去了解了一下sum的用法,看了一些Python大神写的代码后才发现是自己浅薄了!特在此记录一下.书中代码段摘录如下: from math import sqrt def sim_distance(prefs, person1, person2): # 得到shared_items的列表 si = {} for item in prefs[p

  • python中的yield from语法快速学习

    协程是什么?可能很多人不清楚,所以我们先从其中的yield from开始讲解. yield from 用法详解: yield from 是在Python3.3才出现的语法.所以这个特性在Python2中是没有的. yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器. 简单应用:拼接可迭代对象 我们可以用一个使用yield和一个使用yield from的例子来对比看下. 使用yield <p style="line-height: 1.75

  • python中常用的数据结构介绍

    栈 # 使用List作为栈 stack = [3, 4, 5] # 入栈 stack.append(6) # 出栈 val = stack.pop() # 栈定元素 val = stack[-1] 队列 队列是FIFO, 但是List对于First Out效率不够高.通常用双端队列Deque来实现队列 Deque的特点是,两端添加和删除都是O(1)的时间复杂度 from collections import deque queue = deque(["Eric", "John

  • 基于python中的TCP及UDP(详解)

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = socket() # 创建服务器套接字 ss.bind() # 套接字与地址绑定 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话(接收/发

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A(

随机推荐