了解 python 中位于括号中的函数之前的星号运算符
Understanding the asterisk operator in python when it's before the function in a parenthesis
我知道星号用于解包系统参数等值,或者当您将列表解包为变量时。
但是我之前没有在这个 asyncio 示例中看到过这种语法。
我在这里阅读这篇文章,https://realpython.com/async-io-python/#the-10000-foot-view-of-async-io,但我不明白星号运算符在这种情况下的作用。
#!/usr/bin/env python3
# rand.py
import asyncio
import random
# ANSI colors
c = (
"3[0m", # End of color
"3[36m", # Cyan
"3[91m", # Red
"3[35m", # Magenta
)
async def makerandom(idx: int, threshold: int = 6) -> int:
print(c[idx + 1] + f"Initiated makerandom({idx}).")
i = random.randint(0, 10)
while i <= threshold:
print(c[idx + 1] + f"makerandom({idx}) == {i} too low; retrying.")
await asyncio.sleep(idx + 1)
i = random.randint(0, 10)
print(c[idx + 1] + f"---> Finished: makerandom({idx}) == {i}" + c[0])
return i
async def main():
res = await asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))
return res
if __name__ == "__main__":
random.seed(444)
r1, r2, r3 = asyncio.run(main())
print()
print(f"r1: {r1}, r2: {r2}, r3: {r3}")
在 async def main function
下 makerandom
之前有一个星号。有人可以解释它在这种情况下的作用吗?我想了解 async / await 是如何工作的。
我看了这个答案,Python asterisk before function但它并没有真正解释它。
星号不在makerandom
之前,它在生成器表达式
之前
(makerandom(i, 10 - i - 1) for i in range(3))
asyncio.gather
不将可迭代对象作为其第一个参数;它接受可变数量的可等待对象作为位置参数。为了从生成器表达式到那个,你需要解压生成器。
在此特定实例中,星号解包
asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))
进入
asyncio.gather(makerandom(0, 9), makerandom(1, 8), makerandom(2, 7))
一个星号,表示 unpacking. It spreads the iterable into several arguments 如:
array = [1, 2, 3]
print(*array)
与
相同
print(1, 2, 3)
另一个例子:
generator = (x for x in range(10) if my_function(x))
print(*generator)
一个星号用于普通的迭代器,但是当涉及到 mappings 时,您也可以使用双星号作为 **
以便将映射解压缩到关键字参数中,如:
dictionary = {"hello": 1, "world": 2}
my_function(**dictionary)
这相当于 my_function(hello=1, world=2)
。
您还可以使用普通的一个星号,以便仅从映射中解压缩密钥:
print(*{"hello": 1, "world": 2})
这将导致 hello world
我知道星号用于解包系统参数等值,或者当您将列表解包为变量时。
但是我之前没有在这个 asyncio 示例中看到过这种语法。
我在这里阅读这篇文章,https://realpython.com/async-io-python/#the-10000-foot-view-of-async-io,但我不明白星号运算符在这种情况下的作用。
#!/usr/bin/env python3
# rand.py
import asyncio
import random
# ANSI colors
c = (
"3[0m", # End of color
"3[36m", # Cyan
"3[91m", # Red
"3[35m", # Magenta
)
async def makerandom(idx: int, threshold: int = 6) -> int:
print(c[idx + 1] + f"Initiated makerandom({idx}).")
i = random.randint(0, 10)
while i <= threshold:
print(c[idx + 1] + f"makerandom({idx}) == {i} too low; retrying.")
await asyncio.sleep(idx + 1)
i = random.randint(0, 10)
print(c[idx + 1] + f"---> Finished: makerandom({idx}) == {i}" + c[0])
return i
async def main():
res = await asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))
return res
if __name__ == "__main__":
random.seed(444)
r1, r2, r3 = asyncio.run(main())
print()
print(f"r1: {r1}, r2: {r2}, r3: {r3}")
在 async def main function
下 makerandom
之前有一个星号。有人可以解释它在这种情况下的作用吗?我想了解 async / await 是如何工作的。
我看了这个答案,Python asterisk before function但它并没有真正解释它。
星号不在makerandom
之前,它在生成器表达式
(makerandom(i, 10 - i - 1) for i in range(3))
asyncio.gather
不将可迭代对象作为其第一个参数;它接受可变数量的可等待对象作为位置参数。为了从生成器表达式到那个,你需要解压生成器。
在此特定实例中,星号解包
asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))
进入
asyncio.gather(makerandom(0, 9), makerandom(1, 8), makerandom(2, 7))
一个星号,表示 unpacking. It spreads the iterable into several arguments 如:
array = [1, 2, 3]
print(*array)
与
相同print(1, 2, 3)
另一个例子:
generator = (x for x in range(10) if my_function(x))
print(*generator)
一个星号用于普通的迭代器,但是当涉及到 mappings 时,您也可以使用双星号作为 **
以便将映射解压缩到关键字参数中,如:
dictionary = {"hello": 1, "world": 2}
my_function(**dictionary)
这相当于 my_function(hello=1, world=2)
。
您还可以使用普通的一个星号,以便仅从映射中解压缩密钥:
print(*{"hello": 1, "world": 2})
这将导致 hello world