Jak mogę używać cmp (a, b) z Python3?

16

Powiedziano mi, że używając cmp funkcji może być bardzo przydatne w golfie kodowym . Ale niestety Python 3 nie ma cmpfunkcji.

Więc jaki jest najkrótszy odpowiednik cmp tego działa w Pythonie 3?

xaxa
źródło
3
Powinieneś wyjaśnić, że szukasz cmpalternatywy w kontekście gry w golfa. W przeciwnym razie może to zostać bardzo szybko zamknięte jako ogólne pytanie programistyczne.
Martin Ender
@ MartinBüttner Myślę, że jest to w kontekście pytania o golfa OP, w którym użyto odpowiedzi,cmp choć pytanie zadano dla Pythona 3.
xnor
@ xnor Wiem, że tak, ale inni mogą tego nie robić.
Martin Ender
Jeśli warto wiedzieć, możesz użyć cmp(a,b)w Pythonie 2.
mbomb007

Odpowiedzi:

34

Python 3 nie ma cmp. Możesz grać w golfa

11 znaków

(a>b)-(a<b)

który traci 3 znaki cmp(a,b).

Zabawne jest to również „oficjalne” obejście. Strona What's New in Python 3 mówi „(Jeśli naprawdę potrzebujesz tej cmp()funkcji, możesz użyć wyrażenia (a > b) - (a < b)jako odpowiednika dla cmp(a, b).)”

xnor
źródło
15
strzeż się problemów z pierwszeństwem! faktyczny odpowiednik cmp (a, b) to ((a> b) - (a <b))
Sparr
jeśli a lub b są bardziej złożonymi wyrażeniami - powiedzmy wywołania funkcji o bardzo długim czasie działania, to jest to bardzo złe dla twojego czasu działania. Co gorsza, jeśli a lub b zawiera wywołanie funkcji z efektami ubocznymi, może to nawet zmienić semantyczny program.
Algoman,
1
@Algoman O nie, czas działania, najważniejsza część golf-code / s. Jeśli chcesz uniknąć uruchomiony funkcje dwa razy, po prostu przypisać je do zmiennych wcześniej (co pewnie skończy się robi i tak zaoszczędzić na bajtach)
Jo Król
Pracuję nad transpilatorem - odczytuje wyrażenie i ma generować z niego wyrażenie. Ta cmp w pierwotnym wyrażeniu mogłaby być głęboko zagnieżdżona. byłoby bardzo brzydkie i trudne (jeśli nie niemożliwe) wdrożenie, gdybym wygenerował taki kod docelowy.
Algoman
1
@Algoman więc zastąpić cmp(exp1,exp2)z (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg