์ฝ”๋“œ - ํŒจ์บ  ์ˆ˜์—… ์ฝ”๋“œ ์ฐธ๊ณ  (ํŒจ์บ  ์ˆ˜์—… ์ •๋ฆฌ)

 

<์ด์ „ ๊ธ€>

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๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผ ๋ณ€๊ฒฝ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts