【问题标题】:I need a function that start with a positive integer(n) and returns a list of powers of 2, starting with 2 [duplicate]我需要一个以正整数(n)开头并返回2的幂列表的函数,从2开始[重复]
【发布时间】:2012-11-02 13:49:23
【问题描述】:

可能重复:
How to return a list of numbers of the power of 2?

我只知道:

l = []

for i in range(2, n=2):
    l.append(1**2)

return l

我不需要完整的方程式,我只需要知道如何做这样的方程式的基础知识。

【问题讨论】:

  • 这有点模棱两可;你想从2到n吗? 2 到 n^2?都没有?
  • 你的意思是l.append(i**2)
  • 例如,使用 4 并尝试在列表的开头找到以 2 开头的 4 的 2 次方的列表。例如:[2,4,8,16] 应该是答案

标签: python list function integer return


【解决方案1】:

不要使用所有低效的求幂,只需取最后一个计算值并将其乘以 2。

作为一个函数:

>>> def powers(n):
...   ret = [1]
...   while len(ret) < n:
...     ret += [ret[-1]*2]
...   return ret
...
>>> powers(10)
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

作为生成器:

>>> def gen_powers(n):
...   last = 1
...   while n:
...     yield last
...     last *= 2
...     n -= 1
...
>>> list(gen_powers(10))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

作为代码高尔夫单线:

reduce(lambda a,b:a+[2*a[-1]],range(10),[1])

【讨论】:

    【解决方案2】:

    这样的?

    def powers(n):
        return [2**i for i in range(1, n+1)]
    

    (more info)

    这里的方法相同,但使用了 for 循环:

    def powers(n):
        l = []
        for i in range(1, n+1):
            l.append(2**i)
        return l
    

    由于以下原因,您在上面发布的代码片段不起作用:

    • 你做了l.append(1**2)——这是一的二次方,它总是等于一。您可能打算做l.append(2**i),它是变量i 的2 次方
    • 您从 2 开始您的范围,但您希望从 1 开始,以便列表中的第一项是 2,而不是 4。
    • 您错误地使用了范围。有几种方法可以做范围

      range(stop) # 开始默认为 0
      范围(开始,停止)
      range(start, stop, step) # 如果未指定,step 默认为 1

    【讨论】:

      【解决方案3】:

      你是说这个吗?

      def get_powered_vals(endVal):
          return [2**val for val in xrange(endVal+1)]
      
      get_powered_vals(4)
      >>> [2,4,8,16]
      

      或者没有列表理解:

      def get_powered_vals(endVal):
          vals = []
          for val in xrange(endVal+1):
              vals.append(2**val)
              print val, vals[-1]
          return vals
      
      get_powered_vals(4)
      >>> 1, 2
      >>> 2, 4
      >>> 3, 8
      >>> 4, 16   
      >>> [2,4,8,16]
      

      【讨论】:

      • 虽然列表组合可能是执行此操作的方法,但您可能希望使用 list.append 显示一个显式循环。如果 OP 不明白这一点,那么 list-comp 的要求可能有点过分。
      • @mgilson - 肯定添加了,谢谢
      • 我会试试这些,非常感谢
      • 不客气@MarzipanJones
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      相关资源
      最近更新 更多