파이썬에서 %의 결과는 무엇입니까?


241

%계산에서 무엇입니까 ? 나는 그것이하는 일을 해결할 수없는 것 같습니다.

예를 들어 계산의 백분율을 계산 4 % 2합니까? 분명히 0과 같습니다. 어떻게?

답변:


304

% (모듈러스) 연산자는 첫 번째 인수를 두 번째 인수로 나눈 나머지를 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다. 오른쪽 인수가 0이면 ZeroDivisionError 예외가 발생합니다. 인수는 부동 소수점 숫자 일 수 있습니다 (예 : 3.14 % 0.7은 0.34와 같음 (3.14는 4 * 0.7 + 0.34이므로)). 결과의 절대 값은 두 번째 피연산자의 절대 값보다 엄격히 작습니다 [2].

http://docs.python.org/reference/expressions.html 에서 가져온

예 1 : 6을 2 (3)로 나누면 나머지 6%20없기 때문에 평가합니다 .

예 2 : 7을 2로 나눈 나머지 7%21있기 때문에 평가됩니다 1.

요약하면, 나눗셈 연산의 나머지 또는 0나머지가없는 경우를 반환합니다 . 따라서 6%2나머지 6을 2로 나눈다는 것을 의미합니다.


7
모든 예제의 오른쪽에 더 큰 숫자가있는 이유는 무엇입니까? 누군가 2 % 6의 결과를 설명하여 2를 산출 할 수 있습니까?
wookie

8
첫 번째 숫자는 분자이고 두 번째 숫자는 분모입니다. 예 2에서 6으로 나눈 나머지는 0으로 나머지 2이므로 결과는 2입니다.
David

4
답변을 업데이트하십시오. 아래에 더 정확한 답변이 있습니다. 에서는 C / C ++ % 파이썬 %가 '모드'에 대한 반면 "REM"입니다. 예를 들어 - 21 % 4파이썬에서는 3입니다.
azam

이유를 설명해 주시겠습니까 -11%5 = 4??
dahiya_boy

@dahiya_boy 아래에 저의 덜 찬성 한 답변에 GvR의 설명을 추가했습니다.
Paulo Scardine

143

다소 벗어난 주제 %는 문자열 형식화 작업에서 %=값을 문자열로 대체 하는 데에도 사용됩니다 .

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

다시, 주제와, 그러나 추적하는 잠시 나를 데려 조금 문서화 기능을 것 같다, 그리고 나는이 SO 페이지가 높은 순위를하는 파이썬 모듈로 계산에 관한 생각했다.


%도 문자열 형식 참조로 사용되는 논리가 있습니까? 아니면 해당 기호에 과부하가 걸린 것이 우연히 발생합니까? 이것이 자체 질문이어야합니까?
WAF

5
잘못 문서화 되었습니까? 나는 그렇게 생각하지 않습니다 : 문자열 형식화 작업
KurzedMetal

@KurzedMetal- %=해당 페이지에 나타나지 않습니다
P. Myer Nore

@WAF %연산자는 문자열 자체 내에서 사용 된 퍼센트 지정자를 반영하기 때문에 선택되었습니다.
MI Wright

@ P.MyerNore 이것은 거의 3 년 후이지만 다른 사람들을 도울 수 있다는 것을 알고 있습니다. 초에 강조 표시된 첫 번째 파라를 읽습니다. 5.6.2 KurzedMetal에 의해 위에 링크 됨. 있는 "X %는 = {}"단순히위한 짧은 형태이다 "X = X % {...}"
Sujay Phadke

58

같은 표현 x % y은 나머지 부분을 평가합니다. x ÷ y기술적으로 "알림"대신 "모듈러스"이므로 %나머지 연산자가 다른 언어와 비교할 경우 결과가 다를 수 있습니다 . 약간의 미묘한 차이점이 있습니다 (실제적인 결과에 관심이있는 경우 "Python의 정수 부서 층"을 참조하십시오).

