我可以在python中使用简单的for循环:
for i in range(10):
但是,我无法弄清楚如何制作更复杂的内容,这在c ++中非常简单。
如何在python中实现这样的for循环:
for(w = n; w > 1; w = w / 2)
我到目前为止最接近的是:
for w in reversed(range(len(list)))
答案 0 :(得分:32)
for i in range(0, 10, 2):
print(i)
>>> 0
>>> 2
>>> 4
>>> 6
>>> 8
http://docs.python.org/2/library/functions.html
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
答案 1 :(得分:11)
首先:Python for
循环与C for
循环实际上并不相同。它们是For Each loops。迭代迭代的元素。 range()
生成一个可迭代的整数序列,让您模拟最常见的C for
循环用例。
但是,大多数时候你不想要使用range()
。你会遍历列表本身:
for elem in reversed(some_list):
# elem is a list value
如果您必须拥有索引,通常会使用enumerate()
将其添加到循环中:
for i, elem in reversed(enumerate(some_list)):
# elem is a list value, i is it's index in the list
对于真正''时髦'循环,使用while
或创建自己的生成器函数:
def halved_loop(n):
while n > 1:
yield n
n //= 2
for i in halved_loop(10):
print i
打印10
,5
,2
。你也可以将它扩展到序列:
def halved_loop(sequence):
n = -1
while True:
try:
yield sequence[n]
except IndexError:
return
n *= 2
for elem in halved_loop(['foo', 'bar', 'baz', 'quu', 'spam', 'ham', 'monty', 'python']):
print elem
打印:
python
monty
spam
foo
答案 2 :(得分:2)
对于您的确切示例,您可能根本不会使用for循环,而是使用while循环:
w = n
while w > 1:
do stuff
w = w / 2
答案 3 :(得分:2)
您需要使用发电机。您可以按如下方式实现:
def stepDown(n):
while n>1:
yield n
n = n/2
for i in stepDown(n):
print i # or do whatever else you wish.
请注意,这可以很容易地概括为您可能想到的其他复杂模式。
答案 4 :(得分:1)
像for i in [n/(2**j) for j in range(int(math.log(n))+1)]
答案 5 :(得分:0)
对于更一般的情况,您可以创建一个自定义生成器函数,它使用start
,stop
和一个函数来生成从最后一步开始的下一步:
def my_range(start, stop, f):
x = start
while x < stop if stop > start else x > stop:
yield x
x = f(x)
>>> list(my_range(1, 1024, lambda x: x*2))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
>>> list(my_range(1000, 1, lambda x: x/2))
[1000, 500.0, 250.0, 125.0, 62.5, 31.25, 15.625, 7.8125, 3.90625, 1.953125]