본문 바로가기

Programming/Phython

[파이썬] 13. 함수

반응형

프로그램의 흐름을 파악하기 쉽게 하기 위해서 함수를 사용한다.

 

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

add함수 정의

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

add함수의 호출

 

매개변수와 인수

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

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

매개변수는 함수에 입력으로 전달된 값을 받는 변수

인수는 함수를 호출할 때 전달하는 입력값

 

 

1. 일반적인 함수

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

a = add(3, 4)
print(a)

결과값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)

 

 

2. 입력값이 없는 함수

>>> def say(): 
...     return 'Hi' 
... 
>>>

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

결과값을 받을 변수 = 함수이름()

 

3. 결과값이 없는 함수

>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
... 

>>> a = add(3, 4)
>>> print(a)
None

결과값은 return명령어로만 돌려받을 수 있다.

 

4. 입력값도 결과값도 없는 함수

>>> def say(): 
...     print('Hi')
... 
>>>
>>> say()
Hi

 

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

>>> def add(a, b):
...     return a+b
... 
>>> result = add(b=5, a=3)  # b에 5, a에 3을 전달
>>> print(result)
8

매개변수를 지정하는 경우 순서에 상관없이 사용 가능하다.

 

입력값의 개수를 모르는 경우

def 함수이름(*매개변수): 
    <수행할 문장>
    ...
>>> def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 
... 
>>>

*args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어서 입력값의 개수를 자동으로 지정해준다.

>>> def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = 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": 
...         result = 0 
...         for i in args: 
...             result = result + i 
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i 
...     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

 

키워드 파라미터 kwargs

>>> def print_kwargs(**kwargs):
...     print(kwargs)
...

>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}

**kwargs처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.

 

함수의 결과값은 하나

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

>>> result = add_and_mul(3,4)

>>> result1, result2 = add_and_mul(3, 4)

첫번째 result는 a+b a*b는 튜플값 하나인 (7,12)로 돌려준다.

하지만 두번째는 result1은 7이 되고 result2는 12가 된다.

return a+b

return a*b

 

return의 또 다른 쓰임새 => 함수를 빠져나가기 위한 방법

>>> def say_nick(nick): 
...     if nick == "바보": 
...         return 
...     print("나의 별명은 %s 입니다." % nick)
... 
>>>
>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보')
>>>

입력값으로 '바보'라는 값이 들어오면 문자열을 출력하지 않고 함수를 즉시 빠져나간다.

 

매개변수에 초기값 미리 설정하기 => 다른 형태로 함수의 인수를 전달하는 방법

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

함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초깃값을 미리 설정해 두면 유용하다.

 

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

27을 man 변수와 old 변수 중 어느 곳에 대입해야 할지 알 수 없어 오류가 발생한다.

따라서 초기화시키고 싶은 매개변수는 항상 뒤쪽에 놓아야 한다.

 

 

함수 안에서 선언한 변수의 효력 범위 => 함수 안에서 사용할 변수를 함수 밖에서도 사용하기 위한 방법

# vartest.py
a = 1
def vartest(a):
    a = a +1

vartest(a)
print(a)

 def vartest(a)에서 입력값을 전달받는 매개변수 a는 함수 안에서만 사용하는 변수이지 함수 밖의 변수 a가 아니다.

# vartest_error.py
def vartest(a):
    a = a + 1

vartest(3)
print(a)

print(a)에서 입력받아야 하는 a 변수는 존재하지 않기 때문에 오류가 발생한다.

 

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

1. return 사용하기

# vartest_return.py
a = 1 
def vartest(a): 
    a = a +1 
    return a

a = vartest(a) 
print(a)

a = vartest(a)라고 대입하면 a가 vartest 함수의 결과값으로 바뀐다.

vartest 함수 안의 a 매개변수는 함수 밖의 a와는 다른 변수이다.

 

2. global 명령어 사용하기

# vartest_global.py
a = 1 
def vartest(): 
    global a 
    a = a+1

vartest() 
print(a)

외부 변수에 종속적인 함수는 좋은 함수가 아니기 때문에, 함수는 독립적으로 존재하도록 해야한다.

global 명령어를 사용하는 것보다 return을 사용하는 것이 좋다.

 

 

lambda

lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다.

>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7

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

lambda 함수는 return 명령어가 없어도 결과값을 돌려준다.

반응형

'Programming > Phython' 카테고리의 다른 글

[파이썬] 15. 파일 읽고 쓰기  (0) 2021.02.15
[파이썬] 14. 사용자 입력과 출력  (0) 2021.02.15
[파이썬] 조건문 정리  (0) 2021.02.14
[파이썬] 12. for문  (0) 2021.02.14
[파이썬] 11. while문  (0) 2021.02.14