우선 순위는 연산자 /(나눗셈) 및 *(곱셈)과 같습니다.

>>> 9 / 2
4
>>> 9 % 2
1
  • 9를 2로 나눈 값은 4입니다.
  • 4 곱하기 2는 8
  • 9 빼기 8은 1-나머지입니다.

Python gotcha : 사용중인 Python 버전에 따라 %(더 이상 사용되지 않는) 문자열 보간 연산자이기도하므로 다음과 같은 표현식 '12' % 2 + 3이 유효한 자동 유형 캐스팅 (PHP 또는 JS와 같은) 언어의 언어인지 확인 하십시오. 파이썬 그것은 TypeError: not all arguments converted during string formatting아마도 당신을 혼란스럽게 할 것입니다.

[파이썬 3 업데이트]

사용자 n00p 의견 :

파이썬에서 9/2는 4.5입니다. 파이썬은 나누기 (4) 후에 남아있는 전체 객체 수를 알려주려면 9 // 2와 같이 정수 나누기를해야합니다.

정확히 말하면 정수 나누기는 파이썬 2에서 기본값으로 사용되었습니다 (이 답변은 이미 학교에 있고 2.x가 주류였던 내 아들보다 나이가 들었습니다).

$ 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

현대 파이썬에서 실제로 9 / 2결과 4.5:

$ 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

[최신 정보]

dahiya_boy 사용자가 댓글 세션에서 물었습니다.

Q. 이유를 설명해 주 -11 % 5 = 4시겠습니까-dahiya_boy

이거 이상 해요? JavaScript로 시도하면 :

> -11 % 5
-1

이것은 JavaScript %에서 "remainder"연산자이고 Python에서는 "modulus"(시계 수학) 연산자 이기 때문입니다 .

GvR에서 직접 설명을 얻을 수 있습니다 .


편집-dahiya_boy

Java와 iOS -11 % 5 = -1에서는 python과 ruby에서는 그렇습니다 -11 % 5 = 4.

이유의 절반은 Paulo Scardine에 의해 설명되며 나머지 설명은 다음과 같습니다.

자바와 아이폰 OS에서 %수단이 나눈다면 그 나머지를 제공합니다 (5) 11 % 제공 Quotient = 2 and remainder = 15 -11 % 제공을 Quotient = -2 and remainder = -1.

신속한 iOS의 샘플 코드.

여기에 이미지 설명을 입력하십시오

그러나 파이썬에서 이야기 할 때 시계 모듈러스를 제공합니다. 그리고 아래 공식에 대한 작업

mod(a,n) = a - {n * Floor(a/n)}

즉,

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

그래서, mod(11,5) = 1

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

그래서, mod(-11,5) = 4

파이썬 3.0의 샘플 코드.

여기에 이미지 설명을 입력하십시오


왜 파이썬의 정수 부서 층

오늘 파이썬에서 정수 나누기가 왜 C와 같이 0으로 잘리는 대신 결과의 바닥을 반환하는지 설명하도록 요청했습니다.

양수의 경우 놀라운 것은 없습니다.

>>> 5//2
2

그러나 피연산자 중 하나가 음수이면 결과는 바닥이됩니다. 즉, 0에서 반올림됩니다 (음의 무한대로).

>>> -5//2
-3
>>> 5//-2
-3

