ํ์ด์ฌ ํจํน(packing)๊ณผ ์ธํจํน(unpacking)์ ๋ชจ๋ ๊ฒ
์ค๋ ์๊ฐํ๋ ํจํน๊ณผ ์ธํจํน์ ๋ฐ์ดํฐ๋ณด๋ค๋ ํจ์ ํธ์ถ์ ์ธ์(Arguments) ์ค์ฌ์ผ๋ก ์ค๋ช ํฉ๋๋ค.
ํจํน(Packing)
printํจ์๋ ์ถ๋ ฅํ๊ณ ์ ํ๋ ์ธ์๊ฐ ๋ช ๊ฐ๋ ๊ฐ์ ์๊ดํ์ง ์๊ณ ์ถ๋ ฅํด ์ค๋๋ค.
print("Hello")
print("He", "llo")
print("He", "ll", "o")
# Hello
# Hello
# Hello
ํจ์๊ฐ ๋ฐ์ ์ธ์์ ๊ฐ์๋ฅผ ์ ํด๋์ง ์์์ ๋(๊ฐ๋ณ ์ธ์), ์ ๋ ฅ๋ฐ์ ์ธ์๋ค์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํ ๊น์? ๋ฐ๋ก packing์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ๊ด๋ฆฌํ์๋ฉด ๋ฉ๋๋ค.
ํจํน์ ์ธ์๋ก ๋ฐ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ๋์ ๊ฐ์ฒด๋ก ํฉ์ณ์ ๋ฐ์ ์ ์๋๋ก ํฉ๋๋ค.
๊ฐ๋ณ์ธ์ ํจํน์ *ํ ๊ฐ๋ฅผ ๋งค๊ฐ๋ณ์ ์์ ๋ถ์์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
def func(*args):
print(args)
print(type(args))
๋งค๊ฐ๋ณ์ ์ด๋ฆ ์์ *์ ๋ถ์ฌ์ค๋ค๋ฉด, ๊ฐ๋ณ์ธ์๋ก ๋ณด๋ธ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ํ๋์ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํด ์ค๋๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ณ์ธ์๋ ์์๋๋ก ๋ฃ์ ๋จ์ ์ธ์๋ค์ ๋ปํฉ๋๋ค. ์๋ ์์ ์์๋ 1, 2, 3, 4, 5, 6, 'a', 'b'๊ฐ ๋ชจ๋ ๊ฐ๋ณ์ธ์์ ๋๋ค. ์ถํ์ ๋์ฌ ํค์๋์ธ์์ ๋นํด ๋จ์ํ๊ฒ ์ ๋ ฅ๋ฐ์ ์ธ์๋ค์ ๋๋ค. ๊ฐ๋ณ์ธ์๋ค์ ๋ชจ๋ ํํ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
func(1, 2, 3, 4, 5, 6, 'a', 'b')
# (1, 2, 3, 4, 5, 6, 'a', 'b')
# <class 'tuple'>
์ด๋ฌํ packing์ ํตํด ๋ฐ์ ๋ชจ๋ ์ซ์๋ค์ ํฉ์ ๊ตฌํ๋ ์ฐ์ฐ๋ ๊ตฌํ ์ ์์ต๋๋ค. ๋ช ๊ฐ๋ ์๊ด์์ด ๊ฐ๋ฅํฉ๋๋ค.
def sum_all(*numbers):
result = 0
for number in numbers:
result += number
return result
print(sum_all(5, 6, 7, 8)) # 26
print(sum_all(10, 11, 12, 13, 14, 15)) # 75
packing์ ์ด์ฉํด์ ๋ฐ๋์ ๋ฐ์์ผ ํ๋ ๋งค๊ฐ๋ณ์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฐ์ ์ ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ตฌ๋ถํด์ ์์ฑํ ์ ์์ต๋๋ค.
def printCityName(capital, sec_capital, *cities):
print("์๋ :", capital)
print("์ 2 ์๋ :", sec_capital)
if cities:
print("๋ค๋ฅธ ์ง์ญ๋ค:")
for city in cities:
print(city)
printCityName('์์ธ', '๋ถ์ฐ', '๋์ ', '์ธ์ฒ', '๋๊ตฌ', '์ธ์ฐ', '๊ด์ฃผ')
# ์๋ : ์์ธ
# ์ 2 ์๋ : ๋ถ์ฐ
# ๋ค๋ฅธ ์ง์ญ๋ค:
# ๋์
# ์ธ์ฒ
# ๋๊ตฌ
# ์ธ์ฐ
# ๊ด์ฃผ
๊ฐ๋ณ์ธ์๊ฐ ํจํนํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ง๋๋ฉด ๊ทธ ์ดํ์ ์ธ์๊ฐ ๋ช ๊ฐ์ด๋์ง, tuple๋ก ํ๋์ ๊ฐ์ฒด๊ฐ ๋์ด์ ๊ด๋ฆฌ๋ฉ๋๋ค.
๋์ผํ๊ฒ ํค์๋ ์ธ์์ ํจํน์ **์ ํตํด ์์ฑํ ์ ์์ต๋๋ค.
def kwpacking(**kwargs):
print(kwargs)
print(type(kwargs)
kwpacking(a=1, b=2, c=3)
# {'a': 1, 'b': 2, 'c': 3}
# <class 'dict'>
ํค์๋ ์ธ์๋ ํจํนํ ์ธ์๋ค์ ํค์๋์ ์ธ์ ์์ผ๋ก ์ด๋ค์ง ๋์ ๋๋ฆฌ๋ก ๊ด๋ฆฌํฉ๋๋ค.
printCityNameํจ์๋ฅผ ํค์๋ ์ธ์๋ก ์ถ๋ ฅํ๋๋ก ๋ณ๊ฒฝํด ๋ณด๊ฒ ์ต๋๋ค.
def printCityName(capital, sec_capital, **cities):
print("์๋ :", capital)
print("์ 2 ์๋ :", sec_capital)
if cities:
print("๋ค๋ฅธ ์ง์ญ๋ค:")
for title, city in cities.items():
print(f"{title} - {city}")
printCityName('์์ธ', '๋ถ์ฐ', ๊นํ๊ท ์๊ณ ํฅ='๋์ ', ๋ฅํ์ง์๊ณ ํฅ='์ธ์ฒ', ๋ฐ์๋ฏผ์๊ณ ํฅ='๋๊ตฌ', ๊ตฌ์ฐฝ๋ชจ์๊ณ ํฅ='์ธ์ฐ', ๊น๋ณํ์๊ณ ํฅ='๊ด์ฃผ')
# ์๋ : ์์ธ
# ์ 2 ์๋ : ๋ถ์ฐ
# ๋ค๋ฅธ ์ง์ญ๋ค:
# ๊นํ๊ท ์๊ณ ํฅ - ๋์
# ๋ฅํ์ง์๊ณ ํฅ - ์ธ์ฒ
# ๋ฐ์ ๋ฏผ์๊ณ ํฅ - ๋๊ตฌ
# ๊ตฌ์ฐฝ๋ชจ์๊ณ ํฅ - ์ธ์ฐ
# ๊น๋ณํ์๊ณ ํฅ - ๊ด์ฃผ
unpacking
packing์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ๋์ ๊ฐ์ฑ๋ก ๋ฌถ์ด์ฃผ๋ ๊ฐ๋ ์ด์์ต๋๋ค. ์ด์ ๋ฐ๋๋๋ ๊ฐ๋ ์ธ unpacking์ ๋ฌถ์ฌ์๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ผ๋ก ํ์ด์ฃผ๋ ๊ฐ๋ ์ ๋๋ค.
ํจ์์์ unpacking์ ํ ๋๋, ๋งค๊ฐ๋ณ์์์ *์ ๋ถ์ด๋ ๊ฒ ์๋๋ผ ์ธ์ ์์ *์ ๋ถ์ฌ์ ์ฌ์ฉํฉ๋๋ค.
๋์ผํ๊ฒ ๊ฐ๋ณ์ธ์๋ฅผ unpacking ํ๋ ๊ฒฝ์ฐ๋ *๋ฅผ, ํค์๋์ธ์๋ฅผ unpackingํ๋ ๊ฒฝ์ฐ **๋ฅผ ์ฌ์ฉํฉ๋๋ค.
def sum(a, b, c):
return a + b + c
numbers = [1, 2, 3]
sum(numbers) # error
print(sum(*numbers)) # ์ถ๋ ฅ : 6
[1, 2, 3]์ ์ธ์๋ก ๋ณด๋ผ ๋, *์ ๋ถ์ด๋ฉด unpacking์ด ๋ฐ์ํฉ๋๋ค.
unpacking์ ์๋์ ๊ฐ์ ์์๋ก ๋ณ๊ฒฝ๋์ด ์คํ๋ฉ๋๋ค.
1. sum(*numbers)
2. sum(*[1, 2, 3])
3. sum(1, 2, 3)
unpacking์ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๋ฅผ ํด์ฒดํ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์, ํด์ฒด๋ ๊ฒฐ๊ณผ๊ฐ ํจ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์์ ๋ค๋ฅด๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
sum(*[1, 2, 3, 4])
TypeError:sum() takes 3 positional arguments but 4 were given
๊ฐ๋ณ์ธ์๋ฅผ unpackingํ ๋๋ listํ์ ๋ฟ๋ง ์๋๋ผ, Container๊ฐ์ฒด๋ผ๋ฉด ๋ค ๊ฐ๋ฅํฉ๋๋ค.
sum(*'abc') # 'abc'
sum(*(4, 5, 6)) # 15
sum(*{'๊ฐ', '๋', '๋ค'}) # '๊ฐ๋๋ค'
sum(*{'์นํจ': 3, 'ํผ์': 12, '์๋ฃ์': 10}) # '์นํจํผ์์๋ฃ์'
setํ์ ๊ณผ dictํ์ ์ ์์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๋์ผํ ๋ฐฉ์์ผ๋ก ํค์๋์ธ์๋ก unpackingํ ์ ์์ต๋๋ค. unpackingํ๊ธฐ ์ํด์ ์ธ์๊ฐ key์ ์ธ์๋ก ๊ตฌ์ฑ๋์ด ์๋ mappingํ์ , ์ฆ dict๊ฐ ํ์ํฉ๋๋ค.
def cal(first, op, second):
if op == '+':
return first + second
if op == '/':
return first / second
if op == '-':
return first - second
if op == '*':
return first * second
obj = {
'first': 11,
'second': 33,
'op': '*'
}
cal(**obj)
# ๊ฒฐ๊ณผ : 363
์ ์์ ์ ํค์๋ ์ธ์์ unpacking์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
1. cal(**obj)
2. cal(obj = {
'first': 11,
'second': 32,
'op': '*'
})
3. cal(first=11, second=33, op='*')
๊ฐ๋ณ์ธ์์ unpacking์ฒ๋ผ unpacking๋๋ ์ธ์๋ ๋งค๊ฐ๋ณ์์ ํค์๋ ๋งค๊ฐ๋ณ์์ ์ผ์นํด์ผ ํฉ๋๋ค.
๋ง์ฝ ๋น์ด์๋ ์ธ์๋ฅผ unpacking๋ฅผ ํ๋ฉด ๋ฌด์ํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ํจ์์ packing๊ณผ unpacking์ ์ด์ฉํ์ฌ, ๋ค์๊ณผ ๊ฐ์ด ์ด๋ ํ ํจ์์๋ ๋ฐ์ํ๋ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํจ์์ ํจ์์ ์ธ์๋ค์ ๋ฐ์์ ์์ ์ ์๋ฆผ๊ณผ ํจ๊ป ํจ์๋ฅผ ์คํ์์ผ ์ฃผ๋ ๋ํ(wrapping) ํจ์์ ๋๋ค.
def start(func, *args, **kwargs): # packing ์ฌ์ฉ
print("ํจ์๋ฅผ ์์ํฉ๋๋ค.")
return func(*args, **kwargs) # unpacking ์ฌ์ฉ
def printAny(*args, **kwargs): # ๋ํ์ ์ฌ์ฉํ ํจ์
if args:
for value in args:
print(value)
if kwargs:
for title, value in kwargs.items():
print(f"{title} - {value}")
start(printAny, 1, 5, ์ด๋ฆ1='์์', ์ด๋ฆ2='๋') # ํธ์ถ
# ํจ์๋ฅผ ์์ํฉ๋๋ค.
# 1
# 5
# ์ด๋ฆ1 - ์์
# ์ด๋ฆ2 - ๋
packing๊ณผ unpacking์ ํ์ด์ฌ์ ๊ฐ๊ฒฐํ๊ณ ์ ์ฐํ ๋ฌธ๋ฒ์ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.