[Python] Operator(연산자)

kkiyou·2021년 5월 18일
0

Python

목록 보기
2/12

1. 연산자의 종류

operatorsDescription
Arithmetic operators+, -, *, /, %, //, **
Relational(Comparison) operators>, <, ==, !=, >=, <=
Logical(Boolean) operatorsand, or, not
Assignment operators=, +=, -=, *=, /=, %=, //=, **=, &=, |=, ^=, >>=, <<=
Bitwise operators&, |, ~, ^, >>, <<
Special operators - Identity operatorsis, is not
Special operators - Membership operatorsin, not in


1.1. 산술 연산자

Arithmetic Operators

  • a + b: 더하기

  • a - b: 빼기

  • a * b: 곱하기

  • a / b: 나누기

  • a // b: a/b의 몫

  • a % b: a/b의 나머지

  • a ** na^n = a의 n제곱

    • ** 연산자는 오른쪽에서 왼쪽으로 계산됨

      • 12 * 2 ** 3 ** 2 = 12×23212 \times 2^{3^{2}} = 12×2912 \times 2^{9} = 6,144

      • a ** (1 / 2) ≡ 2\sqrt{2}



1.2. 관계 연산자

Relational(Comparison) Operators

  • a == b: a와 b는 같다.
  • a != b: a와 b는 같지 않다.
  • x > y: x는 y보다 크다.
  • x >= y: x는 y보다 크거나 같다.
  • x < y: x는 y보다 작다.
  • x <= y: x는 y보다 작거나 같다.

실수 값의 비교
2진법 체계 하에서 실수는 정확한 값으로 표현되지 않을 수 있다. 따라서 실수 연산 값을 단순히 ==으로 비교하면 원하지 않은 결과가 발생할 수 있다.
예컨대 100을 다양한 방식으로 표현해보자. 6416=10010=1448=1100100264_{16} = 100_{10} = 144_{8} = 1100100_{2}이다. 그렇다면 0.1은 2진법으로 어떻게 표현할까? 0.110=000110011001120.1_{10} = 0001100110011…_{2}이다. 즉 0011이 계속 반복된다. 따라서 2진법으로 소수를 정확하게 표현할 수 없고, 근사치를 사용할 수 밖에 없다.

0.1 + 0.1 + 0.1 == 0.3 # False


1.3. 논리 연산자

Logical Operators

  • a and ba & b: a와 b 모두 참이어야 True
  • a or ba | b: a또는 b 둘 중 하나가 참이면 True
  • not a!a: a가 참이면 False, 거짓이면 True
    • (괄호)를 사용하여 명확하게 할 것
    • (True or False) & FalseFalse
  • a <= x <= b 로 표현 불가 ⇒ 6 < x and x <= 12, 6 < x & x <= 12


1.4. 할당 연산자

Assignment Operator

  • =: 왼쪽에는 반드시 변수가 와야 함.

1.4.1. 복합 (대입) 연산자

a ?= b ≡ a = a ? b (? = [+, -, /, *, %…])

  • a += ba = a + b
  • a *= ba = a * b


1.5. 단항 연산자

unary operator

  • 음수와 양수를 표시하는 부호
    • +x, -x
  • 보수연산자(~)
    • ~x
    • 2진법 체계에서 0과 1을 바꿔줌, 예) 0b0100 → 0b1011


1.6. 비트 연산자