이것은 일부 사람들을 방해하지만 좋은 수학적 이유가 있습니다. 정수 나누기 연산 (//)과 그 형제, 모듈로 연산 (%)은 함께 돌아가서 훌륭한 수학적 관계를 만족시킵니다 (모든 변수는 정수임).

a/b = q with remainder r

그런

b*q + r = a and 0 <= r < b

(a와 b가> = 0이라고 가정).

음수 a에 대해 관계를 확장하려면 (b 양수 유지) 두 가지 선택 사항이 있습니다. q를 0으로 자르면 r이 음수가되어 불변 값이 0 <= abs (r) <로 변경됩니다. 음의 무한대쪽으로 q를 플로어링 할 수 있으며, 불변은 0 <= r <b로 유지됩니다. [업데이트 :이 문제를 해결]

수학적 이론에서 수학자들은 항상 후자의 선택을 선호합니다 (예 : Wikipedia 참조 ). 파이썬의 경우, a의 부호가 흥미롭지 않은 모듈로 연산의 흥미로운 응용 프로그램이 있기 때문에 동일한 선택을했습니다. POSIX 타임 스탬프 (1970 년 초 이후의 초)를 가져 와서 시간으로 바꾸는 것을 고려하십시오. 하루에 24 * 3600 = 86400 초가 있기 때문에이 계산은 단순히 t % 86400입니다. 그러나 음수를 사용하여 1970 년 이전의 시간을 표현할 경우 "0으로 자르기"규칙은 의미없는 결과를 제공합니다! 바닥 규칙을 사용하면 모두 잘 작동합니다.

내가 생각한 다른 응용 프로그램은 컴퓨터 그래픽의 픽셀 위치 계산입니다. 나는 더 많은 것이 확신합니다.

음의 b의 경우, 모든 것이 뒤집어지고 변하지 않는 것은 다음과 같습니다.

0 >= r > b.

C는 왜 이렇게하지 않습니까? 아마도 C가 디자인 될 당시 하드웨어는 이것을하지 않았을 것입니다. 가장 오래된 하드웨어에서 음수는 요즘 사용 된 2의 보수 표현 (적어도 정수)보다 "sign + intensity"로 표시 되었기 때문에 하드웨어는 이런 식으로하지 않았습니다. 첫 번째 컴퓨터는 Control Data 메인 프레임이었으며 정수와 부동 소수점에 대한 보수를 사용했습니다. 60의 패턴은 음의 제로를 의미했습니다!

모든 Python의 부동 소수점 스켈레톤이 어디에 묻혀 있는지 알고있는 Tim Peters는 이러한 규칙을 부동 소수점 모듈로 확장하려는 저의 욕구에 대해 우려를 표명했습니다. 그는 아마 맞을 것이다. x가 매우 작은 음수 인 경우 자르기-음의 무한대 규칙에 따라 x % 1.0의 정밀도 손실이 발생할 수 있습니다. 그러나 그것은 정수 모듈로를 깨뜨리기에 충분하지 않으며 // 밀접하게 연결되어 있습니다.

추신. // 대신 //를 사용하고 있습니다. 이것은 Python 3 구문이며 Python 2에서도 정수 나누기를 호출한다는 것을 강조 할 수 있습니다. Python 2의 / 연산자는 int 및 float 또는 두 개의 float과 다른 두 개의 정수 피연산자에 대해 다른 결과를 반환하므로 모호합니다. 그러나 그것은 완전히 별개의 이야기입니다. PEP 238 참조.

게시자 Guido van Rossum


1
또한 help(divmod)불변을 문서화하십시오 q, r = divmod(x y) <==> q*y + r == x.
chepner

49

모듈러스는 수학적 연산이며 때때로 "클럭 산술"로 설명됩니다. 컴퓨터 과학에서 그렇게 많이 사용되는 실제 이유를 가리기 때문에 단순히 나머지로 묘사하는 것은 오도하고 혼란 스럽습니다. 실제로 사이클을 감싸는 데 사용됩니다.

시계를 생각해보십시오. 시간 범위가 0:00-23.59 인 "군사"시간에 시계를 본다고 가정하십시오. 자정에 매일 무언가를 원한다면 현재 시간 모드 24를 0으로 설정하십시오.

(시간 % 24 == 0) 인 경우 :

당신은 역사상 모든 시간을 24 시간 동안 계속해서 순환하고 하루의 현재 시간은 무한히 긴 숫자 모드 24입니다. 그것은 단지 나머지보다 훨씬 더 심오한 개념이며, 그것은 수학적 방법입니다 사이클을 다루는 것은 컴퓨터 과학에서 매우 중요합니다. 또한 배열을 감싸는 데 사용되므로 인덱스를 늘리고 모듈러스를 사용하여 배열의 끝에 도달 한 후 처음으로 되돌릴 수 있습니다.


1
이것이 파이썬에서 구현되는 방법입니다 :a % b = a - b * floor(a/b)
Aiman ​​Al-Eryani


7

대부분의 언어에서 %는 모듈러스에 사용됩니다 . 파이썬도 예외는 아닙니다.


11
내가 볼 수있는 한, 파이썬은 모듈러스에 %를 사용한다는 점에서 특이합니다. Fortran, C / C ++ 및 Java는 %를 사용하여 나머지를 의미합니다. ( stackoverflow.com/questions/13683563/… 의 차이점은 음수 및 분수 값 처리 방식에 차이가 있습니다.) 구별을 만드는 언어 (예 : Ada, Haskell 및 Scheme)는 "rem"및 "mod"라는 단어를 사용합니다. (또는 "잔여"및 "모듈로")가 아닌 %.
Jim Pivarski

5
업데이트 : en.wikipedia.org/wiki/Modulo_operation 언어별로 모듈러스 / 나머지 작업 표를 찾았습니다 . 파이썬은 독특하지는 않지만 독특하지는 않습니다 (예를 들어, TCL과 Lua는 Python의 규칙을 공유합니다)
Jim Pivarski

5

% Modulo 연산자는 Google https://developers.google.com/edu/python/strings에 정의 된대로 문자열을 인쇄하는데도 사용할 수 있습니다 (C와 동일) .

      # % operator
  text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')

이것은 주제를 벗어난 것처럼 보이지만 확실히 누군가를 도울 것입니다.


4

x % y나눗셈의 나머지를 몫이 정수인으로 나눈x 값을 계산합니다 . 나머지는 부호가 있습니다.yy


파이썬 3에서 계산 결과 6.75; 이것은 /파이썬 2에서 (기본적으로) 정수 나누기가 아닌 진정한 나누기를 수행 하기 때문입니다. 파이썬 2 1 / 4에서는 결과가 반올림되므로 0이됩니다.

정수 나누기는 파이썬 3에서 //연산자로 수행 할 수 있으므로 결과적으로 7을 얻으려면 다음을 실행할 수 있습니다.

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

또한 라인을 추가하여 Python 2에서 Python 스타일 구분을 얻을 수 있습니다.

from __future__ import division

각 소스 파일에서 첫 번째 소스 코드 행으로.


8
아이들 #은 설명을위한 //것이며 운영자 라는 것을 기억하십시오 .
Mike Causer

3

모듈러스 연산자는 일반적으로 정수의 나머지 나눗셈에 사용되지만 Python에서는 부동 소수점 숫자에 사용할 수 있습니다.

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

% (모듈러스) 연산자는 첫 번째 인수를 두 번째 인수로 나눈 나머지를 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다. 오른쪽 인수가 0이면 ZeroDivisionError 예외가 발생합니다. 인수는 부동 소수점 숫자 일 수 있습니다 (예 : 3.14 % 0.7은 0.34와 같음 (3.14는 4 * 0.7 + 0.34이므로)). 결과의 절대 값은 두 번째 피연산자의 절대 값보다 엄격히 작습니다 [2].


3

모듈로 연산이 아닌 구식 C 스타일 문자열 형식화 연산자 인 경우를 제외하고는 모듈로 연산 입니다. 자세한 내용은 여기 를 참조 하십시오 . 기존 코드에서이 내용을 많이 볼 수 있습니다.


3

또한 다음과 같은 유용한 내장 함수가 있습니다 divmod.

divmod (a, b)

두 개의 (복잡하지 않은) 숫자를 인수로 취하고 긴 나누기를 사용할 때 몫과 나머지로 구성된 한 쌍의 숫자를 반환합니다.


2

알고

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

대괄호를 사용하더라도 Python 3.4에서 계산하면 7 대신 6.75가됩니다.


그리고 '/'연산자도 이해하기 쉽지 않습니다 (python2.7) : try ...

- 1/4

1 - 1/4

이것은 약간의 주제가 아니지만 위의 표현을 평가할 때 고려해야합니다 :)


