申请循环使计数器成倍增加而不是在python中添加

时间:2015-08-30 20:41:13

标签: python for-loop

你好我对python比较新!有没有办法在python中使用for循环? 这是我想在python中做的事情的java实现

for (i=1;i<20; i*= 2)
{System.out.println(i);}

在python`中的while循环中的解决方案

while i<20:
    print i
    i*=2 

我无法找到使用for循环执行此操作的方法。显然,使用while循环实现它,但仍然很想知道是否有方法这样做

4 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,例如

for i in range(5):
    i = 2 ** i
    print i

或使用发电机

from itertools import count, takewhile

def powers_of_two():
    for i in count():
        yield 2 ** i

for i in takewhile(lambda x: x < 20, powers_of_two()):
    print i

但最终,它取决于您的用例,哪个版本提供最清晰和最多的readbale代码。在大多数情况下,你可能只是使用while循环,因为它很简单并完成工作。

答案 1 :(得分:2)

您认为for循环与其他语言一样,如C,C ++,Java,JavaScript等。

Python for循环不同;他们在 iterables 上工作,你总是必须阅读它们:

for element in iterable

代替C&#39; ish

for(start_condition; continue_condition; step_statement)

因此,您需要迭代才能生成您的产品。

我喜欢可读性,所以我的方法就是这样:

for a in (2**i for i in range(20)):
    print a

但这主要是有效的,因为我们在数学上知道你的序列的第i个元素将是2**i

答案 2 :(得分:1)

在Python中没有真正的方法可以做到这一点。如果你想完全模仿for循环的逻辑,那么手动while循环肯定是要走的路。

否则,在Python中,您将尝试查找生成i值的生成器或生成器表达式。根据后循环表达式的复杂性,这可能需要实际的功能。

在您的情况下,它有点简单,因为您要查找的数字如下:

1 = 2 ** 0
2 = 2 ** 1
4 = 2 ** 2
8 = 2 ** 3
...

因此,您可以使用生成器表达式(2 ** k for k in range(x))生成数字。这里的问题是您需要指定一个恰好为x的值math.floor(math.log2(20)) + 1(因为您正在查找k为真的最大数字2 ** k < 20

所以完整的表达方式是:

for i in (2 ** k for k in range(math.floor(math.log2(20)) + 1)):
    print(i)

...这有点乱,所以如果你不一定需要i作为那些值,你可以将它移到循环体内:

for k in range(math.floor(math.log2(20)) + 1):
    i = 2 ** k
    print(i)

但这仍然只适合你的目的。如果你想要一个“真正的”C-for循环表达式,你可以写一个生成器函数:

def classicForLoop (init, stop, step):
    i = init
    while i < stop:
        yield i
        i = step(i)

像这样使用:

for i in classicForLoop(1, 20, lambda x: x * 2):
    print(i)

当然,你也可以修改生成器函数,将lambdas作为第一个和第二个参数,但它有点简单。

答案 3 :(得分:0)

使用range()函数定义迭代长度。您可以直接使用print()而不是system.out.println

亚历山大提到它并重新迭代

 for i in range(1,20):print(i*2)

你也可以在这里考虑while循环 -

 i=0     
 while (i<20):   
      print(2**i)     
      i=i+1

记住python中的缩进