我试图在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]
答案 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. ])