2010-12-13 39 views
121

Số % trong tính toán là gì? Tôi dường như không thể tìm ra nó.% hoạt động bằng Python như thế nào?

Tính toán có tính toán phần trăm ví dụ: 3 + 2 + 1 - 5 + 4 % 2 - 1/4 + 6 dường như bằng 7. Làm thế nào?

+2

Đó là LPTHW ..... – orange

+0

nên không '3 + 2 + 1-5 + 4% 2 - 1/4 + 6' đánh giá cho '6.75' ? – taper

+0

@taper câu hỏi này có thể không sử dụng python 3.0 hoặc mới hơn. –

Trả lời

163

Toán tử% (modulo) thu được phần còn lại từ phân chia đối số đầu tiên theo thứ hai. Các đối số dạng số đầu tiên được chuyển đổi thành một kiểu chung. Một đối số bên phải 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 (từ 3,14 bằng 4 * 0,7 + 0,34). Toán tử modulo luôn mang lại kết quả với cùng ký hiệu với toán hạng thứ hai (hoặc số không); giá trị tuyệt đối của kết quả là nhỏ hơn giá trị tuyệt đối của toán hạng thứ hai [2].

Taken từ http://docs.python.org/reference/expressions.html

Ví dụ 1: 6%2 đánh giá để 0 vì không có còn lại nếu 6 được chia cho 2 (3 lần).

Ví dụ 2: 7%2 đánh giá để 1 vì có một phần còn lại của 1 khi 7 được chia cho 2 (3 lần).

Vì vậy, để tóm tắt, nó trả về phần còn lại của một phép chia, hoặc 0 nếu không 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.

+2

Tại sao tất cả các ví dụ đều có 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

+4

Số đầu tiên là tử số và số thứ hai là mẫu số. 0 phần còn lại 2, do đó kết quả là 2. – David

+3

