함수 정의 - def

def add(x,y) :
	print('더하기')
	return x+y

def 으로 add라는 이름을 가진 함수를 정의한다.

함수명뒤의 ()에는 매개변수(parameter)가 들어가고 매개변수를 이용한 함수를 만든다.

return으로 값을 반환한다. 

 

 

 

 

함수 호출, 실행

add(1,2) #더하기

함수명으로 함수를 호출한다.

이때 매개변수 자리에 들어가는 것은 인자(argument)라고 한다.

더한 값은 return으로 반환되지만 따로 저장이나 출력하지 않았기 때문에 print()만 실행된다.

 

 

 

n = add(3,5)
print(n) #8

return값을 n에 저장하여 출력하면 더한 값 결과를 확인할 수 있다.

 

 

 

def f() :
	print('함수실행')
n=f()
print(n) #None

return 이 없으면 return None이 기본으로 None을 반환한다.

return 뒤에 값이 없는 것도 동일하다.

 

 

 

def add(x,y) :
	return x+y
    return x-y
print(add(3,2)) #5

return은 함수를 종료하는 것을 말하고 return을 만나게 되면 그 아래에 있는 코드는 실행되지 않는다.

return이 두개있어도 위의 return을 만나고 함수가 종료된다.

 

 

 

def add(x,y=1) :
	return x+y
    return x-y
print(add(3)) #4

매개변수와 인자의 개수가 맞지 않으면 오류가 발생한다. 

매개변수에 = 으로 기본값을 지정해주면, 인자가 들어오지  않더라도 기본값으로 계산하게 된다.

인자를 하나만 받았기 때문에 x로 받아들이고, y는 기본값 1로 계산된다.

 

 

 

def add(x,y=1) :
	return x+y,x-y
print(add(3)) #(4, 2)

return 값을 ,으로 연결해서 여러개 지정할 수도 있다.

튜플형태로 저장되어 반환된다.

 

 

 

 

 

패킹

여러개의 데이터를 묶어 할당

n = (1,2,3)
print(n) #(1,2,3)

 

 

 

언패킹

시퀀스 요소들을 여러 변수에 나누어 할당

n=(1,2,3)
a,b,c=n
print(a,b,c) #1 2 3

 

 

n=(1,2,3)

a,c=n #ValueError: too many values to unpack (expected 2)
a,b,c,d=n #ValueError: not enough values to unpack (expected 4, got 3)

언패킹시에는 변수의 개수와 할당요소의 개수가 동일해야 한다.

 

 

 

a,*rest, b =(1,2,3,4)
print(a,rest,b) #1 [2, 3] 4

언패킹시 변수에 * 를 붙이면 남은 요소들을 모두 저장할 수있다.

앞, 뒤의 값을 각각 a,b로 저장하고 나머지는 변수앞에 *를 붙여서 rest 변수에 한번에 저장되도록 하였다.

 

 

 

 

print(max(1,2,3)) #3
print(max(1,2,3,4,5)) #5

max()와 같은 내장함수는 인자의 개수와 관계없이 패킹된 인자들을 이용해서 함수를 실행할 수 있다.

이런 것은 가변인자를 이용한 것이다.

 

 

 

 

언패킹 연산자 *

 

* (asterisk) 는 시퀀스 언패킹 연산자(Sequence Unpacking Operator)로 시퀀스를 풀어 헤치는 연산자이다.

주로 튜플이나 리스트를 언패킹하는데 사용된다.

* 를 활용하여 가변인자를 만들 수 있다.

 

 

mat = [[1,2,3],
	   [4,5,6],
	   [7,8,9]]
print(*mat) #[1, 2, 3] [4, 5, 6] [7, 8, 9]

리스트에 *를 붙이면 각각의 요소들이 언패킹되어 떨어진다.

 

 

 

 

 

가변인자 *args

가변인자란 하나의 매개변수에 여러개의 인자를 넣을 수 있도록 하는 것이다. 가변 인자는 매개변수 앞에 *를 붙여서 만든다. 인자(arguments)의 args를 변수로 많이 사용한다. 

 

 

 

def print_args(*args) :
	print(args)

print_args() #()
print_args(1,2) #(1,2)

가변인자는 인자의 개수가 관계없다.

 

 

 

def print_args(arg,*args) :
    print(f'arg={arg}, args={args}')
print_args(1,2,3) #arg=1, args=(2, 3)
print_args() #TypeError: print_args() missing 1 required positional argument: 'arg'

매개변수와 가변인자를 동시에 사용할 수 있다.

매개변수가 있기 때문에 인자가 하나는 반드시 필요하게 된다.

나머지는 개수에 관계없이 가변인자로 함수가 실행된다.

 

 

 

 

def print_args(arg,*args) :
    print(f'arg={arg}, args={args}')
print_args(1,2,3,arg=4) #TypeError: print_args() got multiple values for argument 'arg'

순서대로 인자를 인식하기 때문에 1이 arg로 되었다. 이 상태에 arg=4 으로 새로운 인자를 넣어주면 오류가 발생한다.

 

 

 

 

 

def print_args(*args,arg) :
    print(f'arg={arg}, args={args}')
    
print_args(1,2,3,4) #TypeError: print_args() missing 1 required keyword-only argument: 'arg'
print_args(1,2,3,arg=4) #arg=4, args=(1, 2, 3)

가변인자와 매개변수가 있을 때 가변인자를 앞에 표기하게 되면 여러개의 인자가 모두 가변인자로 인식이 된다.

그래서 매개변수 arg는 인자를 받지 못한것으로 오류가 발생한다.

이런 경우에는 arg는 따로 지정해주어야 한다.

 

 

 

 

가변 키워드 인자 (keyword argument) **kwargs 

몇개의 키워드 인자를 받을지 모를 때 사용하는 것으로 변수 앞에 **를 붙여준다.

딕셔너리로 묶어서 처리된다.

 

 

def print_arg(arg, **kwargs):
	print(f'arg={arg}, kwargs={kwargs}')
print_arg(1,k=2,d=3) #arg=1, kwargs={'k': 2, 'd': 3}

**으로 만든 가변 키워드 인자는 딕셔너리 형태의 key, value 값이 여러개 들어올 수 있는 것이다.

 

 

 

def print_arg(**kwargs):
	for key, value in kwargs.items():
		print(f'{key}...{value}')
print_arg(k=2,d=5,j=2)

가변키워드인자는 딕셔너리로 key, value로 나누어 따로 출력할 수 있다.

 

 

 

 

def print_arg(arg,*args,**kwargs):
	print(f'arg={arg}, args={args}, kwargs={kwargs}')
print_arg(1,2,3,4,k=2,d=5,j=2) #arg=1, args=(2, 3, 4), kwargs={'k': 2, 'd': 5, 'j': 2}

매개변수, 가변인자, 가변키워드인자는 위와 같이 사용할 수 있다.