Bitwise Operators

  • & (Binary AND): bit 단위의 and연산
    • 0b1111 & 0b0100 # 0b0100
  • | (Binary OR): bit 단위의 or연산
    • 0b1111 | 0b0100 # 0b1111
  • ^ (Binary XOR): bit 단위의 xor연산
    • 0b1111 ^ 0b0100 # 0b1011
  • << (Binary left Shift): bit 단위의 왼쪽 밀기 연산
    • 0b0100 >> 2 # 0b0001
  • >> (Binary right Shift) : bit 단위의 오른쪽 밀기 연산
    • 0b0100 << 1 # 0b1000
  • ~ (Binary NOT): bit 단위의 not연산 (2의 보수)

    파이썬에선 2의 보수(two's complement)를 사용한다. 즉 1의 보수와 차이가 존재한다.
    우선 보수를 사용하는 이유는 2진법 체계 하에서 뺄셈을 하기 위해서이다. 예를들어 2 - 2는 2진법으로 0b0010 + 0b1010로 표현된다. 이 때 -2를 4bits로 표현할 때 0b1010이 되는 이유는, 2진법 체계 하에서 부호를 나타내는 방법이 맨 왼쪽(첫 번재) bit를 +일 때 0, -일 때 1로 표현하기 때문이다.

    보수
    n진법의 보수에서는 n-1의 보수와 n의 보수가 존재한다. 1의 보수(one's complement)는 n진법의 각 자리수마다 가장 큰 수(n-1)에서 해당 자리수의 값을 뺀 결과이다. 한편 2의 보수(two's complement)는 1의 보수에 + 1을 한 값이다.

    2의 보수(two's complement)
    2진법에서 음수를 표현할 때 각 자리의 숫자를 반전하고(0 -> 1, 1 -> 0) 1을 더한다.
    예를들어 1byte일 때 127은 0 111 1111이다. 따라서 127 - 127 = 127 + (-127)로 표현할 수 있다. 그리고 결과값은 0이다. 즉 0 111 1111 + 1 xxx xxxx = 0 000 0000이 되어야 한다.

    Del272^7262^6252^5242^4232^3222^2212^1202^0
    01111111
    +1xxxxxxx
    =00000000

    그런데 1의 보수는 모든 자리수를 1로 만들어 주는 수이다. 그리고 모든 자리수가 1이면 -1을 의미한다. 따라서 -1 + 1을 하게 되면 0이 된다.
    그러므로 2의 보수는 1의 보수에서 1을 더해 표현하게 된다. 즉 -127은 0 111 1111을 반전한 1 000 0000에서, 1을 더해 1 000 0001로 표현한다.

    Del272^7262^6252^5242^4232^3222^2212^1202^0
    01111111
    +10000000
    =11111111
    +00000001
    =100000000

    한편, 8bit의 공간에 2진법으로 음수와 양수를 표현하면 -128 ~ 127의 값을 표현할 수 있다.
    Decimal valueTwo’s-complement Representation(1byte)
    1270 111 1111
    1260 111 1110
    1250 111 1101
    1240 111 1100
    40 000 0100
    30 000 0011
    20 000 0010
    10 000 0001
    00 000 0000
    -11 111 1111
    -21 111 1110
    -31 111 1101
    -41 111 1100
    -1261 000 0010
    -1271 000 0001
    -1281 000 0000


1.7. 삼항 연산자

Ternary operators

[true_value] if [condition] else [false_value]



2. 연산자 우선순위

Operators Precedence

연산자는 ** → *, /, //, % → +, - 순서로, 동일 순위 연산자 내에서는 왼쪽에서 오른쪽으로 계산한다. 따라서 계산의 편의성 및 명확성을 위해서 괄호로 묶어 표현하는 것이 바람직하다.

OperatorDescription
(), {}, []Tuple, Set, List, Dictionary
collection[index]
collection[index1, index2]
function(aguments ...)
object.attribute
컬렉션의 첨자
슬라이싱
함수의 인수
객체의 속성 등
**Exponentiation (raise to the power)
제곱
~, +, -Complement, unary plus and minus (method names for the last two are +@ and -@)
보수 연산자, 단항 연산자
*, /, %, //Multiply, divide, modulo and floor division
곱하기, 나누기, 몫, 나머지
+, -Addition and subtraction
덧셈과 뺄셈
>>, <<Right and left bitwise shift
Shift 연산자
&Bitwise 'AND'
비트연산자 AND
^Bitwise exclusive 'OR'
비트연산자 XOR
|Bitwise 'OR'
비트연산자 OR
in, not in, is, is not, <, <=, >, >=, !=, ==Comparison operators, equality operators, membership and identity operators
비교 연산자, 동등 연산자, 관계 연산자, 종속 연산자
notBoolean 'NOT'
논리 연산자 NOT
andBoolean 'AND'
논리 연산자 AND
orBoolean 'OR'
논리 연산자 OR
=, %=, /=, //=, -=. +=. *=, **=Assignment operators
할당 연산자
if elseTernary operators
삼항 연산자
lambda

0개의 댓글