Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇践踏与屈服_Python_Python 2.7_Yield - Fatal编程技术网

Python 蟒蛇践踏与屈服

Python 蟒蛇践踏与屈服,python,python-2.7,yield,Python,Python 2.7,Yield,我在使用Python Stompest库生成到达时的帧时遇到了问题。当我在函数中包含yield关键字时,代码不会像应该的那样阻塞并等待帧 def receive(stomp): received_messages = 0 while True: frame = stomp.receiveFrame() stomp.ack(frame) yield frame.body 但是,如果我所做的只是打印框架主体,那么它会像应该的那样等待

我在使用Python Stompest库生成到达时的帧时遇到了问题。当我在函数中包含
yield
关键字时,代码不会像应该的那样阻塞并等待帧

def receive(stomp):
    received_messages = 0
    while True:
        frame = stomp.receiveFrame()
        stomp.ack(frame)
        yield frame.body
但是,如果我所做的只是打印框架主体,那么它会像应该的那样等待

def receive(stomp):
    while True:
        frame = stomp.receiveFrame()
        stomp.ack(frame)
        print frame.body

在这种情况下使用
yield
有什么问题吗?

当你把
yield
放在一个函数中时,它变成了一个返回生成器的函数,只有在某种迭代或理解中需要生成器时,才会对生成器进行惰性评估。在你给出的第一个案例中

>> x = receive(stomp)
>> type(x)
<type 'generator'>

当您迭代生成器时,它将实际执行您定义的函数中的语句(包括阻塞,直到帧到达),并为每次迭代返回帧。使用
yield
创建生成器对象可以省去实现状态以记住手动进行的迭代的麻烦。

如何调用
receive
?如果您只是在执行
x=receive(whatever)
,那么就不会发生阻塞,因为生成器函数不会执行任何操作,除非您对它们进行迭代或重复调用
next
。尝试接收帧中的
(无论什么):在这里做点什么()
你能创建一个吗?这就是答案。我像
x=receive(stomp)
一样调用它,而不是对它进行迭代。
for frame in x: print(frame)