我有以下C for循环使用位移,我想在python中重新实现。
n = 64
for(int stride = n>>1; stride >0; stride >>=1)
{...
哇,这个循环会在python中看到吗?
我知道n>>1
代表除以2,但我发现很难用range()
对其进行建模。
答案 0 :(得分:4)
想想更简单:
>>> n = 64
>>> while n:
... print n
... n = n >> 1
...
64
32
16
8
4
2
1
答案 1 :(得分:4)
Amadan's answer现场点亮。
如果你经常使用这个模式,我会把它提取到一个简单的生成器函数中,以便在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
答案 2 :(得分:2)
所有for(;;)
循环都可以重写为while
循环,反之亦然。
n = 64
stride = n >> 1
while stride > 0:
# stuff
stride >>= 1
已编辑以反映原始
的变化答案 3 :(得分:1)
首先想到的是:
while stride>0:
# do your stuff
stride>>=1
在这种情况下,我认为尝试使用for循环并不是一个好主意。在Python中,for循环的工作方式与其他语言中的每个循环非常相似。他们按顺序行事。尽管我们可以轻松地将步幅的值范围转换为序列,但while
恕我直言是表达这一想法的一种更简单,更自然的方式。
答案 4 :(得分:0)
您可以编写自己的generator以便在for循环中使用
答案 5 :(得分:0)
由于您没有多次迭代:
for stride in [32, 16, 8, 4, 2, 1, 0]:
# ...
答案 6 :(得分:-1)
使用对数怎么样?
for i in range(int(math.log(n, 2)), -1, -1):
# stride is 2**i
答案 7 :(得分:-2)
嗯,最接近的是使用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