Làm cách nào tôi có thể sử dụng cmp (a, b) với Python3?


16

Tôi đã nói rằng việc sử dụng cmpchức năng này có thể rất hữu ích trong môn đánh gôn . Nhưng thật không may, Python 3 không có cmpchức năng.

Vì vậy, những gì tương đương ngắn nhất cmpmà hoạt động trong python 3?


3
Bạn nên làm rõ rằng bạn đang tìm kiếm cmphoặc một sự thay thế trong bối cảnh chơi golf. Mặt khác, điều này có thể bị đóng lại như một câu hỏi lập trình chung rất nhanh.
Martin Ender

@ MartinBüttner Tôi nghĩ rằng đây là trong bối cảnh câu hỏi tư vấn chơi gôn của OP, nơi một câu trả lời được sử dụngcmp mặc dù câu hỏi được hỏi cho Python 3.
xnor

@xnor Tôi biết là vậy, nhưng những người khác thì không.
Martin Ender

Nếu nó hữu ích để biết, bạn có thể sử dụng cmp(a,b)trong Python 2.
mbomb007

Câu trả lời:


34

Python 3 không có cmp. Đối với golf, bạn có thể làm

11 ký tự

(a>b)-(a<b)

Mà mất 3 chars hơn cmp(a,b).

Thật thú vị, đây cũng là một cách giải quyết "chính thức". Trang What's New trong Python 3 có nội dung "(Nếu bạn thực sự cần cmp()chức năng, bạn có thể sử dụng biểu thức (a > b) - (a < b)tương đương với cmp(a, b).)"


15
hãy cẩn thận vấn đề ưu tiên! tương đương thực tế của cmp (a, b) là ((a> b) - (a <b))
Sparr

nếu a hoặc b là các biểu thức phức tạp hơn - nói các lệnh gọi đến các hàm với thời gian chạy rất dài, thì điều này rất tệ cho thời gian chạy của bạn. Tệ hơn, nếu a hoặc b chứa lệnh gọi hàm có tác dụng phụ, điều này thậm chí có thể thay đổi ngữ nghĩa của chương trình của bạn.
Algoman

1
@Algoman Ôi trời, thời gian chạy, phần quan trọng nhất của môn đánh gôn / s. Nếu bạn muốn tránh các chức năng chạy hai lần, chỉ cần gán chúng cho các biến trước (mà có lẽ bạn đang đi để cuối cùng làm nào để tiết kiệm bytes)
Jo Vua

Tôi đang làm việc trên một bộ chuyển mã - nó đọc một biểu thức và được cho là tạo ra một biểu thức từ nó. Mà cmp trong biểu thức ban đầu có thể được lồng sâu. Sẽ rất xấu và khó (nếu không thể thực hiện được), nếu tôi tạo mã mục tiêu như thế.
Algoman

1
@Algoman Vậy thay thế cmp(exp1,exp2)bằng (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.