Câu trả lời:
Toán tử% (modulo) mang lại phần còn lại từ việc chia đối số thứ nhất cho lần thứ hai. Các đối số số đầu tiên được chuyển đổi thành một loại phổ biến. Một đối số đúng không làm tăng ngoại lệ ZeroDivisionError. Các đối số có thể là số dấu phẩy động, ví dụ: 3,14% 0,7 bằng 0,34 (vì 3,14 bằng 4 * 0,7 + 0,34.) Toán tử modulo luôn mang lại kết quả có cùng dấu với toán hạng thứ hai (hoặc 0); giá trị tuyệt đối của kết quả nhỏ hơn hoàn toàn so với giá trị tuyệt đối của toán hạng thứ hai [2].
Lấy từ http://docs.python.org/reference/expressions.html
Ví dụ 1:
6%2
ước tính 0
vì không có phần dư nếu 6 được chia cho 2 (3 lần).
Ví dụ 2 : 7%2
ước tính 1
vì có phần còn lại 1
khi 7 được chia cho 2 (3 lần).
Vì vậy, để tóm tắt điều đó, nó trả về phần còn lại của một hoạt động phân chia, hoặc 0
nếu không có phần còn lại. Vì vậy, 6%2
có nghĩa là tìm phần còn lại của 6 chia cho 2.
-11%5 = 4
??
Hơi lạc đề, %
cũng được sử dụng trong các hoạt động định dạng chuỗi như %=
để thay thế các giá trị thành một chuỗi:
>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x
'abc_value_'
Một lần nữa, lạc đề, nhưng dường như đó là một tính năng tài liệu nhỏ khiến tôi mất một lúc để theo dõi và tôi nghĩ rằng nó có liên quan đến tính toán modulo của Pythons mà trang SO này xếp hạng cao.
%=
không xuất hiện tại trang đó
%
Toán tử được chọn vì nó phản ánh phần trăm chỉ định được sử dụng trong chính chuỗi.
Một biểu thức như x % y
đánh giá phần còn lại của x ÷ y
- tốt, về mặt kỹ thuật, đó là "mô-đun" thay vì "nhắc nhở" nên kết quả có thể khác nếu bạn so sánh với các ngôn ngữ khác %
là toán tử còn lại. Có một số khác biệt tinh tế (nếu bạn quan tâm đến hậu quả thực tế, hãy xem thêm "Tại sao tầng dưới của Bộ phận nguyên vẹn của Python").
Ưu tiên giống như toán tử /
(phép chia) và *
(phép nhân).
>>> 9 / 2
4
>>> 9 % 2
1
Python gotcha : tùy thuộc vào phiên bản Python bạn đang sử dụng, %
cũng là toán tử nội suy chuỗi (không dùng nữa), vì vậy hãy xem nếu bạn đến từ một ngôn ngữ với kiểu truyền tự động (như PHP hoặc JS) trong đó một biểu thức như '12' % 2 + 3
là hợp pháp: Python nó sẽ dẫn đến kết quả TypeError: not all arguments converted during string formatting
có thể sẽ gây nhầm lẫn cho bạn.
[cập nhật cho Python 3]
Bình luận của người dùng n00p:
9/2 là 4,5 con trăn. Bạn phải thực hiện phép chia số nguyên như vậy: 9 // 2 nếu bạn muốn python cho bạn biết có bao nhiêu đối tượng còn lại sau khi chia (4).
Nói chính xác, phép chia số nguyên từng là mặc định trong Python 2 (xin lưu ý bạn, câu trả lời này cũ hơn cậu bé của tôi đã đi học và tại thời điểm 2.x là chủ đạo):
$ python2.7
Python 2.7.10 (default, Oct 6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4
>>> 9 // 2
4
>>> 9 % 2
1
Trong 9 / 2
kết quả Python hiện đại 4.5
thực sự:
$ python3.6
Python 3.6.1 (default, Apr 27 2017, 00:15:59)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4.5
>>> 9 // 2
4
>>> 9 % 2
1
[cập nhật]
Người dùng dahiya_boy hỏi trong phiên bình luận:
Q. Bạn có thể giải thích tại sao
-11 % 5 = 4
- dahiya_boy
Điều này thật kỳ lạ đúng không? Nếu bạn thử điều này trong JavaScript:
> -11 % 5
-1
Điều này là do trong JavaScript %
là toán tử "phần còn lại" trong khi trong Python nó là toán tử "modulus" (toán đồng hồ).
Bạn có thể nhận được lời giải thích trực tiếp từ GvR :
Chỉnh sửa - dahiya_boy
Trong Java và iOS -11 % 5 = -1
trong khi ở python và ruby -11 % 5 = 4
.
Một nửa lý do được giải thích bởi Paulo Scardine , và phần còn lại của lời giải thích ở dưới đây
Trong Java và iOS, %
cung cấp phần còn lại có nghĩa là nếu bạn chia 11% 5 cho Quotient = 2 and remainder = 1
và -11% 5 cho Quotient = -2 and remainder = -1
.
Mã mẫu trong iOS nhanh chóng.
Nhưng khi chúng ta nói về python, nó đưa ra mô-đun đồng hồ. Và nó hoạt động với công thức dưới đây
mod(a,n) = a - {n * Floor(a/n)}
Đó có nghĩa là,
mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Vì thế, mod(11,5) = 1
Và
mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
Vì thế, mod(-11,5) = 4
Mã mẫu trong python 3.0.
Tại sao tầng số nguyên của Python
Tôi đã được yêu cầu (một lần nữa) hôm nay để giải thích tại sao phép chia số nguyên trong Python trả về kết quả thay vì rút ngắn về 0 như C.
Đối với các số dương, không có gì ngạc nhiên:
>>> 5//2
2
Nhưng nếu một trong các toán hạng là âm, kết quả sẽ được thả nổi, nghĩa là được làm tròn từ 0 (hướng tới vô cực âm):
>>> -5//2
-3
>>> 5//-2
-3
Điều này làm phiền một số người, nhưng có một lý do toán học tốt. Hoạt động phân chia số nguyên (//) và anh chị em của nó, hoạt động modulo (%), đi cùng nhau và thỏa mãn một mối quan hệ toán học tốt đẹp (tất cả các biến là số nguyên):
a/b = q with remainder r
như vậy mà
b*q + r = a and 0 <= r < b
(giả sử a và b là> = 0).
Nếu bạn muốn mối quan hệ mở rộng cho âm a (giữ b dương), bạn có hai lựa chọn: nếu bạn cắt q về 0, r sẽ trở thành âm, do đó, bất biến thay đổi thành 0 <= abs (r) <nếu không, bạn có thể sàn q hướng tới vô cực âm và bất biến vẫn là 0 <= r <b. [cập nhật: đã sửa lỗi para này]
Trong lý thuyết số toán học, các nhà toán học luôn thích lựa chọn sau (xem ví dụ Wikipedia ). Đối với Python, tôi đã đưa ra lựa chọn tương tự vì có một số ứng dụng thú vị của hoạt động modulo trong đó dấu hiệu của a là không thú vị. Cân nhắc lấy dấu thời gian POSIX (giây kể từ đầu năm 1970) và biến nó thành thời gian trong ngày. Vì có 24 * 3600 = 86400 giây mỗi ngày, phép tính này chỉ đơn giản là t% 86400. Nhưng nếu chúng ta biểu thị thời gian trước năm 1970 bằng cách sử dụng các số âm, quy tắc "cắt ngắn về không" sẽ cho kết quả vô nghĩa! Sử dụng quy tắc sàn tất cả đều hoạt động tốt.
Các ứng dụng khác mà tôi nghĩ là tính toán các vị trí pixel trong đồ họa máy tính. Tôi chắc chắn có nhiều hơn nữa.
Nhân tiện, đối với b âm, mọi thứ chỉ lật và bất biến trở thành:
0 >= r > b.
Vậy tại sao C không làm theo cách này? Có lẽ phần cứng đã không làm điều này tại thời điểm C được thiết kế. Và phần cứng có thể đã không làm theo cách này bởi vì trong phần cứng lâu đời nhất, các số âm được biểu thị là "dấu + cường độ" thay vì đại diện bổ sung của hai được sử dụng ngày nay (ít nhất là cho số nguyên). Máy tính đầu tiên của tôi là máy tính lớn Data Control và nó đã sử dụng phần bổ sung cho số nguyên cũng như số float. Một mô hình của 60 cái có nghĩa là số 0 âm!
Tim Peters, người biết nơi chôn cất tất cả các bộ xương nổi của Python, đã bày tỏ một số lo lắng về mong muốn của tôi để mở rộng các quy tắc này thành modulo điểm nổi. Anh ấy có lẽ đúng; quy tắc cắt ngắn theo hướng vô cực có thể gây ra tổn thất chính xác cho x% 1.0 khi x là một số âm rất nhỏ. Nhưng điều đó không đủ để tôi phá vỡ modulo số nguyên và // được liên kết chặt chẽ với điều đó.
Tái bút Lưu ý rằng tôi đang sử dụng // thay vì / - đây là cú pháp Python 3 và cũng được phép trong Python 2 để nhấn mạnh rằng bạn biết bạn đang gọi phép chia số nguyên. Toán tử / trong Python 2 không rõ ràng, vì nó trả về một kết quả khác cho hai toán hạng số nguyên so với một int và một float hoặc hai float. Nhưng đó là một câu chuyện hoàn toàn riêng biệt; xem PEP 238.
Đăng bởi Guido van Rossum lúc 9:49 sáng
help(divmod)
tài liệu bất biến q, r = divmod(x y) <==> q*y + r == x
.
Mô-đun là một hoạt động toán học, đôi khi được mô tả là "số học đồng hồ." Tôi thấy rằng việc mô tả nó đơn giản chỉ là một phần còn lại là sai lệch và khó hiểu bởi vì nó che dấu lý do thực sự nó được sử dụng rất nhiều trong khoa học máy tính. Nó thực sự được sử dụng để bọc xung quanh chu kỳ.
Hãy nghĩ về đồng hồ: Giả sử bạn nhìn vào đồng hồ trong thời gian "quân sự", trong đó phạm vi thời gian đi từ 0:00 - 23,59. Bây giờ nếu bạn muốn một cái gì đó xảy ra mỗi ngày vào lúc nửa đêm, bạn sẽ muốn mod 24 thời gian hiện tại bằng không:
if (giờ% 24 == 0):
Bạn có thể nghĩ về tất cả các giờ trong lịch sử bao quanh một vòng tròn 24 giờ liên tục và giờ hiện tại trong ngày là số mod vô hạn dài 24. Đó là một khái niệm sâu sắc hơn nhiều so với chỉ là một phần còn lại, đó là một cách toán học để đối phó với các chu kỳ và nó rất quan trọng trong khoa học máy tính. Nó cũng được sử dụng để bọc xung quanh các mảng, cho phép bạn tăng chỉ số và sử dụng mô-đun để bọc lại từ đầu sau khi bạn đạt đến cuối mảng.
a % b = a - b * floor(a/b)
Python - Toán tử cơ bản
http://www.tutorialspoint.com/python/python_basic_operators.htmlm
Modulus - Chia toán hạng tay trái bằng toán hạng tay phải và trả về phần còn lại
a = 10 và b = 20
b% a = 0
Trong hầu hết các ngôn ngữ% được sử dụng cho mô đun . Python cũng không ngoại lệ.
Toán tử% Modulo cũng có thể được sử dụng để in chuỗi (Giống như trong C) như được xác định trên Google https://developers.google.com/edu/python/strings .
# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')
Điều này có vẻ hơi lạc đề nhưng nó chắc chắn sẽ giúp được ai đó.
x % y
tính toán thời gian còn lại của bộ phận x
chia theo y
nơi các thương là một số nguyên . Phần còn lại có dấu hiệu của y
.
Trên Python 3 tính năng suất 6.75
; điều này là do /
phân chia đúng, không phải phân chia số nguyên như (theo mặc định) trên Python 2. Trên Python 2 1 / 4
cho 0, vì kết quả được làm tròn xuống.
Việc phân chia số nguyên cũng có thể được thực hiện trên Python 3, với //
toán tử, do đó, để có được kết quả 7, bạn có thể thực hiện:
3 + 2 + 1 - 5 + 4 % 2 - 1 // 4 + 6
Ngoài ra, bạn có thể nhận được phân chia kiểu Python trên Python 2, chỉ bằng cách thêm dòng
from __future__ import division
là dòng mã nguồn đầu tiên trong mỗi tệp nguồn.
#
là cho ý kiến và //
là một nhà điều hành.
Toán tử mô đun, nó được sử dụng để phân chia phần còn lại trên các số nguyên, thông thường, nhưng trong Python có thể được sử dụng cho các số dấu phẩy động.
http://docs.python.org/reference/expressions.html
Toán tử% (modulo) mang lại phần còn lại từ việc chia đối số thứ nhất cho lần thứ hai. Các đối số số đầu tiên được chuyển đổi thành một loại phổ biến. Một đối số đúng không làm tăng ngoại lệ ZeroDivisionError. Các đối số có thể là số dấu phẩy động, ví dụ: 3,14% 0,7 bằng 0,34 (vì 3,14 bằng 4 * 0,7 + 0,34.) Toán tử modulo luôn mang lại kết quả có cùng dấu với toán hạng thứ hai (hoặc 0); giá trị tuyệt đối của kết quả nhỏ hơn hoàn toàn so với giá trị tuyệt đối của toán hạng thứ hai [2].
Đó là một hoạt động modulo, ngoại trừ khi đó là một toán tử định dạng chuỗi kiểu C kiểu cũ, không phải là một hoạt động modulo . Xem ở đây để biết chi tiết. Bạn sẽ thấy rất nhiều điều này trong mã hiện có.
Hãy nhận ra rằng
(3 +2 + 1 - 5) + (4 % 2) - (1/4) + 6
ngay cả với dấu ngoặc kết quả là 6,75 thay vì 7 nếu được tính trong Python 3,4.
Và toán tử '/' cũng không dễ hiểu (python2.7): thử ...
- 1/4
1 - 1/4
Đây là một chút lạc đề ở đây, nhưng nên được xem xét khi đánh giá biểu thức trên :)
(1)+(0)-(0.25)+(6)
.
Thật khó cho tôi để dễ dàng tìm thấy các trường hợp sử dụng cụ thể cho việc sử dụng% trực tuyến, ví dụ tại sao việc thực hiện phân chia mô đun phân đoạn hoặc phân chia mô đun âm dẫn đến câu trả lời mà nó thực hiện. Hy vọng điều này sẽ giúp làm rõ các câu hỏi như thế này:
Bộ phận mô-đun nói chung:
Bộ phận mô đun trả về phần còn lại của phép toán chia. Nó được thực hiện như sau:
Giả sử chúng tôi có cổ tức là 5 và ước tính là 2, hoạt động phân chia sau sẽ là (tương đương với x):
dividend = 5
divisor = 2
x = 5/2
Bước đầu tiên trong tính toán mô đun là tiến hành phân chia số nguyên:
x_int = 5 // 2 (phép chia số nguyên trong python sử dụng dấu gạch chéo kép)
x_int = 2
Tiếp theo, đầu ra của x_int được nhân với số chia:
x_mult = x_int * ước số x_mult = 4
Cuối cùng, cổ tức được trừ vào x_mult
cổ tức - x_mult = 1
Do đó, hoạt động mô đun trả về 1:
5% 2 = 1
Áp dụng mô đun cho một phân số
Example: 2 % 5
Việc tính toán mô đun khi áp dụng cho một phân số giống như trên; tuy nhiên, điều quan trọng cần lưu ý là phép chia số nguyên sẽ dẫn đến giá trị bằng 0 khi số chia lớn hơn cổ tức:
dividend = 2
divisor = 5
Phép chia số nguyên cho 0 trong khi; do đó, khi bước 3 ở trên được thực hiện, giá trị của cổ tức được thực hiện (trừ từ 0):
dividend - 0 = 2 —> 2 % 5 = 2
Áp dụng mô đun cho âm
Phân chia tầng xảy ra trong đó giá trị của phân chia số nguyên được làm tròn xuống giá trị số nguyên thấp nhất:
import math
x = -1.1
math.floor(-1.1) = -2
y = 1.1
math.floor = 1
Do đó, khi bạn thực hiện phép chia số nguyên, bạn có thể nhận được kết quả khác với mong đợi!
Áp dụng các bước trên trên cổ tức và ước số sau đây minh họa cho khái niệm mô đun:
dividend: -5
divisor: 2
Bước 1: Áp dụng phép chia số nguyên
x_int = -5 // 2 = -3
Bước 2: Nhân kết quả của phép chia số nguyên với ước số
x_mult = x_int * 2 = -6
Bước 3: Trừ cổ tức từ biến nhân, chú ý âm kép.
dividend - x_mult = -5 -(-6) = 1
Vì thế:
-5 % 2 = 1
Toán tử% (modulo) mang lại phần còn lại từ việc chia đối số thứ nhất cho lần thứ hai. Các đối số số đầu tiên được chuyển đổi thành một loại phổ biến.
3 + 2 + 1 - 5 + 4% 2 - 1/4 + 6 = 7
Điều này dựa trên quyền ưu tiên của nhà điều hành.
Đó là một hoạt động modulo http://en.wikipedia.org/wiki/Modulo_operation
http://docs.python.org/reference/expressions.html
Vì vậy, với thứ tự của các hoạt động, mà làm việc ra
(3 + 2 + 1-5) + (4% 2) - (1/4) + 6
(1) + (0) - (0) + 6
7
1/4 = 0 vì chúng tôi đang làm toán số nguyên ở đây.
Đó là, như trong nhiều ngôn ngữ giống như C, hoạt động còn lại hoặc modulo. Xem tài liệu cho các loại số - int, float, long, phức tạp .
Modulus - Chia toán hạng tay trái bằng toán hạng tay phải và trả về phần còn lại.
Nếu nó giúp:
1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true
... và như thế.
Tôi đã thấy rằng cách dễ nhất để nắm bắt toán tử mô đun (%) là thông qua phân chia dài. Đây là phần còn lại và có thể hữu ích trong việc xác định một số chẵn hoặc lẻ:
4%2 = 0
2
2|4
-4
0
11%3 = 2
3
3|11
-9
2