目前已经学会了如何在Python中进行异步迭代,接下来的问题是这是否适用于解析式?答案是OJBK!该支持在PEP 530中说起,建议去读一下。编程
>>> import asyncio >>> async def doubler(n): # 1 ... for i in range(n): ... yield i, i*2 ... await asyncio.sleep(0.1) # 2 >>> async def main(): ... result = [x async for x in doubler(3)] # 3 ... print(result) ... result = {x: y async for x, y in doubler(3)} ... print(result) ... result = {x async for x in doubler(3)} ... print(result) >>> asyncio.get_event_loop().run_until_complete(main()) [(0, 0), (1, 2), (2, 4)] {0: 0, 1: 2, 2: 4} {(1, 2), (0, 0), (2, 4)}
这是个简单的异步生成器;bash
sleep一会,确保这是个异步函数;异步
观察如何用async for替代for;async
在PEP 530后半段有介绍在解析式中使用await
,但要注意的是,await
只能在async def
函数体中使用。异步编程
继续用例子来熟悉异步编程语法。函数
>>> import asyncio >>> async def f(x): # 1 ... await asyncio.sleep(0.1) ... return x + 100 >>> async def fac(n): # 2 ... for x in range(n): ... await asyncio.sleep(0.1) ... yield f, x # 3 >>> async def main(): ... results = [await f(x) async for f, x in fac(3)] # 4 ... print('results=', results) >>> asyncio.get_event_loop().run_until_complete(main()) results= [100, 101, 102]
一个简单的协程函数;oop
异步生成器;code
返回一个包含函数和参数的tuple;协程
fac(3)
返回一个异步生成器,必须用异步for调用,返回值是几个tuple,经过参数中的函数调用生成一个coroutine,用await
处理coroutine,await
与async for
作的是彻底不相关的事。ci