KR_ControlFlow - somaz94/python-study GitHub Wiki
๋ฐ๋ณต๋ฌธ์ ์ฆ์ ์ข ๋ฃํ๋ ์ ์ด๋ฌธ์ ๋๋ค.
# ์์ 1: ์ซ์ 5๋ฅผ ๋ง๋๋ฉด ๋ฐ๋ณต ์ข
๋ฃ
for i in range(10):
if i == 5:
break
print(i) # 0,1,2,3,4 ์ถ๋ ฅ
# ์์ 2: while๋ฌธ์์์ break
while True:
response = input("๊ณ์ํ์๊ฒ ์ต๋๊น? (y/n): ")
if response == 'n':
break
โ ํน์ง:
- ๋ฐ๋ณต๋ฌธ์ ์ฆ์ ์ข ๋ฃ
- ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์์๋ ๊ฐ์ฅ ์์ชฝ์ ๋ฐ๋ณต๋ฌธ๋ง ์ข ๋ฃ
- while True์ ์์ฃผ ํจ๊ป ์ฌ์ฉ
ํ์ฌ ๋ฐ๋ณต์ ๊ฑด๋๋ฐ๊ณ ๋ค์ ๋ฐ๋ณต์ผ๋ก ์งํํฉ๋๋ค.
# ์์ 1: ์ง์๋ง ์ถ๋ ฅ
for i in range(5):
if i % 2 != 0:
continue
print(i) # 0,2,4 ์ถ๋ ฅ
# ์์ 2: ํน์ ์กฐ๊ฑด ๊ฑด๋๋ฐ๊ธฐ
for name in ['John', '', 'Jane', '', 'Mike']:
if name == '':
continue
print(name) # ๋น ๋ฌธ์์ด ์ ์ธํ๊ณ ์ถ๋ ฅ
โ ํน์ง:
- ํ์ฌ ๋ฐ๋ณต๋ง ๊ฑด๋๋
- ๋ฐ๋ณต๋ฌธ์ ์์์ผ๋ก ์ฆ์ ์ด๋
- ์กฐ๊ฑด์ ๋ง์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ ์ฉ
์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ๋์ด๊ฐ๋๋ค.
# ์์ 1: ํด๋์ค ๋ผ๋ ๋ง๋ค๊ธฐ
class MyEmptyClass:
pass
# ์์ 2: ์กฐ๊ฑด๋ฌธ์์ ์ฌ์ฉ
if True:
pass # ๋์ค์ ๊ตฌํํ ์์
else:
print("else")
โ ํน์ง:
- ๋ฌธ๋ฒ์ ์ผ๋ก ๋ฌธ์ฅ์ด ํ์ํ ๋ ์ฌ์ฉ
- ์์ ์ฝ๋ ์์ฑ ์ ์ ์ฉ
- ์๋ฌด ๋์๋ ํ์ง ์์
๋ฐ๋ณต๋ฌธ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋ ๋ ์คํ๋ฉ๋๋ค.
# for-else ์์
for i in range(5):
if i == 10:
break
else:
print("๋ฐ๋ณต๋ฌธ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋จ")
# while-else ์์
count = 0
while count < 3:
print(count)
count += 1
else:
print("while๋ฌธ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋จ")
โ ํน์ง:
- break ์์ด ๋ฐ๋ณต๋ฌธ์ด ์๋ฃ๋ ๋ ์คํ
- ๋ฐ๋ณต๋ฌธ์ ์ ์ ์ข ๋ฃ ์ฌ๋ถ ํ์ธ ๊ฐ๋ฅ
- for๋ฌธ๊ณผ while๋ฌธ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
์ ์ด๋ฌธ ์์ ๋ค๋ฅธ ์ ์ด๋ฌธ์ ํฌํจํ ์ ์์ต๋๋ค.
# ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์์ break ์ฌ์ฉ
for i in range(3):
for j in range(3):
if i == j:
break
print(i, j)
# ์ค์ฒฉ ์กฐ๊ฑด๋ฌธ์์ continue ์ฌ์ฉ
for i in range(5):
if i < 2:
continue
if i > 3:
break
print(i) # 2,3 ์ถ๋ ฅ
โ ํน์ง:
- ์ฌ๋ฌ ์ ์ด๋ฌธ์ ์ค์ฒฉํด์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ณต์กํ ๋ก์ง ๊ตฌํ์ ํ์ฉ
- ๊ฐ๋ ์ฑ์ ์ํด ์ ์ ํ ๋ค์ฌ์ฐ๊ธฐ ํ์
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ์ด๋ค.
# ๊ธฐ๋ณธ try-except
try:
result = 10 / 0
except ZeroDivisionError:
print("0์ผ๋ก ๋๋ ์ ์์ต๋๋ค")
# try-except-else-finally
try:
number = int(input("์ซ์๋ฅผ ์
๋ ฅํ์ธ์: "))
result = 100 / number
except ValueError:
print("์ฌ๋ฐ๋ฅธ ์ซ์๋ฅผ ์
๋ ฅํ์ธ์")
except ZeroDivisionError:
print("0์ผ๋ก ๋๋ ์ ์์ต๋๋ค")
else:
print(f"๊ฒฐ๊ณผ: {result}") # ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์คํ
finally:
print("ํญ์ ์คํ๋๋ ์ฝ๋") # ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์คํ
โ ๊ตฌ์ฑ ์์:
-
try
: ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋ -
except
: ํน์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์คํํ ์ฝ๋ -
else
: ์์ธ๊ฐ ๋ฐ์ํ์ง ์์์ ๋ ์คํํ ์ฝ๋ -
finally
: ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ํญ์ ์คํํ ์ฝ๋
๋ฆฌ์์ค์ ํ๋๊ณผ ํด์ ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
# ํ์ผ ์ฒ๋ฆฌ์ with ์ฌ์ฉ
with open('example.txt', 'w') as file:
file.write('Hello, World!')
# ํ์ผ์ด ์๋์ผ๋ก ๋ซํ
# ์ฌ๋ฌ ์ปจํ
์คํธ ๊ด๋ฆฌ์ ๋์ ์ฌ์ฉ
with open('input.txt', 'r') as input_file, open('output.txt', 'w') as output_file:
content = input_file.read()
output_file.write(content.upper())
# ์ฌ์ฉ์ ์ ์ ์ปจํ
์คํธ ๊ด๋ฆฌ์
from contextlib import contextmanager
@contextmanager
def timer():
import time
start = time.time()
yield # ์ด ์ง์ ์์ with ๋ธ๋ก ๋ด๋ถ ์ฝ๋ ์คํ
end = time.time()
print(f"์คํ ์๊ฐ: {end - start}์ด")
# ์ฌ์ฉ
with timer():
# ์๊ฐ์ ์ธก์ ํ ์ฝ๋
sum(range(1000000))
โ ์ฅ์ :
- ๋ฆฌ์์ค ๋์ ๋ฐฉ์ง
- ์๋ ์ ๋ฆฌ(cleanup) ๋ณด์ฅ
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ ํฅ์
- ์์ธ ๋ฐ์ ์์๋ ๋ฆฌ์์ค ํด์
๊ตฌ์กฐ์ ํจํด ๋งค์นญ์ ์ ๊ณตํ๋ Switch-case์ ์ ์ฌํ ๊ตฌ๋ฌธ์ด๋ค.
# ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
def process_response(status):
match status:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Server Error"
case _: # ๊ธฐ๋ณธ๊ฐ
return "Unknown"
# ํจํด ๋งค์นญ ํ์ฉ
def process_command(command):
match command.split():
case ["quit"]:
return "ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค."
case ["help"]:
return "๋์๋ง์ ํ์ํฉ๋๋ค."
case ["open", filename]:
return f"{filename} ํ์ผ์ ์ฝ๋๋ค."
case ["save", filename]:
return f"{filename} ํ์ผ์ ์ ์ฅํฉ๋๋ค."
case ["open", *filenames]:
return f"์ฌ๋ฌ ํ์ผ์ ์ฝ๋๋ค: {filenames}"
case _:
return "์ ์ ์๋ ๋ช
๋ น์ด์
๋๋ค."
# ๊ฐ์ฒด ํจํด ๋งค์นญ
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def classify_point(point):
match point:
case Point(x=0, y=0):
return "์์ "
case Point(x=0, y=y):
return f"y์ถ ์์ ์ (y={y})"
case Point(x=x, y=0):
return f"x์ถ ์์ ์ (x={x})"
case Point(x=x, y=y) if x == y:
return f"๋๊ฐ์ ์์ ์ (x=y={x})"
case Point():
return f"์ผ๋ฐ ์ขํ ({point.x}, {point.y})"
โ ํน์ง:
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ ๋์ฒด ๊ฐ๋ฅ
- ๋ค์ํ ํจํด ๋งค์นญ ์ง์
- ๊ตฌ์กฐ ๋ถํด(destructuring) ๊ธฐ๋ฅ
- ๊ฐ๋ ์กฐ๊ฑด(if ์กฐ๊ฑด) ์ฌ์ฉ ๊ฐ๋ฅ
- ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์
์ ์ด ํ๋ฆ์ ์ต์ ํํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
# ์ค์ฒฉ ์กฐ๊ฑด๋ฌธ
def process_data(data):
if data:
if isinstance(data, list):
if len(data) > 0:
# ๋ฐ์ดํฐ ์ฒ๋ฆฌ
return "์ฒ๋ฆฌ ์๋ฃ"
else:
return "๋น ๋ฆฌ์คํธ"
else:
return "๋ฆฌ์คํธ๊ฐ ์๋"
else:
return "๋ฐ์ดํฐ ์์"
# ์กฐ๊ธฐ ๋ฐํ ํจํด
def process_data_optimized(data):
if not data:
return "๋ฐ์ดํฐ ์์"
if not isinstance(data, list):
return "๋ฆฌ์คํธ๊ฐ ์๋"
if len(data) == 0:
return "๋น ๋ฆฌ์คํธ"
# ๋ฐ์ดํฐ ์ฒ๋ฆฌ
return "์ฒ๋ฆฌ ์๋ฃ"
# ์ ํ ๊ฒ์ - break ํ์ฉ
def find_element(data, target):
result = -1
for i, value in enumerate(data):
if value == target:
result = i
break
return result
# ์ด์ง ๊ฒ์ - ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์ ํจ์จ์
def binary_search(data, target):
low, high = 0, len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] == target:
return mid
elif data[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
import time
# ๋ฃจํ ๋ด ์ฐ์ฐ ์ต์ํ
def sum_squares_unoptimized(n):
start = time.time()
result = 0
for i in range(n):
result += i**2
print(f"Unoptimized: {time.time() - start:.6f}์ด")
return result
def sum_squares_optimized(n):
start = time.time()
# ๋ฃจํ ๋ฐ์ผ๋ก ๋น์ฉ์ด ํฐ ์ฐ์ฐ ์ด๋
result = sum(i**2 for i in range(n))
print(f"Optimized: {time.time() - start:.6f}์ด")
return result
# ์์: ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ํจ๊ณผ์
sum_squares_unoptimized(1000000)
sum_squares_optimized(1000000)
โ ์ต์ ํ ์์น:
- ๋ถํ์ํ ์ฐ์ฐ ์ ๊ฑฐ
- ์กฐ๊ฑด ๊ฒ์ฌ ์์ ์ต์ ํ
- ์กฐ๊ธฐ ๋ฐํ ํ์ฉ
- ์ ์ ํ ์๊ณ ๋ฆฌ์ฆ ์ ํ
- ๋ฃจํ ๋ด๋ถ ์ฐ์ฐ ์ต์ํ
์ค๋ฌด์์ ์ ์ฉํ ๊ณ ๊ธ ์ ์ด ํ๋ฆ ํจํด์ด๋ค.
def process_user(user_data):
# ๊ฐ๋ ์ - ์ ํจํ์ง ์์ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ๋ฐํ
if user_data is None:
return "์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค"
if not isinstance(user_data, dict):
return "์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ๋์
๋๋ฆฌ ํํ์ฌ์ผ ํฉ๋๋ค"
if 'name' not in user_data:
return "์ฌ์ฉ์ ์ด๋ฆ์ด ํ์ํฉ๋๋ค"
if 'age' not in user_data:
return "์ฌ์ฉ์ ๋์ด๊ฐ ํ์ํฉ๋๋ค"
# ๋ชจ๋ ๊ฒ์ฆ์ ํต๊ณผํ ํ ์ค์ ์ฒ๋ฆฌ ๋ก์ง
name = user_data['name']
age = user_data['age']
return f"{name}({age}์ธ) ์ฌ์ฉ์ ์ฒ๋ฆฌ ์๋ฃ"
class OrderState:
def process(self, order):
raise NotImplementedError
def cancel(self, order):
raise NotImplementedError
class NewOrder(OrderState):
def process(self, order):
print("์ฃผ๋ฌธ ์ฒ๋ฆฌ ์์")
order.state = ProcessingOrder()
return True
def cancel(self, order):
print("์ ์ฃผ๋ฌธ ์ทจ์")
order.state = CancelledOrder()
return True
class ProcessingOrder(OrderState):
def process(self, order):
print("์ด๋ฏธ ์ฒ๋ฆฌ ์ค์
๋๋ค")
return False
def cancel(self, order):
print("์ฒ๋ฆฌ ์ค ์ฃผ๋ฌธ ์ทจ์")
order.state = CancelledOrder()
return True
class ShippedOrder(OrderState):
def process(self, order):
print("์ด๋ฏธ ๋ฐ์ก๋์์ต๋๋ค")
return False
def cancel(self, order):
print("๋ฐ์ก๋ ์ฃผ๋ฌธ์ ์ทจ์ํ ์ ์์ต๋๋ค")
return False
class CancelledOrder(OrderState):
def process(self, order):
print("์ทจ์๋ ์ฃผ๋ฌธ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค")
return False
def cancel(self, order):
print("์ด๋ฏธ ์ทจ์๋ ์ฃผ๋ฌธ์
๋๋ค")
return False
class Order:
def __init__(self):
self.state = NewOrder()
def process(self):
return self.state.process(self)
def cancel(self):
return self.state.cancel(self)
def validate_username(username):
if len(username) < 4:
return False, "์ฌ์ฉ์ ์ด๋ฆ์ 4์ ์ด์์ด์ด์ผ ํฉ๋๋ค"
return True, None
def validate_email(email):
if '@' not in email:
return False, "์ ํจํ ์ด๋ฉ์ผ ํ์์ด ์๋๋๋ค"
return True, None
def validate_password(password):
if len(password) < 8:
return False, "๋น๋ฐ๋ฒํธ๋ 8์ ์ด์์ด์ด์ผ ํฉ๋๋ค"
return True, None
def register_user(username, email, password):
# ๊ฒ์ฆ ์ฒด์ธ
validations = [
(validate_username, username),
(validate_email, email),
(validate_password, password)
]
for validator, value in validations:
valid, error = validator(value)
if not valid:
return {"success": False, "error": error}
# ๋ชจ๋ ๊ฒ์ฆ์ ํต๊ณผํ๋ฉด ์ฌ์ฉ์ ๋ฑ๋ก
return {"success": True, "message": "์ฌ์ฉ์๊ฐ ๋ฑ๋ก๋์์ต๋๋ค"}
from abc import ABC, abstractmethod
# ์ ๋ต ์ธํฐํ์ด์ค
class SortStrategy(ABC):
@abstractmethod
def sort(self, data):
pass
# ๊ตฌ์ฒด์ ์ธ ์ ๋ต๋ค
class QuickSort(SortStrategy):
def sort(self, data):
print("ํต ์ ๋ ฌ ์ํ")
return sorted(data) # ์ค์ ๋ก๋ ํต ์ ๋ ฌ ๊ตฌํ
class MergeSort(SortStrategy):
def sort(self, data):
print("๋ณํฉ ์ ๋ ฌ ์ํ")
return sorted(data) # ์ค์ ๋ก๋ ๋ณํฉ ์ ๋ ฌ ๊ตฌํ
class BubbleSort(SortStrategy):
def sort(self, data):
print("๋ฒ๋ธ ์ ๋ ฌ ์ํ")
return sorted(data) # ์ค์ ๋ก๋ ๋ฒ๋ธ ์ ๋ ฌ ๊ตฌํ
# ์ปจํ
์คํธ
class Sorter:
def __init__(self, strategy=None):
self.strategy = strategy or QuickSort()
def set_strategy(self, strategy):
self.strategy = strategy
def sort(self, data):
return self.strategy.sort(data)
# ์ฌ์ฉ ์์
sorter = Sorter()
data = [3, 1, 4, 1, 5, 9, 2, 6]
# ๊ธฐ๋ณธ ์ ๋ต(ํต ์ ๋ ฌ) ์ฌ์ฉ
result = sorter.sort(data)
# ์ ๋ต ๋ณ๊ฒฝ
sorter.set_strategy(MergeSort())
result = sorter.sort(data)
# ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์ ๋ต ์ ํ
if len(data) < 10:
sorter.set_strategy(BubbleSort())
else:
sorter.set_strategy(QuickSort())
result = sorter.sort(data)
โ ๊ณ ๊ธ ํจํด ์ฅ์ :
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ
- ์ ์ง๋ณด์์ฑ ํฅ์
- ํ์ฅ์ฑ ๊ฐ์
- ํ ์คํธ ์ฉ์ด์ฑ
- ์ฝ๋ ๊ตฌ์กฐํ ๋ฐ ๋ชจ๋ํ
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์์ ์ ์ด ํ๋ฆ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ด๋ค.
import asyncio
# ๊ธฐ๋ณธ ๋น๋๊ธฐ ํจ์
async def fetch_data(id):
print(f"๋ฐ์ดํฐ {id} ๊ฐ์ ธ์ค๋ ์ค...")
await asyncio.sleep(1) # ๋น๋๊ธฐ ๋๊ธฐ (I/O ์์
์๋ฎฌ๋ ์ด์
)
return f"๋ฐ์ดํฐ {id}"
# ๋์ ์คํ
async def fetch_all_data():
# ์ฌ๋ฌ ์์
๋์ ์คํ
tasks = [fetch_data(i) for i in range(1, 6)]
results = await asyncio.gather(*tasks)
return results
# ์์ฐจ ์คํ
async def fetch_in_sequence():
results = []
for i in range(1, 6):
result = await fetch_data(i)
results.append(result)
return results
# ํ์์์ ์ฒ๋ฆฌ
async def fetch_with_timeout(id, timeout=1.5):
try:
return await asyncio.wait_for(fetch_data(id), timeout)
except asyncio.TimeoutError:
return f"๋ฐ์ดํฐ {id} ๊ฐ์ ธ์ค๊ธฐ ์๊ฐ ์ด๊ณผ"
# ๋น๋๊ธฐ ์ปจํ
์คํธ ๊ด๋ฆฌ์
async def process_data():
async with asyncio.TaskGroup() as tg:
task1 = tg.create_task(fetch_data(1))
task2 = tg.create_task(fetch_data(2))
task3 = tg.create_task(fetch_data(3))
# ๋ชจ๋ ์์
์ด ์๋ฃ๋ ํ ๊ฒฐ๊ณผ ์ฌ์ฉ
return [task1.result(), task2.result(), task3.result()]
# ๋น๋๊ธฐ ์ดํฐ๋ ์ด์
async def async_range(start, stop):
for i in range(start, stop):
await asyncio.sleep(0.5)
yield i
async def use_async_iterator():
async for i in async_range(1, 5):
print(f"๋น๋๊ธฐ ์ดํฐ๋ ์ด์
: {i}")
# ๋ฉ์ธ ํจ์
async def main():
# ๋์ ์คํ
results = await fetch_all_data()
print(f"๋์ ์คํ ๊ฒฐ๊ณผ: {results}")
# ์์ฐจ ์คํ
results = await fetch_in_sequence()
print(f"์์ฐจ ์คํ ๊ฒฐ๊ณผ: {results}")
# ํ์์์ ์ฒ๋ฆฌ
result = await fetch_with_timeout(5, 0.5)
print(f"ํ์์์ ์ฒ๋ฆฌ: {result}")
# ๋น๋๊ธฐ ์ปจํ
์คํธ ๊ด๋ฆฌ์
results = await process_data()
print(f"TaskGroup ๊ฒฐ๊ณผ: {results}")
# ๋น๋๊ธฐ ์ดํฐ๋ ์ด์
await use_async_iterator()
# ์คํ
if __name__ == "__main__":
asyncio.run(main())
โ ๋น๋๊ธฐ ์ ์ด ํ๋ฆ ํน์ง:
- ๋์์ฑ ์ฒ๋ฆฌ
- ๋น์ฐจ๋จ(non-blocking) I/O
- ํ์์์ ๊ด๋ฆฌ
- ์์ ๊ทธ๋ฃนํ
- ๋น๋๊ธฐ ์ดํฐ๋ ์ด์
- ๋น๋๊ธฐ ์ปจํ ์คํธ ๊ด๋ฆฌ
์ค์ ์ฌ๋ก๋ฅผ ํตํ ์ ์ด ํ๋ฆ ์ต์ ํ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
# ๊ฐ ๋จ๊ณ๋ณ ์ฒ๋ฆฌ ํจ์
def validate_data(data):
if not data:
return None
return data
def transform_data(data):
if data is None:
return None
try:
transformed = [x * 2 for x in data]
return transformed
except Exception:
return None
def filter_data(data):
if data is None:
return None
return [x for x in data if x > 10]
def save_data(data):
if data is None:
return "์ฒ๋ฆฌ ์คํจ"
# ์ ์ฅ ๋ก์ง
return f"์ ์ฅ ์๋ฃ: {data}"
# ์ต์ ํ ์ - ์ค์ฒฉ ์กฐ๊ฑด๋ฌธ
def process_pipeline_original(data):
validated = validate_data(data)
if validated is not None:
transformed = transform_data(validated)
if transformed is not None:
filtered = filter_data(transformed)
if filtered is not None:
return save_data(filtered)
else:
return "ํํฐ๋ง ์คํจ"
else:
return "๋ณํ ์คํจ"
else:
return "์ ํจ์ฑ ๊ฒ์ฌ ์คํจ"
# ์ต์ ํ ํ - ์กฐ๊ธฐ ๋ฐํ ๋ฐ ํ์ดํ๋ผ์ธ ํจํด
def process_pipeline_optimized(data):
validated = validate_data(data)
if validated is None:
return "์ ํจ์ฑ ๊ฒ์ฌ ์คํจ"
transformed = transform_data(validated)
if transformed is None:
return "๋ณํ ์คํจ"
filtered = filter_data(transformed)
if filtered is None:
return "ํํฐ๋ง ์คํจ"
return save_data(filtered)
# ํจ์ํ ์ ๊ทผ๋ฒ
def pipeline(*funcs):
def process(data):
result = data
for func in funcs:
result = func(result)
if result is None:
return None
return result
return process
# ์ฌ์ฉ ์์
process_data = pipeline(validate_data, transform_data, filter_data)
result = process_data([1, 5, 10, 15])
if result is not None:
print(save_data(result))
else:
print("ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ ์คํจ")
import time
from collections import defaultdict
class EventProcessor:
def __init__(self):
self.handlers = defaultdict(list)
self.default_handler = lambda event: print(f"์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฒคํธ: {event}")
def register(self, event_type, handler):
self.handlers[event_type].append(handler)
def process(self, event):
event_type = event.get('type')
# ๋น ๋ฅธ ๊ฒฝ๋ก(fast path): ์๋ ค์ง ์ด๋ฒคํธ ํ์
์ธ ๊ฒฝ์ฐ
if event_type in self.handlers:
for handler in self.handlers[event_type]:
handler(event)
return True
# ๋๋ฆฐ ๊ฒฝ๋ก(slow path): ์๋ ค์ง ์ด๋ฒคํธ ํ์
์ด ์๋ ๊ฒฝ์ฐ
self.default_handler(event)
return False
# ์ด๋ฒคํธ ํธ๋ค๋ฌ
def handle_click(event):
print(f"ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ: {event.get('position')}")
def handle_hover(event):
print(f"ํธ๋ฒ ์ด๋ฒคํธ ์ฒ๋ฆฌ: {event.get('position')}")
def handle_key(event):
print(f"ํค ์ด๋ฒคํธ ์ฒ๋ฆฌ: {event.get('key')}")
# ์ฌ์ฉ ์์
processor = EventProcessor()
processor.register('click', handle_click)
processor.register('hover', handle_hover)
processor.register('keypress', handle_key)
# ์ด๋ฒคํธ ์ฒ๋ฆฌ
events = [
{'type': 'click', 'position': (10, 20)},
{'type': 'hover', 'position': (30, 40)},
{'type': 'keypress', 'key': 'Enter'},
{'type': 'unknown', 'data': 'some data'}
]
for event in events:
processor.process(event)
โ ์ฌ๋ก ์ฐ๊ตฌ ํต์ฌ ํฌ์ธํธ:
- ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์
- ๋น์ฆ๋์ค ๋ก์ง ๋ถ๋ฆฌ
- ์๋ฌ ์ฒ๋ฆฌ ๊ฐ์
- ํ์ฅ์ฑ ๋์ ๊ตฌ์กฐ ์ค๊ณ
- ์คํ ๊ฒฝ๋ก ์ต์ ํ
- ์ ์ด ํ๋ฆ ๋ช ํํ