KR_For - somaz94/python-study GitHub Wiki
for๋ฌธ์ ์ํ์ค(๋ฆฌ์คํธ, ํํ, ๋ฌธ์์ด ๋ฑ)์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋ฐ๋ณตํ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค. while๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ ํด์ง ํ์๋งํผ ๋ฐ๋ณตํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
# ๊ธฐ๋ณธ for๋ฌธ ๊ตฌ์กฐ
for ๋ณ์ in ์ํ์ค:
์ํํ _๋ฌธ์ฅ1
์ํํ _๋ฌธ์ฅ2
...
# ์์
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
print(fruit)
โ ํน์ง:
- ์ํ์ค์ ๋ชจ๋ ์์๋ฅผ ์ํ
- ์๋์ผ๋ก ๋ค์ ์์๋ก ์ด๋
- ๋ค์ฌ์ฐ๊ธฐ๋ก ์ฝ๋ ๋ธ๋ก ๊ตฌ๋ถ
# range() ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
for i in range(5): # 0๋ถํฐ 4๊น์ง
print(i)
# ์์๊ณผ ๋ ์ง์
for i in range(1, 6): # 1๋ถํฐ 5๊น์ง
print(i)
# ์คํ
์ง์
for i in range(0, 10, 2): # 0๋ถํฐ 9๊น์ง 2์ฉ ์ฆ๊ฐ
print(i) # 0, 2, 4, 6, 8 ์ถ๋ ฅ
โ range() ํน์ง:
-
range(๋)
: 0๋ถํฐ ๋-1๊น์ง -
range(์์, ๋)
: ์์๋ถํฐ ๋-1๊น์ง -
range(์์, ๋, ์คํ )
: ์์๋ถํฐ ๋-1๊น์ง ์คํ ๋งํผ ์ฆ๊ฐ
# break ์ฌ์ฉ
for i in range(10):
if i == 5:
break
print(i)
# continue ์ฌ์ฉ
for i in range(10):
if i % 2 == 0:
continue # ์ง์๋ฉด ๊ฑด๋๋ฐ๊ธฐ
print(i) # ํ์๋ง ์ถ๋ ฅ
โ ์ ์ด๋ฌธ:
-
break
: ๋ฐ๋ณต๋ฌธ ์์ ํ ์ข ๋ฃ -
continue
: ํ์ฌ ๋ฐ๋ณต ๊ฑด๋๋ฐ๊ธฐ
# ๊ธฐ๋ณธ ํํ
squares = [x**2 for x in range(10)]
# ์กฐ๊ฑด๋ฌธ ํฌํจ
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ
matrix = [[i*j for j in range(3)] for i in range(3)]
# ๊ธฐ์กด ๋ฐฉ์๊ณผ ๋น๊ต
# ๊ธฐ์กด ๋ฐฉ์
squares = []
for x in range(10):
squares.append(x**2)
# ์ปดํ๋ฆฌํจ์
squares = [x**2 for x in range(10)]
โ ์ปดํ๋ฆฌํจ์ ์ฅ์ :
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ
- ๊ฐ๋ ์ฑ ํฅ์
- ์ฑ๋ฅ ์ต์ ํ
- ์ง๊ด์ ์ธ ํํ
# ๊ตฌ๊ตฌ๋จ ์ถ๋ ฅ
for i in range(2, 10):
for j in range(1, 10):
print(f"{i} x {j} = {i*j}")
print()
# ๋ฆฌ์คํธ ์ํํ๋ฉฐ ์ฒ๋ฆฌ
scores = [90, 85, 77, 65, 97]
for i, score in enumerate(scores):
print(f"ํ์{i+1}: {score}์ ")
# ๋์
๋๋ฆฌ ์ํ
person = {'name': 'John', 'age': 30, 'city': 'Seoul'}
for key, value in person.items():
print(f"{key}: {value}")
โ ํ์ฉ Tip:
-
enumerate()
: ์ธ๋ฑ์ค์ ๊ฐ์ ํจ๊ป ์ํ -
zip()
: ์ฌ๋ฌ ์ํ์ค ๋์ ์ํ -
items()
: ๋์ ๋๋ฆฌ์ ํค-๊ฐ ์ ์ํ
๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ, ์ธํธ ์ปดํ๋ฆฌํจ์ ์ ํ์ฉํ ๋ค์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด๋ค.
# ๋์
๋๋ฆฌ ์ปดํ๋ฆฌํจ์
word_lengths = {word: len(word) for word in ['apple', 'banana', 'orange']}
# ๊ฒฐ๊ณผ: {'apple': 5, 'banana': 6, 'orange': 6}
# ์ธํธ ์ปดํ๋ฆฌํจ์
unique_lengths = {len(word) for word in ['apple', 'banana', 'orange', 'pear']}
# ๊ฒฐ๊ณผ: {4, 5, 6}
# ์ค์ฒฉ ์ปดํ๋ฆฌํจ์
๊ณผ ์กฐ๊ฑด
flattened = [num for row in [[1, 2], [3, 4], [5, 6]] for num in row if num % 2 == 0]
# ๊ฒฐ๊ณผ: [2, 4, 6]
# ์กฐ๊ฑด๋ถ ๊ฐ ํ ๋น
scores = [85, 92, 78, 90, 55]
grades = ['A' if score >= 90 else 'B' if score >= 80 else 'C' if score >= 70 else 'F' for score in scores]
# ๊ฒฐ๊ณผ: ['B', 'A', 'C', 'A', 'F']
# ์กฐ๊ฑด๋ถ ํํ์์ ์ฌ์ฉํ ํํฐ๋ง๊ณผ ๋ณํ
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 17}, {'name': 'Charlie', 'age': 30}]
adult_names = [person['name'] for person in data if person['age'] >= 18]
# ๊ฒฐ๊ณผ: ['Alice', 'Charlie']
โ ๊ณ ๊ธ ์ปดํ๋ฆฌํจ์ ํน์ง:
- ๋ค์ค ๋ฐ๋ณต๋ฌธ ์ง์
- ํํฐ๋ง๊ณผ ๋ณํ ๋์ ์ํ
- ์ค์ฒฉ ์๋ฃ๊ตฌ์กฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ง๊ด์ ์ธ ๋ฐ์ดํฐ ๋ณํ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ
ํ์ด์ฌ์ ๋ฐ๋ณต ๊ด๋ จ ๊ณ ๊ธ ๊ฐ๋ ๋ค์ ์ดํด๋ณธ๋ค.
# ์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ
iterable = [1, 2, 3]
iterator = iter(iterable)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
# print(next(iterator)) # StopIteration ์์ธ ๋ฐ์
# ๊ฐ๋จํ ์ ๋๋ ์ดํฐ ํจ์
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
# ์ ๋๋ ์ดํฐ ์ฌ์ฉ
counter = count_up_to(5)
for num in counter:
print(num) # 1, 2, 3, 4, 5 ์ถ๋ ฅ
# ์ ๋๋ ์ดํฐ ์ปดํ๋ฆฌํจ์
(์ ๋๋ ์ดํฐ ํํ์)
gen = (x**2 for x in range(5))
for value in gen:
print(value) # 0, 1, 4, 9, 16 ์ถ๋ ฅ
# ๋ฌดํ ์ํ์ค ์์ฑ
def infinite_sequence():
num = 0
while True:
yield num
num += 1
# ๋ฌดํ ์ํ์ค์์ ์ผ๋ถ๋ง ์ฌ์ฉ
sequence = infinite_sequence()
for i, num in enumerate(sequence):
print(num)
if i >= 9: # 10๊ฐ๋ง ์ถ๋ ฅ
break
โ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ ์ฅ์ :
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ (ํ์ํ ๋๋ง ๊ฐ ์์ฑ)
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ํฉ
- ์ง์ฐ ํ๊ฐ(Lazy Evaluation)
- ๋ฌดํ ์ํ์ค ์์ฑ ๊ฐ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์์ธก ๊ฐ๋ฅ
์ฑ๋ฅ ํฅ์์ ์ํ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ด๋ค.
import time
# 1. ๋ฃจํ ๋ด๋ถ ์ต์ํ
# ๋นํจ์จ์ ๋ฐฉ๋ฒ
start = time.time()
result = []
for i in range(1000000):
# ๋ฃจํ ๋ด๋ถ์์ ๊ณ์ฐ์ด ๋ฐ๋ณต๋จ
result.append(i ** 2 + 2 * i + 1)
print(f"์๊ฐ: {time.time() - start:.4f}์ด")
# ์ต์ ํ ๋ฐฉ๋ฒ
start = time.time()
result = [(i ** 2 + 2 * i + 1) for i in range(1000000)]
print(f"์๊ฐ: {time.time() - start:.4f}์ด")
# 2. ๋ถํ์ํ ํจ์ ํธ์ถ ์ค์ด๊ธฐ
# ๋นํจ์จ์ ๋ฐฉ๋ฒ
start = time.time()
data = [1, 2, 3, 4, 5] * 1000000
length = 0
for item in data:
length += len(str(item)) # ๋งค๋ฒ str() ํจ์ ํธ์ถ
print(f"์๊ฐ: {time.time() - start:.4f}์ด")
# ์ต์ ํ ๋ฐฉ๋ฒ
start = time.time()
data = [1, 2, 3, 4, 5] * 1000000
str_data = [str(item) for item in data] # ๋จผ์ ๋ณํ
length = 0
for s in str_data:
length += len(s)
print(f"์๊ฐ: {time.time() - start:.4f}์ด")
# ๋นํจ์จ์ ๋ฐฉ๋ฒ (์ ์ญ ํจ์๋ฅผ ๋ฐ๋ณต ์ฐธ์กฐ)
def process_data(items):
result = []
for item in items:
result.append(len(item))
return result
# ์ต์ ํ ๋ฐฉ๋ฒ (์ง์ญ ๋ณ์์ ํจ์ ๋ฐ์ธ๋ฉ)
def process_data_optimized(items):
result = []
_len = len # ์ง์ญ ๋ณ์์ ํจ์ ๋ฐ์ธ๋ฉ
_append = result.append
for item in items:
_append(_len(item))
return result
# ๋นํจ์จ์ ๋ฐฉ๋ฒ (๋ฆฌ์คํธ์์ ๊ฒ์)
data = list(range(10000))
count = 0
for i in range(1000):
if i in data: # O(n) ๊ฒ์
count += 1
# ์ต์ ํ ๋ฐฉ๋ฒ (์ธํธ์์ ๊ฒ์)
data_set = set(range(10000)) # O(1) ๊ฒ์
count = 0
for i in range(1000):
if i in data_set:
count += 1
โ ์ต์ ํ ํต์ฌ ์์น:
- ๋ฃจํ ๋ด๋ถ ์ฐ์ฐ ์ต์ํ
- ๋ถ๋ณ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ๊ณ์ฐ
- ์ ์ ํ ์๋ฃ๊ตฌ์กฐ ์ ํ
- ํจ์ ํธ์ถ ์ต์ํ
- ๋ด์ฅ ํจ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
๋ฉํฐ ํ๋ก์ธ์ฑ/์ค๋ ๋ฉ์ ์ด์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด๋ค.
import concurrent.futures
import time
# ์ฒ๋ฆฌํ ์์
def process_item(item):
time.sleep(0.1) # ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์
์๋ฎฌ๋ ์ด์
return item * item
# ๊ธฐ๋ณธ์ ์ธ for ๋ฐ๋ณต๋ฌธ
def sequential_process():
start = time.time()
items = list(range(100))
results = []
for item in items:
results.append(process_item(item))
print(f"์์ฐจ ์ฒ๋ฆฌ ์๊ฐ: {time.time() - start:.2f}์ด")
return results
# ThreadPoolExecutor๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ
def parallel_process_threads():
start = time.time()
items = list(range(100))
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
results = list(executor.map(process_item, items))
print(f"์ค๋ ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๊ฐ: {time.time() - start:.2f}์ด")
return results
# ProcessPoolExecutor๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ
def parallel_process_processes():
start = time.time()
items = list(range(100))
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_item, items))
print(f"ํ๋ก์ธ์ค ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๊ฐ: {time.time() - start:.2f}์ด")
return results
# ๋น๊ต ์คํ
sequential_results = sequential_process() # ์ฝ 10์ด
thread_results = parallel_process_threads() # CPU ๋ฐ์ด๋๊ฐ ์๋๋ฉด ๋ ๋น ๋ฆ
process_results = parallel_process_processes() # CPU ๋ฐ์ด๋ ์์
์ ์ ํฉ
โ ๋ณ๋ ฌ ์ฒ๋ฆฌ ํน์ง:
- CPU ๋ฐ์ด๋ ์์ : ProcessPoolExecutor ์ฌ์ฉ
- I/O ๋ฐ์ด๋ ์์ : ThreadPoolExecutor ์ฌ์ฉ
- GIL(Global Interpreter Lock)๋ก ์ธํ ์ ์ฝ ๊ณ ๋ ค
- ์์ ๋์ ๋ฐ๋ฅธ ์ ์ ํ ์์ปค ์ ์ค์
- ์ค๋ฒํค๋์ ์ฑ๋ฅ ์ด์ ๊ท ํ ๊ณ ๋ ค
์ค์ ์์ ์ ์ฉํ ๋ค์ํ for ๋ฃจํ ํจํด๊ณผ ๊ธฐ๋ฒ์ด๋ค.
def process_in_chunks(items, chunk_size=100):
"""๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌ"""
for i in range(0, len(items), chunk_size):
chunk = items[i:i + chunk_size]
# ์ฒญํฌ ๋จ์ ์ฒ๋ฆฌ
process_chunk(chunk)
print(f"์ฒญํฌ {i//chunk_size + 1} ์ฒ๋ฆฌ ์๋ฃ ({len(chunk)} ํญ๋ชฉ)")
def find_first_match(items, condition):
"""์กฐ๊ฑด์ ๋ง๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ ์ฐพ๊ธฐ"""
for item in items:
if condition(item):
return item
return None
# ์ฌ์ฉ ์์
first_even = find_first_match(range(1, 100), lambda x: x % 2 == 0 and x > 10)
def sliding_window(items, window_size):
"""์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํจํด์ผ๋ก ํญ๋ชฉ ์ฒ๋ฆฌ"""
for i in range(len(items) - window_size + 1):
yield items[i:i + window_size]
# ์ฌ์ฉ ์์
text = "ABCDEFGHIJ"
for window in sliding_window(text, 3):
print(window) # "ABC", "BCD", "CDE", ...
def track_state_changes(items):
"""ํญ๋ชฉ ์ํ ๋ณํ ์ถ์ """
if not items:
return []
changes = []
previous = items[0]
for current in items[1:]:
if current != previous:
changes.append((previous, current))
previous = current
return changes
# ์ฌ์ฉ ์์
temps = [22, 22, 23, 23, 23, 24, 25, 25, 24, 24]
print(track_state_changes(temps)) # [(22, 23), (23, 24), (24, 25), (25, 24)]
# ๋นํจ์จ์ ์ธ ์ค์ฒฉ ๋ฃจํ
def find_pairs_naive(items1, items2, target_sum):
"""ํฉ์ด target_sum์ธ ๋ ๋ฆฌ์คํธ์ ํญ๋ชฉ ์ ์ฐพ๊ธฐ (O(nยฒ))"""
pairs = []
for x in items1:
for y in items2:
if x + y == target_sum:
pairs.append((x, y))
return pairs
# ์ต์ ํ๋ ๋ฐฉ๋ฒ
def find_pairs_optimized(items1, items2, target_sum):
"""ํฉ์ด target_sum์ธ ๋ ๋ฆฌ์คํธ์ ํญ๋ชฉ ์ ์ฐพ๊ธฐ (O(n))"""
complements = set(target_sum - x for x in items1)
return [(target_sum - y, y) for y in items2 if y in complements]
โ ์ค์ฉ ํจํด ์ฅ์ :
- ๋์ฉ๋ ๋ฐ์ดํฐ ํจ์จ์ ์ฒ๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ต์ ํ
- ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์
- ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจํด ํ์คํ
- ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋ ๊ฐ์