본문 바로가기
Python/파이썬 기초

[4-1] 함수

by 준보틱스 2024. 6. 30.

함수

함수는 어떤 입력값을 가지고 어떤 일을 수행한 후 그 결과물을 출력한다. y = 2x + 3 이라는 함수를 생각해보면, 입력값 x에 따라 출력값 y 이 변하는 함수다.

함수를 사용하는 이유

프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성하는 경우가 종종 있다. 이때 함수가 필요하다. 반복되는 부분이 있을 경우, '반복적으로 사용되는 가치 있는 부분'을 한 뭉치로 묶어 '어떤 입력값을 주었을 때 어떤 결괏값을 리턴해 준다'라는 식의 함수로 작성하는 것이다.

함수를 사용하는 또 다른 이유는 자신이 작성한 프로그램을 기능 단위의 함수로 분리해 놓으면 프로그램 흐름을 일목요연하게 볼 수 있기 때문이다. 프로그램에서 입력한 값이 여러 함수를 거치면서 원하는 결괏값을 내는 것을 볼 수 있다. 이렇게 되면 프로그램의 흐름을 잘 파악할 수 있고 오류가 어디에서 나는지도 쉽게 알아차릴 수 있다.

프로그래밍에의 함수에서는 입력 또는 출력이 없거나 입출력 전부 없을 수 있는 특징이 있다.

파이썬 함수 구조

(1) 파이썬 함수 일반 구조
>>> def sum(a, b):
        result = a + b
        return result
>>> print(sum(1,2))

(2) 입력값이 없는 함수
>>> def say():
        return 'hi'
>>> print(say())
hi

(3) 리턴값이 없는 함수
>>> def sum(a, b):
        print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>> print(sum(1, 2))
1, 2의 합은 3입니다.
None

(4) 입력값, 리턴값이 없는 함수
>>> def say():
       print('hi')
>>> print(say())
hi
None

(5) 매개변수를 지정해 호출
>>> def sub(a, b):
        return a - b
    result = sub(a=6, b=3)
>>> print(result)
3

입력값이 여러 개인 함수 구조

(1) 여러개의 입력값 (*args는 key, value를 받는 형식을 제외한 모든 형식을 개수 상관없이 인자로 받는다)
>>> def sum_many(*args):
       sum = 0
       for i in args:
           sum = sum + i
       return sum
>>> print(sum_many(1,2,3))
6

(2) *args를 이용해 여러개의 입력값과 여러개의 매개변수
- 매개변수 choice에 "add"을 입력받았을 때
>>> def add_mul(choice, *args):
        if choice == "add":             # 매개변수 choice에 "add"을 입력받았을 때
            result = 0
            for i in args:
                result = result + i
        elif choice == "mul":           # 매개변수 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

- 매개변수 choice에 "mul"을 입력받았을 때
>>> def add_mul(choice, *args):
        if choice == "add":             # 매개변수 choice에 "add"을 입력받았을 때
            result = 0
            for i in args:
                result = result + i
        elif choice == "mul":           # 매개변수 choice에 "mul"을 입력받았을 때
            result = 1
            for i in args:
                result = result * i
       return result
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

(3) 여러개의 입력값 (*kwarg는 key, value를 받는 형식의 인자를 개수 상관없이 받는다)
>>> def print_kwargs(**kwargs):
        print(kwargs)
>>> print_kwargs(name='park', age=26)
{'name': 'park', 'age': 26}

함수의 리턴 값은 하나

(1) 여러 개의 값을 튜플 형태로 나타내고 결국 리턴 값은 하나이다.
>>> def sum_and_mul(a,b):
        return a+b, a*b
>>> print(sum_and_mul(1,2))
(3, 2)

(2) 여러 개의 값을 튜플 형태로 나타내고 인덱싱으로 원하는 부분만 출력
>>> def sum_and_mul(a,b):
        return a+b, a*b
>>> print(sum_and_mul(1,2)[0])
3

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

(1) 원래 일반적인 형태(매개변수 순서를 맞추어야함)
>>> def say_myself(name, age, man):
        print("my name is %s." % name)
        print("I am %d years old. % age)
        if man:
            print("I'm a man.")
        else:
            print("I'm a women.")
>>> say_myself("park", 26, "man")
my name is park.
I am 26 years old.
I'm a man.

(2) 매개변수 "man"을 True로 미리 설정 (True로 지정하는 매개변수는 맨 뒤에 있어야함, 순서 중요)
>>> def say_myself(name, age, man=True):
        print("my name is %s." % name)
        print("I am %d years old. % age)
        if man:
            print("I'm a man.")
        else:
            print("I'm a women.")
>>> say_myself("park", 26)
my name is park.
I am 26 years old.
I'm a man.

(3) 매개변수 순서 안 맞출 수 있는 방법
>>> def say_myself(name, age, man=True):
        print("my name is %s." % name)
        print("I am %d years old. % age)
        if man:
            print("I'm a man.")
        else:
            print("I'm a women.")
>>> say_myself(age=26, name="park")
my name is park.
I am 26 years old.
I'm a man.

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

ex.
>>> a = 1
>>> def vartest(a)
        a = a + 1
>>> vartest(a)
>>> print(a)
1

 

위 코드를 보면 2가 출력될 것 같지만, 프로그램을 실행해 보면 리턴 값은 1이 나온다. 그 이유는 함수 안에서 사용하는 매개변수는 함수 안에서만 사용하는 '함수만의 변수'이기 때문이다. 즉, def vartest(a) 에서 입력값을 전달받은 매개변수 a는 함수 안에서만 사용하는 변수일 뿐, 함수 밖의 변수는 a와는 전혀 상관없다.

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

(1) return 사용
>>> a = 1
>>> def vartest(a):
        a = a + 1
        return a
>>> a = vartest(a)
>>> print(a)
2

(2) global 명령어 사용
>>> a = 1
>>> def vartest():
        global a
        a = a + 1
>>> vartest()
>>> print(a)
2

Immutable vs Mutable

  • Immutable : 정수, 실수, 문자열, 튜플 (변하지 않음)
  • Mutable : 리스트, 딕셔너리, 집합 (변할 수 있음)
(1) Immutable
>>> a = 1
>>> def vartest(a):
        a = a + 1
>>> vartest(a)
>>> print(a)
1

(2) Mutable
>>> b = [1,2,3]
>>> def  vartest(b):
         b = b.append(4)
>>> vartest2(b)
>>> print(b)
[1, 2, 3, 4]

lambda 예약어

lambda는 함수를 생성할 때 사용하는 예약어로, def와 동일한 역할을 한다. 보통 함수를 한 줄로 간결하게 만들 때 사용한다. 우리말로 '람다'라고 읽고 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에서 주로 쓰인다.

- def를 사용해서 표현
>>> def add(a,b):
        return a+b
>>> print(add(1,2))
3

- lambda 이용해서 표현
>>> add = lambda a,b: a+b
>>> print(add(1,2))
3

- 리스트 안에 함수 넣기
>>> mylist = [lambda a, b: a+b, lambda a, b: a*b]
>>> print(mylist[0](1,2))
3

'Python > 파이썬 기초' 카테고리의 다른 글

[5-1] 클래스  (0) 2024.06.30
[4-2] 사용자 입출력  (0) 2024.06.30
[1-1] 변수  (0) 2024.06.29
[3-3] for문  (0) 2024.06.29
[3-2] while문  (0) 2024.06.29