KR_Operator - somaz94/python-study GitHub Wiki

Python ์—ฐ์‚ฐ์ž(Operator) ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

๊ธฐ๋ณธ์ ์ธ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.

# ๊ธฐ๋ณธ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž
x = 10
y = 3

print(x + y)    # 13  (๋ง์…ˆ)
print(x - y)    # 7   (๋บ„์…ˆ)
print(x * y)    # 30  (๊ณฑ์…ˆ)
print(x / y)    # 3.333... (๋‚˜๋ˆ—์…ˆ)
print(x // y)   # 3   (๋ชซ)
print(x % y)    # 1   (๋‚˜๋จธ์ง€)
print(x ** y)   # 1000 (๊ฑฐ๋“ญ์ œ๊ณฑ)

โœ… ํŠน์ง•:

  • ๊ธฐ๋ณธ์ ์ธ ์ˆ˜ํ•™ ์—ฐ์‚ฐ ์ง€์›
  • ๋‚˜๋ˆ—์…ˆ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ float
  • ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์€ // ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ


2๏ธโƒฃ ๋น„๊ต ์—ฐ์‚ฐ์ž

๋‘ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ True/False๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

x = 5
y = 3

print(x == y)   # False (๊ฐ™์Œ)
print(x != y)   # True  (๋‹ค๋ฆ„)
print(x > y)    # True  (ํฌ๋‹ค)
print(x < y)    # False (์ž‘๋‹ค)
print(x >= y)   # True  (ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค)
print(x <= y)   # False (์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค)

โœ… ํŠน์ง•:

  • ๋น„๊ต ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๋ถˆ๋ฆฌ์–ธ
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฒด์ธ ๋น„๊ต ๊ฐ€๋Šฅ (์˜ˆ: a < b < c)


3๏ธโƒฃ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž

๋ถˆ๋ฆฌ์–ธ ๊ฐ’๋“ค์„ ์กฐํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.

x = True
y = False

print(x and y)  # False (๋…ผ๋ฆฌ๊ณฑ)
print(x or y)   # True  (๋…ผ๋ฆฌํ•ฉ)
print(not x)    # False (๋…ผ๋ฆฌ๋ถ€์ •)

โœ… ํŠน์ง•:

  • and, or, not ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • ๋‹จ๋ฝ ํ‰๊ฐ€(short-circuit) ์ง€์›
  • ๋ถˆ๋ฆฌ์–ธ์ด ์•„๋‹Œ ๊ฐ’๋„ ํ‰๊ฐ€ ๊ฐ€๋Šฅ


4๏ธโƒฃ ํ• ๋‹น ์—ฐ์‚ฐ์ž

๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.

x = 10          # ๊ธฐ๋ณธ ํ• ๋‹น
x += 5          # x = x + 5
x -= 3          # x = x - 3
x *= 2          # x = x * 2
x /= 4          # x = x / 4
x //= 2         # x = x // 2
x %= 3          # x = x % 3
x **= 2         # x = x ** 2

โœ… ํŠน์ง•:

  • ๋ณตํ•ฉ ํ• ๋‹น ์—ฐ์‚ฐ์ž ์ง€์›
  • ๋ชจ๋“  ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž์™€ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ
  • ์—ฐ์‚ฐ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ์ˆ˜ํ–‰


5๏ธโƒฃ ๋น„ํŠธ ์—ฐ์‚ฐ์ž

๋น„ํŠธ ๋‹จ์œ„์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

x = 60  # 0011 1100
y = 13  # 0000 1101

print(x & y)    # 12  (AND)
print(x | y)    # 61  (OR)
print(x ^ y)    # 49  (XOR)
print(~x)       # -61 (NOT)
print(x << 2)   # 240 (์™ผ์ชฝ ์‹œํ”„ํŠธ)
print(x >> 2)   # 15  (์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ)

โœ… ํŠน์ง•:

  • ์ •์ˆ˜ํ˜•์— ๋Œ€ํ•ด ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ
  • ๋น„ํŠธ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ ์ง€์›
  • 2์ง„์ˆ˜ ์ฒ˜๋ฆฌ์— ์œ ์šฉ


6๏ธโƒฃ ๋ฉค๋ฒ„์‹ญ ์—ฐ์‚ฐ์ž

์‹œํ€€์Šค ๋‚ด์˜ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

lst = [1, 2, 3, 4, 5]

print(3 in lst)     # True
print(6 not in lst) # True

โœ… ํŠน์ง•:

  • in๊ณผ not in ์—ฐ์‚ฐ์ž ์ œ๊ณต
  • ๋ฆฌ์ŠคํŠธ, ํŠœํ”Œ, ๋ฌธ์ž์—ด ๋“ฑ์— ์‚ฌ์šฉ
  • ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ‚ค ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ


7๏ธโƒฃ ์•„์ด๋ดํ‹ฐํ‹ฐ ์—ฐ์‚ฐ์ž

๊ฐ์ฒด์˜ ๋™์ผ์„ฑ์„ ํ™•์ธํ•œ๋‹ค.

a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a is c)     # True (๊ฐ™์€ ๊ฐ์ฒด)
print(a is b)     # False (๋‹ค๋ฅธ ๊ฐ์ฒด)
print(a is not b) # True (๋‹ค๋ฅธ ๊ฐ์ฒด)

