W Pythonie 3.x, są tam niektóre a
, b
takie, że max(a, b) != max(b, a)
?
a
i b
powinien być wbudowanego typu python i nie może zawierać żadnej konwersji.
Typem a
i b
może być: num, float, bool, list, krotka ...
Przykład:
a = 1 # Correct
a = [1, 2] # Correct
a = float('nan') # Wrong
max
wbudowana funkcja, która pobiera iterowalny obiekt jako dane wejściowe. Czylia,b
to samo,b,a
comax(a,b)
musi być równemax(b,a)
float('nan')
nie jest to typ wbudowany. Zakładam, że „typ wbudowany” oznaczałby wszystko, co możesz stworzyć bez konieczności tworzenia nowegoclass
.float('nan')
, to dlaczego? Żeby było jasne, możesz zadać pytanie, w którym wykluczasz coś takiegofloat('nan')
, jak chcesz; to nie jest problem. Problem w tym, że nikt nie jest pewien, o co próbujesz zapytać.Odpowiedzi:
Spełnia wszystkie kryteria:
To dlatego, że inne niż porównania
!=
lubis
zfloat("nan")
zawsze return false.Mówiąc bardziej ogólnie, możemy to zrobić,
max(a, b) != max(b, a)
gdy typ (y)a, b
nie zapewniają całkowitego zamówienia. Jak wskazuje Daniel Mesejo, zestawy mają również tę właściwość. W przypadku zestawów<
oznacza „ścisłego podzbioru”, ale{1, 2}
i{3, 4}
ani ścisła podzbiorem drugiego, tak:Ten technicznie nie ma,
max(a, b) != max(b, a)
ponieważ1 == True
wciąż istnieje zauważalna różnica:źródło
float("nan")
nie jest wbudowany, niż co to jest? Z pewnością jest wbudowany.float('nan')
jest zmiennoprzecinkowy. Jestfloat
tam napisane , więc nie jestem pewien, czego jeszcze się spodziewałeś. Możesz to sprawdzić,type
jeśli chcesz.max
zachowanie jest artefaktem definiowania go inaczej niż Cfmax
(co gwarantuje propagację NaN), zamiast tego jako coś,a<b ? b : a
co zawsze powstaje,a
gdy porównanie jest fałszywe. NaN jest „nieuporządkowany” wrt. jakikolwiek inny numer, taka < NaN
zawsze jest fałszywy, i tak też jestNaN < b
Zgodnie z dokumentacją użycie
max
na zestawach daje niezdefiniowane wyniki:Oto przykład,
Wynik
źródło
min
imax
) lub kolejność (dlasorted
).