입출력 1. 함수

변현섭·2023년 7월 27일
0

Ⅲ. 입출력

1. 함수

1) 함수의 구조

def 키워드를 이용해 함수를 만들 수 있다. 다른 프로그래밍 언어와 비교되는 점은 함수의 반환 타입을 명시하지 않는다는 것이다.

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

2) 함수의 정의와 사용

① 일반적인 함수

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

함수의 사용 방법은 C/C++, Java와 동일하다.

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

당연히 입력 값이나, 리턴 값이 없는 함수도 있을 수 있다.

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

② 매개변수를 지정하여 호출

  • 매개변수를 직접 지정하여 사용할 경우, 입력 값을 명시할 수 있고 순서와 무관하게 함수의 입력 값을 줄 수 있다. 다만, 입력 값의 순서는 특별한 경우가 아니라면 지켜주는 것이 좋다.
>>> result = sub(b=5, a=3)  # b에 5, a에 3을 전달
>>> print(result)
-2

③ 가변 인수

  • 입력 값이 몇 개일지 모르는 경우에 함수를 정의하기 위해 가변 인수를 사용한다.
  • C/C++과 Java에서는 ...으로 가변인수를 나타냈었지만, 파이썬에서는 *로 나타낸다.
>>> 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

④ kwargs

  • 키워드 매개변수는 **로 사용할 수 있다.
  • 여기서 키워드 매개변수는 key-value의 딕셔너리 형태로 입력 값을 저장한다.
>>> def print_kwargs(**kwargs):
...     print(kwargs)

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

3) Multiple Return

다른 언어에서는 볼 수 없던 파이썬만의 특별한 기능이 또 있다. 아래의 예시를 보자.

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

C/C++, Java에서는 상상도 못했을 문법이지만, 파이썬에서는 가능하다. 그럼 위 함수의 실행 결과는 어떻게 될까?

>>> result = add_and_mul(3,4)
result = (7, 12)

result는 튜플의 형태를 갖게 된다. 이는 함수의 반환타입을 명시하지 않기 때문에 가능한 것이다. 즉, 위의 쉼표를 튜플의 소괄호를 생략된 형태로 인식하고 있는 것이다. 물론, 에러가 안난다는 것이지, 이런 식으로 작성하는 것은 좋은 방법이 아니다. 아래와 같이 튜플 값을 분리하여 받아주는 것이 일반적이다.

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

C/C++이나 Java였다면, 한 함수에서 두 개의 반환 값을 주기 위해 명시적으로 ArrayList나 Array를 사용해야 했을 것이다. 그 후, 배열의 인덱싱 연산으로 값을 가져와 result1과 result2에 저장해야 한다. 이러한 부분에서 파이썬이 왜 강한 언어인지, 또한 왜 코딩 테스트에 유리한 언어로 손꼽히는지가 여실히 드러난다.

4) 매개변수 초기 값 설정

매개변수의 초기 값을 넣는 것은 C/C++, Java에서도 사용가능한 문법인데, 초기 값을 주는 경우는 자주 있다. 예를 들면, 유저를 생성할 때, 유저의 계정 상태를 의미하는 status는 굳이 입력받지 않아도 Active라는 것을 알 수 있기 때문에 초기 값으로 설정해두는 경우가 많다. 물론 초기 값을 주는 방법은 이외에도 여러가지이기 때문에, 꼭 아래의 방법을 고집할 필요는 없지만, 초기 값(또는 기본 값)을 설정하는 방법 한 가지정도는 알아두는 게 좋다.

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

위 방식에서 주의해야 할 것은 가변인수와 마찬가지로, 초기 값이 설정된 값이 맨 뒤에 나와야 한다는 것이다. 예를 들어, (name, man=True, old)와 같은 방식으로 작성하면 이는 에러를 발생시킨다.

5) 전역변수

global 키워드를 사용하여 변수를 전역변수화시킬 수 있다. 하지만, 언제나 그래왔듯 전역 변수 사용은 그다지 권장되지 않는다.

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

vartest() 
print(a)

6) 람다식

lambda라는 키워드는 def와 같이 함수를 생성하기 위한 예약어로, def에 비해 간결한 방법으로 함수를 생성한다. 즉, 단순한 함수에 대해서는 lambda 키워드로 함수를 생성하는 것이 코드를 짧게 만드는 데 도움을 줄 수 있다.

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

확실히 def에 비해 간결한 문법을 제공한다. 참고로, Java의 람다식은 입력 값을 괄호로 묶고, 입력 값과 반환 값 사이에 ->를 두지만, 파이썬의 경우 입력 값을 묶을 필요가 없고, -> 대신 :을 사용한다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글