Как я могу использовать 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 содержит вызов функции с побочными эффектами, это может даже изменить семантику вашей программы.
Algoman

1
@Algoman О нет, время бега, самая важная часть игры в гольф. Если вы хотите , чтобы избежать запуска функции дважды, просто присвоить их переменные заранее (которые вы , вероятно , будете в конечном итоге делать в любом случае , чтобы сэкономить на байтах)
Джо Кинг

Я работаю над транспортером - он читает выражение и должен генерировать из него выражение. Этот cmp в исходном выражении может быть глубоко вложенным. было бы очень уродливо и трудно (если не невозможно) реализовать, если бы я генерировал целевой код подобным образом.
Algoman

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.