임의의 개수의 인자를 함수에 넘겨줄때 가변인자를 사용한다.
여러 인자들을 넘거주면 args는 튜플 형태로 입력받는다.
def myfunc(*args):
print(args)
myfunc(1,2,3,4,5)
-> (1, 2, 3, 4, 5)
딕셔너리는 **를 붙인다.
인자를 넘겨줄 때 {key:value}의 형태로 넘겨주면 자동으로 dict 형태로 만들어준다.
def myfunc2(**d):
print(d)
myfunc2(name='A', age=12)
-> {'name': 'A', 'age': 12}
그럼 일반 인자와 가변인자를 같이 넘기려면 어떻게 해야 할까
def myfunc(*args, a):
print(args)
print(a)
myfunc(1,2,3,4,5,6)
myfunc((1,2,3,4), 1)
어떻게 넣든 a의 값을 넣지 않았다고 나온다.
그렇기 때문에 일반 인자와 가변인자를 같이 넣을때는 일반인자를 첫 번째로 넣어주어야 한다.
def myfunc(a, *args):
print(a)
print(args)
myfunc(1,2,3,4,5,6,7)
->
1 <class 'int'>
(2, 3, 4, 5, 6, 7) <class 'tuple'>
그러면 일반 인자와 가변인자 그리고 dict까지 넣으려면 어떻게 해야할까
앞에서 일반 인자와 가변인자를 같이 넘길때 일반 인자가 먼저 쓰였던 것 처럼
dict 타입의 가변인자를 맨 나중에 넣는다.
def profile(role, *skills, **details):
print("Role", role)
print("Skills", skills)
print('Details', details)
profile("programmer", "Python", "react", "deeplearning",
yearpay=100000000, position='개발자')
->
Role programmer
Skills ('Python', 'react', 'deeplearning')
Details {'yearpay': 100000000, 'position': '개발자'}
그렇다면 리스트 안에 있는 dict을 출력하고 싶다면 어떻게 해야 할까
# 랜덤 데이터 만들기
import string
import random
aList = []
atozList = list(string.ascii_uppercase)
random.shuffle(atozList)
randnum = [random.randint(20,70) for i in range(28)]
for n, i in zip(atozList, randnum):
a = {"name": n, "age": i}
aList.append(a)
def myfunc(*d):
print(type(d))
for i in d[0]:
print(i)
myfunc(aList)
->
<class 'tuple'>
{'name': 'A', 'age': 22}
{'name': 'H', 'age': 41}
{'name': 'N', 'age': 49}
{'name': 'F', 'age': 34}
{'name': 'M', 'age': 33}
{'name': 'J', 'age': 45}
...
보면 알다싶이 우리가 보낸 리스트는 tuple 타입이 되어 들어있다.
만약 하나의 리스트만 보냈다면 단순하게 0번째 인덱스 값을 가져오면 해결할 수 있다.
만약 해당 dict에서 데이터를 찾는다고 한다면
def myfunc(*d):
for i in d[0]:
if i['name'] == 'D':
print(i)
myfunc(aList)
-> {'name': 'D', 'age': 42}
이런식으로 할 수 있을 것이다.
하지만 우리는 이미 dict 타입을 그냥 넘길 수 있다는 것을 알고 있으니 key-value를 넘기는 것이 아니라면 굳이 사용할 필요가 없다.