23

我可以在 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)))
4

6 回答 6

44
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]
于 2013-07-30T10:20:12.193 回答
14

首先也是最重要的:Pythonfor循环与 C 循环并不是一回事for。它们是For Each 循环。您迭代可迭代的元素。range()生成一个可迭代的整数序列,让您模拟最常见的 Cfor循环用例。

但是,大多数时候您不想使用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
于 2013-07-30T10:19:52.060 回答
3

对于您的确切示例,您可能根本不会使用 for 循环,而是使用 while 循环:

w = n
while w > 1:
    do stuff
    w = w / 2
于 2013-07-30T10:23:01.727 回答
3

您需要使用生成器。您可以按如下方式实现:

def stepDown(n):
    while n>1:
        yield n
        n = n/2

for i in stepDown(n):
    print i # or do whatever else you wish.

请注意,这很容易推广到您可能想到的其他复杂模式。

于 2013-07-30T10:25:27.067 回答
1

就像是for i in [n/(2**j) for j in range(int(math.log(n))+1)]

于 2013-07-30T10:20:35.723 回答
1

对于更一般的情况,您可以创建一个自定义生成器函数,它需要一个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]
于 2017-08-07T11:25:30.243 回答