2
이것이 어떻게 7일까요? 로 단순화합니다 (1)+(0)-(0.25)+(6).
J.Steve

1

% 온라인 사용에 대한 특정 사용 사례를 쉽게 찾기가 어려웠습니다. 이것이 다음과 같은 질문을 명확히하는 데 도움이되기를 바랍니다.

모듈러스 부문 :

계수 나누기는 나머지 수학적 나누기 연산을 반환합니다. 다음과 같이 수행됩니다.

우리가 5의 배당과 2의 제수를 가지고 있다고 가정하면 다음과 같은 나눗셈 연산이 (x와 동일) 것입니다 :

dividend = 5
divisor = 2

x = 5/2 
  1. 계수 계산의 첫 번째 단계는 정수 나누기를 수행하는 것입니다.

    x_int = 5 // 2 (파이썬의 정수 나누기는 이중 슬래시를 사용합니다)

    x_int = 2

  2. 다음으로 x_int의 결과에 제수를 곱합니다.

    x_mult = x_int * 제수 x_mult = 4

  3. 마지막으로 x_mult에서 배당을 뺍니다.

    피제수-x_mult = 1

  4. 따라서 계수 연산은 1을 반환합니다.

    5 % 2 = 1

계수를 분수에 적용하는 응용

Example: 2 % 5 

