Bagaimana saya bisa menggunakan cmp (a, b) dengan Python3?

16

Saya diberitahu bahwa menggunakan cmpfungsi bisa sangat berguna dalam kode-golf . Namun sayangnya, Python 3 tidak memiliki cmpfungsi.

Jadi, apa yang setara dengan cmpyang bekerja di python 3?

xaxa
sumber
3
Anda harus mengklarifikasi bahwa Anda mencari cmpatau alternatif dalam konteks golf. Kalau tidak, ini bisa ditutup sebagai pertanyaan pemrograman umum dengan sangat cepat.
Martin Ender
@ MartinBüttner Saya pikir ini dalam konteks pertanyaan saran golf OP di mana jawaban digunakancmp melalui pertanyaan yang diajukan untuk Python 3.
xnor
@ xnor Aku tahu itu, tapi yang lain mungkin tidak.
Martin Ender
Jika Anda ingin tahu, Anda bisa menggunakannya cmp(a,b)dengan Python 2.
mbomb007

Jawaban:

34

Python 3 tidak punya cmp. Untuk bermain golf, Anda bisa melakukannya

11 karakter

(a>b)-(a<b)

yang kehilangan 3 karakter cmp(a,b).

Yang mengherankan, ini juga merupakan solusi "resmi". Halaman What's New in Python 3 mengatakan "(Jika Anda benar-benar membutuhkan cmp()fungsionalitas, Anda dapat menggunakan ekspresi (a > b) - (a < b)sebagai padanan untuk cmp(a, b).)"

Tidak
sumber
15
Waspadalah terhadap masalah prioritas! padanan sebenarnya dari cmp (a, b) adalah ((a> b) - (a <b))
Sparr
jika a atau b adalah ekspresi yang lebih kompleks - ucapkan panggilan ke fungsi dengan waktu berjalan sangat lama, maka ini sangat buruk untuk waktu berjalan Anda. Lebih buruk lagi, jika a atau b berisi panggilan ke fungsi dengan efek samping, ini bahkan dapat mengubah semantik program Anda.
Algoman
1
@Algoman Oh noes, waktu berjalan, bagian terpenting dari golf kode / s. Jika Anda ingin menghindari berjalan fungsi dua kali, hanya menetapkan mereka untuk variabel terlebih dahulu (yang Anda mungkin akan berakhir melakukan pula untuk menghemat bytes)
Jo Raja
Saya sedang mengerjakan transpiler - ia membaca sebuah ekspresi dan seharusnya menghasilkan ekspresi darinya. Cmp dalam ekspresi asli bisa bersarang secara mendalam. akan sangat jelek dan sulit (jika bukan tidak mungkin) untuk diimplementasikan, jika saya menghasilkan kode target seperti itu.
Algoman
1
@Algoman Jadi gantikan cmp(exp1,exp2)dengan (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg