for循环中的变量步

时间:2016-06-15 21:14:01

标签: python for-loop

我试图在0.01和10之间循环,但在0.01和0.1之间使用0.01作为步骤,然后在0.1和1.0之间使用0.1作为步骤,在1.0和10.0之间使用1.0作为步骤。

我编写了while循环代码,但希望使其更加pythonic。

0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 4, 5, 6, 7, 8, 9

这将产生

[NeutralResourcesLanguage]

7 个答案:

答案 0 :(得分:20)

特殊钱包生成器功能可能是正确的方法。这将有效地将无聊的部分(正确的数字列表)与有趣的部分(示例中的# do something)分开。

def my_range():
    for j in .01, .1, 1.:
        for i in range(1, 10, 1):
            yield i * j

for x in my_range():
    print x

答案 1 :(得分:3)

你可以有一个嵌套循环,外部循环遍历精度,内部循环只有range(1,10)

for precision in (0.01, 0.1, 1):
    for i in range(1,10):
        i*=precision
        print(i)

然而,在这种情况下,浮动可能不会起作用,因为这会在我的机器上显示0.30000000000000004之类的值,因为您希望使用decimal模块的精确十进制值:

import decimal
for precision in ("0.01", "0.1", "1"):
    for i in range(1,10):
        i*=decimal.Decimal(precision)
        print(i)

答案 2 :(得分:3)

一种方法是使用两个循环:一个用于数量级,一个用于从1到9的值:

for exp in range(-2, 1):
    for i in range(1, 10):
        print("{:.2f}".format(i * 10 ** exp))

答案 3 :(得分:3)

通过列表理解只需一行代码 -

for k in [i*j for j in (0.01, 0.1, 1) for i in range(1, 10)]

不能更加pythonic!

答案 4 :(得分:2)

我也推荐一个生成器功能,但如果步骤不是彼此方便的功能,我会把它写成

def my_range():
    i = 0
    while i < 0.1:
        i += 0.01
        yield i
    while i < 1:
        i += 0.1
        yield i
    while i < 10:
        i += 1
        yield i

for x in my_range():
    print x

它可能更重复一点,但说明发生的事情要好得多,并且产生的值会单调增加(无论你放入什么数字)。

如果重复太多,请使用

def my_range():
    i = 0
    for (end, step) in [(0.1, 0.01), (1, 0.1), (10, 1)]:
        while i < end:
            i += step
            yield i

答案 5 :(得分:1)

您可以执行以下操作:

import numpy as np
list1 = np.arange(0.01, 0.1, 0.01)
list2 = np.arange(0.1, 1, 0.1)
list3 = np.arange(1, 10, 1)
i_list = np.concatenate((list1, list2, list3))  # note the double parenthesis
for i in i_list:
    ...

基本上,您需要预先创建所需的整个值列表i_list,然后在for循环中迭代它们。

答案 6 :(得分:1)

以防您希望用矢量化代码替换循环...

In [63]: np.ravel(10.**np.arange(-2, 1)[:,None] * np.arange(1, 10)[None,:])
Out[64]: 
array([ 0.01,  0.02,  0.03,  0.04,  0.05,  0.06,  0.07,  0.08,  0.09,
        0.1 ,  0.2 ,  0.3 ,  0.4 ,  0.5 ,  0.6 ,  0.7 ,  0.8 ,  0.9 ,
        1.  ,  2.  ,  3.  ,  4.  ,  5.  ,  6.  ,  7.  ,  8.  ,  9.  ])