[점프 투 파이썬] 4장. 프로그램의 입력과 출력은 어떻게 해야할까?

정지나·2022년 6월 20일
0



5주차

2022.06.13. ~ 2022.06.19

  • 04-1 함수

함수란 무엇인가?


입력값을 가지고 어떤 일을 수행한 후 결과물을 내놓는 것이 함수가 하는 일이다. 예를 들면 믹서에 과일을 넣는 행위 속 믹서에 넣는 과일은 "입력"이 되는 것이고 과일 주스는 "출력(결과값)"이 된다. 함수는 바로 믹서가 되는데 믹서 즉 함수는 과일을 입력받아 주스를 출력해주는 역할을 한다.

함수를 사용하는 이유는 무엇일까?


첫 번째는 똑같은 내용을 반복 작성하지 않기 위해서이다. 반복적으로 사용이 되는 가치 있는 부분을 한 뭉치로 묶어 어떤 입력값을 주었을 때 이런 결과값을 돌려준다는 식으로 함수를 작성하는 것이 현명하다.
두 번째는 프로그램의 흐름을 일목요연하게 보기 위해서이다. 프로그램에서 입력한 값이 여러 함수를 거치며 원하는 결과값을 낼 수 있는데, 이렇게 되면 흐름 파악이 쉬워져 오류가 어디에서 나는지도 바로 알아차릴 수 있다.

파이썬 함수의 구조


def 함수명(매개변수): # 함수를 만들 때 사용하는 예약어, 함수 이름은 함수 만드는 사람이 임의로 정할 수 있다.
# 매개변수란? 함수에 입력으로 전달되는 값을 받은 변수이다.
    <수행할 문장1> 
    <수행할 문장2>
    ...
def add(a, b): 
    return a + b # return은 함수의 결과값을 돌려주는 명령어이다. 

위 예시는 다음과 같이 풀이된다.
"이 함수의 이름(함수 이름)은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값이다."

add 함수를 이용한 예시는 다음과 같다.

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

매개변수와 인수


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

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

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

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


함수는 들어온 입력값을 받아 처리를 해 적절한 결과값으로 돌려준다.

입력값 --> 함수 --> 결과값

함수의 형태는 입력값과 결과값의 존재 유무에 따라 4가지 유형으로 나뉜다.


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

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

add 함수는 2개의 입력값을 받아 서로 더한 결과값을 돌려준다.

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

입력값으로 3,4를 주고 결과값을 7로 돌려받았다.

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


2. 입력값이 없는 함수 입력값이 없는 함수도 존재한다.
>>> a = say()
>>> print (a)
Hi

위 함수를 쓰기 위해서는 say()처럼 괄호 안에 아무값도 넣지 않아야 한다.
이 함수는 입력값은 없지만 결과값으로 Hi라는 문자열을 돌려준다. a = say()처럼 작성하면 Hi 문자열이 대입되는 것이다.
입력값이 없고 결과값만 있는 함수는 다음과 같이 사용된다.

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


3. 결과값이 없는 함수 결과값이 없는 함수 역시 존재한다.
>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
... 
>>>

결과값 없는 함수는 호출해도 돌려주는 값이 없다.

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

즉 결과값 없는 함수는 다음과 같이 사용한다.

함수이름(입력인수1, 입력인수2)


4. 입력값도 결과값도 없는 함수
>>> def say():
...    print('Hi')
...

입력 인수를 받는 매개변수도 없고, return문도 없으니 입력값도 결과값도 없는 함수이다.
이 함수를 사용하는 방법은 단 한가지이다.

>>> say()
Hi

함수이름()


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


# 여러 개의 입력값을 모두 더하는 함수
>>> def add_many(*args): # *args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 준다.
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 
... 
>>>

add_many(1,2,3)으로 함수를 호출하면 6을 돌려주고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9,10)을 대입하면 55를 돌려준다.

>>> def add_mul(choice, *args): # *arg 매개변수 뿐만 아니라 Choice 매개변수도 추가 가능하다.  
...     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 
... 
>>>

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


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


함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가게 된다.

# add_and_mul 함수는 2개의 입력 인수를 받아 더한 값과 곱한 값을 돌려주는 함수이다.
>>> def add_and_mul(a,b): 
...     return a+b, a*b
>>> result = add_and_mul(3,4)

결과값은 a+b와 ab 2개인데 결과값을 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까? 하지만 오류는 발생하지 않는다. 그 이유는 함수의 결과값은 2개가 아니라 언제나 1개이기 때문이다. add_and_mul 함수의 결괏값 a+b와 ab는 튜플값 하나인 (a+b, a*b)로 돌려준다.

따라서 result 변수는 다음과 같은 값을 갖게 된다.

result = (7, 12)


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


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

man=True처럼 매개변수에 미리 값을 넣을 수 있다. 이것이 바로 함수의 매개변수 초기값을 설정하는 방법이다. 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초기값을 미리 설정해 두면 유용하다.

say_myself 함수는 다음처럼 사용할 수 있다.

say_myself("박응용", 27)
say_myself("박응용", 27, True)

입력값으로 "박응용", 27처럼 2개를 주면 name에는 "박응용"이 old에는 27이 대입된다. 그리고 man이라는 변수에는 입력값을 주지 않았지만 초기값 True를 갖게 된다.

따라서 위 예에서 함수를 사용한 2가지 방법은 모두 동일한 결과를 출력한다.

나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.

초기값을 False로 바꿀 시 다음과 같은 결과가 출력된다.

나의 이름은 박응용입니다.
나이는 27살입니다.
여자입니다.

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


vartest라는 함수를 사용해서 함수 밖의 변수 a를 1만큼 증가시킬 수 있는 방법에 대해 알아보겠다. 2가지 방법이 있다.


1. return 사용하기

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

a = vartest(a) 
print(a)

vartest 함수는 입력으로 들어온 값에 1을 더한값을 돌려준다. 따라서 a = vartest(a)라고 대입하면 a가 vartest 함수의 결괏값으로 바뀐다. 여기에서도 물론 vartest 함수 안의 a 매개변수는 함수 밖의 a와는 다른 것이다.

  1. global 명령어 사용하기
# vartest_global.py
a = 1 
def vartest(): 
    global a 
    a = a+1

vartest() 
print(a)

두 번째 방법은 global 명령어를 사용하는 방법이다. 위 예에서 볼 수 있듯이 vartest 함수 안의 global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻이다. 하지만 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다. 가급적으로 global 명령어를 사용하는 방법은 피하자


lambda


lambda는 함수를 생성할 때 사용하는 예약어로, def와 동일한 역할을 한다. def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

lambda 매개변수 1, 매개변수2, ...: 매개변수를 이용한 표현식

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

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

profile
폭주벨로거,, (가 될 예정)

0개의 댓글