1. Data: Type, Value, Variable, Name
๊ฐ. ํ์ด์ฌ ๋ฐ์ดํฐ์ ์ ์ฒด
1) Data is Object
โข
๊ธฐ๋ณธ ๋ด์ฅ ๋ฐ์ดํฐ๋ Object๋ก Wrapping๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋จ
โ ๊ธฐ๋ณธ ๋ด์ฅ ๋ฐ์ดํฐ๋ ์ ์, ๋ฌธ์์ด, ํจ์ ๋ฑ์ด ํด๋น๋จ
โ Object๋ ์์ฑ(attribute)๊ณผ ๋ฉ์๋(method)๋ก ๊ตฌ์ฑ๋์ด ์๋ ์ปค์คํ
์๋ฃ๊ตฌ์กฐ
โข
๊ธฐ๋ณธ ๋ด์ฅ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธฐ๋ Object๋ ๋ค์์ ๋ค ๊ฐ์ง ์์ฑ์ ํฌํจํจ
โ ํ์
: ๋ฐ์ดํฐ์ ์ฌ์ฉ๋ฐ๊ฒฝ ์ ํ
โ ID: ๊ฐ์ฒด์ ์ ์ผ์ฑ ํํ
โ ๊ฐ: ๋ด์ฉ๋ฌผ
โ ์ฐธ์กฐํ์: ๋ณ์๋ฅผ ํตํด ํน์ ๊ฐ์ฒด๊ฐ ์ง์ ๋ ํ์
2) Type
โข
๊ฐ๋ณ์ฑ(Mutable)
โ ๊ฐ๋ณ์ฑ์ด ์๋ ํ์
์ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ๋ด ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํจ
โ ํ์ด์ฌ ๋ด์ฅ ๋ฐ์ดํฐ ์ค ๊ฐ๋ณ์ฑ ํ์
์ ๋ฐ์ดํฐ๋ ๋ฆฌ์คํธ, ๋์
๋๋ฆฌ, ๋ฐ์ดํธ ๋ฐฐ์ด, ์
์ผ๋ก ํ์ ๋จ
โข
Strong Type Language
โ ๊ฐ๋ณ ๋ฐ์ดํฐ ํ์
์ ๊ฒฝ์ฐ์๋ ํ์
๋ณ๊ฒฝ์ ๋ถ๊ฐ๋ฅ
3) Name
โข
๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๋ ๊ฒ == ๋ณ์์ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ
โ ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํจ์ผ๋ก์จ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ์ด๋ฆ์ ์์ฑํ๋ ๊ฒ
โ ๋ณ์ ํ ๋น์ ๋ฐ์ดํฐ ๋ด ๊ฐ์ ๋ณ์์ ๋ณต์ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์๋๋ค
โ ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๋ฉด ๋ฐ์ดํฐ ๋ด ์ฐธ์กฐํ์๊ฐ ์ฆ๊ฐํ๋ค
โข
(์์) ๋ณ์ ํ ๋น ํ๋ก์ธ์ค
โ ์ต๋ช
์ ์ ๊ฐ์ฒด ์์ฑ(๊ฐ์ 5)
โ ๋ณ์ y๊ฐ ์ต๋ช
์ ์ ๊ฐ์ฒด ์ฐธ์กฐ
โ ์ ์ ๊ฐ์ฒด ๋ด ์ฐธ์กฐํ์ ์ฆ๊ฐ
โ ์ต๋ช
์ ์ ๊ฐ์ฒด ์์ฑ(๊ฐ์ 12)
โ ๊ฐ์ด 12์ธ ์ต๋ช
์ ์ ๊ฐ์ฒด์ ๊ฐ๊ณผ y๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ๊ฐ์ฒด์ ๊ฐ์ ๋บ
โ ๊ฐ 7์ ์ต๋ช
์ ์ ๊ฐ์ฒด์ ํ ๋น๋จ
โ ๋ณ์ x๊ฐ ์ต๋ช
์ ์ ๊ฐ์ฒด ์ฐธ์กฐ(๊ฐ 7)
โ ๊ฐ์ด 7์ธ ๊ฐ์ฒด์ ์ฐธ์กฐํ์ ์ฆ๊ฐ
โ x๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ๊ฐ์ฒด์ ๊ฐ ์ถ๋ ฅ
# introducing python 2.7 chapter ์์
>>> y = 5
>>> x = 12 - y
>>> x
7
Python
๋ณต์ฌ
4) ๊ฐ๋ณ ๋ฐ์ดํฐ์ ์ด๋ฆ ์ฌํ ๋น
โข
๋ถ๋ณ ํ์
์ ๋ฐ์ดํฐ์ ๊ฐ ๋ณ๊ฒฝ์ ์ด๋ฆ์ ์ฌํ ๋นํ๋ ๊ฒ
โ ๋ถ๋ณ ํ์
์ ๋ฐ์ดํฐ์ ์ด๋ฆ์ด ํ ๋น๋ ๊ฒฝ์ฐ, ์ด๋ฆ์ ๋ค๋ฅธ ๊ฐ์ ์ฌํ ๋นํ๋ ๊ฒ์ ์ด์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋
โข
(์์) ์ด๋ฆ ์ฌํ ๋น
โ ๊ฐ์ด 5์ธ ์ ์ ๊ฐ์ฒด ์์ฑ
โ ๋ณ์ x๊ฐ ๊ฐ์ด 5์ธ ์ ์ ๊ฐ์ฒด ์ฐธ์กฐ
โ ๊ฐ์ด 5์ธ ์ ์ ๊ฐ์ฒด์ ์ฐธ์กฐํ์ ์ฆ๊ฐ
โ ๊ฐ์ด 6์ธ ์ ์ ๊ฐ์ฒด ์์ฑ
โ ๋ณ์ x๊ฐ ๊ฐ์ด 6์ธ ์ ์ ๊ฐ์ฒด ์ฐธ์กฐ
โ ๊ฐ์ด 5์ธ ์ ์ ๊ฐ์ฒด์ ์ฐธ์กฐํ์ ๊ฐ์
โ ๊ฐ์ด 6์ธ ์ ์ ๊ฐ์ฒด์ ์ฐธ์กฐํ์ ์ฆ๊ฐ
>>> x = 5
>>> x = 6
Python
๋ณต์ฌ
โข
๊ฐ๋ณ ํ์
์ ๋ฐ์ดํฐ์ ๋ณต์์ ์ด๋ฆ์ ์ง์ ํ๋ค๋ฉด ํ๋์ ์ด๋ฆ์ ํตํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์, ๋ค๋ฅธ ์ด๋ฆ ์ฐธ์กฐ๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ์ ๊ฐ์ ํ์ธํ ์ ์์
โข
(์์) ๊ฐ๋ณ ๋ฐ์ดํฐ ์ด๋ฆ ์ฌํ ๋น
x = [1, 2, 3]
y = x
y[0] = 4
print(x) # [4, 2, 3]
print(y) # [4, 2, 3]
Python
๋ณต์ฌ
๋. ๊ธฐ๋ณธ์ฐ์ฐ
1) bool ๊ฐ๊ณผ ๋
ผ๋ฆฌ์ฐ์ฐ
โข
์ซ์ 0์ ์ ์ธํ ๋ชจ๋ ์ - true
โข
๋น ๋์
๋๋ฆฌ, ๋น ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ ๋ชจ๋ ๋์
๋๋ฆฌ, ๋ฆฌ์คํธ - true
โข
์๋ฌด ๊ฐ๋ ์๋ค๋ ์๋ฏธ์ธ None - false
โข
๋น๋ฌธ์์ด์ ์ ์ธํ ๋ชจ๋ ๋ฌธ์์ด - true
2) is vs ==
โข
is: ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด itself ๋น๊ต
โข
==: ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด ๋ด ๊ฐ ๋น๊ต
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1 == list2:
print("list1๊ณผ list2์ ๊ฐ์ ๊ฐ์ต๋๋ค.")
if list1 is list2:
print("ํ์ง๋ง list1๊ณผ list2๋ ๋ค๋ฅธ ๊ฐ์ฒด์
๋๋ค.")
Python
๋ณต์ฌ
3) for in range vs enumerate
โข
for in range
rainbow=["๋นจ","์ฃผ","๋
ธ","์ด","ํ","๋จ","๋ณด"]
for i in range(len(rainbow)):
color = rainbow[i]
print('{}๋ฒ์งธ ์์ {}'.format(i+1,color))
Python
๋ณต์ฌ
4) enumerate
โข
enumerate: for in range์ len ํ์ฉ ๋ฐ color ๋ณ์ ์ ์ธ์ ์ถ์ฝํ ํํ
rainbow=["๋นจ","์ฃผ","๋
ธ","์ด","ํ","๋จ","๋ณด"]
for i,color in enumerate(rainbow):
print('{}๋ฒ์งธ ์์ {}'.format(i+1,color))
Python
๋ณต์ฌ
3. ์๋ฃํ
๊ฐ. ์๋ฃ๊ตฌ์กฐ๋ณ ์๊ฐ๋ณต์ก๋ ๋ถ์
1) Set
โข
์ ํฉํ ์ฌ์ฉ๋ฒ
โ ๊ฐ๊ฐ์ ๊ตฌ์ฑ์์์ ๋ํ ์กฐํ๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ
โ ์๋ฃ๊ตฌ์กฐ ๋ด ๊ตฌ์ฑ์์๊ฐ ์ ์ผํ ๊ฐ์ผ ๊ฒฝ์ฐ(์ค๋ณต๊ฐ์ด ํ์ฉ๋์ง ์์ ๊ฒฝ์ฐ)
โ ๊ฐ๊ฐ์ ๊ตฌ์ฑ์์์ ๋ํ ํฌํจ์ฌ๋ถ ํ์ธ ๋ฐ ์ฝ์
์ด ํ์ํ ๊ฒฝ์ฐ
โข
ํฌํจ์ฌ๋ถ ํ์ธ
โ in or not in: O(1)
โ Set์ hashable ๊ฐ์ฒด์ด๋ฏ๋ก ํด์ฌ๊ฐ๊ณผ ๋ด๋ถ ๊ตฌ์ฑ์์ ๊ฐ์ lookup table์ด ์์ฑ๋๊ณ , ์ด๋ฅผ ํ์ฉํ์ฌ ํฌํจ์ฌ๋ถ๋ฅผ ์กฐํํ๋ฉด O(1) ๊ฒฐ๊ณผ ๋์ถ
โ ๋จ, Set์ __hash__๊ฐ ์ ์๋์ง ์์์ ๋ชจ๋ ๊ตฌ์ฑ์์์ ํด์ฌ๊ฐ์ด ๋์ผํ๋ค๋ฉด lookup ํ
์ด๋ธ์ ํ์ฉํ ์ ์์ผ๋ฏ๋ก ํฌํจ์ฌ๋ถ์ ์๊ฐ๋ณต์ก๋๋ O(n)์ด ๋ ์ ์๋ค
โข
์ฝ์
์ญ์
โ add, remove: O(1)
2) List
โข
์ ํฉํ ์ฌ์ฉ๋ฒ
โ ๊ฐ ๊ตฌ์ฑ์์์ ๋ํด ์ธ๋ฑ์ค ์กฐํ๊ฐ ํ์ํ ๊ฒฝ์ฐ
โ ์๋ฃ๊ตฌ์กฐ ๋ด ๊ตฌ์ฑ์์๊ฐ ์ค๋ณต๋ ์ ์๋ ๊ฒฝ์ฐ
โข
์ธ๋ฑ์ค ์กฐํ
โ list[x]: O(1)
โข
ํฌํจ์ฌ๋ถ ํ์ธ
โ in or not in: O(n)
โข
์ฝ์
์ญ์
โ insert, delete: O(n)
โ append, pop: O(1)
3) Dict
โข
์ ํฉํ ์ฌ์ฉ๋ฒ
โ ์๋ฃ๊ตฌ์กฐ ๋ด ๊ตฌ์ฑ์์๊ฐ key-value์ ์์ผ๋ก ๊ด๋ฆฌ๋ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ
โ ๊ตฌ์ฑ์์์ ์กฐํ ๋ฐ ๊ฐฑ์ ์์
์ด ํ์ํ ๊ฒฝ์ฐ
โข
์ธ๋ฑ์ค ์กฐํ
โ dict[โkeyโ]: O(1)
โข
ํฌํจ์ฌ๋ถ ํ์ธ
โ in or not in: O(1)
โข
์ฝ์
์ญ์
โ del, store: O(1)
๋. List vs Dictionary
1) ๊ณตํต์
Show All
Search
2) ์ฐจ์ด์
Show All
Search
3) Dictionary์์ None ์ฒ๋ฆฌ
โข
Dictionary์์ Key ๊ฐ์ผ๋ก Value ๊ฒ์ํ๋ ๋ฐฉ๋ฒ
โ dict[โoneโ]: key๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์
โ dict.get(โoneโ): key๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด None ๋ฐํ
4) List comprehension
โข
[ ๊ณ์ฐ์ for๋ฌธ ]
โ [ i*i for i in range(1,11) ]
โข
[ ๊ณ์ฐ์ for๋ฌธ ์กฐ๊ฑด๋ฌธ ]
โย [ i*i for i in range(1,11) if i % 2 == 0 ]
โข
[ ๊ณ์ฐ์ for๋ฌธ for๋ฌธ ]
โย [ ( x, y ) for x in range(15) for y in range(15) ]
5) Dictionary comprehension
โข
{ ํ์ for๋ฌธ }
students = ["ํ์ฐ", "์ง์ฐ", "์ ํ", "ํ๋", "์ฑ์ง"]
# {'2๋ฒ': '์ ํ', '0๋ฒ': 'ํ์ฐ', '1๋ฒ': '์ง์ฐ', '4๋ฒ': '์ฑ์ง', '3๋ฒ': 'ํ๋'}
{"{}๋ฒ".format(number):name for number, name in enumerate(students)}
Python
๋ณต์ฌ
โข
{ํค:๊ฐ for in zip}
students = ["ํ์ฐ", "์ง์ฐ", "์ ํ", "ํ๋", "์ฑ์ง"]
scores = [85, 92, 78, 90, 100]
# {'์ฑ์ง': 100, '์ง์ฐ': 92, 'ํ๋': 90, 'ํ์ฐ': 85, '์ ํ': 78}
result = {x : y for x, y in zip(students, scores)}
Python
๋ณต์ฌ
6) List Slicing
โข
์กฐํ
list1 = list(range(20))
# new_list 5, 8, 11, 14
new_list = list1[5:15:3]
# reverse_list 17, 13, 9, 5
reverse_list = list1[17:4:-4]
Python
๋ณต์ฌ
โข
๊ฐฑ์
list1 = [0, 1, 2, 3, 4, 5]
list1[1:4] = [11, 22, 33] # list1 = [0, 11, 22, 33, 4, 5]
list2 = [0, 1, 2, 3, 4, 5]
del list2[1:4] # list2 = [0, 4, 5]๊ฐ ๋์ด์ผ ํฉ๋๋ค.
Python
๋ณต์ฌ
7) packing, unpacking
โข
packing: ํ๋์ ๋ณ์์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๋ฃ๋ ๊ฒ
โข
unpacking: ํจํน๋ ๋ณ์์์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๊บผ๋ด์ค๋ ๊ฒ
c = (3, 4)
d, e = c # c์ ๊ฐ์ ์ธํจํนํ์ฌ d, e์ ๊ฐ์ ๋ฃ์๋ค
f = d, e # ๋ณ์ d์ e๋ฅผ f์ ํจํน
Python
๋ณต์ฌ
๋ค. ๋ฌธ์์ด
1) ๊ฒ์
โข
String ์ธ๋ฑ์ค ์ ๊ทผ
>>> s = 'abcdef'
>>> s[3]
'd'
Python
๋ณต์ฌ
โข
์ ๋ฐฉ์ผ์น: startwith()
โข
ํ๋ฐฉ์ผ์น: endwith()
โข
๋ถ๋ถ์ผ์น: not in, in
โข
์์ ์ผ์น: ==, !=
โ is์ ๊ฒฝ์ฐ ๊ฐ์ฒด์์ค์ ์ผ์น์ฌ๋ถ ํ์ธ
2) ํน์ ๋ฌธ์ ์ ๊ฑฐ
โข
๋ฌธ์์ด์์ ๋๊ดํธ ์ ๊ฑฐ
โ strip์ ๊ฒฝ์ฐ ์์ชฝ์์ ํ ๋ฒ์ฉ ํด๋น ๋ฌธ์์ด์ ์ ๊ฑฐํ๋ค
target_string = "['pig', 'cow'], ['pig', 'cow']"
refined_string = target_string.strip("[" "]")
print(refined_string) # 'pig', 'cow'], ['pig', 'cow'
Python
๋ณต์ฌ
3) ํน์ ๋ฌธ์ ์นํ
โข
์ค๋ณต ์กด์ฌํ๋ ํน์ ๋ฌธ์๋ฅผ ๋ฌธ์์ด์์ ๋ชจ๋ ์ ๊ฑฐ
target_string = "['pig', 'cow'], ['pig', 'cow']"
refined_string = target_string.replace("[", "")
refined_string = refined_string.replace("]", "")
print(refined_string) # 'pig', 'cow', 'pig', 'cow'
Python
๋ณต์ฌ
4) ํน์ ๋ฌธ์ ๊ธฐ์ค ๋ฌธ์์ด โ ๋ฆฌ์คํธ ๋ณ๊ฒฝ
โข
์ผํ๊ธฐ์ค ๋ฌธ์์ด ๋ด ๋ฌธ์๋ฅผ ์์๋กํ๋ ๋ฆฌ์คํธ ์์ฑ
target_string = "[pig,cow],[pig,cow]"
refined_string = target_string.replace("[", "")
refined_string = refined_string.replace("]", "")
changed_list = refined_string.split(",")
print(changed_list) # ['pig', 'cow', 'pig', 'cow']
Python
๋ณต์ฌ
4. ํจ์
๊ฐ. ๋งค๊ฐ๋ณ์
1) *args
โข
๋งค๊ฐ๋ณ์์ ๊ฐ์๊ฐ ์ ํด์ง์ง ์์์ ๋ ์ฌ์ฉ
โข
ํํ ํํ๋ก ์ ๋ฌ๋จ
def print_param(*args):
print args for p in args:
print p
print_param('a', 'b', 'c', 'd')
#('a', 'b', 'c', 'd')
#a
#b
#c
#d
์ถ์ฒ: https://jhproject.tistory.com/109 [JH PROJECT]
Python
๋ณต์ฌ
2) **kwargs
โข
๋งค๊ฐ๋ณ์ ๋ช
ํจ๊ป ์ ๋ฌ ๊ฐ๋ฅ
โข
๋์
๋๋ฆฌ ํํ๋ก ์ ๋ฌ
def print_param2(**kwargs):
print kwargs
print kwargs.keys()
print kwargs.values()
for name, value in kwargs.items():
print "%s : %s" % (name, value)
print_param2(first = 'a', second = 'b', third = 'c', fourth = 'd')
#{'second': 'b', 'fourth': 'd', 'third': 'c', 'first': 'a'}
#['second', 'fourth', 'third', 'first']
#['b', 'd', 'c', 'a']
#second : b
#fourth : d
#third : c
#first : a
์ถ์ฒ: https://jhproject.tistory.com/109 [JH PROJECT]
Python
๋ณต์ฌ
5. ๊ฐ์ฒด์ ํด๋์ค
๊ฐ. ๊ฐ๋จํ ๊ฐ์ฒด
โข
ํด๋์ค ์์
class Human():
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return "{} (๋ชธ๋ฌด๊ฒ {}kg)".format(self.name, self.weight)
def eat(self):
self.weight += 0.1
print("{}๊ฐ ๋จน์ด์ {}kg์ด ๋์์ต๋๋ค.".format(self.name, self.weight))
def walk(self):
self.weight -= 0.1
print("{}๊ฐ ๊ฑธ์ด์ {}kg์ด ๋์์ต๋๋ค.".format(self.name, self.weight))
person = Human("MJ", 85)
person.walk() # MJ๊ฐ ๊ฑธ์ด์ 84.9kg์ด ๋์์ต๋๋ค.
person.walk() # MJ๊ฐ ๊ฑธ์ด์ 84.80000000000001kg์ด ๋์์ต๋๋ค.
person.eat() # MJ๊ฐ ๋จน์ด์ 84.9kg์ด ๋์์ต๋๋ค.
print(person) # MJ (๋ชธ๋ฌด๊ฒ 84.9kg)
Python
๋ณต์ฌ
1) ์์ฑ
โข
ํด๋์ค์ ์์ฑ์ ์์ฑ๊ฐ๊ณผ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋จ
โข
์์ฑ๊ฐ์ ๋ฐ์ดํฐ์ด๊ณ ๋ฉ์๋๋ ํจ์์
2) ๋ฉ์๋
โข
์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก self๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์ธ์คํด์ค ์์ฒด๋ฅผ ๊ฐ๋ฆฌํด
class Car():
def run(self):
print("{}๊ฐ ๋ฌ๋ฆฝ๋๋ค.".format(self.name))
taxi = Car()
taxi.name = "ํ์"
taxi.run()
Python
๋ณต์ฌ
โข
static method: ํด๋์ค๋ ์ธ์คํด์ค์ ์์ฑ์ ์์กดํ์ง ์๋ ๋ฐ์ดํฐ๋ก ํจ์ ์ ์ํ ๋ ์ฌ์ฉ
โ staticmethod ์ฅ์์๋ฅผ ๋ถ์ฌ์ผ ์ธ์คํด์ค ๊ฐ์ฒด์์ static method ํธ์ถ ๊ฐ๋ฅ
class Human():
def __init__(self, name, weight):
self.name = name
self.weight = weight
@staticmethod
def say_hello():
print("hello")
Python
๋ณต์ฌ
3) ๋งค์ง ๋ฉ์๋
โข
_ _init_ _: ํด๋์ค์ ์ด๊ธฐ๊ฐ ์ค์
โ Java์ toString ๊ฐ๋
โข
_ _str_ _: ํด๋์ค์ ๋ํ default ๋ฌธ์์ด ์ค์
โข
_ _doc_ _: ํด๋์ค ์ ๋ฐ์ ๋ํด ๋ช
์ํ ์ฃผ์์ ํ์ธํ ์ ์์
4) namespace
โข
์ ์: ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ฒ์
โ __dict__ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด์ namespace๋ฅผ ํ์ธํ ์ ์์
โข
ํด๋์ค ๊ฐ์ฒด์ ์ธ์คํด์ค ๊ฐ์ฒด์ ๋ํ namespace ํ์ธ
โข
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ํด ์ธ์คํด์ค ๊ฐ์ฒด์ namespace์๋ ์ธ์คํด์ค ๊ฐ์ฒด์ ์์ฑ๊ฐ๋ง์ ์ ์ํจ
โ ์ธ์คํด์ค ๋ฉ์๋ ๋ฐ ํด๋์ค ์์ฑ์ ๋ชจ๋ ํด๋์ค namespace์ ์ ์๋จ
โ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ์ธ์คํด์ค ๊ฐ์ฒด์ namespace์ ์๋ ๊ฒ์ ํ์ธํ๊ณ , ํด๋์ค ๊ฐ์ฒด์ namesplace๋ฅผ ํ์ธํ์ฌ ์ธ์คํด์ค ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํ์ธํ์ฌ ์คํํ๋ ํ๋ก์ธ์ค์
โ ์์ ๊ฐ์ด ๋์ ์ธ ์คํ์์๋ฅผ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ํ์ด์ฌ์ ๋์ ์ธ ์ธ์ด๋ก ํํํจ
person.__dict__
{'name': 'MJ', 'weight': 84.9}
Human.__dict__
mappingproxy({'__module__': '__main__', '__init__': <function Human.__init__ at 0x1025b10d0>, '__str__': <function Human.__str__ at 0x1025b11f0>, 'eat': <function Human.eat at 0x1025b1310>, 'walk': <function Human.walk at 0x1025b13a0>, '__dict__': <attribute '__dict__' of 'Human' objects>, '__weakref__': <attribute '__weakref__' of 'Human' objects>, '__doc__': None})
Python
๋ณต์ฌ
5) self vs cls
โข
self ๋ณ์๋ ์ธ์คํด์ค ๊ฐ์ฒด ๊ทธ ์์ฒด
โ self์ id๊ฐ๊ณผ ์ธ์คํด์ค์ id๊ฐ์ด ๋์ผ
โข
cls ๋ณ์๋ ํด๋์ค ๊ฐ์ฒด ๊ทธ ์์ฒด
6) composition
โข
์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ์์ ๋ฐ์ง ์๊ณ ์ผ๋ถ ๋ฉ์๋๋ง ์์ ๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ํ์ฉ
class A(object):
def __init__(self, a):
self.a = a
def do_work(self, a):
print(f'{a} do_work')
class C:
def __init__(self, a):
self.a = a
self.A = A(a)
def do_work(self, h):
print(h)
return self.A.do_work(self.a)
c = C("k")
c.do_work("t")
# t
# k do_work
Python
๋ณต์ฌ
7) ์ ๊ทผ์ ์ด์
โข
ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ์ ๊ทผ์ ์ด์๋ public๊ณผ private๋ง ์กด์ฌํจ
โ public: ์์ฑ์ ๋ํ ๋ชจ๋ ์ ๊ทผ์ ํ์ฉ
โ private: ์์ฑ์ด private์ผ๋ก ์ ์๋ class ๋ด๋ถ์์๋ง ์ ๊ทผ ํ์ฉ
โ ํ์ ํด๋์ค์์๋ private์ผ๋ก ์ ์๋ ์์ฑ ์ ๊ทผ ๋ถ๊ฐ
โข
ํ์ด์ฌ ์ปค๋ฎค๋ํฐ์์ ์ธ๋๋ฐ ํ๋๋ฅผ protected ์ ๊ทผ์ ์ด์๋ก ์ฌ์ฉํ์๋ ์ผ๋ถ์ ํฉ์ ์กด์ฌ
โ protected: ์์ฑ์ด protected๋ก ์ ์๋ class๋ฅผ ์์ ๋ฐ์ผ๋ฉด ํ์ ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ง, class ์ธ๋ถ์์๋ ์ ๊ทผ ๋ถ๊ฐ
โ ๋จ, ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ ๊ณต์์ ์ผ๋ก protected๋ฅผ ์ง์ํ์ง ์๊ธฐ๋๋ฌธ์ ์ธ๋๋ฐ ํ๋๋ก ์ ์๋ ์์ฑ์ class ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ
โ ์ปค๋ฎค๋ํฐ ์ผ๋ถ์์๋ ์ธ๋๋ฐ ํ๋๋ฅผ ์์ ๋ณ์๋ก ๋ณด์๋ ํฉ์๋ ์กด์ฌํจ
โข
์ ๊ทผ์ ์ด์ ์์
class A:
def __init__(self, a, b):
self.a = a
self.__b = b
def _test_protected(self, c):
print(f'{self.a}, {c}')
class B(A):
def __init__(self, a, b, d):
super().__init__(a, b)
self._d = d
def __test_private(self):
print(f'{self.a}')
i_a = A(1, 2)
i_b = B(3, 4, 5)
print(i_a.a) # 2
print(i_a._test_protected('hello')) # 1, hello
print(i_b.a) # 3
print(i_b._d) # 5
print(i_b.__test_private('hello')) # AttributeError: 'B' object has no attribute '__test_private'
Python
๋ณต์ฌ
๋. ์์
1) Super()
โข
์์ ๊ฐ์ฒด์์ ๋ถ๋ชจ๊ฐ์ฒด์ ๋ฉ์๋ ์ฌ์ฉ
โข
super์ ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ฉด ํด๋น ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ
โ ์ง์ ํ ์์ ํด๋์ค์ ์์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด AttributeError ๋ฐ์
class A(object):
def do_work(self):
print('A์ do_work')
class B(A):
def do_work(self):
print('B์ do_work')
super(B, self).do_work()
class C(B):
def do_work(self):
print(1)
super(C, self).do_work()
print(2)
super(B, self).do_work()
print(3)
super(A, self).do_work
# C ์ธ์คํด์ค ์์ฑ
c = C()
c.do_work()
-- ๊ฒฐ๊ณผ --
1
B์ do_work
A์ do_work
2
A์ do_work
3
AttributeError: 'super' object has no attribute 'do_work'
Python
๋ณต์ฌ
example code from https://sirzzang.github.io/dev/Dev-python-super/
โข
super์ ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ง ์์ผ๋ฉด ๋ชจ๋ ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ
class A(object):
def do_work(self):
print('A์ do_work')
class B(A):
def do_work(self):
print('B์ do_work')
super().do_work()
class C(B):
def do_work(self):
print(1)
super().do_work()
print(2)
super().do_work()
print(3)
super().do_work
# C ์ธ์คํด์ค ์์ฑ
c = C()
c.do_work()
-- ๊ฒฐ๊ณผ
1
B์ do_work
A์ do_work
2
B์ do_work
A์ do_work
3
B์ do_work
A์ do_work
Plain Text
๋ณต์ฌ
example code from https://sirzzang.github.io/dev/Dev-python-super/
๋ค. Self
1) ์ ์
โข
์ธ์คํด์ค ๊ฐ์ฒด ์์ ์ ๋ํ ์ฐธ์กฐ๋ณ์
โ ์ธ์คํด์ค ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก self ์ ๋ฌํด์ผ ํจ
2) ๋์์๋ฆฌ
โข
a_car.exclaim() ํธ์ถ์ ๋ฐ๋ฅธ self์ ๋์์๋ฆฌ
โ a_car ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ํด๋์ค ๊ฐ์ฒด ํ์
โ a_car ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ Car ํด๋์ค ๊ฐ์ฒด์ ๋ฉ์๋์ self ๋ณ์์ ํ ๋น
โ ๊ฒฐ๊ณผ์ ์ผ๋ก a_car.exclaim() == Car.exclaim(a_car)
class Car:
def exclaim(self):
print("I'am a Car")
a_car = Car()
a_car.exclaim() # I'am a Car
Python
๋ณต์ฌ
๋ผ. Method Type
1) ์ธ์คํด์ค ๋ฉ์๋
โข
ํน์ ์ธ์คํด์ค ๊ฐ์ฒด์๋ง ์ํฅ์ ์ฃผ๋ ๋ฉ์๋
โข
๋ฉ์๋์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก self(์ธ์คํด์ค ๊ฐ์ฒด ์์ ์ ์ฐธ์กฐํ๋ ๋ณ์)๋ฅผ ์ ๋ฌํจ
2) ํด๋์ค ๋ฉ์๋
โข
ํด๋์ค ๊ฐ์ฒด ์์ฒด์ ์ํฅ์ ์ฃผ๋ ๋ฉ์๋
โ ํด๋น ํด๋์ค๋ฅผ ํตํด ์์ฑ๋ ๋ชจ๋ ์ธ์คํด์ค ๊ฐ์ฒด์ ์ํฅ์ ์ฃผ๋ ๋ฉ์๋
โข
@classmethod๋ผ๋ decoration์ด ๋ถ๊ณ ์ฒซ๋ฒ์ฌ ๋งค๊ฐ๋ณ์๋ก cls(ํด๋์ค ๊ฐ์ฒด ์์ ์ ์ฐธ์กฐํ๋ ๋ณ์)๋ฅผ ์ ๋ฌํจ
>>> class A():
... count = 0
... def __init__(self):
... A.count += 1
... @classmethod
... def class_kids(cls):
... print(cls.count)
... def instance_increase(self):
... self.count += 1
... def instance_kids(self):
... print(self.count)
...
>>> first_a = A()
>>> second_a = A()
>>> first_a.instance_increase()
>>> A.class_kids()
2
>>> first_a.instance_kids()
3
Python
๋ณต์ฌ
3) ์ ์ ๋ฉ์๋
โข
ํด๋์ค๋ ์ธ์คํด์ค์ ์ํฅ์ ์ฃผ์ง ์์ง๋ง ํธ๋ฆฌ์ฑ์ ์ํด ์ฌ์ฉํ๋ ๋ฉ์๋
โข
ํด๋์ค๋ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ์ ์ ๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ
โข
@staticmethod๋ผ๋ decoration์ด ๋ถ์
>>> class Weapon():
... @staticmethod
... def commercial():
... print("Weapon! Wow!")
...
>>> Weapon.commercial()
Weapon! Wow!
Python
๋ณต์ฌ
๋ง. Mixin
1) ์ ์
โข
์ผ๋ จ์ ์์ฑ๊ณผ ๋ฉ์๋์ ์งํฉ
โ ๊ฐ์ base class๋ฅผ ์์ํ์ง ์๋ ๊ฐ์ฒด ๊ฐ์ ํน์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์์
2) ์์
โข
Cow, Bull, Ox ํด๋์ค๋ ๋ชจ๋ Cattle์ด๋ผ๋ base class๋ฅผ ์์๋ฐ์
โข
Bull, Ox๋ ์์์ด๋ฏ๋ก ๋ ๊ฐ์ฒด์๋ง ์ฌ์ฉ๋๋ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ์กด์ฌํจ
โ ์์ฑ(์ ์ก๋ฒํธ), ๋ฉ์๋(์ ์ก์ฑ์ทจ)๊ฐ Mixin์ผ๋ก ์ ์๋์ด Bull๊ณผ Ox ํด๋์ค๊ฐ ์์๋ฐ์ ์ ์์
class Cattle(object):
def __init__(self, birth_date):
self.birth_date = birth_date
def get_age_in_days():
return today() - self.birth_date
class MaleMixin(object):
def __init__(self, seed_id):
self.seed_id = seed_id
def get_seed_id():
return self.seed_id
class Cow(Cattle):
pass
class Bull(Cattle, MaleMixin):
pass
class Ox(Cattle, MaleMixin):
pass
Python
๋ณต์ฌ
๋ฐ. Hash
1) Object Hash
โข
ํน์ ๊ฐ์ฒด๋ฅผ Hashableํ๊ฒ ๋ง๋ค๊ธฐ ์ํด __hash__์ __eq__ ๋ฉ์๋๋ฅผ ์ ์ํด์ผํจ
โข
๊ฐ์ฒด์
2) Hash ์ฌ์ฉ์ฒ
โข
Set๊ณผ Dict์ ๊ตฌ์ฑ์์์ ๊ฐ๊ณผ ํด์ฌ๊ฐ์ ๊ฐ์ง๊ณ lookup table์ ๊ตฌ์ฑํ์ฌ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ๋ณธ๊ธฐ๋ฅ(์กฐํ, ๋น๊ต ๋ฑ)์ ํ์ฉ๋จ
โ ํด์ฌ๊ฐ์ lookup table์์ ํค๋ก ์ฌ์ฉ๋๋ฏ๋ก ํด์ฌ๊ฐ์ด ์ค๊ฐ์ ๋ฐ๋๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ๋ถ์์ฉ์ ์ด๋ํ ์ ์์
โ ํน์ ๊ฐ์ฒด์์ ํด์ฌ ๊ฐ ์์ฑ์ ํ ๋๊ฐ ๋๋ ๊ฐ์ ํด๋น ๊ฐ์ฒด์ lifecycle์ฒด์ ๋ถ๋ณ์ ๊ฐ์ด์ด์ผ ํจ
โ ๊ฐ์ ๋งฅ๋ฝ์์ python ๊ธฐ๋ณธ ์๋ฃํ ์ค immutable ๊ฐ์ฒด(tuple, string)๋ hashableํ์ง๋ง mutableํ ๊ฐ์ฒด๋ unhashableํ ์ ๋ฐ์ ์๋ค
6. ๋ชจ๋๊ณผ ํจํค์ง
๊ฐ. Decorator
1) Decorator ๊ฐ์
โข
๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์ ๋ด๋ถ๋ฅผ ์์ ํ์ง ์๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํจ
โข
๋์๋ฐฉ์
โ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ฌ์ ์ ์ํ ํจ์๋ ๋ฐ์ฝ๋ ์ดํฐ ์ ์๋ถ ๋ด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋จ
โ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ํจ์๋ wrapper ํจ์ ๋ด ์ง์ ๋ ์์น์์ ์คํ๋จ
โข
๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ณธํํ ์ ์
# ๋ฐ์ฝ๋ ์ดํฐ ์ ์
def decorator_function(function):
def wrapper():
print("start test")
function()
print("end test")
return wrapper
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์ ์
@decorator_function
def test_decorator():
print("hello")
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์คํ
test_decorator()
Python
๋ณต์ฌ
โข
์์ ์ฝ๋ ์คํ ๋ฐ ์ถ๋ ฅ
โข
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋ตํ ๋ก์ง
โ ๋ฐ์ฝ๋ ์ดํฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ํจ์์ ์ ์๋ถ์ ๋ฐ์ฝ๋ ์ดํฐ ํจ์๋ฅผ ์ฅ์์๋ก ํ์ํ๋ฉด, ๋ณธ๋ฌธ์์ ๋ฐ์ฝ๋ ์ดํฐ ํจ์์ ์ ์ธ ๋ถ๋ถ์ ์๋ตํ ์ ์์
# ๋ฐ์ฝ๋ ์ดํฐ ์ ์
def decorator_function(function):
def wrapper():
print("start test")
function()
print("end test")
return wrapper
def test_decorator():
print("hello")
test_decorator = decorator_function(test_decorator)
test_decorator()
Python
๋ณต์ฌ
2) ๋งค๊ฐ๋ณ์์ ๋ฐํ๊ฐ ์ฒ๋ฆฌ
โข
๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ฌ ์คํํ ๊ฒฝ์ฐ, ๋ฐ์ฝ๋ ์ดํฐ ์ ์ ๋ถ๋ถ์ wrapper ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ์ฌ ์ ์ํด์ผ ํจ
โข
๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ๊ฒฝ์ฐ
# ๋ฐ์ฝ๋ ์ดํฐ ์ ์
def decorator_function(function):
def wrapper(sid, pw, name):
print("start: ", function.__name__)
function(sid, pw, name)
print("end: ", function.__name__)
return wrapper
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์ ์
@decorator_function
def test_decorator_with_params(sid, pw, name):
print(f'hello: {name}, sid: {sid}, passward: {pw}')
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์คํ
test_decorator_with_params(name="MJ", sid=123, pw=456)
Python
๋ณต์ฌ
โข
์์ ์ฝ๋ ์คํ ๋ฐ ์ถ๋ ฅ
3) ๋ฐ์ฝ๋ ์ดํฐ ํด๋์ค
โข
ํด๋์ค ํํ๋ก ๋ฐ์ฝ๋ ์ดํฐ ์ ์
# ๋ฐ์ฝ๋ ์ดํฐ ์ ์
class decorator_class:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kargs):
print("start: ", self.function.__name__)
self.function(*args, **kargs)
print("end: ", self.function.__name__)
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์ ์
@decorator_class
def test_decorator_with_params(sid, pw, name):
print(f'hello: {name}, sid: {sid}, passward: {pw}')
# ๋ฐ์ฝ๋ ์ดํฐ ๋ถ์ธ ํจ์ ์คํ
test_decorator_with_params(name="MJ", sid=123, pw=456)
Python
๋ณต์ฌ
โข
์์ ์ฝ๋ ์คํ ๋ฐ ์ถ๋ ฅ
๋. __init__
1) ์ฉ๋
โข
๋๋ ํ ๋ฆฌ ์ดํ์ ๋ชจ๋(.py)์ ํจํค์ง๋ก ๊ด๋ฆฌ
2) ์ฌ์ฉ๋ฒ ๋น๊ต
โข
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
Project
ใ
ฃ-- a_package
ใ
ฃ ใ
ฃ-- __init__.py
ใ
ฃ ใ
ฃ-- feature_a.py
ใ
ฃ ใ
ฃ-- feature_b.py
ใ
ฃ-- main.py
Plain Text
๋ณต์ฌ
โข
empty __init__.py in a_package
# main.py
import a_package.feature_a
import a_package.feature_b
a_package.feature_a.furnction_a()
a_package.feature_b.furnction_b()
Python
๋ณต์ฌ
โข
non empty __init__.py in a_package
# __init__.py
from .feature_a import furnction_a
from .feature_b import furnction_b
Python
๋ณต์ฌ
# main.py
import a_package
a_package.feature_a.furnction_a()
a_package.feature_b.furnction_b()
Python
๋ณต์ฌ
๋ค. Path
1) path ํจ์
โข
ํ์ผ์ ๊ฒฝ๋ก ํ์ธ
import sys
from pathlib import Path
path = Path(__file__).resolve().__str__()
print(f'path: {path}')
Python
๋ณต์ฌ
โข
file์ด ์์นํ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ python path ์ถ๊ฐ
โ ํ์ผ์ ๊ฒฝ๋ก: Path(__file__).resolve()
โ ํ์ผ์ ๋ถ๋ชจ(๋๋ ํ ๋ฆฌ)์ ๊ฒฝ๋ก: Path(__file__).resolve().parent
import sys
from pathlib import Path
path = Path(__file__).resolve().parent.__str__()
sys.path.append(path) # python path์ ํ์ผ์ ๋ถ๋ชจ ๊ฒฝ๋ก ์ถ๊ฐ
Python
๋ณต์ฌ
2) package importing issue
โข
์ํฉ
โ manager-api/FA/urls.py์์ update_farms_from_grpc method ํธ์ถ
from grpc_client.gclient import update_farms_from_grpc
update_farms_from_grpc()
Python
๋ณต์ฌ
โ manager-api/grpc_client/farm_pb2 ๊ฒฝ๋ก์ farm_pb2 ๋ชจ๋์ ๋ชป์ฐพ๋ ์ด์ ๋ฐ์
import farm_pb2
def update_farms_from_grpc():
with grpc.insecure_channel(GRPC_URL) as channel:
stub = farm_pb2_grpc.FarmControllerStub(channel)
Python
๋ณต์ฌ
โ ์๋ฌ ๋ก๊ทธ
File "/Users/maxwell/PycharmProjects/manager-api/FA/urls.py", line 10, in <module>
from grpc_client.gclient import update_farms_from_grpc
File "/Users/maxwell/PycharmProjects/manager-api/grpc_client/gclient.py", line 9, in <module>
import farm_pb2
Plain Text
๋ณต์ฌ
โข
์์ธ: python path์ manager-api/grpc_client ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก import farm_pb2 ๋ง์ผ๋ก ํด๋น ๋ชจ๋์ ๊ฒฝ๋ก ์ ์ฐพ์ ์ ์์
โข
ํด๊ฒฐ: python path์ manager-api/grpc_client ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ์ฌ import farm_pb2 ๋ง์ผ๋ก ํด๋น ๋ชจ๋์ ๊ฒฝ๋ก์์ ์ฐพ์ ์ ์๋๋ก ์์
import sys
from pathlib import Path
path = Path(__file__).resolve().parent.__str__()
sys.path.append(path)
import farm_pb2
def update_farms_from_grpc():
with grpc.insecure_channel(GRPC_URL) as channel:
stub = farm_pb2_grpc.FarmControllerStub(channel)
Python
๋ณต์ฌ
7. ๋ฐ์ดํฐ ๊ธธ๋ค์ด๊ธฐ
๊ฐ. with
1) ๊ฐ์ฒด์ ์ปจํ
์คํธ ๊ด๋ฆฌ
โข
ํ์ฉ: ํน์ ๊ฐ์ฒด์ ์์ ์ฃผ๊ธฐ(์ปจํ
์คํธ)๊ฐ ํธ์ถ์ ๋ฐ๋ผ ๊ฐ์ ๋ฐํํ๊ณ ๋๋๋ค๋ฉด, with ๊ตฌ๋ฌธ์ผ๋ก ๊ฐ์ธ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฉด์์ ํจ๊ณผ์
โ ์์ ์ฝ๋
async with session.get(url) as response:
html = await response.text()
soup = BeautifulSoup(html, "html.parser")
cont_thumb = soup.find_all("div", "cont_thumb")
for cont in cont_thumb:
title = cont.find("p", "txt_thumb")
if title is not None:
print(title.text)
Python
๋ณต์ฌ
โข
with ๊ตฌ๋ฌธ
with EXPR as VAR:
BLOCK
Python
๋ณต์ฌ
code from https://peps.python.org/pep-0343/
โข
with ๊ตฌ๋ฌธ ํ์ด
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
Python
๋ณต์ฌ
code from code from https://peps.python.org/pep-0343/
2) File ์ฒ๋ฆฌ
โข
with ๊ตฌ๋ฌธ์ ํน์ ๋ฉ์๋๋ ํด๋์ค ๋ด ์ ์ธ๋ ์์ ํด์ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ํธ์ถํ์ฌ ์์์ ์์ฑ, ์ฌ์ฉ, ์๋ฉธ ๊ณผ์ ์ ์์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์
โข
file stream ์ฒ๋ฆฌํ ๋, ์๋์ผ๋ก close ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํจ
# fp-test.json ํ์ผ์ ์ด๊ณ json.dump ๋ฉ์๋ ํธ์ถ ๋ค close ๋ฉ์๋ ํธ์ถ
with open('fp-test.json', 'w') as f:
json.dump(fp_dict, f, ensure_ascii=False)
Python
๋ณต์ฌ
๋. JSON ์ฒ๋ฆฌ
1) JSON๊ณผ Python์ ํธํ
โข
JSON(JavaScript Object Notation)์ Python๊ณผ์ ๋ฐ์ดํฐ ํธํ์ ์ ํฉํจ
โ JavaScript์ Python์ ๊ฐ์ C-family ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฏ๋ก ์ํธ ๋ฐ์ดํฐํธํ์ ์ ํฉํจ
โข
์ธ์ฝ๋ฉ(or ์ง๋ ฌํ), ๋์ฝ๋ฉ(or ์ญ์ง๋ ฌํ) ๊ฐ ๋ฐ์ดํฐ ํธํ ์ฐธ๊ณ
2) ์ง๋ ฌํ(Python โ JSON)
โข
json.dump(): ๋์คํฌ
โข
json.dumps(): ๋ฉ๋ชจ๋ฆฌ
3) ์ญ์ง๋ ฌํ(JSON โ Python)
โข
json.load(): ๋์คํฌ
โข
json.loads(): ๋ฉ๋ชจ๋ฆฌ
8. ๋ ์ง์ ์๊ฐ
๊ฐ. datetime
1) ๊ธฐ๋ณธ ์ฌ์ฉ
โข
ํน์ ์กฐ๊ฑด ์ดํ์ ๋ ์ง์ ์๊ฐ ๊ณ์ฐ
addtime = datetime.timedelta(days = 10)
datetime.datetime.now() + addtime # 10์ผ ํ
datetime.datetime.now() - addtime # 10์ผ ์
thedate = datetime.datetime.now().replace(hour = 10, minute=0, second = 0) + datetime.timedelta(days = 3) # 3์ผ ํ 10์ ์ ๊ฐ
Python
๋ณต์ฌ
2) str to datetime
โข
๋ฌธ์์ด์ datetime์ผ๋ก ๋ณํ
โ JSON์ผ๋ก ๋ฐ์ date๋ฅผ datetime ํ์
์ผ๋ก ๋ณ๊ฒฝ ํ ๋ ์ง ๊ณ์ฐ์ ํ์
from datetime import datetime
datetime.strptime("2018-01-31", "%Y-%m-%d")
Plain Text
๋ณต์ฌ
๋. date
1) today
โข
datetime์ now()์ ์ ์ฌํ ๊ธฐ๋ฅ
from datetime import date
date.today() - obj.latest_work_date
Plain Text
๋ณต์ฌ
2) days
โข
datetime.date ํ์
๊ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์๋ก ๋ฐ๋๋ฐ ์ฌ์ฉ
(date.today() - obj.next_work_date)
"exceeded_days": "-86400.0"
(date.today() - obj.next_work_date).days
"exceeded_days": -1
Plain Text
๋ณต์ฌ
3) str to date
โข
๋ฌธ์์ด์ date type์ผ๋ก ๋ณํ
โข
datetime.strptime์์ date() ์ถ๊ฐํธ์ถํ์ฌ ๋ณํ
datetime.strptime(str, '%Y-%m-%d').date()
Python
๋ณต์ฌ
4) date to str
โข
date ํ์
์ string์ผ๋ก ๋ณํ
from datetime import date
test_date = date.today()
test_date_str = test_date.strptime('%Y-%m-%d')
Python
๋ณต์ฌ
5) ๋ ๋ ์ง ์ฌ์ด์ ๋ ์ง ์์ฑ
โข
timedelta๋ฅผ ํ์ฉ
def _generate_dates(date__gte, date__lte):
start_date = datetime.strptime(date__gte, "%Y-%m-%d").date()
end_date = datetime.strptime(date__lte, "%Y-%m-%d").date()
delta = end_date - start_date
dates = [start_date + timedelta(days=i) for i in range(delta.days + 1)]
return dates
Python
๋ณต์ฌ
9. Collections
๊ฐ. Counter
1) ๊ฐ์ฅ ๋น๋ฒํ ์์ ์ฐพ๊ธฐ
โข
n๊ฐ์ ๊ฐ์ฅ ๋น๋ฒํ ์์ ์ฐพ๊ธฐ: Counter().most_common(n)
Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
Python
๋ณต์ฌ
def mostCommonWord(self, paragraph: str, banned: Llst[str]) -> str:
words = [word for word In re.sub(r'[^Xw]', ' ', paragraph).lower().split()
if word not in banned]
counts = collections.Counter(words)
return counts.most_common(1)[0][0]
Python
๋ณต์ฌ
๋. defaultdict
์กด์ฌํ์ง ์๋ key๋ฅผ ์ฝ์
ํ ๋ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด key ์กด์ฌ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ ์ฐจ๋ฅผ ์๋ตํ ๋, defaultdict๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค
1) difaultdict(int)
โข
key:value ์์์ ์ง์ ํ์ง ์์ ํค์ value๋ฅผ ์กฐํํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด 0์ด ๋๋ค.
int_dict = collections.defaultdict(int)
print(int_idct[key_1]) // 0
Python
๋ณต์ฌ
2) difaultdict(list)
โข
key:value ์์์ value์ ๊ธฐ๋ณธ๊ฐ์ด ๋น ๋ฆฌ์คํธ๊ฐ ๋๋ค.
list_dict = collections.defaultdict(list)
print(list_dict[key_1]) // []
Python
๋ณต์ฌ
3) difaultdict(set)
list_dict = collections.defaultdict(set)
print(list_dict[key_1]) // set()
Python
๋ณต์ฌ
Reference
โข
Introducing Python 2nd Edit, Bill Lubanovic
โข
ํ์ด์ฌ ์
๋ฌธ, ํ๋ก๊ทธ๋๋จธ์ค, https://programmers.co.kr/learn/courses/2#introduction
โข
ํจ์-๋งค๊ฐ๋ณ์, https://jhproject.tistory.com/109
โข
File stream, https://devpouch.tistory.com/79
โข
Json ๋ฐ์ดํฐ ์ฒ๋ฆฌ, https://rfriend.tistory.com/474
โข
์๋ฃ๊ตฌ์กฐ๋ณ ์๊ฐ๋ณต์ก๋, https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
โข
vscode ide ์ค์ , https://earth-95.tistory.com/85
โข
collections.Counter, https://docs.python.org/3/library/collections.html#collections.Counter