For 循环遍历 2 的幂
For loop iterate over powers of 2
我想编写一个 for 循环,它将为每个循环迭代 2 的幂。
例如我想要这样的范围:
2, 4, 8, 16, ... , 1024
我该怎么做?
您需要创建自己的函数:
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
你说你想为每个循环迭代 2 的幂,
看到你的例子,公式可以是:
创建一个循环,将初始值乘以 2,直到达到 1024。
ii = 2
while ii <= 1024:
print(ii)
ii = ii*2
counter = 2
while counter <= 1024:
print counter
counter *= 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
您可以使用 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)
但这变得很愚蠢(而且可读性不强)。
我想编写一个 for 循环,它将为每个循环迭代 2 的幂。
例如我想要这样的范围:
2, 4, 8, 16, ... , 1024
我该怎么做?
您需要创建自己的函数:
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
你说你想为每个循环迭代 2 的幂,
看到你的例子,公式可以是:
创建一个循环,将初始值乘以 2,直到达到 1024。
ii = 2
while ii <= 1024:
print(ii)
ii = ii*2
counter = 2
while counter <= 1024:
print counter
counter *= 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
您可以使用 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)
但这变得很愚蠢(而且可读性不强)。