ํ์ด์ฌ์ ํธ๋ฆฌํ ๊ธฐ๋ฅ๋ค์ ์๊ฐํด๋ณผ๊นํ๋ค.
๋ฌผ๋ก ๊ฐ์ธ ๋ฉ๋ชจ๊ฒธ ์ ๋๊ฒ์ด๋ฏ๋ก ๊ทธ๋ฅ ์ ์ฉํ์ง ์์์๋ ์๋ค.
๋ฌธ์ ํ๋ค๊ฐ ๋ฐ๊ฒฌ
def is_correct(s):
stack = []
for char in s:
if char == "(":
stack.append(char)
else:
if not stack:
return False
stack.pop()
return not stack
return not stack: ์กฐ๊ฑด๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ boolean์ผ๋ก ๋ฐํํด์ค๋ค. stack์ด ๋น์ด์๋ค๋ฉด(not stack) True, ๋น์ด์์ง ์๋ค๋ฉด False๋ฅผ ๋ฐํํ๋ค.
์ค... ์ญ์ ํ์ดํค!
์๋๋ถํฐ๋ ์์ฃผ ์ฐ์ด๋ or ํธ๋ฆฌํ ๊ธฐ๋ฅ๋ค์ด๋ค.
(๋ ธ๋์ ํ์ ๋ ๊ธฐ๋ฅ๋ค์ ๋ด๊ฐ ์์ฃผ ์ฐ๋ ๊ธฐ๋ฅ์ด๋ค.)
1. ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ (List Comprehensions)
# ๊ธฐ๋ณธ์ ์ธ for-loop์ ์ฌ์ฉํ์ฌ ์ง์๋ง ๋ด์ ๋ฆฌ์คํธ ์์ฑ
evens = []
for i in range(10):
if i % 2 == 0:
evens.append(i)
# ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
์ ์ฌ์ฉํ ๋ฐฉ์
evens = [i for i in range(10) if i % 2 == 0]
2. ์ธํจํน(Unpacking)
a, b = 1, 2
print(a) # 1
print(b) # 2
# ํจ์์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๊ณ ์ธํจํนํ๊ธฐ
def get_values():
return 1, 2, 3
x, y, z = get_values()
์ธํจํน๊ฐ์ ๊ฒฝ์ฐ ๋ฆฌ์คํธ์์ ๊ทธ ์ง๊ฐ๋ฅผ ๋ฐํํ๋ค.
lst = [1, 2, 3, 4]
print(*lst) # 1 2 3 4
print(lst) # [1, 2, 3, 4]
3. with๋ฌธ ์ฌ์ฉํ๊ธฐ
ํ์ผ์ ๋ค๋ฃฐ ๋ with๋ฌธ์ ์ฌ์ฉํ๋ฉด ํ์ผ์ ์๋์ผ๋ก ๋ซ์์ฃผ๋ฏ๋ก ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
with open("file.txt", "r") as file:
contents = file.read()
4. ์ ๋๋ ์ดํฐ ํํ์(Generator Expressions)
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ค.
# ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
squares = [i**2 for i in range(1000000)]
# ์ ๋๋ ์ดํฐ ํํ์
squares = (i**2 for i in range(1000000))
๊ต์ฅํ ์์ฃผ์ฐ์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํธ๋ฆฌํ๋ฉฐ ๊ฐ๊ฒฐํ๋ค.
5. enumerate ํจ์
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
print(index, fruit)
6. zip ํจ์
์ฌ๋ฌ ๋ฆฌ์คํธ๋ฅผ ๋์์ ์ํํ ๋ ์ฌ์ฉ.
names = ["John", "Jane", "Doe"]
ages = [23, 34, 45]
for name, age in zip(names, ages):
print(f"{name} is {age} years old.")
7. F-String
Python 3.6๋ฒ์ ๋ถํฐ ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฌธ์์ด ๋ด์์ ์ง์ ์ฐธ์กฐํ๊ณ ํฌ๋งทํ ์ ์์ผ๋ฉฐ ๊ฐ๋ ์ฑ์ด ์ข๋ค.
name = "์ง๋ฏธ์"
age = 4
print(f"{name}์ ๋์ด๋ {age}์ด์
๋๋ค.")
8. ์กฐ๊ฑด๋ถ ์ฐ์ฐ์(Ternary Operators)
aka ์ผํญ์ฐ์ฐ์
condition = True
print("์ฐธ์
๋๋ค" if condition else "๊ฑฐ์ง์
๋๋ค")
9. ํจ์ ์ธ์์ ๋ํ ๊ธฐ๋ณธ๊ฐ ์ค์
ํจ์ ํธ์ถ ์ ์ธ์๋ฅผ ์๋ตํ ์ ์๋ค.
def greet(name="๋๊ตฐ๊ฐ"):
print(f"์๋
, {name}!")
greet()
greet("์ง๋ฏธ์")
10. *args์ **kwargs ์ฌ์ฉ
ํจ์๊ฐ ๊ฐ๋ณ์ ์ธ ์์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ฌ์ฉํ๋ค.
def print_args(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
print_args("ํ๋", "๋", key1="๊ฐ1", key2="๊ฐ2")
11. Walrus Operator(:=)
'๋ฐ๋ค์ฝ๋ผ๋ฆฌ ๋ฌธ๋ฒ'์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. 3.8๋ฒ์ ๋ถํฐ ๋์
๋ ๋ฌธ๋ฒ์ธ๋ฐ, ์ฌ์ค ๋๋ ์ ์์ด๋ค^^;
์ด๋ฐ์ ์ ๊ธฐํด์ ๋ช ๋ฒ ์จ๋ดค๋ ๋ฌธ๋ฒ.
# Walrus Operator ๋ฏธ์ฌ์ฉ
n = len(my_list)
if n > 10:
print(f"๋ฆฌ์คํธ๊ฐ ๋๋ฌด ๊น๋๋ค (๊ธธ์ด: {n})")
# Walrus Operator ์ฌ์ฉ
if (n := len(my_list)) > 10:
print(f"๋ฆฌ์คํธ๊ฐ ๋๋ฌด ๊น๋๋ค (๊ธธ์ด: {n})")
12. Iterables๋ฅผ ์ด์ฉํ ๋์ ์ธํจํน
๋ฆฌ์คํธ๋ ํํ ๊ฐ์ '์ํ ๊ฐ๋ฅํ ์๋ฃํ'์ ํจ์ ์ธ์๋ก ๋๊ธธ๋ ์ฌ์ฉํ๋ค.
์์ ์ธํจํน ํํธ์์ ์ ๊น ์ผ๋ ๋ด์ฉ์ด๋ค. ์ธํจํน์ ๊ฝ!
numbers = [1, 2, 3]
print(*numbers)
์์๋ง ๊น๋ํ๊ฒ 1 2 3์ผ๋ก ์ถ๋ ฅ๋๋ค.
13. any ์ all
๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด ๋ด์ ์์๋ค์ด ํ๋๋ผ๋ ์ฐธ์ธ์ง(OR), ๋๋ ๋ชจ๋ ์ฐธ์ธ์ง(AND) ๊ฐ๋จํ๊ฒ ํ์ธํ ์ ์๋ค.
# any: ํ๋๋ผ๋ ์ฐธ์ด๋ฉด True
numbers = [0, 1, 2, 3]
print(any(numbers)) # ์ถ๋ ฅ: True
# all: ๋ชจ๋ ์ฐธ์ด์ด์ผ True
print(all(numbers)) # ์ถ๋ ฅ: False
14. set ์ ์ด์ฉํ ์ค๋ณต ์ ๊ฑฐ
๋ฆฌ์คํธ์์ ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํ ๋ ์ฌ์ฉํ๋ค.
๋ฆฌ์คํธ์ ๊ฐ ์์๊ฐ ๋ช๋ฒ์ฉ ์ค๋ณต๋๋์ง ๊ณ์ฐํ ๋ ์ ์ฉํ๋ค.
๋จ, set์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ผ๋ฏ๋ก ์ฃผ์ํ์.
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # ์ถ๋ ฅ: [1, 2, 3, 4, 5]
15. dict.get() ๋ฉ์๋
๋ด๊ฐ ๋ฐ๋ก ์์ฑ๊น์ง ํ๋ ๋
์์ด๋คใ
ใ
์์ฃผ ํธ๋ฆฌํ๋ค. setdefault()๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ฐธ๊ณ ํ์. (๋์ ์ฐจ์ด์ ์ get์ ๋์
๋๋ฆฌ ๋ฐ์ X, setdefault๋ ๋ฐ์ O)
my_dict = {"key1": "value1"}
# get() ๋ฉ์๋ ์ฌ์ฉ
value1 = my_dict.get("key1") # "value1"
value2 = my_dict.get("key2", 'default_value') # "default_value"
print(my_dict) # {"key1": "value1"}
# setdefault() ๋ฉ์๋ ์ฌ์ฉ
value1 = my_dict.setdefault("key1", "default_value") # "value1"
value2 = my_dict.setdefault("key2", "default_value") # "default_value"
print(my_dict) # {"key1": "value1", "key2": "default_value"}
16. collections.defaultdict
๋์ ๋๋ฆฌ๋ฅผ ์ด๊ธฐํํ ๋, ๊ธฐ๋ณธ๊ฐ์ ์๋์ผ๋ก ์ค์ ํด์ค๋ค.
from collections import defaultdict
dd = defaultdict(int)
dd["a"] += 1
print(dd) # ์ถ๋ ฅ: defaultdict(<class "int">, {"a": 1})
17. itertools ๋ชจ๋ ํ์ฉ
๋ฐ๋ณต ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ํจ์๋ค์ ์ ๊ณตํ๋ค.
import itertools
# product: ๋ฐ์นด๋ฅดํธ ๊ณฑ
print(list(itertools.product([1, 2], ["a", "b"]))) # ์ถ๋ ฅ: [(1, "a"), (1, "b"), (2, "a"), (2, "b")]
# permutations: ์์ด
print(list(itertools.permutations([1, 2, 3]))) # ์ถ๋ ฅ: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
18. functools.lru_cache ๋ฐ์ฝ๋ ์ดํฐ
ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. (์จ๋ณธ์ ์๋ค ์ฌ์ค)
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(50)) # ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
19. ์ปจํ ์คํธ ๋งค๋์ ๋ง๋ค๊ธฐ
์ง์ ์ปจํ
์คํธ ๋งค๋์ ๋ฅผ ๋ง๋ค์ด์ ์์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค. with๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค.
from contextlib import contextmanager
@contextmanager
def my_context():
print("Entering")
yield
print("Exiting")
with my_context():
print("Inside")