๐ ํด๋น ํฌ์คํ ์ ์ธํ๋ฐ์ ํ์ด์ฌ ์ค๊ธ ๊ฐ์๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ณต์ต์ฐจ์์ผ๋ก ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค. ํด๋น ๋ด์ฉ์ ์ฃผ๋ก ๋ณธ์ธ์ ๋ณต์ต์ฉ์ด๋ผ์ ์์ธํ ์ค๋ช ์ ์๋ ์ ์ํด ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋ณธ ์ฝ๋๋ ์ฌ๊ธฐ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์ ํ์ด์ฌ์ ์ํ์ค ์๋ฃ๊ตฌ์กฐ์ ๋ํด์ ์์๋ณด๊ณ ์ด์ ๋ํด ์ค์ต๋ ํด๋ณด์. ์ฐ์ ํ์ด์ฌ ๋ฐ์ดํฐ ํ์ก์ ๋ํด ์ธ๋ถ์ ์ผ๋ก ๋ถ๋ฅํด๋ณด์.
- 1๋ฒ์งธ ๊ธฐ์ค : ์๋ฃ ๊ตฌ์ฑ ํํ
- ์ปจํ ์ด๋ - ์๋ก ๋ค๋ฅธ ์๋ฃํ ๊ตฌ์ฑ ๊ฐ๋ฅ : ๋ฆฌ์คํธ, ํํ, collections์ deque
- ํ๋ซํ(Flat) - ํ ๊ฐ์ ์๋ฃํ์ผ๋ก ๊ตฌ์ฑ : ๋ฌธ์์ด(str), bytes, bytes array, array, memoryview
- 2๋ฒ์งธ ๊ธฐ์ค : ์๋ฃ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ
- ๊ฐ๋ณํ ์๋ฃ๊ตฌ์กฐ : ๋ฆฌ์คํธ, bytes array, array, memoryview, deque
- ๋ถ๋ณํ ์๋ฃ๊ตฌ์กฐ : ํํ, ๋ฌธ์์ด(str), bytes
# ord(string)์ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ๋ฒํธ๋ฅผ ๋ฐํํด์ค
# 1.์ผ๋ฐ list append
chars = '!@$##%$^%$^&'
code_lst1 = []
for c in chars:
code_lst1.append(ord(c))
print("์ผ๋ฐ list append: ", code_lst1)
# List comprehension => ๋ฐ์ดํฐ ์์ด ์ปค์ง๋ฉด์ ์ด๋ฐ ๋ฐฉ๋ฒ์ด ๋ ์๋๊ฐ ์ฐ์ธํ๋ค๊ณ ํจ!
code_lst2 = [ord(c) for c in chars]
print("list comprehension: ", code_lst2)
print('-'*50)
- list comprehension ์ด ์ผ๋ฐ for ๋ฌธ์ ์ฌ์ฉํ ๊ฒ๋ณด๋ค ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์๋๊ฐ ๋ ์ฐ์ธ
๋ค์์ iterator ๊ฐ์ฒด๋ฅผ ๋ง๋๋ map, filter ํจ์๋ฅผ ์์๋ณด์.
# Map, Filter๋ iterator๋ฅผ ๋ง๋ฆ!
# filter ํจ์๋ filter(ํจ์, iterableํ ๊ฐ์ฒด) => iterator๊ฐ ๊ฒฐ๊ณผ๊ธฐ ๋๋ฌธ์ next()๋ฅผ ์ด์ฉํด ์ถ๋ ฅ ๊ฐ๋ฅ
filter_ = filter(lambda x: x > 40, [ord(c) for c in chars])
print("filter์ list๊ฐ์ธ์ค ํ :", list(filter_))
# list๋ก ๊ฐ์ธ์ listํํ๋ก ๋ง๋ค์ด์ฃผ์
# map ํจ์
map_ = map(ord, chars)
print([ord(c) for c in chars])
print('์ฒซ๋ฒ์งธ ์์:', next(map_))
print('๋๋ฒ์งธ ์์:', next(map_))
print('์ธ๋ฒ์งธ ์์:', next(map_))
# list comprehension VS Map + Filter
code_lst3 = [ord(c) for c in chars if ord(c) > 40]
code_lst4 = list(filter(lambda x: x > 40, map(ord, chars)))
print("list comprehension: ", code_lst3)
print("Map + Filiter: ", code_lst4)
print('-'*50)
- filter(ํจ์, iterativeํ ๊ฐ์ฒด) ๋ฅผ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉฐ ํด๋น ํจ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ค์ ๋ฐํํ๋ ค๋ฉด next() ๋ฉ์๋๋ก ํ๋์ฉ ๋ฐํํ๊ฑฐ๋ list()๋ก ๊ฐ์ธ์ฃผ์ด list ๊ฐ์ฒด๋ก ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด ์์
- map(ํจ์, iterativeํ ๊ฐ์ฒด) ๋ฅผ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉฐ list๋ก ๊ฐ์ธ์ฃผ์ด ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด ๊ฒ๋ค์ ์ถ๋ ฅํ ์ ์๊ณ next() ๋ฉ์๋๋ก ํ๋์ฉ ์ถ๋ ฅ ๊ฐ๋ฅ
๋ค์์ Generator๋ฅผ ์์ฑํด๋ณด์. ์ ๋ค๋ ์ดํฐ๋ iterator์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ค๋น๋ง ๋ง์ถฐ๋์ ์ํ๋ผ๊ณ ํ ์ ์๋ค. ์ฆ, list comprehension ์ฒ๋ผ ํ ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ next() ๋ฉ์๋๋ฅผ ํ์ฉํด ํ๋์ฉ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๋๋ก ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์
# Generator ์์ฑ -> ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ง์ ์์ฑํ ์ค๋น๋ง ๋ง์ถฐ๋์ ์ํ๋ผ๊ณ ํ ์ ์์!
# ํ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ผ๋ฉด์ ๊ฐ๋ณ์ ์ธ array ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉํด๋ณด๊ธฐ
# Generator๋ list comprehension ํํ์์์ ๋๊ดํธ[] -> ์๊ดํธ()๋ก ๋ฐ๊ฟ!
tuple_g = (ord(c) for c in chars)
print(tuple_g, type(tuple_g))
print([ord(c) for c in chars]) # list comprehension์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋ฒ๋ฆผ..!
print(next(tuple_g))
print(next(tuple_g))
# Generaotr ์ด์ฉํด 4๊ฐ์ ๋ฐ๊ณผ ๊ฐ 20๊ฐ์ ๋ฒํธ๋ฅผ ๊ฐ๋ ์๋ฃ๊ตฌ์กฐ ์์ฑ
students_g = (f"{room}๋ฐ {num}๋ฒ" for room in 'A B C D'.split() for num in range(1, 21))
print(students_g)
for student in students_g:
print(student)
๋ค์์ Tuple์ unpacking ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
# b, a = a, b -> ์ด๊ฒ๋ ์ผ์ข
์ unpacking์!
# *(aster)๋ฅผ ์ด์ฉํด unpacking ๊ฐ๋ฅ
print(divmod(100, 21)) # ๋ชซ๊ณผ ๋๋จธ์ง ์ถ๋ ฅ
print(divmod(*(100, 21))) # tuple (100, 21)์ unpack
print(*(divmod(100, 21))) # divmod๊ฒฐ๊ณผ๊ฐ์ unpack
print()
x, y, *rest = range(10)
print(x, y, rest)
x, y, *rest= range(2) # ๋ถ์กฑํด๋ ๋น ๋ฆฌ์คํธ๋ก ๋ฐํ
print(x, y, rest)
x, y, *rest = 1, 2, 3, 4, 5
print(x, y, rest)
print()
print()
๋ค์์ sorted ์ sort ๋ฉ์๋๋ฅผ ๋น๊ตํด๋ณด์. ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ ๋ ฌํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํ์ํค๋๋ ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ์ ๋ ฌ์ํค๊ณ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํ์ํค์ง ์๋๋์ ์ฐจ์ด์ด๋ค. optional๋ก ๋ค์ด๊ฐ๋ ์ ๋ ฌ ์ธ์๋ ๋์ผํ๋ค.
# sorted VS sort : ๊ณตํต์ธ์๋ก reverse, key=len/str.lower/ํจ์.. ๊ฐ
# 1. sorted : ์ ๋ ฌ ํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํ
v_list = ['bus', 'train', 'airplane', 'underground', 'car']
h_list = ['๋ฒ์ค', '๊ธฐ์ฐจ', '๋นํ๊ธฐ', '์งํ์ฒ ', '์๋์ฐจ']
print('sorted: ', sorted(v_list)) # ๋ํดํธ๋ ์ํ๋ฒณ์ ์ค๋ฆ์ฐจ์์ผ๋ก
print('sorted: ', sorted(h_list)) # ๋ํดํธ๋ ํ๊ธ๋ ์ค๋ฆ์ฐจ์์ผ๋ก
print('sorted1: ', sorted(v_list, reverse=True))
print('sorted1: ', sorted(h_list, reverse=True))
print('sorted2: ', sorted(v_list, key=len))
print('sorted2: ', sorted(h_list, key=len))
print('sorted3: ', sorted(v_list, key=lambda x: x[-1],
reverse=True)) # ๋ฌธ์์ด ๋ง์ง๋ง ๊ธ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
print('sorted3: ', sorted(h_list, key=lambda x: x[-1],
reverse=True))
print()
# 2. sort : ์ ๋ ฌํ ํ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝ์ํด(์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๋ถ์ฌํ์ง ์๊ณ ๊ธฐ์กด ๊ฒ ์ฌ์ฉ)
print('sort1: ', v_list.sort(), v_list) # sort() ๊ธฐ์กด์ ๊ฒ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ None์ ์ถ๋ ฅํจ
print('sort2: ', v_list.sort(reverse=True), v_list)
print('sort3: ', v_list.sort(key=len), v_list)
print('sort4: ', v_list.sort(key=lambda x: x[-1]), v_list)
๋ค์์ Hash table์ ๋ํ ๋ด์ฉ์ด๋ค. ํ์ด์ฌ์์๋ Dictionary ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ก ์ธํด ํธ๋ฆฌํ๊ฒ Hash table๋ฅผ ๊ตฌํํ ์ ์๋ค. ์ฌ๊ธฐ์ Hash ๊ฐ์ด๋, ๋ฐ์ดํฐ์ uniqueํ key๊ฐ์ ์๋ฏธํ๋ฉฐ hash() ๋ฉ์๋๋ฅผ ํ์ฉํด ์ถ๋ ฅํ ์ ์๋ค. ํ์ง๋ง ์๋ฃ๊ตฌ์กฐ์ ๊ฐ๋ณ์ฑ ์ฌ๋ถ์ ๋ฐ๋ผ hash() ๊ฐ์ด ์ถ์ถ์ด ๋ ์ ์๊ณ ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ถ๋ณ ๊ตฌ์กฐ์ธ ํํ์ hash ๊ฐ์ ๋ฝ์๋ผ ์ ์์ง๋ง ๊ฐ๋ณ ๊ตฌ์กฐ์ธ ๋ฆฌ์คํธ๋ ๋ฝ์๋ผ ์ ์๋ค.
# Hash ๊ฐ(uniqueํ ๊ฐ) ๋ฝ์๋ด๊ธฐ -> hash() ๋ฉ์๋ ์ฌ์ฉ!
t1 = (10, 20, (30, 40, 50)) # tuple is immutable
t2 = (10, 20, [30, 40, 50]) # list is mutable
print('t1์ hash: ', hash(t1))
# print('t2์ hash: ', hash(t2)) -> list๋ mutableํด์ ์ธ์ ๋ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฐ์ดํฐ๊ฐ ๊ณ ์ ์ ๊ฐ์ ๊ฐ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฐ์
๋ค์์ ์ค๋ณต๋ key๋ฅผ ๊ฐ๋ ๋ฐ์ดํฐ์์ ํํ๋ก ์ฃผ์ด์ก์ ๋ ์ด๋ป๊ฒ ํธ๋ฆฌํ๊ฒ Dictionary๋ก ๋ฐ๊ฟ ์ ์๋์ง ์ดํด๋ณด์. ๋ฌผ๋ก ์ผ๋ฐ์ ์ธ for๋ฌธ์ ํตํด ๋ณํ์ด ๊ฐ๋ฅํ์ง๋ง setdefault ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ๋ ๊ฐ๋จํ ์ฝ๋๋ก ๋ณํ์ด ๊ฐ๋ฅํ๋ค. ์ฐธ๊ณ ๋ก ํํ์ ์ค๋ณต๋ ๊ฐ์ด ์กด์ฌํ ๋,Dict comprehension์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ถ์ ์ ํ๋ค. ์๋ํ๋ฉด Dict comprehension์ ์ค๋ณต๋ key์ ๋ง์ง๋ง ๊ฐ๋ค๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
# Dict์ setdefault ์์ for tuple to dictionary
source = (('k1', 'value1'),
('k1', 'value2'),
('k2', 'value3'),
('k2', 'value4'),
('k2', 'value5'))
new_dict1 = {}
new_dict2 = {}
# setdefault๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ด์ฉํด Dictionary๋ก ์ ํ!
for k, v in source:
if k in new_dict1:
new_dict1[k].append(v)
else:
new_dict1[k] = [v]
print("์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ ์ด์ฉ:", new_dict1)
# setdefault๋ฅผ ์ด์ฉํด ์๋์ ์ผ๋ก ์ค๋ณต๋๋ key๊ฐ ์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ
for k, v in source:
new_dict2.setdefault(k, []).append(v)
print("setdefault ๋ฐฉ๋ฒ ์ด์ฉ:", new_dict2)
# Dictionary comprehension์ ์ด์ฉํ๊ฒ ๋๋ฉด ์ค๋ณต๋๋ ๊ฐ๋ค ์ค ๋ง์ง๋ง ๊ฐ๋ค๋ง ์ฒ๋ฆฌ๋จ
new_dict3 = {k: v for k, v in source}
print("Dict comprehension ์ด์ฉ:", new_dict3)
๋ค์์ ๋์ ๋๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก mutableํ ๊ตฌ์กฐ์ด์ง๋ง immutable ํ ์๋ฃ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. MappingProxyType ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๋ณํํ ์ ์๋ค.
# ์๋ Dict๋ mutable ํ์ง๋ง Immutableํ Dict๋ก ๋ง๋ค ์ ์์!
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ
from types import MappingProxyType
d = {'key1': 'value1'}
d_frozen = MappingProxyType(d)
print("d์ d_frozen์ ํํ๋ ๋์ผํ๊ฐ?", d == d_frozen)
print("d์ d_frozen์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ๋ ๋์ผํ๊ฐ?", d is d_frozen)
print()
# ์ผ๋ฐ dict ์์ ํ๊ธฐ
d['key2'] = 'value2'
print("์์ ํ d :", d)
# Immutable dict ์์ ํด๋ณด๊ธฐ
# d_frozen['key1'] = 'value2' => error ๋ฐ์
๋ง์ง๋ง์ผ๋ก ์งํฉํ ์๋ฃ๊ตฌ์กฐ์ธ set์ ์ ์ธํ๋ ๋ฐฉ๋ฒ๊ณผ set comprehension์ ๋ํด ์์๋ณด์.
# Set ์ ์ธํ๊ธฐ
s1 = {'apple', 'banana', 'kiwi', 'apple', 'banana'}
s2 = set(['apple', 'banana', 'kiwi', 'apple', 'banana'])
s3 = {'orange'}
s4 = set() # {}๋ก ์ ์ธํ๋ฉด set์ด ์๋ empty dict๋ก ์ ์๋จ!
# set์ ๋ฐ์ดํฐ ์ฒจ๊ฐ
s1.add('orange')
s2.add('watermelon')
s2.update(['pear', 'grapes']) # ์ฌ๋ฌ๊ฐ ์ฒจ๊ฐํ ๋ update!
s2.remove('kiwi') # ์ญ์ ํ ๋ ์ญ์ ํ ๋ฐ์ดํฐ ์ธ์๋ก ๋ฃ๊ธฐ
print(s1)
print(s2)
print(s3)
print(s4)
# Comprehension set => list comprehension๊ณผ ๋น์ท
result = {i for i in range(10)}
print(result, type(result))
print()
๋ฒ์ธ๋ก, ํ์ด์ฌ์ bytes ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ด๋ถ์ ์ผ๋ก ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ํํด์ ์ฝ๋๋ฅผ runํ๋๋ฐ, ์ด ๋ด๋ถ์ ์ผ๋ก ๋์๊ฐ๋ ๊ณผ์ ์ ๋ช ๋จ๊ณ๋ก ๊ฑฐ์ณ์ง๋์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ด์ฐฐํ ์ ์๋ค. ๊ทธ๋ผ์ผ๋ก์จ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ธํ ๋ ์ต์ ํํ ์ ์๊ฒ ๋๋ค. ๊ฐ๋จํ๊ฒ ์์๊ฐ ํ๋์ธ set ์งํฉ ์๋ฃ๊ตฌ์กฐ๋ฅผ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ์ธํ์ ๋, ์ ์ธ๋๋ ๋ด๋ถ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์.
# ์๋ฃ๊ตฌ์กฐ ์ ์ธ์ ์ต์ ํ ํ๊ธฐ
# ์ด๋ค ๋ฐฉ๋ฒ์ด ์ต์ ํ ๋ฐฉ๋ฒ์ธ์ง ์๊ธฐ ์ํ dis ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
from dis import dis
# dis ๋ฉ์๋์์ ๋ฌธ์์ด ์ฒ๋ผ ๋ฐ์ดํ ์์ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ!
print('-'*40)
print("์ ์ธ ๋ฐฉ๋ฒ: 1", dis('{10}'))
print('-'*40)
print("์ ์ธ ๋ฐฉ๋ฒ: 2", dis('set([10])'))
์ ๊ฒฐ๊ณผํ๋ฉด์ ๋ณด๋ฉด ๋จ์ํ {}๋ฅผ ์ด์ฉํด ์ ์ธํ๋ ๊ฒ๋ณด๋ค set() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ธํ๋ ๊ฒ์ด ๋ด๋ถ์ ์ผ๋ก ๋ ๋ง์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นจ์ ์ ์ ์๋ค. ๋ฐ๋ผ์ 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์ข ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
'Python > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ํด๋์ค ์์ ์ super() ์ ์ฐ์ (0) | 2021.08.25 |
---|---|
[Python ์ค๊ธ] ์ผ๊ธํจ์(First-class)์ ํด๋ก์ , ๋ฐ์ฝ๋ ์ดํฐ (0) | 2020.12.27 |
[Python ์ค๊ธ] Magic method์ named tuple (0) | 2020.12.22 |
[Python ์ค๊ธ] Class์ Method ์ฌํ (0) | 2020.12.20 |
[Python] ํจํค์ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ชจ๋... ๋ ์ง์ง ์์? (0) | 2020.01.07 |