2013-08-28 44 views
6

Có toán tử còn lại nào trong Python không? Tôi không yêu cầu nhà điều hành modulo, nhưng phần còn lại. Ví dụ:Toán tử còn lại của Python

-5 mod 2 = 1 

nhưng

-5 rem 2 = -1 # where "rem" is a remainder operator. 

Tôi có phải thực hiện nó một mình;)?

+3

Có, bạn phải tự mình thực hiện. – katrielalex

+0

có thể trùng lặp của [Tìm số phần còn lại của một số] (http://stackoverflow.com/questions/5584586/find-the-division-remainder-of-a-number) – alecxe

+0

@katrielalex nhưng lập trình là khó: ( – blakev

Trả lời

1

Chỉnh sửa: không hoàn toàn rõ ràng ý của bạn khi bạn yêu cầu một hoạt động còn lại, cách thực hiện điều này sẽ phụ thuộc vào yêu cầu có trên dấu hiệu đầu ra.

Nếu dấu là phải luôn tích cực divmod có thể làm những gì bạn muốn, đó là trong thư viện chuẩn

http://docs.python.org/2/library/functions.html#divmod

Ngoài ra bạn có thể muốn xem xét việc xây dựng trong toán tử số học nhị phân:

http://docs.python.org/2/reference/expressions.html

Nếu phần còn lại phải có ký hiệu giống như đối số được chuyển thì bạn phải cuộn như vậy:

import math 
def rem(x,y): 
    res = x % y 
    return math.copysign(res,x) 
+2

Không, 'divmod (a, b)' trả về chính xác điều tương tự như '(a/b, a% b) '. Nói cách khác, OP sẽ vẫn nhận được '1' thay vì' -1' như anh ta muốn. – abarnert

+0

@abarnert bài đăng được chỉnh sửa để phản ánh rằng – shuttle87

+0

Rõ ràng "nếu dấu hiệu luôn dương" không có tác dụng, bởi vì nó không đúng với ví dụ duy nhất mà OP cung cấp cho chúng tôi, '-5 rem 2 = -1'. – abarnert

18

Thực tế, có ba định nghĩa khác nhau của "modulo" hoặc "phần còn lại", không phải là hai:

  • rút gọn bộ phận còn lại: dấu hiệu cũng giống như số bị chia.
  • Phần còn lại phân chia tầng: ký hiệu giống như số chia.
  • Phần còn lại của phân chia Euclide: dấu hiệu luôn dương.

Gọi một trong số đó là "modulo" và phần còn lại "" còn lại rất khó hiểu; cả ba đều là định nghĩa hữu ích cho cả hai từ.

Hầu hết mọi ngôn ngữ chỉ cung cấp một trong ba ngôn ngữ (Fortran là ngoại lệ đáng chú ý). * Hầu hết các ngôn ngữ cung cấp ngôn ngữ phù hợp với toán tử phân chia ngôn ngữ. ** Vì Python sử dụng phép chia tầng (theo sau đối số của Knuth trong Lập trình máy tính), nó sử dụng toán tử còn lại phù hợp.

Nếu bạn muốn người khác, bạn phải viết thủ công. Nó không phải là rất khó khăn; this Wikipedia article cho biết cách triển khai cả ba.

Ví dụ:

def trunc_divmod(a, b): 
    q = a/b 
    q = -int(-q) if q<0 else int(q) 
    r = a - b * q 
    return q, r 

Bây giờ, ví dụ của bạn:

>>> q, r = trunc_divmod(-5, 2) 
>>> print(q, r) 
-2 -1 

* Thông thường ngôn ngữ mà cung cấp cả hai cuộc gọi cắt ngắn còn lại một số biến thể trên mod, và hạ đo ván một số biến thể trên rem ... nhưng đó chắc chắn không phải là thứ để dựa vào. Ví dụ: Fortran gọi số còn lại là số sàn modulo, trong khi Đề án gọi số dư Euclide là mod.

** Hai trường hợp ngoại lệ đáng chú ý là C90 và C++ 03, để lại sự lựa chọn tối đa cho việc triển khai. Trong khi nhiều triển khai sử dụng phân chia cắt ngắn và phần còn lại, một số không (một vài thậm chí sử dụng phân chia cắt ngắn và phần còn lại sàn, có nghĩa là a = b * (a/b) + a%b thậm chí không hoạt động ...).

-1

math.fmod làm những gì bạn đang tìm kiếm không?

+0

Không, 'fmod' trả về kết quả" như được định nghĩa bởi thư viện nền tảng C ". Loại phần còn lại nào có nghĩa là phụ thuộc vào việc triển khai thực hiện. (C99 _does_ xác định một, nhưng ít nhất Python 2.7 được viết bằng C90, không phải C99.) Vì vậy, _may_ này làm những gì anh ta đang tìm kiếm trên nền tảng của mình ... và sau đó làm điều gì đó khác trên nền tảng khác. (Cũng có một thực tế là 'fmod' chuyển đổi mọi thứ thành' float', và các tài liệu nói rõ ràng rằng nó không được ưu tiên khi làm việc với các số nguyên.) – abarnert

Các vấn đề liên quan