python function parameters & arguments

BnDC·2021년 9월 5일
0

python

목록 보기
2/3
post-thumbnail

🎆Parameter vs Argument

🎈Parameter(매개변수)

함수의 정의에서 함수가
전달 받는 값을 지칭하는 변수

def add(a,b):
	return a+b

🎈Argument(전달 인자)

함수가 호출 될 때, 직접적으로 받는 값

print(add(1,2)) #3


parameter와 argument를 엄밀히 구분 할 수 있지만, parameter와 argument의 의미를 나누지 않고, 혼용해서쓰는 경우도 있으므로 문맥에 따라 해석 하도록 하자





🎊Positional / Keyword Arguments


📍Positional Arguments

함수 정의에서, parameter가 나열된 순서대로
함수 호출에 argument를 나열하면 그 순서대로 argument가 parameter 자리에 들어간다.

def sub(a,b):
	return a-b

print(sub(1,2)) # -1

📍Keyword Arguments

함수를 호출할 때, parameter의 순서대로 argument를 나열해서 호출하는 방법도 있지만, parameter 별로 argument를 지정해서 함수를 호출 할 수 있다.

def sub(a,b):
	return a-b
    
print(sub(b=1, a=2)) #1

📍 Mixing positional Arguments and keyword Arguments

positional Argument와 keyword Argument를 같이 사용할 수 있다.

🩸!!주의!!🩸
keyword argument는 항상 positional argument 뒤에 있어야 한다

def add(a, b, c):
    return a+b+c

print(add(1, c=1, 2))
# SyntaxError: positional argument follows keyword argument



🎉Positional / Keyword Only Parameters



🎀Positional Only Parameters

함수 호출 시 argument를 받을 때, positional argument 만으로 argument를 받도록 강제 할 수 있다.

/ 앞에 나열된 parameter가 argument를 받을 때는, 무조건 positional argument로 전달 받아야 한다.

/뒤에 parameter는 positional/ keyword 자유롭게 선택해서 argument를 전달 받을 수 있다

def add(a,b,/,c,d):
	return a+b+c+d

print(add(1,2,c=3,d=4)) #10
print(add(1,b=2,c=3,d=4)) 
#TypeError: add() got some positional-only arguments passed as keyword arguments: 'b'


def add1(a,b,c,d,/):
	return a+b+c+d

print(add1(1,2,3,4)) #10
print(add1(1,2,3,d=4))
#TypeError: add1() got some positional-only arguments passed as keyword arguments: 'd'

🎀Keyword Only Parameters

함수 호출 시 argument를 받을 때, keyword
argument 만으로 argument를 받도록 강제 할 수 있다.

* 뒤에 나열된 parameter가 argument를 받을 때는, 무조건 keyword argument로 전달 받아야 한다.

* 앞에 parameter는 positional/ keyword 자유롭게 선택해서 argument를 전달 받을 수 있다

def add(a, b,*,c,d):
    return a+b+c

print(add(1, c=1, 2))
# SyntaxError: positional argument follows keyword argument



🎇(Non) Default Value Parameter


🎐default value parameter

정의에서 미리 parameter의 기본값을 설정해 줄 수 있다. 만약 기본값을 설정해준 parameter에 argument가 전달 되지 않는다면, 그 argument에 설정해 둔 기본값이 전달 된 것으로 간주한다.

def add(a,b=1):
	return a+b

add(3) #4
add(3,2) #5

🎐Non-Default Value Parameter

parameter에 미리 기본값을 설정해주지 않은 parameter들은 다 non-default value parameter이다.

🩸!!주의!!🩸
default value parameter는 항상 non-default value parameter 뒤에 있어야 한다

def add(a=1,b):
	return a+b
#SyntaxError: non-default argument follows default argument
  
add(2) 

default value parameter가 non-default value parameter 보다 먼저 나열되었다. 그렇게 되면
함수가 호출 되었을 때, 받은 argument가 어떤 parameter에 전달된 argument인지 알 수 없게 되는 문제가 발생 한다.

예시에서 add함수에 argument 2가 전달되었는데, 그것이 a에 전달된 argument인지,b에 전달된 argument인지 알 수 없다.




✨Variable Length Positional / Keyword Arguments


📌Variable length Positional Arguments

variable length positional arguments는 함수가 받을 인자의 수가 일정치 않을 때, 유용하다.
함수를 정의 할때, parameter 이름에 *를 추가하면 Variable length keyword argument(vlka)가 된다.

def add(a,b,*arg):
	result=a+b
	for element in arg:
		result+=element

	print(a,b)
	print(arg) 
	print(result)
	return result

add(1, 2, 3, 4, 5)
# 1,2
# (3, 4, 5)
# 15

주어진 arguments에서 a,b에 전달될 1,2를 제외한 나머지 arguments는 모두 *arg에 tuple로 넘겨 진다.

📌Variable length Keyword Arguments

variable length keyword arguments는 함수가 받을 인자의 수가 일정치 않고, parameter에 나열하지 않은 keyword를 전달 받는데 유용하다.
함수를 정의 할때, parameter 이름에 **를 추가하면 Variable length keyword argument(vlka)가 된다.

def introduce(name, age, **kwarg):
  print("Hi! My name is "+name)
  print("I'm "+str(age))
  for key, value in kwarg.items():
      print(key+":"+value)

  print('\n')
  print(kwarg)


introduce('jake', 20, job='traveler', 
		      Phone='01012345678',
		      hobby='singing',
		      favoriteFood='pizza')
'''
Hi! My name is jake
I'm 20
job:traveler
Phone:01012345678
hobby:singing
favoriteFood:pizza

{'job': 'traveler', 
'Phone': '01012345678', 
'hobby': 'singing', 
'favoriteFood': 'pizza'}
'''

주어진 arguments에서 name,age에 전달될 jake, 20를 제외한
나머지 arguments는 모두 *arg에 dictionary로 넘겨 진다.




🎊 Python Function Definition, Arguments Kind & Order

  1. Positional Argument (non-default)
  2. Default Argument
  3. Variable Length Positional Arguments
  4. Non-default Keyword-Only Arguments
  5. Keyword-Only Arguments With Defaults
  6. Variable Length Keyword Arguments

앞서 보았듯이
기본적으로
Positional Arguments가 Keyword Arguments를 앞서고, Positional / Keyword Arguments 각각에서
non-default Parameter가 default를 앞선 순서로 나열 된다.
마지막으로
variable length positional / keyword arguments들은 positional / keyword arguments 중에 마지막으로 나열된다.



🎯 ex1)

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)
  #TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

variable length position arguments인 arg는
position arguments에 가장 마지막에 배치됌으로
age는 keyword-only argument로 호출되어야 한다. 혹은 positional argument로 호출 하기 위해 자리를
args 앞쪽으로 배치해야 한다.

🏆 Sol1)

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

🏆 Sol2)

def func_param_with_var_args(name,age, *args, age):
    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
  '''



🎯 ex2)

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
'''

variable length keyword arguments **kwargs는 가장 마지막에 위치해야 한다.

🏆 Sol)

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
'''



🎯 ex3)

  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
'''

앞선 예시처럼 함수를 정의할 때, **kwargs가 가장 마지막에 위치해야 하고, keyword only argument인 age가 positional argument 뒤에 배치되어 keword argument로 호출 되어야 한다.

🏆 Sol)

def mixed_params(name="아이유", *args, age, 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("정우성", "01012341234", "male" ,age=20, mobile="01012341234", address="seoul")

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



profile
“Life is C (Choice) between B (Birth) and D (Death).” - 인생은 B와 D사이의 C

0개의 댓글

관련 채용 정보