# ์ฃผ์˜: == vs is
print(a == b)     # True (๊ฐ’์ด ๊ฐ™์Œ)
print(a is b)     # False (๋‹ค๋ฅธ ๊ฐ์ฒด)

โœ… ํŠน์ง•:

  • is์™€ is not ์—ฐ์‚ฐ์ž ์ œ๊ณต
  • ๊ฐ์ฒด์˜ ID๋ฅผ ๋น„๊ต
  • == ์—ฐ์‚ฐ์ž์™€์˜ ์ฐจ์ด ์ดํ•ด ํ•„์š”
  • None ์ฒดํฌ์— ์ž์ฃผ ์‚ฌ์šฉ (x is None)


8๏ธโƒฃ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„

# ์šฐ์„ ์ˆœ์œ„ ์˜ˆ์‹œ
result = 2 + 3 * 4  # 14 (๊ณฑ์…ˆ ๋จผ์ €)

โœ… ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ:

  1. ** (๊ฑฐ๋“ญ์ œ๊ณฑ)
  2. +x, -x (๋‹จํ•ญ ์—ฐ์‚ฐ์ž)
  3. *, /, //, % (๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ)
  4. +, - (๋ง์…ˆ, ๋บ„์…ˆ)
  5. <<, >> (๋น„ํŠธ ์‹œํ”„ํŠธ)
  6. & (๋น„ํŠธ AND)
  7. ^ (๋น„ํŠธ XOR)
  8. | (๋น„ํŠธ OR)
  9. ๋น„๊ต ์—ฐ์‚ฐ์ž (<, >, <=, >=, ==, !=)
  10. is, is not, in, not in (์•„์ด๋ดํ‹ฐํ‹ฐ, ๋ฉค๋ฒ„์‹ญ)
  11. not (๋…ผ๋ฆฌ NOT)
  12. and (๋…ผ๋ฆฌ AND)
  13. or (๋…ผ๋ฆฌ OR)


9๏ธโƒฃ ๋‹จ๋ฝ ํ‰๊ฐ€(Short-circuit Evaluation)

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์˜ ์ค‘์š”ํ•œ ํŠน์„ฑ์ธ ๋‹จ๋ฝ ํ‰๊ฐ€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

# and ์—ฐ์‚ฐ์ž์˜ ๋‹จ๋ฝ ํ‰๊ฐ€
x = False
y = print("y๊ฐ€ ํ‰๊ฐ€๋จ") or True  # y๊ฐ€ ํ‰๊ฐ€๋จ

result = x and y  # y๋Š” ํ‰๊ฐ€๋˜์ง€ ์•Š์Œ
print(result)     # False

# or ์—ฐ์‚ฐ์ž์˜ ๋‹จ๋ฝ ํ‰๊ฐ€
x = True
y = print("y๊ฐ€ ํ‰๊ฐ€๋จ") or True  # y๊ฐ€ ํ‰๊ฐ€๋˜์ง€ ์•Š์Œ

result = x or y   # y๋Š” ํ‰๊ฐ€๋˜์ง€ ์•Š์Œ
print(result)     # True

# ์‹ค์šฉ์ ์ธ ํ™œ์šฉ
def get_user():
    print("์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ")
    return {"name": "ํ™๊ธธ๋™"}

# ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ
user = existing_user or get_user()

# ์•ˆ์ „ํ•œ ์†์„ฑ ์ ‘๊ทผ
name = user and user.get('name')

# ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
default_config = {"timeout": 30, "retries": 3}
config = user_config or default_config

