社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Deivids Agriņš • 5 年前 • 2922 次点击  

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

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49603
 
2922 次点击  
文章 [ 30 ]  |  最新文章 5 年前
Liam McInroy Nik
Reply   •   1 楼
Liam McInroy Nik    13 年前
[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    6 年前

这是一个使用 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    16 年前

恐怕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    7 年前

类似 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    8 年前

我觉得纽比有点过分了。

[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    11 年前

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

from scipy import arange

cmsjr
Reply   •   7 楼
cmsjr    10 年前

增加 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    16 年前

建立在 '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    16 年前

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

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

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

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

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

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

你可以使用 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])