有没有办法在0和1之间以0.1步进?
我以为我可以像下面那样做,但是失败了:
for i in range(0, 1, 0.1):
print i
相反,它说step参数不能为零,这是我没有想到的。
#1楼
[x * 0.1 for x in range(0, 10)]
在Python 2.7x中,结果如下:
[0.0、0.1、0.2、0.30000000000000004、0.4、0.5、0.6000000000000001、0.7000000000000001、0.8、0.9]
但如果您使用:
[ round(x * 0.1, 1) for x in range(0, 10)]
给您所需的:
[0.0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9]
#2楼
与R的 seq
函数类似,此函数以正确的步长值以任意顺序返回序列。 最后一个值等于停止值。
def seq(start, stop, step=1):
n = int(round((stop - start)/float(step)))
if n > 1:
return([start + step*i for i in range(n+1)])
elif n == 1:
return([start])
else:
return([])
结果
seq(1, 5, 0.5)
[1.0、1.5、2.0、2.5、3.0、3.5、4.0、4.5、5.0]
seq(10, 0, -1)
[10、9、8、7、6、5、4、3、2、1、0]
seq(10, 0, -2)
[10、8、6、4、2、0]
seq(1, 1)
[1]
#3楼
我的解决方案:
def seq(start, stop, step=1, digit=0):
x = float(start)
v = []
while x <= stop:
v.append(round(x,digit))
x += step
return v
#4楼
import numpy as np
for i in np.arange(0, 1, 0.1):
print i
#5楼
这是使用itertools的解决方案:
import itertools
def seq(start, end, step):
if step == 0:
raise ValueError("step must not be 0")
sample_count = int(abs(end - start) / step)
return itertools.islice(itertools.count(start, step), sample_count)
用法示例:
for i in seq(0, 1, 0.1):
print(i)
#6楼
我的版本使用原始的范围函数来为班次创建乘法索引。 这允许与原始范围函数使用相同的语法。 我做了两个版本,一个使用浮点,一个使用十进制,因为我发现在某些情况下我想避免浮点算术引入的舍入漂移。
它与范围/ xrange中的空集结果一致。
仅将单个数值传递给任何一个函数都将使标准范围输出返回到输入参数的整数上限值(因此,如果给定5.5,则它将返回range(6)。)
编辑:下面的代码现在可以在pypi上作为软件包使用: Franges
## frange.py
from math import ceil
# find best range function available to version (2.7.x / 3.x.x)
try:
_xrange = xrange
except NameError:
_xrange = range
def frange(start, stop = None, step = 1):
"""frange generates a set of floating point values over the
range [start, stop) with step size step
frange([start,] stop [, step ])"""
if stop is None:
for x in _xrange(int(ceil(start))):
yield x
else:
# create a generator expression for the index values
indices = (i for i in _xrange(0, int((stop-start)/step)))
# yield results
for i in indices:
yield start + step*i
## drange.py
import decimal
from math import ceil
# find best range function available to version (2.7.x / 3.x.x)
try:
_xrange = xrange
except NameError:
_xrange = range
def drange(start, stop = None, step = 1, precision = None):
"""drange generates a set of Decimal values over the
range [start, stop) with step size step
drange([start,] stop, [step [,precision]])"""
if stop is None:
for x in _xrange(int(ceil(start))):
yield x
else:
# find precision
if precision is not None:
decimal.getcontext().prec = precision
# convert values to decimals
start = decima