์ฝ๋ - ํจ์บ ์์ ์ฝ๋ ์ฐธ๊ณ (ํจ์บ ์์ ์ ๋ฆฌ)
<์ด์ ๊ธ>
https://silvercoding.tistory.com/22
[python ์ฌํ] 5. Special Method (Magic Method)
์ฝ๋ - ํจ์บ ์์ ์ฝ๋ ์ฐธ๊ณ (ํจ์บ ์์ ์ ๋ฆฌ) <์ด์ ๊ธ> https://silvercoding.tistory.com/21 https://silvercoding.tistory.com/20 https://silvercoding.tistory.com/19 https://silvercoding.tistory.com/18..
silvercoding.tistory.com
- ์ปจํ ์ด๋ (Container) : ์๋ก ๋ค๋ฅธ ์๋ฃํ ํฌํจ ๊ฐ๋ฅ
list, tuple, collections.deuqe (ex) list --->[1, 3.0, 'hi']
- Flat : ํ๊ฐ์ ์๋ฃํ๋ง์ ํฌํจ
str, bytes, bytearray, array.array, memoryview
- ๊ฐ๋ณ
list, bytearray, array.array, memoryview, deque
- ๋ถ๋ณ
tuple, str, bytes
๋๋ฆ ํ์ด์ฌ์ ๋ฐฐ์ฐ๋ ์ ๊ณต์์ด์ง๋ง ์ฌํ๊ณผ์ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์์ง ๋ชจ๋ฅด๋ ๊ฒ ์ ๋ง ๋ง์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
์์ ์๋ฃํ๋ค๋ง ๋ด๋!
์ด๋ฒ ํฌ์คํ ์์๋ ์ง๋ฅํ ๋ฆฌ์คํธ, ์ ๋๋ ์ดํฐ, ํํ, ๋์ ๋๋ฆฌ์ ๋ด์ฉ์ ๊น๊ฒ ๋ค์ด๊ฐ๋ค.
- ์ง๋ฅํ ๋ฆฌ์คํธ (Comprehending Lists)
*** None comprehending LIsts
chars = '!@#$%^&*()_+'
codes1 = []
for s in chars:
# ์ ๋์ฝ๋ ๋ณํ
codes1.append(ord(s))
์ง๋ฅํ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ์ ์ผ๋ก for๋ฌธ์ ์ด์ฉํ์ฌ ๋ฆฌ์คํธ ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ์์์ด๋ค.
*** Comprehending Lists
์์ฒญ ํฐ ์ํฅ์ ๋ผ์น๊ฒ ๋๋ ๊ฒ์ ์๋์ง๋ง, ๋น ๋ฐ์ดํฐ ๋ถ์ผ์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ํ์ ํ๊ฒ ๋ง์์ง๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฐ๋ ๊ฒ์ด ์ฑ๋ฅ, ์๋ ๋ฉด์์ ๋ ์ ๋ฆฌํ๋ค๊ณ ํ๋ค.
codes2 = [ord(s) for i in chasrs]
๋ฆฌ์คํธ ์์์ ๋ฐ๋ก for๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
*** Comprehending LIst + Map, Filter
์ด ๋ฐฉ๋ฒ ์ญ์ ์๋๊ฐ ์ฝ๊ฐ ์ฐ์ธํจ .
codes3 = [ord(s) for s in chars if ord(s) > 40]
codes4 = list(filter(lambda x : x > 40, map(ord, chars)))
๊ฒฐ๊ณผ์ ์ผ๋ก codes3์ codes4 ๋ฆฌ์คํธ ์์ ๊ฐ๋ค์ ๊ฐ๋ค. codes3๋ for๋ฌธ๊ณผ if๋ฌธ์ ์ฌ์ฉ , codes4๋ mapํจ์๋ก chars์ ๊ฐ๋ค์ ordํจ์๋ฅผ ์ ์ฉ ์ํจ ํ , lambda, filter๋ฅผ ์ฌ์ฉํ์ฌ 40๋ณด๋ค ํฐ ๊ฐ๋ค๋ง ๋์ค๊ฒ ๋ง๋ค์ด์ค๋ค.
*** ์ถ๋ ฅํด๋ณด๊ธฐ
print('EX1-1 - ', codes1)
print('EX1-2 - ', codes2)
print('EX1-3 - ', codes3)
print('EX1-4 - ', codes4)
print('EX1-5 - ', [chr(s) for s in codes1])
print('EX1-6 - ', [chr(s) for s in codes2])
print('EX1-7 - ', [chr(s) for s in codes3])
print('EX1-8 - ', [chr(s) for s in codes4])
EX1-5๋ถํฐ๋ ord์ ๋ฐ๋๋ก chr()๋ฅผ ์ด์ฉํ์ฌ ๋ค์ ๋ฐ๊พธ์ด์ ๋ฆฌ์คํธ์ ๋ฃ์ด ์ฃผ๋ ์ฝ๋์ด๋ค.
*** ๋ฆฌ์คํธ ์ฃผ์ํ ์
marks1 = [['~'] * 3 for n in range(3)]
marks2 = [['~'] * 3] * 3
print("EX4-1 - ", marks1)
print("EX4-2 - ", marks2)
์ด ๋๊ฐ์ง๋ฅผ ์ถ๋ ฅํ๋ฉด
๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
--> ๊ฐ ํ๋ ๋ณ๊ฒฝ
marks1[0][1] = 'X'
marks2[0][1] = 'X'
print('EX4-3 - ', marks1)
print('EX4-3 - ', marks2)
๋ถ๋ช ํํ๋ ๊ฐ์๋๋ฐ, 0๋ฒ์งธ ๋ฆฌ์คํธ์ 1๋ฒ์งธ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง, ๋๋ฒ์งธ๋ 0, 1, 2๋ฒ์งธ์ 1๋ฒ์จฐ ๊ฐ์ด ๋ชจ๋ ๋ฐ๋์๋ค.
---> ์ฆ๋ช
print('EX4-5 - ', [id(i) for i in marks1])
print('EX4-6 - ', [id(i) for i in marks2])
์์ ๊ฐ์ด marks1์ ๋ฆฌ์คํธ ๋ค์ ๋ชจ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ๋ก id๊ฐ์ด ๋ค๋ฅด์ง๋ง, marks2์ ๋ฆฌ์คํธ๋ค์ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ 3๋ฒ ๋ฐ๋ณตํด ๋์ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ id๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค. ๊ฐ์ ๊ณณ์ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ 0๋ฒ์จฐ ๋ฆฌ์คํธ์ ๊ฐ๋ง ๋ฐ๊พธ๋ฉด 1, 2๋ฒ์งธ ๋ฆฌ์คํธ์ ๊ฐ๋ ํจ๊ป ๋ฐ๋๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ๋ถ์์ ํ ๋ ์ด๋ฐ ์ค์๋ฅผ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋์ฐํ๋ค!
- ์ ๋๋ ์ดํฐ , Generator & Array
(1) ์ ๋๋ ์ดํฐ
์ ๋๋ ์ดํฐ๋ ํ ๋ฒ์ ํ ๊ฐ์ ํญ๋ชฉ์ ์์ฑํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ์ง ์๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฐ์ดํฐ๋ฅผ ์ธ ๋๋ Generator๊ฐ ํจ์ฌ ์ฐ์ธํ๋ค๊ณ ํ๋ค.
tuple_g = (ord(s) for s in chars) # ์์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํ ์ํ๊ฐ ์๋
์ด์ฒ๋ผ ํํ ์์ for๋ฌธ์ ์จ์ฃผ๋ฉด ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ์์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํ ์ํ๊ฐ ์๋๋ผ๋ ๊ฒ!
(2) Array
import array
array_g = array.array('I', (ord(s) for s in chars))
array๋ฅผ importํด์ค๋ค. ์ฒ์ ์จ๋ณด์์ ๋ฌธ์๋ฅผ ์ฐพ์์ ์ฝ์ด๋ณด์๋ค.
<array.array ์ฐธ๊ณ ๋ฌธ์>
https://docs.python.org/3/library/array.html
array — Efficient arrays of numeric values — Python 3.9.6 documentation
array — Efficient arrays of numeric values This module defines an object type which can compactly represent an array of basic values: characters, integers, floating point numbers. Arrays are sequence types and behave very much like lists, except that the
docs.python.org
*** ์ถ๋ ฅ, ์ฌ์ฉํด๋ณด๊ธฐ
print('EX2-1 - ', tuple_g)
print('EX2-2 - ', next(tuple_g))
print('EX2-3 - ', next(tuple_g))
print('EX3-4 - ', array_g)
print('EX3-4 - ', array_g.tolist())
์ ๋๋ ์ดํฐ๋ next ๋๋ for๋ฌธ์ ์ด์ฉํ์ฌ ๊ฐ์ ๊บผ๋ผ ์ ์๋ค.
array๋ฅผ ๋ฆฌ์คํธ๋ก ๋ณํํ๊ณ ์ถ๋ค๋ฉด tolist()๋ฅผ ์ฌ์ฉํ๋ค.
*** ์ ๋๋ ์ดํฐ for๋ฌธ์ผ๋ก ์ฌ์ฉํ๊ธฐ
print('EX3-1 - ', ('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1, 11)))
for s in ('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1, 11)):
print('EX3-2 - ', s)
for๋ฌธ์ผ๋ก ์ ๋๋ ์ดํฐ ๊ฐ์ฒด์์ ๊ฐ๋ค์ ํ๋์ฉ ๊บผ๋ด์ฃผ๋ ์ฝ๋ .
- Tuple Advanced
*** packing & unpacking
print('EX5-1 - ', divmod(100, 9))
print('EX5-2 - ', divmod(*(100, 9)))
print('EX5-3 - ', *(divmod(100, 9)))
divmod๋ ๋ชซ๊ณผ ๋๋จธ์ง๋ฅผ ํํ๋ก ๋ฐํํด์ฃผ๋ ํจ์์ด๋ค. ํํ ์์ *์ ๋ถ์ด๋ฉด unpaking์ด ๋๋ค๋ ๊ฒ !
x, y, *rest = range(10)
print('EX5-4 - ', x, y, rest)
x, y, *rest = range(2)
print('EX5-5 - ', x, y, rest)
x, y, *rest = 1, 2, 3, 4, 5
print('EX5-6 - ', x, y, rest)
์ฐธ๊ณ ) ** ---> dictionary ๋ฅผ ๋ฐ์
(ex) def test(*args, **args):
- Mutable (๊ฐ๋ณ) vs Immutable (๋ถ๋ณ)
l = (10, 15, 20)
m = [10, 15, 20]
print('EX6-1 - ', l, m, id(l), id(m))
๋ฆฌ์คํธ์ ํํ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ์์ฑํด์ค๋ค.
# ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑ ---> ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ก์๋จน์ ์๋ ์๋ค๋ ๊ฒ
l = l * 2
m = m * 2
print('EX6-2 - ', l, m, id(l), id(m))
# ์์ฒด์์ ์ฐ์ฐ
l *= 2
m *= 2
print('EX6-3 - ', l, m, id(l), id(m))
l = l*2 ์ ๊ฐ์ ์ฝ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ค๋ ๊ฒ์ด๋ค. ์ถ๋ ฅ๋ id๊ฐ์ ๋ด๋ ๋ฆฌ์คํธ์ ํํ ๋ชจ๋ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๊ฒ์ ์ ์ ์๋ค.
l *= 2 ์ ๊ฐ์ด ์์ฒด์์ ์ฐ์ฐ์ ํ ๋๋ ๊ฐ๋ณํ์ธ ๋ฆฌ์คํธ๋ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ , ๋ถ๋ณํ์ธ ํํ์ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋ ๋ค.
- sort vs sorted
f_list = ['ornage', 'apple', 'mango', 'papaya', 'lemon', 'strawberry','coconut']
(1) sorted : ์ ๋ ฌ ํ ์๋ก์ด ๊ฐ์ฒด ๋ฐํ
print('EX7-1 - ', sorted(f_list))
print('EX7-2 - ', sorted(f_list, reverse=True)) # ์ญ์์ผ๋ก ์ ๋ ฌ
print('EX7-3 - ', sorted(f_list, key=len)) # ๊ธธ์ด์์
print('EX7-4 - ', sorted(f_list, key=lambda x: x[-1]))
print('EX7-5 - ', sorted(f_list, key=lambda x: x[-1], reverse=True))
print('EX7-6 - ', f_list)
sorted ์ ์ธ์์๋ ์ ๋ ฌํ ๋ฆฌ์คํธ์ ์ ๋ ฌํ ์กฐ๊ฑด์ ๋ฃ์ด์ค๋ค.
๊ฐ์ฒด๋ฅผ ์๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์, ์๋ณธ ๋ฆฌ์คํธ์๋ ๋ณํ๊ฐ ์๋ค.
(2) sort : ์ ๋ ฌ ํ ๊ฐ์ฒด ์ง์ ๋ณ๊ฒฝ
a = f_list.sort()
print('EX7-7 - ', f_list.sort(), f_list)
print('EX7-8 - ', f_list.sort(reverse=True), f_list)
print('EX7-9 - ', f_list.sort(key=len), f_list)
print('EX7-10 - ', f_list.sort(key=lambda x: x[-1]), f_list)
print('EX7-11 - ', f_list.sort(key=lambda x: x[-1], reverse=True), f_list)
sort๋ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์, f_list.sort() ์์ฒด๋ฅผ ์ถ๋ ฅํ๋ฉด None์ด ๋์จ๋ค. (None---> ๋ฐํ๊ฐ์ด ์๋ค๋ ๋ป) ๊ทธ๋์ ์๋ณธ์ธ f_list๋ฅผ ์ถ๋ ฅํด์ฃผ์ด์ผ ๋ณ๊ฒฝ๋ ๋ฆฌ์คํธ๋ฅผ ๋ณผ ์ ์๋ค.