python

[Python 미니세션] 함수 *Asterisk

kinggoddino 2024. 7. 12.

▶ 문제1

  • 하나의 함수는 숫자를 3개 입력받는다.
  • 함수를 호출하면 안에 숫자들의 평균값 구하기.
def aver(num1, num2, num3):             # 함수정의, 매개변수는 숫자 3개
    aver = (num1 + num2 + num3) / 3     # 숫자 3개를 더해서 3으로 나누는 aver 변수 선언
    print(aver)                         # aver 값 출력
    
input1 = int(input("num1 : "))          # 숫자 입력 받기
input2 = int(input("num2 : "))        
input3 = int(input("num3 : "))         

aver(input1, input2, input3)            # 함수호출, 입력받은 3개 인자

개인과제에서 input 함수를 배웠기 때문에! 써봤다.

처음에는 int로 바꾸는 과정 없이 input 만 받았었는데

input1 = (input("num1 : ")) 
input2 = (input("num2 : "))         
input3 = (input("num3 : ")) 

# TypeError: unsupported operand type(s) for /: 'str' and 'int'

입력을 받으면 전부 문자열이 되기 때문에, <문자열 str / 숫자 int> 가 지원되지 않는다는 에러가 발생했다. 그래서 입력받은걸 숫자로 바꿔서 저장해준다.


  문제2

  • 하나의 함수는 숫자를 무제한 입력받는다.
  • 함수를 호출하면 안에 숫자들의 평균값 구하기.

함수정의에서 매개변수를 받아야되는데 몇개 받을 지 모르는 상황이다.

이 때 매개변수에 * (asterisk, 애스터리스크)를 붙여주면 인자를 가변적으로 받을 수 있다.

보통 arguments(인자)의 약자를 써서 args 라고 한다.

*args : 가변 인자를 함수의 매개 변수로 받기

def aver(*args):                          # 함수 정의, 가변 인자 받기
    aver_result = sum(args) / len(args)   # 평균값 = 요소합 / 길이
    return aver_result                    # aver 함수 결과값 반환

 

근데 인자를 튜플형태로 받아오기 때문에, 이대로 예시 리스트를 집어넣으면

ex_list = [1,5,3,2,6]    # 예시리스트
print(aver(ex_list))     # 함수호출
                       
# TypeError: unsupported operand type(s) for +: 'int' and 'list'

ex_list가 리스트 형태 그대로 *args의 한 요소로 들어가기 때문에, sum() 계산이 불가능하다.

예를 들어 *args가 아니라  a,b,c,d,c 를 매개변수로 넣어보면,

def aver(a, b, c, d, e):                    # list 자체가 a에 들어감.
    aver_result = sum(args) / len(args) 
    return aver_result                          

ex_list = [1,5,3,2,6]                       # 예시리스트
print(aver(ex_list))

# TypeError: aver() missing 4 required positional arguments: 'b', 'c', 'd', and 'e'

[1,5,3,2,6]이 각각 (a,b,c,d,e)에 들어가는 게 아니라 a에 통째로 들어간다.

그래서 b, c, d, e에 해당하는 필요한 인자가 없다는 오류가 뜬다.

 

이럴때는 인자에도 * (asterisk, 애스터리스크)를 붙여주면 된다.

*인자 : 리스트를 언팩하여 개별 인자로 전달

def aver(*args):                           # 함수 정의, 가변 인자 받기
    aver_result = sum(args) / len(args)    # 평균값 = 튜플요소합 / 튜플길이
    return aver_result                     # aver 함수 결과값 반환

ex_list = [1,5,3,2,6]                      # 입력할 예시 리스트
print(aver(*ex_list))                      # 개별 인자로 전달   # 3.4

 

별표를 인자에 붙여주면 언패킹 해주는 기능이 있다.

현재 리스트 형태로 패킹(packing)되어 있는 [1, 5, 3, 2, 6]을 뜯어서 언패킹(unpacking)해주면 1, 5, 3, 2, 6 각각 개별 요소가 되고, 얘네들을 개별 인자로 함수에 전달 할 수 있다.