Vui lòng cập nhật câu trả lời của bạn, có nhiều câu trả lời chính xác hơn dưới đây.Trong [C/C++] (http://stackoverflow.com/a/20638659/3370168)% là dành cho 'rem' trong khi Python là 'mod', ví dụ '- 21% 4' là 3 trong Python – azam

31

Biểu thức như 'x% y' đánh giá phần còn lại của 'x/y'. Các quy tắc ưu tiên giống như '/' và '*'.

>>> 9/2 
4 
>>> 9 % 2 
1 
  • 9 chia cho 2 bằng 4.
  • 4 lần 2 là 8
  • 9 trừ 8 là 1 - thời gian còn lại.

Python Gotcha: tùy theo phiên bản Python bạn đang sử dụng, % cũng là (phản đối) nhà điều hành chuỗi suy, vì vậy xem ra nếu bạn đang đến từ một ngôn ngữ với đúc loại tự động (như PHP hoặc JS) trong đó một biểu thức như '12' % 2 + 3 là hợp pháp: trong Python nó sẽ dẫn đến TypeError: not all arguments converted during string formatting mà có lẽ sẽ khá khó hiểu cho bạn.

+0

Bạn có thể giải thích bằng cách sử dụng một ví dụ hay không. Lấy làm tiếc. :( – orange

3

Toán tử mô đun, nó được sử dụng để phân chia 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

Các% (modulo) điều hành mang lại thời gian còn lại từ bộ phận của đối số đầu tiên bằng cách thứ hai. Các đối số dạng số đầu tiên được chuyển đổi thành một kiểu chung. Một đối số bên phải 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 (từ 3,14 bằng 4 * 0,7 + 0,34). Toán tử modulo luôn mang lại kết quả với cùng ký hiệu với toán hạng thứ hai (hoặc số không); giá trị tuyệt đối của kết quả là nhỏ hơn giá trị tuyệt đối của toán hạng thứ hai [2].

8

Trong hầu hết các ngôn ngữ,% được sử dụng cho modulus. Python cũng không ngoại lệ.

+3

Theo như tôi thấy, Python là bất thường ở chỗ nó sử dụng% cho modulus; Fortran, C/C++ và Java sử dụng% để có nghĩa là phần còn lại. (Xem http://stackoverflow.com/questions/13683563/whats-the-difference-between-mod-and-remainder, sự khác biệt là cách xử lý các giá trị âm và phân số.) Các ngôn ngữ tạo nên sự khác biệt (ví dụ: Ada , Haskell và Scheme) sử dụng các từ "rem" và "mod" (hoặc "phần còn lại" và "modulo") thay vì%. –

+2

Cập nhật: Tôi đã tìm thấy bảng hoạt động modulo/phần dư lớn này bằng ngôn ngữ http://en.wikipedia.org/wiki/Modulo_operation. Python là 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.) –

0

Toán tử% (modulo) thu được phần còn lại từ phân chia đối số đầu tiên theo thứ hai. Các đối số dạng số đầu tiên được chuyển đổi thành một kiểu chung.

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

này được dựa trên ưu tiên đ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) phân chia, vì vậy:

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

Đó là một hoạt động modulo, ngoại trừ khi nó là một toán tử định dạng chuỗi kiểu C kiểu cũ, không phải là thao tác modulo. Xem here để 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 built-in hữu ích được gọi divmod:

divmod (a, b)

Hãy hai con số (không phức tạp) như các đối số và trả về một cặp số gồm của thương và phần còn lại khi sử dụng phân chia dài.

94

Hơi off topic, các % cũng được sử dụng trong các hoạt động chuỗi định dạng như %= để thay giá trị vào một chuỗi:

>>> x = 'abc_%(key)s_' 
>>> x %= {'key':'value'} 
>>> x 
'abc_value_' 

Một lần nữa, tắt chủ đề, nhưng nó có vẻ là một tính năng ghi nhận ít mà đã cho tôi một thời gian để theo dõi, Tôi nghĩ rằng nó có liên quan đến tính toán modulo Pythons mà trang SO này xếp hạng cao.

+18

Cảm ơn bạn. Đây là một tính năng được sử dụng rộng rãi và được sử dụng rộng rãi và là điều đã dẫn tôi đến bài đăng này. –

+3

Chúng tôi yêu câu trả lời ngoài chủ đề này. –

+0

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

25

Mô đun là một phép toán, đôi khi được mô tả là "số học đồng hồ". Tôi thấy rằng mô tả nó chỉ đơn giản là phần còn lại là gây hiểu lầm và khó hiểu bởi vì nó che giấ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 để quấn quanh chu kỳ.

Hãy suy nghĩ về đồng hồ: Giả sử bạn nhìn vào đồng hồ theo thời gian "quân sự", nơi có phạm vi thời gian 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 có thời gian mod hiện 24 cải tiến zero:

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ờ hơn và hơn và giờ hiện tại trong ngày là vô số dài mod 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, nó là một cách toán học để đối phó với chu kỳ và nó là rất quan trọng trong khoa học máy tính. Nó cũng được sử dụng để bọc xung quanh mảng, cho phép bạn tăng chỉ mục và sử dụng mô-đun để quấn trở lại phần đầu sau khi bạn đạt đến cuối mảng.

+1

Đây là câu trả lời đúng, và nó phải được đánh dấu như vậy. –

+0

Đây là cách nó được thực hiện bằng Python: 'a% b = a - b * tầng (a/b)' –

2

Hãy nhận biết rằng

(3+2+1-5) + (4%2) - (1/4) + 6 

thậm chí với kết quả ngoặc trong 6,75 thay vì 7 nếu tính bằng Python 3.4.


Và '/' điều hành mà không phải là dễ hiểu, quá (python2.7): cố gắng ...

- 1/4 

1 - 1/4 

Đây là một chút off-topic ở đây, nhưng phải xem xét khi đánh giá biểu thức trên :)

+0

Làm thế nào điều này có thể là 7? Nó đơn giản hóa thành '(1) + (0) - (0,25) + (6)'. –

3

x % y tính toán thời gian còn lại của bộ phận x chia y nơi các thương là một số nguyên. Phần còn lại có dấu hiệu y.


Trên Python 3, sản lượng tính toán 6.75; điều này là do / thực hiện một bộ phận thực sự, chứ 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, khi kết quả được làm tròn xuống.

Việc phân chia số nguyên có thể được thực hiện trên Python 3 quá, với // điều hành, do đó để có được 7 kết quả là, 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 sự phân chia kiểu Python trên Python 2, chỉ cần thêm dòng

from __future__ import division 

làm dòng mã nguồn đầu tiên trong mỗi tệp nguồn.

+6

Hãy nhớ rằng trẻ '#' dành cho các chú thích và '//' là toán tử. –

1

Modulus - Chia toán hạng bên 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à vân vân.

2

% Nhà điều hành mô-đun cũng có thể được sử dụng để in các 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 dường như hơi tắt chủ đề nhưng chắc chắn sẽ giúp ai đó.

0

Thật khó để tôi dễ dàng tìm thấy các trường hợp sử dụng cụ thể để sử dụng% trực tuyến, ví dụ: tại sao thực hiện phân chia mô đun phân đoạn hoặc phân chia mô đun tiêu cực trong câu trả lời mà nó thực hiện. Hy vọng điều này sẽ giúp làm sáng tỏ những câu hỏi như thế này:

Modulus Division Trong chung:

phận Modulus trả phần còn lại của phép chia toán học.Nó được thực hiện như sau:

Giả sử chúng ta có một cổ tức 5 và ước của 2, phép chia sau đây sẽ được (tương đương với x):

dividend = 5 
divisor = 2 

x = 5/2 
  1. Bước đầu tiên trong tính mô đun là tiến hành phân chia số nguyên:

    x_int = 5 // 2 (bộ phận 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 x_mult = 4

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

    cổ tức - x_mult = 1

  4. Các hoạt động mô đun, do đó, trả về 1:

    5% 2 = 1

ứng dụng để áp dụng các mô đun để một phần nhỏ

Example: 2 % 5 

Việc tính toán các module khi áp dụng cho một phần nhỏ là tương tự như trên; tuy nhiên, điều quan trọng cần lưu ý là việc chia số nguyên sẽ dẫn đến giá trị bằng không khi số chia lớn hơn số chia cổ tức:

dividend = 2 
divisor = 5 

Kết quả phân số nguyên là 0; Vì vậy, khi bước 3 ở trên được thực hiện, giá trị của cổ tức được thực hiện thông qua (trừ zero):

dividend - 0 = 2 —> 2 % 5 = 2 

ứng dụng để áp dụng các mô đun để một bộ phận Tầng

tiêu cực 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 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 dưới đây minh họa các khái niệm mô đun:

dividend: -5 
divisor: 2 

Bước 1: Áp dụng phân chia số nguyên

x_int = -5 // 2 = -3 

Bước 2: Nhân kết quả của việc phân chia số nguyên bằng số chia

x_mult = x_int * 2 = -6 

Bước 3: Trừ cổ tức từ số nhân biến, chú ý tiêu cực kép.

dividend - x_mult = -5 -(-6) = 1 

Do đó:

-5 % 2 = 1 
Các vấn đề liên quan