subrutinas parametro mclibre lista invocar integradas funciones como aprender python math comparison

parametro - mclibre funciones python



Python: las funciones integradas max/min dependen del orden de los parĂ¡metros (3)

Max funciona de la siguiente manera:

El primer elemento se establece como maxval y luego el siguiente se compara con este valor. La comparación siempre devolverá False:

>>> float(''nan'') < 1 False >>> float(''nan'') > 1 False

Entonces, si el primer valor es nan, entonces (dado que la comparación arroja un resultado falso) no será reemplazado en el próximo paso.

OTOH si 1 es el primero, pasa lo mismo: pero en este caso, como 1 fue establecido, será el máximo.

Puedes verificar esto en el código python, solo busca la función min_max en Python / bltinmodule.c

max(float(''nan''), 1) evalúa a nan

max(1, float(''nan'')) evalúa a 1

¿Es el comportamiento previsto?

Gracias por las respuestas.

max genera una excepción cuando el iterable está vacío. ¿Por qué el max de Python no generaría una excepción cuando nan está presente? O al menos hacer algo útil, como return nan o ignore nan . El comportamiento actual es muy inseguro y parece completamente irracional.

Encontré una consecuencia aún más sorprendente de este comportamiento, así que acabo de publicar una pregunta relacionada .


No he visto esto antes, pero tiene sentido. Tenga en cuenta que nan es un objeto muy extraño:

>>> x = float(''nan'') >>> x == x False >>> x > 1 False >>> x < 1 False

Diría que el comportamiento de max no está definido en este caso, ¿qué respuesta esperarías? El único comportamiento sensato es suponer que las operaciones son antisimétricas.

Observe que puede reproducir este comportamiento haciendo una clase rota:

>>> class Broken(object): ... __le__ = __ge__ = __eq__ = __lt__ = __gt__ = __ne__ = ... lambda self, other: False ... >>> x = Broken() >>> x == x False >>> x < 1 False >>> x > 1 False >>> max(x, 1) <__main__.Broken object at 0x024B5B50> >>> max(1, x) 1


In [19]: 1>float(''nan'') Out[19]: False In [20]: float(''nan'')>1 Out[20]: False

El flotante nan no es ni más grande ni más pequeño que el número entero 1 . max comienza eligiendo el primer elemento, y solo lo reemplaza cuando encuentra un elemento que es estrictamente más grande.

In [31]: max(1,float(''nan'')) Out[31]: 1

Como nan no es mayor que 1, se devuelve 1.

In [32]: max(float(''nan''),1) Out[32]: nan

Como 1 no es más grande que nan , se devuelve nan .

PD. Tenga en cuenta que np.max trata float(''nan'') diferente:

In [36]: import numpy as np In [91]: np.max([1,float(''nan'')]) Out[91]: nan In [92]: np.max([float(''nan''),1]) Out[92]: nan

pero si desea ignorar np.nan s, puede usar np.nanmax :

In [93]: np.nanmax([1,float(''nan'')]) Out[93]: 1.0 In [94]: np.nanmax([float(''nan''),1]) Out[94]: 1.0