def和def可能同时包含python和“yield”吗?

2024-09-28 21:33:23 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在学习pythontronado,我发现了一个有趣的def here,示例代码如下

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    return response.bodyere

如您所见,def函数同时包含yield和return。。。那么,它是否遵循python规则?我们如何使用这种定义?任何人给我一些样品将非常感谢。。。在


Tags: 代码clienthttpurl示例returnhereresponse
2条回答
>>> def f():
...     yield 1
...     return 2
... 
>>> g = f()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration: 2

{{{cda}的执行在cda}结束。显然,在return中给定一个值只会将其作为StopIteration异常的参数传递。在

注释中的pointed out是在python3.3之后才允许传递这样的值。在

在正常迭代(即for x in f())中看不到这个值。在

Tornado似乎对它做了一些特别的事情,通过使用next进行迭代并捕捉异常。协同程序是一个复杂的话题。这可能是协同程序的“结果”,其中的yield只是暂停执行和交换数据。在

在python2中没有。在python2中,包含“yield”的函数可以有一个没有值的纯“return”,但不允许返回值。龙卷风有一个解决办法:你可以先屈服,然后再提高发电机回路(值):

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    raise gen.Return(response.body)

在Python 3.3及更高版本中,包含“yield”的函数也可以返回值:

^{pr2}$

Python3.3获得了从PEP 380中的生成器返回值的能力,以及新的语句“yield from”。在

相关问题 更多 >