โœ… ๋‹จ๋ฝ ํ‰๊ฐ€์˜ ํŠน์ง•:

  • and ์—ฐ์‚ฐ์ž: ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ๊ฑฐ์ง“์ด๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Œ
  • or ์—ฐ์‚ฐ์ž: ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ์ฐธ์ด๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Œ
  • ํšจ์œจ์„ฑ ํ–ฅ์ƒ ๋ฐ ์˜ค๋ฅ˜ ๋ฐฉ์ง€์— ์œ ์šฉ
  • ์กฐ๊ฑด๋ถ€ ์‹คํ–‰, ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • ๋“ฑ์— ํ™œ์šฉ


๐Ÿ”Ÿ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

ํŒŒ์ด์ฌ์€ ํด๋ž˜์Šค์—์„œ ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # + ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    # - ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)
    
    # * ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ (์Šค์นผ๋ผ ๊ณฑ)
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    
    # == ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    # ๋ฌธ์ž์—ด ํ‘œํ˜„
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

# ์‚ฌ์šฉ ์˜ˆ์‹œ
v1 = Vector(1, 2)
v2 = Vector(3, 4)

v3 = v1 + v2       # Vector(4, 6)
v4 = v1 - v2       # Vector(-2, -2)
v5 = v1 * 3        # Vector(3, 6)

print(v3)
print(v4)
print(v5)
print(v1 == Vector(1, 2))  # True

โœ… ์ฃผ์š” ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ:

  • __add__: + ์—ฐ์‚ฐ์ž
  • __sub__: - ์—ฐ์‚ฐ์ž
  • __mul__: * ์—ฐ์‚ฐ์ž
  • __truediv__: / ์—ฐ์‚ฐ์ž
  • __floordiv__: // ์—ฐ์‚ฐ์ž
  • __mod__: % ์—ฐ์‚ฐ์ž
  • __pow__: ** ์—ฐ์‚ฐ์ž
  • __eq__: == ์—ฐ์‚ฐ์ž
  • __lt__: < ์—ฐ์‚ฐ์ž
  • __le__: <= ์—ฐ์‚ฐ์ž
  • __gt__: > ์—ฐ์‚ฐ์ž
  • __ge__: >= ์—ฐ์‚ฐ์ž


1๏ธโƒฃ1๏ธโƒฃ ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž์™€ ํ‘œํ˜„์‹

1. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž(Ternary Operator)

# ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’ ํ• ๋‹น
x = 10
result = "์ง์ˆ˜" if x % 2 == 0 else "ํ™€์ˆ˜"
print(result)  # ์ง์ˆ˜

# ์ค‘์ฒฉ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž
score = 85
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D"
print(grade)  # B

2. ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•œ ํ’€๊ธฐ(Unpacking)

# ๋ฆฌ์ŠคํŠธ ํ’€๊ธฐ
a, b, c = [1, 2, 3]
print(a, b, c)  # 1 2 3

# ๋‚˜๋จธ์ง€ ์š”์†Œ ๋ชจ์œผ๊ธฐ (Python 3.x)
first, *middle, last = [1, 2, 3, 4, 5]
print(first)   # 1
print(middle)  # [2, 3, 4]
print(last)    # 5

# ๋”•์…”๋„ˆ๋ฆฌ ํ’€๊ธฐ
person = {'name': 'ํ™๊ธธ๋™', 'age': 30}
print("{name}๋‹˜์€ {age}์„ธ์ž…๋‹ˆ๋‹ค.".format(**person))  # ํ™๊ธธ๋™๋‹˜์€ 30์„ธ์ž…๋‹ˆ๋‹ค.

3. ์›”์ฆˆ ์—ฐ์‚ฐ์ž(Walrus Operator) - Python 3.8+

# ๊ธฐ์กด ๋ฐฉ์‹
numbers = [1, 2, 3, 4, 5]
filtered = []
for num in numbers:
    squared = num ** 2
    if squared > 10:
        filtered.append(squared)
print(filtered)  # [16, 25]

# ์›”์ฆˆ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ (Python 3.8+)
numbers = [1, 2, 3, 4, 5]
filtered = [squared for num in numbers if (squared := num ** 2) > 10]
print(filtered)  # [16, 25]

# while ๋ฃจํ”„์—์„œ ํ™œ์šฉ
while (line := input("์ž…๋ ฅํ•˜์„ธ์š” (์ข…๋ฃŒํ•˜๋ ค๋ฉด 'q'): ")) != 'q':
    print(f"์ž…๋ ฅ๊ฐ’: {line}")


1๏ธโƒฃ2๏ธโƒฃ ์—ฐ์‚ฐ์ž ํ™œ์šฉ ๊ณ ๊ธ‰ ์˜ˆ์ œ

