Better way 27 map๊ณผ filter ๋์ ์ปดํ๋ฆฌํจ์ ์ ์ฌ์ฉํ๋ผ
# map๊ณผ filter ์ฌ์ฉ
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
even_squares = list(map(lambda x: x ** 2, even_numbers))
# ์ข์ ์์ - ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
even_squares = [x ** 2 for x in numbers if x % 2 == 0]
Better way 28 ์ปดํ๋ฆฌํจ์ ๋ด๋ถ์ ์ ์ด ํ์ ์์ ์ธ ๊ฐ ์ด์ ์ฌ์ฉํ์ง ๋ง๋ผ
# ์ ์ข์ ์์
matrix = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
flattened = [num for layer in matrix for row in layer for num in row if num % 2 == 0]
# ์ข์ ์์
matrix = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
even_numbers = []
for layer in matrix:
for row in layer:
for num in row:
if num % 2 == 0:
even_numbers.append(num)
Better way 29 ๋์ ์์ ์ฌ์ฉํด ์ปดํ๋ฆฌํจ์ ์์์ ๋ฐ๋ณต ์์ ์ ํผํ๋ผ
# ์ ์ข์ ์์
words = ["hello", "world", "python"]
lengths = [len(word) for word in words if len(word) > 4]
# ์ข์ ์์
lengths = [length for word in words if (length := len(word)) > 4]
Better way 30 ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๊ธฐ๋ณด๋ค๋ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ผ
# ๋ฆฌ์คํธ ๋ฐํ
def squares(n):
return [x ** 2 for x in range(n)]
# ์ ๋๋ ์ดํฐ ์ฌ์ฉ
def squares(n):
for x in range(n):
yield x ** 2
Better way 31 ์ธ์์ ๋ํด ์ดํฐ๋ ์ด์ ํ ๋๋ ๋ฐฉ์ด์ ์ด ๋ผ๋ผ
# ์ ์ข์ ์์
def process(iterator):
first_pass = list(iterator)
second_pass = list(iterator) # ๋น ๋ฆฌ์คํธ ๋ฐํ
# ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ณํ
def process(iterable):
data = list(iterable)
first_pass = data
second_pass = data
Better way 32 ๊ธด ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ๋ณด๋ค๋ ์ ๋๋ ์ดํฐ ์์ ์ฌ์ฉํ๋ผ
# ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
(๋ง์ ๋ฉ๋ชจ๋ฆฌ ์ฐจ์ง)
squares = [x ** 2 for x in range(10**6)]
# ์ ๋๋ ์ดํฐ ( next() ๋ฅผ ํธ์ถ ํ ๋ ๋ง๋ค ํธ์ถ)
squares = (x ** 2 for x in range(10**6))
Better way 33 yield from์ ์ฌ์ฉํด ์ฌ๋ฌ ์ ๋๋ ์ดํฐ๋ฅผ ํฉ์ฑํ๋ผ
# ์์ข์ ์์ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
def chain(iter1, iter2):
for item in iter1:
yield item
for item in iter2:
yield item
# ์ข์ ์์ - yield from ์ฌ์ฉ
def chain(iter1, iter2):
yield from iter1
yield from iter2
Better way 34 send๋ก ์ ๋๋ ์ดํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ์ง ๋ง๋ผ
# ์ ์ข์ ์์ ์ธ๋ถ์์ send()๋ก ๊ฐ์ ๋ฐ์์ด
def message_generator():
message = "Start"
while True:
received = yield message # ์ธ๋ถ์์ ๊ฐ์ ๋ฐ์์ด
if received is not None:
message = f"Received: {received}"
msg_gen = message_generator()
print(next(msg_gen)) # Start
print(msg_gen.send("Hello")) # Received: Hello
# ๋ ๋์ ์์ - ํจ์ ์ธ์๋ก ๋ฐ์ดํฐ ์ ๋ฌ
def process_message(message, additional):
return f"Processed: {message} with {additional}"
print(process_message("Hello", "Extra Data")) # Processed: Hello with Extra Data
Better way 35 ์ ๋๋ ์ดํฐ ์์์ throw๋ก ์ํ๋ฅผ ๋ณํ์ํค์ง ๋ง๋ผ
# ์ ์ข์ ์์ - throw()๋ฅผ ์ฌ์ฉ
def error_generator():
try:
while True:
yield
except ValueError:
print("Error received!")
gen = error_generator()
next(gen)
gen.throw(ValueError) # Error received!
# ์ข์ ์์
def safe_generator():
yield "Processing..."
raise ValueError("Error occurred")
try:
gen = safe_generator()
print(next(gen))
print(next(gen)) # ์ฌ๊ธฐ์ ์์ธ ๋ฐ์
except ValueError as e:
print("Handled error:", e)
Better way 36 ์ดํฐ๋ ์ดํฐ๋ ์ ๋๋ ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ itertools๋ฅผ ์ฌ์ฉํ๋ผ
# ์ ์ข์ ์์ - ์๋ ๋ฐ๋ณต ๊ตฌํ
def repeat_n_times(value, n):
return [value for _ in range(n)]
print(repeat_n_times("Hello", 3)) # ['Hello', 'Hello', 'Hello']
# ์ข์ ์์ - itertools ์ฌ์ฉ
from itertools import repeat
print(list(repeat("Hello", 3))) # ['Hello', 'Hello', 'Hello']
'๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ดํํฐ๋ธ ํ์ด์ฌ 6์ฅ - ๋ฉํํด๋์ค์ ์ ํธ๋ฆฌ๋ทฐํธ (0) | 2025.03.30 |
---|---|
์ดํํฐ๋ธ ํ์ด์ฌ 5์ฅ - ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2025.03.21 |
์ดํํฐ๋ธ ํ์ด์ฌ 3์ฅ - ํจ์ (0) | 2025.03.17 |
์ดํํฐ๋ธ ํ์ด์ฌ 2์ฅ - ๋ฆฌ์คํธ์ ๋์ ๋๋ฆฌ (0) | 2025.03.12 |
์ดํํฐ๋ธ ํ์ด์ฌ 1์ฅ - ํ์ด์ฌ๋ต๊ฒ ์๊ฐํ๊ธฐ (0) | 2025.03.06 |