분수에 적용될 때 모듈러스의 계산은 위와 동일합니다. 그러나 제수가 피제수보다 큰 경우 정수 나누기의 값은 0입니다.

dividend = 2 
divisor = 5

정수 나누기는 0이되고; 따라서 위의 3 단계를 수행 할 때 배당금의 가치는 0에서 차감됩니다.

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

모듈러스를 네거티브에 적용하는 응용

바닥 나누기는 정수 나누기 값이 가장 낮은 정수 값으로 내림됩니다.

import math 

x = -1.1
math.floor(-1.1) = -2 

y = 1.1
math.floor = 1

따라서 정수 나누기를 수행하면 예상과 다른 결과를 얻을 수 있습니다!

다음 배당 및 제수에 위의 단계를 적용하면 모듈러스 개념이 설명됩니다.

dividend: -5 
divisor: 2 

1 단계 : 정수 나누기

x_int = -5 // 2  = -3

2 단계 : 정수 나누기의 결과에 제수를 곱합니다.

x_mult = x_int * 2 = -6

3 단계 : 곱한 변수에서 피제수를 빼고 이중 음수를 확인합니다.

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

따라서:

-5 % 2 = 1

0

% (모듈러스) 연산자는 첫 번째 인수를 두 번째 인수로 나눈 나머지를 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다.

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

이것은 연산자 우선 순위를 기반으로합니다.


0

%입니다 모듈 . 3 % 2 = 1,4 % 2 = 0

/ 는 (이 경우 정수) 나누기이므로 다음과 같습니다.

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



0

모듈러스-왼쪽 피연산자를 오른쪽 피연산자로 나누고 나머지를 반환합니다.

도움이된다면 :

1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true

... 등등.


0

모듈러스 연산자 (%)를 파악하는 가장 쉬운 방법은 긴 분할을 통하는 것입니다. 나머지이며 짝수 또는 홀수 인 숫자를 결정하는 데 유용 할 수 있습니다.

4%2 = 0

  2
2|4
 -4
  0


11%3 = 2

  3
3|11
 -9
  2

부서의 나머지 부분을 많이받지 않습니다
DeafaltCoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.