코딩잡아먹는자바 2023. 7. 15. 18:16
728x90

<함수 구조>

def 함수 이름(매개변수):
    수행할 문장1
    수행할 문장2
    ...

def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다. 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.

 

함수의 이름은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값이다.
def add(a, b):
    return a + b # return은 함수의 결괏값을 돌려주는 명령어

예제

>>> def add(a, b)
...    return a + b

>>> a = 3
>>> b = 4
>>> c = add(a, b)
>>> print(c)
...
7

 

<매개변수와 인수>

매개변수(parameter): 함수에 입력으로 전달된 값을 받는 변수를 의미

인수(argument): 함수를 호출할 때 입력값을 의미

def add(a, b): # a, b는 매개변수
    return a + b

print(add(3, 4)) # 3, 4는 인수

 

<함수의 형태>

 

● 일반적인 함수

입력값이 있고 결괏값이 있는 함수가 일반적인 함수이다.

>>> def add(a, b):
...    result = a + b
...    return result # a + b의 결괏값 반환

>>> a = add(3, 4)
>>> print(a)
...
7

 

● 입력값이 없는 함수

결과값을 받을 변수 = 함수이름()
>>> def say():
...    return 'Hi'

>>> a = say()
>>> print(a)
...
Hi

위 코드를 보면 say라는 함수를 만들었는데 매개변수에는 비어있다. 이 같은 함수를 쓰기 위해서는 say()처럼 괄호 안에 아무 값도 넣지 않아야 한다. 이 함수는 입력값은 없지만 결괏값으로 Hi라는 문자열을 돌려준다.

 

● 결괏값이 없는 함수

함수이름(입력인수1, 입력인수2, ...)
>>> def add(a, b):
...    print("%d, %d의 합은 %d입니다." %(a, b, a+b))

>>> add(3, 4)
...
3, 4의 합은 7입니다.

결괏값이 없는 함수는 호출해도 돌려주는 값이 없다. 여기서 결괏값이 없는 함수는 return 명령어로 출력을 해야 결괏값이 나오는데 그렇지 않았기 때문에 결괏값이 없는 함수라고 한다.

 

● 입력값도 결괏값도 없는 함수

함수이름()
>>> def say():
...    print('Hi')

>>> say()
Hi

매개변수도 없고 return문도 없어서 입력값도 결괏값도 없는 함수이다.

 

<매개변수 지정하여 호출하기>

>>> def add(a, b)
...    return a + b

>>> result = add(a=3, b=7)
>>> print(result)
...
10

매개변수를 지정하면 순서에 상관없이 사용할 수 있다.

>>> result(b=7, a=3)
>>> print(result)
...
10

 

<입력값이 몇 개인지 모를 때>

def 함수이름(*매개변수):
    수행할 문장
    ...

입력값이 몇 개인지 모를 때는 매개변수에 *기호를 사용하면 된다.

>>> def add_many(*args):
...    result = 0
...    for i in args:
...        result += i
...    return result

>>> result = add_many(1, 2, 3)
>>> print(result)
6

>>> result = add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print(result)
55

 

응용 예제

>>> def add_mul(choice, *args):
...    if choice == "add": # 매개변수 choice에 'add'를 입력받았을 때
...        result = 0
...        for i in args:
...            result += i # *args에 입력받은 모든 값을 더함
...    elif choice == "mul": # 매개변수 choice에 'mul'을 입력받았을 때
...        result = 1
...        for i in args:
...            result *= i # *args에 입력받은 모든 값을 곱합
...    return result

>>> result = add_mul('add', 1, 2, 3, 4, 5)
>>> print(result)
15

>>> result = add_mul('mul', 1, 2, 3, 4, 5)
>>> print(result)
120

 

<키워드 파라미터>

키워드 파라미터는 매개변수 앞에 별 두개(**)를 붙인다.

>>> def print_kwargs(**kwargs):
...    print(kwargs)
    
>>> print_kwargs(a=1)
{'a' : 1}

>>> print_kwargs(name='kim', age=12)
{'name' : 'kim', 'age' : 12}

위 코드에서 출력된 값을 보면 모두 딕셔너리로 만들어져서 출력되었다. 이와 같이 매개변수 앞에 **을 붙이면 모든 결괏값은 key=value 형태로 출력이 된다.

 

<함수의 결괏값은 무조건 하나>

>>> def add_and_mul(a, b):
...    return a+b, a*b

>>> result = add_and_mul(3, 4)
>>> print(result)
(7, 12) # 튜플 값 1개

>>> result1, result2 = add_and_mul(3, 4)
>>> print(result1, result2)
7 12 # result1 = 7, result2 = 12

 

<매개변수에 초깃값 미리 설정하기>

>>> def say_myself(name, old, man=True):
...    print("나의 이름은 %s입니다." %name)
...    print("나이는 %d살입니다." %old)
...    if man:
...        print("남자입니다.")
...    else:
...        print("여자입니다.")

매개변수에 들어갈 값에 항상 똑같은 값으로 설정하고 싶으면 man=True와 같이 함수의 초깃값을 미리 설정해두면 된다. 만약에 "여자입니다" 라고 출력하고 싶으면 True 자리에 False를 입력하면 된다.

 

<함수 안에서 함수 밖의 변수를 변경하는 방법>

 

● return 사용하기

>>> a = 1
>>> def vartest(a):
...    a += 1
...    return a

>>> a = vartest(a)
>>> print(a)
...
2

vartest 함수는 return 함수로 인해 들어온 값에 1을 더한 값을 돌려준다. 따라서 a = vartest(a)라고 대입하면 a가 vartest 함수의 결괏값으로 바뀐다.

 

● global 명령어 사용하기

>>> a = 1
>>> def vartest():
...    global a # 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
...    a += 1
    
>>> vartest()
>>> print(a)
...
2

 

<lambda>

lambda는 함수를 생성할 때 사용하는 예약어다. 보통 함수를 한 줄로 간결하게 만들 때 사용한다. def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

lambda 매개변수1, 매개변수2, ...: 매개변수를 사용한 표현식
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
...
7

위 코드는 아래 def를 사용한 함수와 동일하다.

>>> def add(a, b):
...    return a + b
    
>>> result = add(3, 4)
>>> print(result)
...
7
728x90