我有如下使用位移的C语言循环,我想要在Python中重新实现。
n = 64
for(int stride = n>>1; stride >0; stride >>=1)
{...
那么这个循环在 Python 中会是什么样子呢?
我知道 n>>1
代表除以 2,但我觉得用 range()
很难模拟它。
我有如下使用位移的C语言循环,我想要在Python中重新实现。
n = 64
for(int stride = n>>1; stride >0; stride >>=1)
{...
那么这个循环在 Python 中会是什么样子呢?
我知道 n>>1
代表除以 2,但我觉得用 range()
很难模拟它。
简单思考:
>>> n = 64
>>> while n:
... print n
... n = n >> 1
...
64
32
16
8
4
2
1
Amadan的回答非常准确。
如果您经常使用此模式,我建议将其提取为一个简单的生成函数以便在for
循环中重复使用:
>>> def strider(n):
... stride = n >> 1
... while stride > 0:
... yield stride
... stride >>= 1
...
>>> for n in strider(64):
... print n
...
32
16
8
4
2
1
所有的 for(;;)
循环都可以重写为 while
循环,反之亦然。
n = 64
stride = n >> 1
while stride > 0:
# stuff
stride >>= 1
编辑以反映原始更改
脑海中首先浮现的是:
while stride>0:
# do your stuff
stride>>=1
我认为在这种情况下尝试使用for循环并不是一个好主意。在Python中,for循环的工作方式类似于其他语言中的for-each循环。它们作用于序列。虽然我们可以轻松地将步幅值的范围转换为序列,但在我看来,使用while循环更简单、更自然地表达了这个想法。
由于您没有太多的迭代:
for stride in [32, 16, 8, 4, 2, 1, 0]:
# ...
使用对数怎么样?
for i in range(int(math.log(n, 2)), -1, -1):
# stride is 2**i
(0, 1, 2, 3, 4, 5)
。 - Tim Pietzcker嗯,最接近的方法是使用itertools模块:
>>> from itertools import takewhile, imap, count
>>> n = 64
>>> for i in takewhile(bool, imap(lambda x:n >> x, count(1))):
... print i
...
32
16
8
4
2
1