1. ๋น„ํŠธ ์—ฐ์‚ฐ์ž ํ™œ์šฉ

# ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ
READ = 1      # 0001
WRITE = 2     # 0010
EXECUTE = 4   # 0100
DELETE = 8    # 1000

# ๊ถŒํ•œ ๋ถ€์—ฌ
permission = READ | WRITE  # 0011 (3)

# ๊ถŒํ•œ ํ™•์ธ
has_read = permission & READ  # 0001 (1) - ์žˆ์Œ
has_execute = permission & EXECUTE  # 0000 (0) - ์—†์Œ

print(f"Read ๊ถŒํ•œ: {bool(has_read)}")  # True
print(f"Execute ๊ถŒํ•œ: {bool(has_execute)}")  # False

# ๊ถŒํ•œ ์ถ”๊ฐ€
permission |= EXECUTE  # 0111 (7)
print(f"Execute ๊ถŒํ•œ ์ถ”๊ฐ€ ํ›„: {bin(permission)}")  # 0b111

# ๊ถŒํ•œ ์ œ๊ฑฐ
permission &= ~DELETE  # 0111 & ~1000 = 0111 (7)
print(f"Delete ๊ถŒํ•œ ์ œ๊ฑฐ ํ™•์ธ: {bin(permission)}")  # 0b111

# ํŠน์ • ๋น„ํŠธ๋งŒ ํ† ๊ธ€(๋ณ€๊ฒฝ)
permission ^= WRITE  # 0111 ^ 0010 = 0101 (5)
print(f"Write ๊ถŒํ•œ ํ† ๊ธ€ ํ›„: {bin(permission)}")  # 0b101

2. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ ์—ฐ์‚ฐ์ž

from functools import reduce
from operator import add, mul, itemgetter, attrgetter

# ๋ฆฌ์ŠคํŠธ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ
numbers = [1, 2, 3, 4, 5]
sum_result = reduce(add, numbers)
print(f"ํ•ฉ๊ณ„: {sum_result}")  # 15

# ๋ฆฌ์ŠคํŠธ ๊ณฑ ๊ณ„์‚ฐ
product_result = reduce(mul, numbers, 1)
print(f"๊ณฑ: {product_result}")  # 120

# ๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ
people = [
    {'name': 'ํ™๊ธธ๋™', 'age': 20},
    {'name': '๊น€์ฒ ์ˆ˜', 'age': 35},
    {'name': '์ด์˜ํฌ', 'age': 25}
]

# ๋‚˜์ด์ˆœ ์ •๋ ฌ
age_sorted = sorted(people, key=itemgetter('age'))
print("๋‚˜์ด์ˆœ ์ •๋ ฌ:", [p['name'] for p in age_sorted])  # ['ํ™๊ธธ๋™', '์ด์˜ํฌ', '๊น€์ฒ ์ˆ˜']

# ์ด๋ฆ„์ˆœ ์ •๋ ฌ
name_sorted = sorted(people, key=itemgetter('name'))
print("์ด๋ฆ„์ˆœ ์ •๋ ฌ:", [p['name'] for p in name_sorted])  # ['๊น€์ฒ ์ˆ˜', '์ด์˜ํฌ', 'ํ™๊ธธ๋™']

# ํด๋ž˜์Šค ์†์„ฑ์œผ๋กœ ์ •๋ ฌ
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f"Person('{self.name}', {self.age})"

people_objs = [
    Person('ํ™๊ธธ๋™', 20),
    Person('๊น€์ฒ ์ˆ˜', 35),
    Person('์ด์˜ํฌ', 25)
]

age_sorted_objs = sorted(people_objs, key=attrgetter('age'))
print("๋‚˜์ด์ˆœ ์ •๋ ฌ(๊ฐ์ฒด):", age_sorted_objs)

3. ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž์™€ ์—ฐ์‚ฐ์ž

# with ๋ฌธ์€ ๋‚ด๋ถ€์ ์œผ๋กœ __enter__์™€ __exit__ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ

class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        self.end = time.time()
        self.interval = self.end - self.start
        print(f"์‹คํ–‰ ์‹œ๊ฐ„: {self.interval:.6f}์ดˆ")
        return False  # ์˜ˆ์™ธ ์ „ํŒŒ
    
# ์‚ฌ์šฉ ์˜ˆ์‹œ
with Timer() as timer:
    # ์‹œ๊ฐ„ ์ธก์ •ํ•  ์ฝ”๋“œ
    total = sum(range(1000000))


โš ๏ธ **GitHub.com Fallback** โš ๏ธ