티스토리 뷰

#15 파이썬 chapter 15. 함수

 

함수를 설명하기 위해선 믹서기를 예로 들어보자. 우리는 믹서에 과일을 넣고 그 과일을 갈아서 과일 주스를 만든다. 과일은 입력이 되고 출력은 주스가 된다. 그렇다면 믹서는 무엇일까? 바로 우리가 지금부터 배우려는 함수가 믹서의 역할과 비슷하다. 

 

1.  함수를 사용하는 이유??

 

프로그래밍을 하다보면 똑같은 내용을 반복적으로 작성해야 할 때가 많다. 이 때가 바로 함수가 필요한 때이다.

즉 반복되는 부분을 한 뭉치로 묶어서 어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다 라는 식의 함수로 작성하는 것이 현명하다. 함수를 잘 활용하고 함수를 적절하게 만들 줄 아는 사람이 능력있는 프로그래머라 할 수 있다.

 

2. 파이썬 함수의 구조

 

함수의 구조는 아래와 같다. def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다. 함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다. 이렇게 함수를 정의한 다음 if, while, for문 등과 마찬가지로 함수에서 수행할 문장을 입력한다.

 

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

 

위 예제를 풀이하면 함수의 이름은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값이다.

 

여기서 return은 함수의 결괏값을 돌려주는 명령어이다.

 

def add(a, b):
    return a + b
a = 3
b = 4
c = add(a, b)
print(c)
7

 

add 함수를 사용하여 결괏값을 대입하면 print(c)로 c의 값을 확인할 수 있다.

 

2. 매개변수와 인수

 

매개변수 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다.

 

def add(a, b)    <-- a,b는 매개변수
    return a + b 
   
print(add(3,4))  <-- 3,4는 인수

 

3. 입력값과 결괏값에 따른 함수의 형태

 

함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결괏값을 돌려준다.

 

1) 일반적인 함수

 

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

 

다음 예는 일반 함수의 전형적인 예이다.

 

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

 

2) 입력값이 없는 함수

 

입력값이 없는 함수도 존재한다. 다음을 보자.

 

def say():
    return 'Hi'

 

say라는 이름의 함수를 만들었다. 하지만 매개변수 쪽이 비어있다. 이 함수는 어떻게 사용할까?

 

다음을 보자.

 

a = say()
print(a)
Hi

 

위 함수를 쓰기위해선 say() 처럼 괄호 안에 아무것도 넣지 말야아 한다. 이 함수는 입력값은 없지만 결괏값으로 Hi라는 문자열을 돌려준다.

 

3) 결괏값이 없는 함수

 

결괏값이 없는 함수도 존재한다. 다음 예를 보자.

 

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

 

결괏값이 없는 함수는 호출해도 돌려주는 값이 없기 때문에 다음과 같이 사용한다.

 

add(3, 4)

3, 4의 합은 7입니다.

 

하지만 3, 4의 합은 7입니다 라는 문장이 출력되었는데 왜 결괏값이 없다고 의아하게 생각 할 것이다. 나도 공부하면서 혼란스러웠는데 print문은 함수의 고성 요소중 하나인 '수행할 문장'에 해당하는 부분일 뿐이다. 결괏값은 당연히 없다.

결괏값은 오로지 return 명령어로 돌려받을 수 있다.

 

4) 입력값도 결괏값도 없는 함수

 

입력값과 결괏값이 없는 함수도 있다. 아래를 보자.

 

def say():
    print('Hi')

 

입력 인수를 받는 매개변수도 없고 return문도 없으니  입력값과 출력값이 없는 함수이다.

이 함수를 사용하는 방법은 아래와 같다.

 

say()
Hi

 

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

 

함수를 호출할 때 매개변수를 지정할 수도 있다. 다음 예를 보자.

 

def add (a, b):
    return a + b
result = add(a=3, b=7)
print(result)
10

 

매개변수를 사용하면 아래와 같이 순서에 상관없이 사용할 수 있다.

 

def add (a, b):
    return a + b
result = add(b=5, a=3)
print(result)
8

 

5. 입력값이 몇 개가 될지 모를때는 어떻게 해야할까?

 

입력값이 여러가지일 때 모두 더해주는 함수를 생각해 보자. 하지만 몇 개가 입력될지 모를때엔 어떻게 해야할까?

아래와 같이 매개변수 부분을 *매개변수로 바꾸면 된다.

 

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

 

위 처럼 add_many 함수는 입려값이 몇개든 상관없다. *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_many(*args) 처럼 함수의 매개변수로 *args만 사용할 수 있는 것은 아니다.

 

다음 예를 보자.

 

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('add', 1,2,3,4,5)
printe=(a)
120

 

매개변수 choice에 'add'가 입력된 경우 *args에 입력되는 모든 값을 더해서 15를 돌려주고, 'mul' 이 입력되면 *args에 입력되는 모든 값을 곱해서 120을 돌려준다.

 

6. 함수의 결괏값은 언제나 하나이다.

 

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

result = add_and_mul(3,4)

 

위처럼 return 값이 a+b, a*b 2개인데 결괏값을 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까 하는데 오류는 발생하지 않고 튜플값 하나인 (a+b, a*b)로 돌려준다.

 

따라서 변수는 다음과  같은 값을 가지가 된다.

 

result = (7, 12)

 

만약 1개의 튜플값을 2개의 결괏값처럼 받고 싶다면 다음과 같이 하면 된다.

 

result1, result2 = add_and_mul(3,4)

 

이렇게 호출하면 result1은 7이 되고 result2는 12가 된다.

 

7. 매개변수에 초깃값 미리 설정하기

 

이번에는 조금 다른 형태로 함수의 인수를 전달하는 방법에 대해서 알아보자.

 

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

 

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

 

say_myself("이재윤", 33)

나의 이름은 이재윤입니다.
나이는 33입니다.
남자입니다.

 

다음은 초기값을 False로 지정한 결과이다.

 

say_myself("이재순",32)

나의 이름은 이재순입니다.
나이는 32입니다.
여자입니다.

 

매개변수에 초깃값을 미리 설정할 때 주의해야 할 점은 초깃값을 설정할 매개변수는 항상 뒤쪽에 두어야 한다는 것을 잊지말자.

 

8. 함수 안에서 선언한 변수의 효력 범위

 

함수 안에서 사용할 변수의 이름을 함수 밖에서도 동일하게 사용한다면 어떻게 될까?

 

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

 

당연히 vartest 함수에 매개변수 a = 1 을 더했으니까 2가 출력될 것 같지만 위처럼 결괏값은 1이 나온다.

그 이유는 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 '함수만의 변수' 이기 때문이다.

 

즉 함수안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없다는 뜻이다.

 

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

 

그렇다면 vartest라는 함수를 사용해서 함수 밖의 변수 a를 1만큼 증가시킬 수 있는 방법은 없을까?

 

* return 사용하기

 

# vartest_return.py

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

 

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

 

* global 명령어 사용하기

 

# vartest_return.py

a = 1
def vartest():
    global a
    a = a + 1

 

위 예에서 볼 수 있듯이 vartest 함수 안의 global a 문장은 함수 안에서 함수 밖에 a변수를 직접 사용하겠다는 뜻이다.

 

9. lambda

 

lambda 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다. 보통 함수를 한줄로 간결하게 만들 때 사용한다.

 

사용법은 다음과 같다.

 

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

 

add는 두 개의 인수를 받아 서로 더한 값을 돌려주는 lambda 함수이다. def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 잆는 곳에 주로 쓰인다.

 

출처 :  점프 투 파이썬

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함