파이썬 가변인자

Apic·2025년 4월 30일
0

코딩

목록 보기
20/24

가변인자

임의의 개수의 인자를 함수에 넘겨줄때 가변인자를 사용한다.

일반 인자들

여러 인자들을 넘거주면 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까지 넣으려면 어떻게 해야할까
앞에서 일반 인자와 가변인자를 같이 넘길때 일반 인자가 먼저 쓰였던 것 처럼
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

그렇다면 리스트 안에 있는 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를 넘기는 것이 아니라면 굳이 사용할 필요가 없다.

profile
코딩 공부하는 사람

0개의 댓글