我希望编写一个for循环,用于迭代每个循环的2的幂。
例如,我需要一个如下范围的循环:
2, 4, 8, 16, ... , 1024
我该怎么做呢?
我希望编写一个for循环,用于迭代每个循环的2的幂。
例如,我需要一个如下范围的循环:
2, 4, 8, 16, ... , 1024
我该怎么做呢?
>>> for x in (2**p for p in range(1, 11)):
... print(x)
2
4
8
16
32
64
128
256
512
1024
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)
您需要创建自己的函数:
def doubling_range(start, stop):
while start < stop:
yield start
start <<= 1
这里使用了左移操作;如果您认为更清晰的话,也可以使用start *= 2
。
Demo:
>>> 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 <<= 1
看起来很酷,但它等同于 start = start + start
),对于那些已经花费了几分钟时间使用 Python 解释器的人来说,这样的回答并没有什么帮助。 - TigerhawkT3for
循环和while
循环。我希望您能根据答案本身来评价,而不是问题的质量,无论如何,这就是我所做的。 - Martijn Pieterscounter = 2
while counter <= 1024:
print counter
counter *= 2
您想要在每个循环中迭代2的幂次方,
看了您的例子,可以这样表述:
创建一个循环,将初始值乘以2,直到达到1024。
ii = 2
while ii <= 1024:
print(ii)
ii = ii*2
这个不需要你自己写函数,只需要使用一个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的幂次方,那么可以直接到达。如果不知道,可以像这样到达最大可存储的整数:
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()
生成另一个整数列表,每个整数都是二的幂次方。只有在这些数字上迭代之后才能进行操作。只有在 Python 3 中,range()
和 map()
才会按需生成数字。 - Martijn Pietersdef ram_size(min_size: int, step: int, max_size: int):
"""list generator from min to max powered by step"""
size = min_size
while size <= max_size:
yield size
size *= step