Py学习  »  Python

For循环范围步骤更改为float python[duplicate]

Deivids Agriņš • 4 年前 • 1969 次点击  

有没有办法在0和1之间按0.1步进?

我以为我可以像下面这样做,但失败了:

for i in range(0, 1, 0.1):
    print i

相反,它说步骤参数不能为零,这是我没有预料到的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49603
 
1969 次点击  
文章 [ 30 ]  |  最新文章 4 年前
Liam McInroy Nik
Reply   •   1 楼
Liam McInroy Nik    11 年前
[x * 0.1 for x in range(0, 10)] 

在Python2.7x中,结果如下:

[0.0,0.1,0.2,0.3000000000004,0.4,0.5,0.600000000000001,0.70000000000001,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]

Pramod
Reply   •   2 楼
Pramod    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)
Dana
Reply   •   3 楼
Dana    15 年前

恐怕range()内置函数返回一个整数值序列,所以不能用它来执行小数步。

我想说只要用一个while循环:

i = 0.0
while i <= 1.0:
    print i
    i += 0.1

如果您好奇,Python正在将0.1转换为0,这就是为什么它告诉您参数不能为零。

Volodymyr Kalish zeferino
Reply   •   4 楼
Volodymyr Kalish zeferino    6 年前

类似 R's 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)

[一]

kalle
Reply   •   5 楼
kalle    7 年前

我觉得纽比有点过分了。

[p/10 for p in range(0, 10)]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

一般来说,一步一步- 1/x 高达 y 你会的

x=100
y=2
[p/x for p in range(0, int(x*y))]
[0.0, 0.01, 0.02, 0.03, ..., 1.97, 1.98, 1.99]

( 1/倍 当我测试时产生的舍入噪声更少)。

Catherine Ray
Reply   •   6 楼
Catherine Ray    9 年前

scipy 具有内置功能 arange 它概括了Python的 range() 构造函数来满足您对浮点处理的要求。

from scipy import arange

cmsjr
Reply   •   7 楼
cmsjr    9 年前

增加 i 在你需要的时候减少它。

for i * 100 in range(0, 100, 10):
    print i / 100.0

编辑:我真的不记得为什么我认为这会在语法上起作用

for i in range(0, 11, 1):
    print i / 10.0

它应该有理想的输出。

gimel
Reply   •   8 楼
gimel    15 年前

建立在 'xrange([start], stop[, step])' ,您可以定义一个生成器,它接受并生成您选择的任何类型(坚持使用支持 + < ):

>>> def drange(start, stop, step):
...     r = start
...     while r < stop:
...         yield r
...         r += step
...         
>>> i0=drange(0.0, 1.0, 0.1)
>>> ["%g" % x for x in i0]
['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1']
>>> 
user25148user25148
Reply   •   9 楼
user25148user25148    15 年前

Python的range()只能做整数,不能做浮点。在特定情况下,您可以使用列表理解代替:

[x * 0.1 for x in range(0, 10)]

(用该表达式替换对range的调用。)

对于更一般的情况,您可能需要编写自定义函数或生成器。

user2357112 Andrew Jaffe
Reply   •   10 楼
user2357112 Andrew Jaffe    5 年前

与其直接使用小数步,不如用你想要的点数来表达。否则,浮点舍入误差可能会给出错误的结果。

你可以使用 linspace 功能来自 NumPy 库(不是标准库的一部分,但相对容易获得)。 邻接空间 获取要返回的多个点,还可以指定是否包含右端点:

>>> np.linspace(0,1,11)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

如果您真的想使用浮点步长值,可以 numpy.arange .

>>> import numpy as np
>>> np.arange(0.0, 1.0, 0.1)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

浮点舍入误差 不过,也会造成问题。这里有一个简单的例子,舍入误差会导致 arange 要在只应生成3个数字时生成length-4数组,请执行以下操作:

>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])