python
之美常常体现在它的简洁性和单行代码上。
我正慢慢地写自己。
我有一个计算sum of n
2的幂的函数。
ex:if n==4, I get 2^4+2^3+2^2+2^1+2^0
我有这个功能很好,但想知道是否有空间可以冷凝到一两行
>>> def sumpowers(n):
... sum=0
... for x in range(n+1):
... sum+=pow(2,x)
... return sum
...
>>> sumpowers(31)
4294967295
built-ins
的任何提示或使用可以在简单性方面改进它?
由于
答案 0 :(得分:3)
for-loop可以替换为sum
内置和generator expression:
>>> def sumpowers(n):
... return sum(pow(2,x) for x in range(n+1))
...
>>> sumpowers(31)
4294967295
>>>
您可能还想将pow(2,x)
替换为2**x
:
>>> def sumpowers(n):
... return sum(2**x for x in range(n+1))
...
>>> sumpowers(31)
4294967295
>>>
答案 1 :(得分:3)
尝试以下方法:
def sumpowers(n):
return ((2 ** (n+1)) - 1)
答案 2 :(得分:2)
尝试这个解决方案,更具惯用性:
def sumpowers(n):
return sum(2**x for x in range(n+1))
使其更简洁的“技巧”在于使用以下内容:
sum
内置函数,而不是计数器变量**
运算符,而不是pow
内置函数(使用两个参数时两者相同)但是等等!我们可以通过使用数学属性使事情更简单。该函数等同于此(与@fp的赞誉首先指出它):
def sumpowers(n):
return 2**(n+1)-1
无论哪种方式,它都按预期工作:
sumpowers(31)
=> 4294967295
答案 3 :(得分:2)
在这种情况下,没有比列表理解更好的了。
my_sum=sum([2**x for x in range(n+1)])
答案 4 :(得分:0)
使用reduce built-in
和lambda,你可以实现它:
>>> reduce(lambda x,y: x+y, [pow(2,i) for i in range(32)])
4294967295
in terms of function:
try this:
>>> def test(n):
... return reduce(lambda x,y: x+y,[pow(2,i) for i in range(n+1)])
...
>>> test(31)
4294967295
编辑:绝对没有必要使用reduce
。正如评论中指出的那样,这可能并不常见。但它是函数式编程的一个方面,可以使用,并且是指出的几种方法之一