Як я можу використовувати cmp (a, b) з Python3?


16

Мені сказали, що використання cmpфункції може бути дуже корисним у коді-гольф . Але, на жаль, Python 3 не має cmpфункції.

То який найкоротший еквівалент cmpпрацює в python 3?


3
Вам слід уточнити, що ви шукаєте cmpчи альтернативу в контексті гольфу. В іншому випадку це може закритися як загальне питання програмування дуже швидко.
Мартін Ендер

@ MartinBüttner Я думаю, що це в контексті питання щодо гольфу в ОП, де використовується відповідь,cmp хоча питання було задано для Python 3.
xnor

@xnor Я знаю, що це так, але інші можуть.
Мартін Ендер

Якщо це корисно знати, ви можете використовувати cmp(a,b)в Python 2.
mbomb007

Відповіді:


34

Python 3 не має cmp. Для гольфу можна обійтися

11 символів

(a>b)-(a<b)

який втрачає 3 чари cmp(a,b).

Кумедно, це також "офіційний" спосіб вирішення. На сторінці " Що нового на Python 3 " написано "(Якщо вам справді потрібна cmp()функціональність, ви можете використовувати вираз (a > b) - (a < b)як еквівалент cmp(a, b).)"


15
остерігайтеся проблем пріоритетності! фактичний еквівалент cmp (a, b) дорівнює ((a> b) - (a <b))
Sparr

якщо a або b є складнішими виразами - скажімо, дзвінки до функцій з дуже тривалим часом роботи, то це дуже погано для вашого часу роботи. Гірше, якщо a або b містить виклик функції з побічними ефектами, це може навіть змінити семантику вашої програми.
Алгоман

1
@Algoman О, ні, час роботи, найважливіша частина кодового гольфу / с. Якщо ви хочете уникнути запуску функцій двічі, просто заздалегідь призначте їх змінним (що ви, мабуть, все одно зробите, щоб заощадити на байтах)
Jo King

Я працюю над транспілятором - він читає вираз і повинен генерувати вираз з нього. Цей cmp в оригінальному виразі міг бути глибоко вкладений. було б дуже негарно і важко (якщо не неможливо) реалізувати, якби я генерував такий цільовий код.
Алгоман

1
@Algoman Так замініть cmp(exp1,exp2)на (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Андерс Касеорг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.