【问题标题】:For loop iterate over powers of 2For 循环遍历 2 的幂
【发布时间】:2015-10-30 14:27:24
【问题描述】:

我想编写一个 for 循环,它会为每个循环迭代 2 的幂。

例如,我想要这样的范围:

2, 4, 8, 16, ... , 1024

我该怎么做?

【问题讨论】:

  • 网上有很多关于如何做到这一点的好信息。从python的基础开始。我向你保证,如果你只是阅读一些关于 python 的文档/教程,你会偶然发现 for 循环以及如何做到这一点
  • 您是否尝试过使用谷歌,或阅读您的教科书,或者您自己的任何东西?
  • 我还可以问“2、4、8、16”如何是 2 的倍数,或者为什么这里没有代码或研究工作......
  • 谷歌搜索“迭代二的幂”将其作为第一个结果。而且,此后谷歌上的其他链接实际上更糟。 smh 一个合理的问题。

标签: python loops range increment


【解决方案1】:

您可以使用generator expression,以便它根据需要生成数字并且它们不会浪费内存:

>>> for x in (2**p for p in range(1, 11)):
...    print(x)

2
4
8
16
32
64
128
256
512
1024

在 Python 2 中,您可以使用 xrange 而不是 range 将其保留为生成器并避免创建不必要的列表。

如果你想输入实际停止点而不是停止的功率,这可能是最简单的方法:

from itertools import count
for x in (2**p for p in count(1)):
    if x > 1024:
        break
    print(x)

你可以把它放在一行中:

from itertools import count, takewhile
for x in takewhile(lambda x: x <= 1024, (2**p for p in count(1))):
    print(x)

但这变得很愚蠢(而且不太可读)。

【讨论】:

  • 这与答案的不同之处仅在于您的范围高达限制的平方根,而我的答案范围高达限制本身。一个不同的用例。 OP 没有具体说明他们是否希望范围高达 2**N(您的方法)或高达 K(我的方法)。如果在 Python 3 上运行,这与 AndrewSmiley 发布的内容完全相同。
  • @MartijnPieters 其他答案都没有使用生成器表达式,这就是我要说明的内容。简单高效
  • 但它并不比使用生成器更有效;但是,我的不需要您计算所需最终值的平方根。
  • @MartijnPieters 是的,它不是更有效,但更简单。这不是平方根,而是对数。是的,如果你想能够直接进入停止点,它变得非常复杂。
  • Ick,是的,我的意思是 log2。
【解决方案2】:
counter = 2

while counter <= 1024:
    print counter
    counter *= 2

【讨论】:

  • 请解释你的代码做了什么以及为什么它会解决问题。只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
  • @SuperBiasedMan 这里没有什么要解释的。这不是直截了当的答案吗?
  • 这不是很复杂,但是如果他们需要问这个问题,OP显然不明白。一个解释将使这成为一个更好的答案。
  • @Vishal 这个问题也很简单,所以我想说它仍然需要,假设我们认为这个问题是有效的!
【解决方案3】:

您需要创建自己的函数:

def doubling_range(start, stop):
    while start < stop:
        yield start
        start <<= 1

这使用了左移操作;如果你觉得更清楚,你也可以使用start *= 2

演示:

>>> def doubling_range(start, stop):
...     while start < stop:
...         yield start
...         start <<= 1
... 
>>> for i in doubling_range(2, 1025):
...     print i
... 
2
4
8
16
32
64
128
256
512
1024

【讨论】:

  • 对不起,但我想不出任何办法来回答基本上“如何将两个数字相加”(start &lt;&lt;= 1 看起来很酷,但它相当于 start = start + start)对使用 Python 解释器超过几分钟的人很有帮助。
  • @TigerhawkT3:很抱歉,您发现这对您没有帮助;是的,这个问题很基础,他们可能for 循环感到困惑,而不是使用while 循环。我希望你自己判断答案,而不是问题的质量,但是,无论如何,这是我所做的。
  • 正如我所说,在我看来,回答这样的问题没有帮助 - 甚至对 OP 也没有帮助,他可能会在明天回来收集代码并什么都学不到。
【解决方案4】:

你说你想为每个循环迭代 2 的幂,

看到你的例子,公式可能是:

创建一个循环,将初始值乘以 2,直到达到 1024。

ii = 2
while ii <= 1024: 
    print(ii)
    ii = ii*2

【讨论】:

    【解决方案5】:

    您不需要自己的函数,只需使用 lambda

    import sys
    from math import log
    for i in map(lambda v : pow(2,v), range(0,log(1024, 2))):
        print i
    

    输出看起来像

    1
    2
    4
    8
    16
    32
    64
    128
    256
    512
    1024
    

    如果你知道你需要使用 2 的幂。如果你不这样做,你可以直接使用最大的可存储 int,如下所示:

    from math import log
    import sys
    for i in map(lambda v : pow(2,v), range(0,int(log(sys.maxint, 2)))):
        print i
    

    输出看起来像

    1
    2
    4
    8
    16
    32
    64
    128
    256
    512
    1024
    2048
    4096
    8192
    16384
    32768
    65536
    131072
    262144
    524288
    1048576
    2097152
    4194304
    8388608
    16777216
    33554432
    67108864
    134217728
    268435456
    536870912
    1073741824
    2147483648
    4294967296
    8589934592
    17179869184
    34359738368
    68719476736
    137438953472
    274877906944
    549755813888
    1099511627776
    2199023255552
    4398046511104
    8796093022208
    17592186044416
    35184372088832
    70368744177664
    140737488355328
    281474976710656
    562949953421312
    1125899906842624
    2251799813685248
    4503599627370496
    9007199254740992
    18014398509481984
    36028797018963968
    72057594037927936
    144115188075855872
    288230376151711744
    576460752303423488
    1152921504606846976
    2305843009213693952
    4611686018427387904
    

    【讨论】:

    • 由于您使用print,因此您似乎在使用Python 2。在Python 2 上使用range()map() 意味着您预先生成列表range() 生成一个包含从 0 到 floor(squareroot(N)) 的所有整数的列表,然后 map() 生成另一个整数列表,每个整数都是 2 的幂。只有 然后 您才会遍历这些数字。只有在 Python 3 中,range()map() 才会按需生成数字。
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多