티스토리 뷰

study/Python

Function parameter

xoxowo 2022. 6. 23. 20:07

파이썬에서 함수를 정의할 때 def 키워드로 정의하며 함수 이름 뒤 괄호 안에 parameter(매개변수)를 지정하면 된다.

이 parameter는 원하는 만큼 추가할 수 있으며 쉼표(,)로 구분한다.

 

기본적으로 함수는  호출 시 기입한 인수의 개수와 parameter의 개수가 다르면 오류가 발생한다.

 

* 매개변수는 함수 정의에서 괄호 안에 나열된 변수

* 인수는 호출될 때 함수에 전송되는 값

def function(parameter):
	# 내부 코드는 들여쓰기를 해야한다.
	print("함수 선언")
    
# 함수 호출 시 함수명과 괄호를 사용한다 
function(인수)

 

함수의 괄호 안에 싸인 parameter(매개 변수)는 일반 매개변수, *가변매개변수(*args), 기본 매개변수, **키워드 매개변수(**kwargs)가 있다.

 

일반매개변수(non-default value parameter)

일반 매개변수는 인수의 개수와 일반 매개변수의 개수가 다르면 오류가 발생한다. 또한 다른 매개변수를 같이 쓸 때에는 맨 앞에 써넣어야 한다.

기본 매개변수(default value parameter)

기본 매개변수는 '매개변수=값' 형태이며 함수를 호출할 때 매개변수를 넣지 않아도 기본 값으로 설정한 값이 들어간다.

*가변 매개변수 (*args) (Variable Length Positional Arguments)

가변 매개변수는 수가 유동적으로 변하는 함수를 튜플 자료형

**키워드 매개변수 (**kwargs) (Variable Length Keyword Arguments)

키워드 매개변수는 직접 매개 변수명을 지정하여 매개변수를 전달한다. 키워드(key = value)매개변수를 입력하면 함수 내에서 딕셔너리로 인식하며,순서가 바뀌어도 상관없이 전달된다.

 

def function(일반매개변수, *가변매개변수, 기본매개변수=n) :
	# 함수 내부 코드 작성 시 들여쓰기 작성
    print(일반매개변수)
    print(*가변매개변수)
    print(기본매개변수)

# 함수 선언
function( 1,2,3,4,5,기본매개변수=100 )

# 실행결과
1	# 일반매개변수
(2 3 4 5)	# *가변매개변수로 전달받은 인자들은 튜플로 묶인다
100	# 기본매개변수

매개변수들의 위치를 바꾸게 된다면 실행 시 아래와 같은 내용이 출력된다.

def function(*가변매개변수,일반매개변수, 기본매개변수=100) :
	# 함수 내부 코드 작성 시 들여쓰기 작성
    print(*가변매개변수)
    print(기본매개변수)
    print(일반매개변수)

# 함수 선언
function( 1,2,3,4,5, 기본매개변수=100 )

# 실행결과
Traceback (most recent call last):
  File "/Users/yujeong/Project/test/function.py", line 10, in <module>
    function( 1,2,3,4,5 )
TypeError: function() missing 1 required keyword-only argument: '일반매개변수'

 

function 함수를 선언할 때 괄호 안에 ( 1,2,3,4,5, 기본 매개변수 =100)을 넣었는데 코드 실행 시

missing 1 required keyword-only argument: '일반매개변수' 가 나온다.

일반 매개변수를 찾을 수 없다는 뜻인데

 

가변 매개변수는 수가 유동적으로 변하는 함수이기 때문에 function (1,2,3,4,5, 기본 매개변수= 100 ) 안에서 1,2,3,4,5 모두 가변 매개변수로 인식하여 일반 매개변수를 찾을 수 없어 나오는 오류이다.  (틀렸을 수도 있음....)

 

 

마찬가지로 함수에 기본 매개변수를 먼저 넣고 일반 매개변수를 넣어 실행하면 아래와 같이 오류가 출력된다.

왜 기본매개변수(default value parameter) 뒤에는 일반 매개변수(non-default value parameter)가 올 수 없을까?

아래 코드를 실행하면 에러가 발생하는데 함수 정의에서 일반매개변수가 앞에 와야하기 때문에 코드는 SyntaxError가 발생했다. 

# 기본매개변수 name="jin" 과 일반매개변수 age 인 함수
def user(name="jin", age):
    print(name, '! You are learning Python!')

age = input("What is your age?")
user(age)

# 실행결과
SyntaxError: non-default argument follows default argument

 

 

 

 

매개변수 위치에 따른 오류와 해결방법

1. *가변매개변수 (variable length keyword arguments) 위치에 따른 오류 
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", 20)

# 실행결과
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

- 풀이 

1. *가변매개변수는 일반 매개변수 뒤에 와야 하기 때문에 def func_param_with_var_args(name, age, *args) 위치를 바꿔주었다.

(name, *args, age) -> (name, age, *args)

 

2. 함수 호출 시에도 age 값의 위치를 동일하게 변경하여 출력하였다.

# 1. 함수 매개변수순서 바꾸기
def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

# 2. 함수 선언 시 매개변수 순서 바꿔서 호출
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
 

2. **가변키워드변수에 위치에 따른 오류

def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

# 실행결과
def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^^^^^^^
SyntaxError: invalid syntax

- 풀이 

1. 가변키워드변수 또한 일반 매개변수 앞에 올 수 없기 때문에 def func_param_with_kwargs(name, age, address=0, **kwargs) 위치를 바꿔주었다.

(name, age, **kwargs, address=0) ->(name, age, address=0, **kwargs)

# 함수의 **가변키워드변수의 위치를 옯겨준다
def func_param_with_kwargs(name, age, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

# 실행결과
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

 


3. 일반매개변수 위치와 가변 매개변수 위치 오류

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

# 실행결과

def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                     ^^^^^^^
SyntaxError: invalid syntax

- 풀이 

1. 일반매개변수(age) 위치 오류로 age 위치를 변경해준다.

2. 가변매개변수(**kwargs)위치를 맨 뒤로 변경해준다.

# 함수 일반매개변수(age)와 가변매개변수(address)위치를 변경해준다.
def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

# 실행결과
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

 

 

'study > Python' 카테고리의 다른 글

Class  (0) 2022.06.27
기본 자료형  (0) 2022.06.24
List 와 Array 의 차이  (0) 2022.06.18
Tuple  (0) 2022.06.16
List, Dictionary 관련 기본 함수 및 리스트 내포  (0) 2022.06.16
댓글