如何在python中以更简洁的方式编写此函数

时间:2013-12-26 19:36:15

标签: python function

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的任何提示或使用可以在简单性方面改进它?

由于

5 个答案:

答案 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))

使其更简洁的“技巧”在于使用以下内容:

  • A generator expression,而不是显式循环
  • 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。正如评论中指出的那样,这可能并不常见。但它是函数式编程的一个方面,可以使用,并且是指出的几种方法之一