¿Cómo usar un valor de paso de rango decimal ()?

5 minutos de lectura

¿Como usar un valor de paso de rango decimal
Evan Fosmark

¿Hay alguna forma de pasar de 0 a 1 en 0,1?

Pensé que podría hacerlo de la siguiente manera, pero falló:

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

En cambio, dice que el argumento del paso no puede ser cero, lo cual no esperaba.

  • int(0.1) == 0, por lo que el paso en realidad es cero. Puede ser inesperado, pero es cero. Es posible que desee reafirmar su pregunta para reflejar el hecho de que no esperaba esto. Decir “no lo es” es falso y engañoso.

    – S. Lott

    25 de enero de 2009 a las 13:34

  • Por cierto, se puede enrollar una sola línea corta usando itertools.takewhile y itertools.count. no es mejor que drange aunque en cuanto al rendimiento.

    – Cos

    29 de noviembre de 2012 a las 16:15

  • Es vergonzoso que el rango de python no permita esto, dado lo fácil que es implementar un generador que haga esto incluso sin acumular errores de redondeo. Diablos, incluso el seq herramienta en GNU coreutils permite hacer seq 0 0.1 1 sin errores de redondeo!

    – josé

    20 de agosto de 2016 a las 5:55

  • @josch: seq usa la c long double escribir internamente y es sujeto a errores de redondeo. Por ejemplo, en mi máquina, seq 0 0.1 1 da 1 como su última salida (como se esperaba), pero seq 1 0.1 2 da 1.9 como la última salida (en lugar de la esperada 2).

    –Mark Dickinson

    24/10/2017 a las 18:39


  • Para mayor comodidad, la sugerencia de @Kos se puede implementar como itertools.takewhile(lambda x: (x+0.05)<1, itertools.count(0,0.1)) o itertools.islice(itertools.count(0,0.1), 10) (después de haber import itertools), aunque no he probado cuál es más eficiente

    – Anónimo

    19 de septiembre de 2019 a las 14:13


de pitón range() solo puede hacer números enteros, no punto flotante. En su caso específico, puede utilizar un lista de comprensión en lugar de:

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

(Reemplace la llamada a range con esa expresión).

Para el caso más general, es posible que desee escribir una función personalizada o generador.

  • Aún mejor, podría usar un generador de comprensión si está trabajando con Python 2.4+. (x * 0.1 for x in range(0, 10)).

    – JAB

    25 de junio de 2010 a las 18:02


  • Incluso mejor, poner x/10 en lugar de x * 0.1 😀 Nada especial en realidad, pero algunos números allí serán más precisos, por ejemplo, para 3*0.1 usted obtiene 0.30000000000000004mientras que por 3/10 obtienes 0.3 🙂

    – Tipo

    26 mayo 2012 a las 18:22


  • 3/10 me da 0, no 0,3. 3/10.0 da 0.29999999999999999. Pitón 2.6.

    usuario25148

    27 de mayo de 2012 a las 8:19

  • @LarsWirzenius: en Python 2.2+, from __future__ import division; 3/10 devuelve 0.3. Este comportamiento es el predeterminado en Python 3.x.

    – Benjamín Hodgson

    14/09/2012 a las 11:15

  • también se puede usar la función redonda lst = [round(x* 0.10,2) for x in range(0,10)]

    – MARCA

    30 de enero de 2014 a las 8:34


  • Esto tiene problemas de redondeo. Por favor mira aquí: code.activestate.com/recipes/66472

    – Christian Oudard

    12/10/2009 a las 20:50

  • Lo extendería un poco para la otra dirección con a (mientras que r> stop) y un r = paso correspondiente para dar la dirección opuesta.

    – usuario318904

    8 de noviembre de 2010 a las 3:59

  • Hice una función xfrange sin los problemas de precisión de flotación mencionados anteriormente. Échale un vistazo 😉 stackoverflow.com/questions/477486/…

    – Carlos Vega

    12 de diciembre de 2013 a las 17:05


  • Estás acumulando errores de redondeo. Utilice esto en su lugar: ` i = 0; r = iniciar mientras que r < detener: i += 1; r = inicio + i * paso; rendimiento r`

    – Cees Timmermann

    11 de abril de 2016 a las 11:56

  • Esto es de pythoncentral.io/pythons-range-function-explained (y otras fuentes de documentación de Python)

    – Apóstoles

    5 de enero de 2018 a las 17:31

1646960346 732 ¿Como usar un valor de paso de rango decimal
cmsjr

Aumentar la magnitud de i para el ciclo y luego redúzcalo cuando lo necesite.

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

EDITAR: Honestamente, no puedo recordar por qué pensé que funcionaría sintácticamente

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

Eso debería tener la salida deseada.

  • Creo que encontrará que range() funciona con números enteros, en cuyo caso esta sería la única solución, usando al menos la misma función.

    – Mateo Scharley

    25 de enero de 2009 a las 10:33

  • @cmsjr creative 😀 Solo una pequeña cosa: divide por 100.0 para evitar que Python trunque el resultado si estás usando Python 2.x. Creo que en 3.0 funcionará como lo codificaste.

    – dana

    25 de enero de 2009 a las 10:35

  • for i * 100 in range(0, 100, 10): SyntaxError: no se puede asignar al operador

    –Anne van Rossum

    6 de enero de 2015 a las 15:02

¿Como usar un valor de paso de rango decimal
kalle

NumPy es un poco exagerado, creo.

[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]

En términos generales, para hacer un paso a paso1/x hasta y tu harías

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/x produjo menos ruido de redondeo cuando probé).

  • Creo que encontrará que range() funciona con números enteros, en cuyo caso esta sería la única solución, usando al menos la misma función.

    – Mateo Scharley

    25 de enero de 2009 a las 10:33

  • @cmsjr creative 😀 Solo una pequeña cosa: divide por 100.0 para evitar que Python trunque el resultado si estás usando Python 2.x. Creo que en 3.0 funcionará como lo codificaste.

    – dana

    25 de enero de 2009 a las 10:35

  • for i * 100 in range(0, 100, 10): SyntaxError: no se puede asignar al operador

    –Anne van Rossum

    6 de enero de 2015 a las 15:02

1646960347 965 ¿Como usar un valor de paso de rango decimal
catalina rayo

scipy tiene una función incorporada arange que generaliza Python range() constructor para satisfacer sus requisitos de manejo de flotadores.

from scipy import arange

  • Esto es en realidad exactamente lo mismo arange puedes encontrar en numpy: >>> import scipy >>> import numpy >>> numpy.arange is scipy.arange regresará True.

    – iFreilicht

    10 de julio de 2017 a las 11:17

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad