Function Parameters

sj950902·2020년 11월 21일
1
post-thumbnail
오늘은 "함수의 매개변수 (Parameter)"를 적을 때 주의해야되는 부분들에 대해서 포스팅을 해보겠습니다.

1. Default 매개 변수 사용시 주의 할 점

! 먼저, 파이썬 함수를 적을때 매개변수는 기본값을 가질수도 안 가질수도 있습니다.!


def my_function(name, age = 25): 
   print(f"{name} is {age} years old") 
   
my_function("seungjae")
# seungjae is 25 years old

def my_function(name, age = 25): 
   print(f"{name} is {age} years old") 
   
my_function("seungjae")
# seungjae is 25 years old

다음과 코드와 같이, name 변수는 기본값을 안지고 있고, age 변수는 기본값을 가지고 있는 것을 확인 할 수 있습니다. 그래서 밑에 my_function 이란 함수를 실행시킬때, 기본값을 안가지고 있는 name 변수는 값을 지정해주어야 되며 , age 변수는 입력을 안해도 기본값인 25를 가지고 있기 때문에 다음과 같이 결과 화면을 확인 할 수 있죠 !

하지만, 이 때 주의해야 될 점은 기본값을 가지고 있는 매개 변수 (age) 같은 경우 기본값을 가지고 있지 않는 변수 (name) 앞에는 명시를 하면 안된다는 점이다. 만약 이렇게 안쓴다면 아래와 같이 파이썬은 SyntaxError 을 발생시키죠 ㅠㅠ


def my_function(age = 25,name): 
    print(f"{name} is {age} years old") 
    
my_function(age = 10, name = "seungjae")

> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

파이썬에서 왜 이런 규칙을 만들었는지에 대해서 고민해 봤을때 저는 2가지 정도가 생각이 났습니다.


첫번째는 "매개변수의 혼동"을 초래 할것이기 때문입니다.


각 매개변수의 값을 지정할 수 도없지만, 파이썬에서는 아래와 같이 대게 생략을 할 수 도 있죠.

이렇게 했을때, 다음 주석과 같이 혼동이 올 수 도있죠. 그래서 만약 일반 string 변수와 integer 변수가 사칙연산이 안되기 때문에, 코드에서 Value 의 TypeError 또한 초래할 수 있기 때문에 다음과 같이 default value를 가지는 parameter 는 다양한 혼동을 야기하기 때문에 파이썬 개발자 분들께서 다음과 같은 규율을 정한거 같습니다.

def my_function(age = 25, siblings = 1, name, favorite): 
    print(f"{name} is {age} years old. I have {sibilings} sibling(s). My favorite is {favorite}" ) 
    
my_function(10,'seungae','cake') # age == 10 name == 'seungjae' favorite = 'cake' ???
										or
                                   # siblings == 10 name == 'seungjae' favorite = 'cake' ???
								
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument


두번째는 "편의성"이 더 좋을것 같다고 생각했습니다.


다른 분들은 잘 머르겠지만, 예를 들어서 저는 일단 확실한 문제부터 처리하고 애매한 문제는 다음에 두고 생각한 다음에 푸는 걸 선호하죠. 이렇게 하면 애매한 문제를 풀면서 확실한 문제를 생각하지 않아도 돼서 조금 더 여유롭게 고민할 수 있어서 좋더라구요. 이런 것처럼 저 함수를 이용하는 입장으로써, non-default parameter 같은 경우 무조건 값을 줘야하기 때문에 그 부분을 먼저 처리하고, 나중에 default value paremeter를 처리하는게 이용하는 입장에서 더 편할 것이라고 생각하네요. 그래서 이용자는 하지만, 이 부분은 솔직히 취향적인 부분이여서 저의 개인적인 생각입니다 하하 ...

2. 위치인수 (positional arguments)와 가변인수 (variable length arguments) 사용시 주의할 점


먼저, 위치 인수와 가변 인수에 대해서 간략하게 설명하자면,
  • 위치인수는 항상 지정된 순서와 위치에 맞는 변수들을 집어넣어줘야 되는 매개 변수들입니다.
  • 가변 인수 같은 경우는 불특정 다수의 인자값을 받기 위해서 사용하는 매개 변수 입니다.

https://media.vlpt.us/images/kbj7227/post/9155caee-1166-4ce0-84f6-2523ce5de8eb/python-function-definition-arguments-kind-and-order.jpg

  • 이 두가지 변수들은 혼용할 수가 있는데, 만약 아래와 같은 코드로 위치 인수의 순서 중간에 가변 인수가 있다면, 에러가 떠버리죠. 이 부분도 파이썬의 매개변수를 받아드리는 순서가 위의 이미지처럼 규칙이 정해져 있기 때문입니다.

틀린 방식

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)

'''

Traceback (most recent call last):
  File "/home/seungjae/바탕화면/project/test.py", line 9, in <module>
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

맞는방식

def func_param_with_var_args(name, age, *args):
   print("name=",end=""), print(name)
   print("args=",end=""), print(args)
   print("age=",end=""), print(age)


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

'''
name=정우성
args=('01012341234', 'seoul')
age=20
'''

3. 가변 키워드 인수 (variable length keyword arguments) 의 위치


위에서 설명한 가변인수와 비슷하게, 가변 키워드 인수 (variable lenght keyword arguments)는 불특정 다수의 키워드 argument를 생성할 때 사용되는 매개변수입니다. 그리고, 위의 이미지에서 확인할 수 있듯이, 이 인자는 항상 마지막의 매개변수로 오기 때문에 아래와 같은 코드는 에러를 생성하게 되죠 ...

틀린방식

def func_param_with_kwargs(name, age, 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")

'''
  File "/home/seungjae/바탕화면/project/test.py", line 1
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax

'''

맞는방식

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", address="seoul" ,mobile="01012341234")

'''
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''

4. 4. 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments) 의 위치


틀린 방식

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")


'''
  File "/home/seungjae/바탕화면/project/test.py", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax
'''

맞는 방식


def mixed_params(age, *args ,address =0,name="아이유", **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

'''
profile
# 백엔드개발자 # 기억보단 기록을

0개의 댓글