¿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.
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.
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.30000000000000004
mientras 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
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
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
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
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
yitertools.count
. no es mejor quedrange
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 hacerseq 0 0.1 1
sin errores de redondeo!– josé
20 de agosto de 2016 a las 5:55
@josch:
seq
usa la clong double
escribir internamente y es sujeto a errores de redondeo. Por ejemplo, en mi máquina,seq 0 0.1 1
da1
como su última salida (como se esperaba), peroseq 1 0.1 2
da1.9
como la última salida (en lugar de la esperada2
).–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))
oitertools.islice(itertools.count(0,0.1), 10)
(después de haberimport itertools
), aunque no he probado cuál es más eficiente– Anónimo
19 de septiembre de 2019 a las 14:13