Kết quả của% trong Python là gì?


241

Những gì %trong một tính toán? Tôi dường như không thể tìm ra những gì nó làm.

Nó có tính ra một phần trăm của phép tính không, ví dụ: 4 % 2bằng 0. Làm thế nào?

Câu trả lời:


304

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 0vì không có phần dư nếu 6 được chia cho 2 (3 lần).

Ví dụ 2 : 7%2ước tính 1vì có phần còn lại 1khi 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 0nếu không có phần còn lại. Vì vậy, 6%2có nghĩa là tìm phần còn lại của 6 chia cho 2.


7
Tại sao tất cả các ví dụ có một số lớn hơn ở bên phải? Ai đó có thể giải thích kết quả của 2% 6 mang lại 2?
wookie

8
Số thứ nhất là tử số và số thứ hai là mẫu số. Trong ví dụ 2 của bạn chia cho 6 là 0 phần còn lại 2, do đó kết quả là 2.
David

4
Vui lòng cập nhật câu trả lời của bạn, có câu trả lời chính xác hơn dưới đây. Trong C / C ++ % là cho 'rem' trong khi trong Python% là cho 'mod'. ví dụ - 21 % 43 là Python.
azam

Bạn có thể vui lòng giải thích tại sao -11%5 = 4??
dahiya_boy

@dahiya_boy Tôi đã thêm lời giải thích của GvR vào câu trả lời ít được nêu hơn của tôi bên dưới.
Paulo Scardine

143

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 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.


Có logic để% cũng được sử dụng làm tham chiếu định dạng chuỗi hay chỉ là một tai nạn của lịch sử mà biểu tượng đó đã bị quá tải? Đây có nên là câu hỏi của riêng mình?
WAF

5
Tài liệu kém? Tôi không nghĩ vậy: Các hoạt động định dạng chuỗi
KurzingMetal

@KurenedMetal - %=không xuất hiện tại trang đó
P. Myer Nore

@WAF %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.
MI Wright

@ P.MyerNore Tôi biết điều này gần 3 năm sau, nhưng có thể giúp đỡ người khác. Đọc đoạn đánh dấu đầu tiên trong giây. 5.6.2 được liên kết ở trên bởi KurzingMetal. "X% = {}" chỉ đơn giản là một dạng rút gọn cho "x = x% {...}"
Sujay Phadke

58

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
  • 9 chia cho 2 bằng 4.
  • 4 lần 2 là 8
  • 9 trừ 8 là 1 - phần còn lại.

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 + 3là hợp pháp: Python nó sẽ dẫn đến kết quả TypeError: not all arguments converted during string formattingcó 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 / 2kết quả Python hiện đại 4.5thự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 = -1trong 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-11% 5 cho Quotient = -2 and remainder = -1.

Mã mẫu trong iOS nhanh chóng.

nhập mô tả hình ảnh ở đây

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

mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}

Vì thế, mod(-11,5) = 4

Mã mẫu trong python 3.0.

nhập mô tả hình ảnh ở đây


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


1
Ngoài ra, help(divmod)tài liệu bất biến q, r = divmod(x y) <==> q*y + r == x.
chepner

49

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.


1
Đây là cách nó được thực hiện bằng Python:a % b = a - b * floor(a/b)
Aiman Al-Eryani


7

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ệ.


11
Theo như tôi có thể thấy, Python khác thường ở chỗ nó sử dụng% cho mô đun; Fortran, C / C ++ và Java sử dụng% để có nghĩa là phần còn lại. (Xem stackoverflow.com/questions/13683563/... , sự khác biệt là ở tiêu cực và giá trị phân đoạn được xử lý như thế nào.) Các ngôn ngữ tạo nên một sự khác biệt (ví dụ như Ada, Haskell, và Đề án) sử dụng các từ "rem" và "mod" (hoặc "phần còn lại" và "modulo") thay vì%.
Jim Pivarski

5
Cập nhật: Tôi tìm thấy bảng hoạt động modulo / phần còn lại tuyệt vời này bằng ngôn ngữ en.wikipedia.org/wiki/Modulo_operation . Python không bình thường nhưng không phải là duy nhất (ví dụ, TCL và Lua chia sẻ quy ước của Python.)
Jim Pivarski

5

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 đó.


4

x % ytính toán thời gian còn lại của bộ phận xchia theo ynơ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 / 4cho 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.


8
Hãy nhớ rằng trẻ em #là cho ý kiến ​​và //là một nhà điều hành.
Mike Causer

3

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].


3

Đó 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ó.


3

Ngoài ra, có một hàm tích hợp hữu ích được gọi là divmod:

divmod (a, b)

Lấy hai số (không phức tạp) làm đối số và trả về một cặp số bao gồm thương số và số dư của chúng khi sử dụng phép chia dài.


2

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 :)


2
Làm thế nào điều này sẽ bao giờ là 7? Nó đơn giản hóa để (1)+(0)-(0.25)+(6).
J.Steve

1

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 
  1. 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

  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

  3. Cuối cùng, cổ tức được trừ vào x_mult

    cổ tức - x_mult = 1

  4. 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

0

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.


0

%modulo . 3 % 2 = 1,4 % 2 = 0

/ là (một số nguyên trong trường hợp này), vì vậy:

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6
1 + 4%2 - 1/4 + 6
1 + 0 - 0 + 6
7



0

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ế.


0

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

cung cấp phần còn lại của một bộ phận không có nhiều để tham gia
DeafaltCoder
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.