Python类型`def`

时间:2017-08-15 09:16:45

标签: python

Python 3.6

有人可以解释这个控制台输出吗?

刚开始查看asyncio的内容,虽然我确认如何创建协同程序等。似乎使用def始终会为您提供课程function

>>> async def test():
...     pass
... 
>>> type(test)
<class 'function'> # Why not 'coroutine'?

>>> def test():
...     yield
...     
>>> type(test)
<class 'function'>

>>> test = (i for i in range(0))
>>> type(test)
<class 'generator'> # Expected

>>> def test():
...     for i in range(0):
...         yield i
...         
>>> type(test)
<class 'function'> # Why not 'generator'?

1 个答案:

答案 0 :(得分:4)

你仍然有常规功能。这些函数生成一个生成器或协同程序,它们本身不是生成器或协同程序。

将生成器函数与返回生成器表达式的函数进行比较:

def test():
    return (i for i in range(0))

就像使用yield的函数一样,上面的函数只在你调用它时产生生成器;这可以让你生成多个独立的生成器;另一方面,生成器表达式只能迭代一次。

同样适用于协同程序。您可以生成一个不使用async返回协程的函数:

def test():
    return asyncio.sleep(0)

异步函数或生成器函数的作用是充当工厂;您可以重复调用它们来生成新的协程或生成器。