Python 的内置 `pow` 函数和 `**` 运算符有什么区别?
What is the difference between Python's built-in `pow` function and the `**` operator?
有**运算符为什么还有pow函数?
它甚至比函数更快:
from timeit import timeit
print(timeit('pow(3000, 3000)', number=10000))
print(timeit('3000**3000', number=10000))
输出:
1.3396891819999155
1.3082993840000654
我发现 pow
函数比 **
运算符更有用。首先,**
实际上是 的幂并应用可选的模数 ,如 a**b % c
。但是如果你包含 %
,它的值就不能是 None
。 2**3 % None
是一个错误。 pow
真的是 pow(x, y, z=None)
。
所以,如果我想将派生值提升为幂,我可以使用运算符
>>> def powerizer(db, index, modulus=None):
... x, y = db.get(index)
... return x**y % modulus
...
>>> db = {"foo":[9,3]}
>>> powerizer(db, "foo", 10)
9
但它在默认的 None
模数上失败了。
>>> powerizer(db, "foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in powerizer
TypeError: unsupported operand type(s) for %: 'int' and 'NoneType'
pow
函数来拯救
>>> def powerizer(db, index, modulus=None):
... x, y = db.get(index)
... return pow(x, y, modulus)
...
>>> powerizer(db, "foo", 10)
9
>>> powerizer(db, "foo")
729
有**运算符为什么还有pow函数? 它甚至比函数更快:
from timeit import timeit
print(timeit('pow(3000, 3000)', number=10000))
print(timeit('3000**3000', number=10000))
输出:
1.3396891819999155
1.3082993840000654
我发现 pow
函数比 **
运算符更有用。首先,**
实际上是 的幂并应用可选的模数 ,如 a**b % c
。但是如果你包含 %
,它的值就不能是 None
。 2**3 % None
是一个错误。 pow
真的是 pow(x, y, z=None)
。
所以,如果我想将派生值提升为幂,我可以使用运算符
>>> def powerizer(db, index, modulus=None):
... x, y = db.get(index)
... return x**y % modulus
...
>>> db = {"foo":[9,3]}
>>> powerizer(db, "foo", 10)
9
但它在默认的 None
模数上失败了。
>>> powerizer(db, "foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in powerizer
TypeError: unsupported operand type(s) for %: 'int' and 'NoneType'
pow
函数来拯救
>>> def powerizer(db, index, modulus=None):
... x, y = db.get(index)
... return pow(x, y, modulus)
...
>>> powerizer(db, "foo", 10)
9
>>> powerizer(db, "foo")
729