본문 바로가기

Python Basic/혼공파

[혼공파] Chapter 05 함수 ①함수 만들기


  • 는 개념 정리
  •  개인적으로 새롭게 알게 된 점 

Chapter 4까지 자료, 조건문, 반복문에 대해서 살펴보았음. 이는 프로그래밍의 논리와 관련된 가장 핵심적인 부분.
Chapter 5부터는 '프로그래밍을 어떻게 더 쉽게 만들 것인가'와 관련됨. 

5-1. 함수 만들기

[용어 정리]

  • 함수를 사용한다 = 함수를 호출한다.
  • 매개변수: 함수를 호출할 때 괄호 내부에 넣는 여러가지 자료
    • 매개변수는 함수를 생성할 때, 괄호 내부에 식별자를 입력해서 만듦.
  • 리턴값: 함수를 호출해서 최종적으로 나오는 결과

매개변수와 관련된 TypeError

함수를 호출할 때는, 함수를 선언할 때와 같은 개수의 매개 변수를 입력해야 함. 

  • 함수 호출 시, 생성한 매개변수보다 매개변수를 적게 넣은 경우
TypeError: print_n_times() missing 1 reqiured positional argument: 'n'

 

  • 함수 호출 시, 생성한 매개변수보다 매개변수를 더 넣은 경우
TypeError: print_n_times() takes 2 positional arguments but 3 were given

매개변수

함수를 호출하는데 사용하는 파이썬의 매개변수에는 4가지 유형이 있음.

  1. 위치 매개변수 (Positional Arguments, 일반 매개변수라고도 함)
  2. 기본 매개변수 (Default Arguments)
  3. 키워드 매개변수 (Keyword Arguments)
  4. 가변 매개변수 (Arbitrary Arguments)

1. 위치 매개변수 (Positional Arguments)

  • 함수 내 매개변수의 위치 순서와 데이터 타입에 맞게 정확하게 입력을 해 주어야만 하는 매개변수. 

2. 기본 매개변수 (Default Arguments)

  • 함수를 호출 할 때, 매개변수 입력이 없을 경우에 함수를 정의할 때 입력한 기본값 (default value)을 사용할 수 있게 해 줌. 
    • 함수를 정의할 때 기본값 설정이 안 된 상태에서, 함수 호출 시 매개변수 값 입력을 빼 먹으면 TypeError가 나는데, 기본값 매개변수를 사용하면 TypeError 없이 사용할 수 있음. 
  • 단, 기본 매개변수 뒤에는 일반 매개변수(위치 매개변수)가 올 수 없음
    • SyntaxError: non-default argument follows default argument 에러 발생. 
    • 책이랑 따로 찾아본 내용이랑 모두 혼합되어 있어서: 위치 매개변수 == 일반 매개변수 임. 

즉, 다음과 같이 사용될 수 없음. 

# Wrong
def print_n_times(n=2, value)
    for i in range(n):
        print(value)

 

CODE

def print_me(company, name = "Who?"): #name='Who?' 기본 매개변수
    print("Company:", company)
    print("Name:", name)
    
    
print_me(company = "ABC Co.")

OUTPUT

Company: ABC Co.
Name: Who?
  • name 매개변수를 입력하지 않았음에도 불구하고, 'Who?' 출력.

3. 키워드 매개변수 (Keyword Arguments)

  • 함수를 호출 할 때, 매개변수의 이름(parameter name)으로 매개변수를 지정함. 
  • 만약 키워드 매개변수를 사용하지 않는다면, 입력 순서와 데이터 타입을 꼭 함수에서 정의한 순서와 맞추어야 함. 
    • e.g. 회사명 (company)과 임직원 이름 (name)을 출력하는 함수에서 매개변수 순서를 바꾸어서 입력했음에도 불구하고 출력은 함수에서 정의했던 순서대로 출력되었음을 알 수 있음. 

CODE 1

def print_me (company, name):
    print("Company:", company)
    print("Name:", name)
    
print_me(company='ABDC Co.', name='Mr.Jack')
print()

print_me(name='Mr.Jack', company='ABC Co.')

OUTPUT 1

Company: ABCD Co.
Name: Mr.Jack

Company: ABC Co.
Name: Mr.Jack

 

만약 키워드 함수를 사용하지 않는다면 아래와 같이 출력됨. 

CODE 2

print('ABCD Co.', 'Mr.Jack')
print()

print('Mr.Jack', 'ABC Co.')

OUTPUT 2

Company: ABCD Co.
Name: Mr.Jack

Company: Mr.Jack
Name: ABC Co.

4. 가변 매개변수 (Arbitrary Arguments)

  • 매개변수 수가 상황에 따라서 변화하는 매개변수
    • 대표적인 예, print()
  • 위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변 매개변수 사용함. 
  • 가변 매개변수는 2가지 종류가 있음
    1. *args_tupe: Positional 매개변수 (Tuple)
      • 임의 개수의 positional 매개변수를 tuple 형태의 변수로 저장
    2. **args_dick: 키워드 매개변수 (Dictionary)
      • 임의 개수의 keyword 매개변수를 dictionary 형태의 변수로 저장

Python Arbitrary Arguments

1. *args_tuple: Positional 매개변수 (Tuple 형태)

  • 괄호 안의 매개변수 입력란에 '* (Asterisk)'로 시작하는 매개변수 이름을 넣어줌. 이 가변 매개변수는 Tuple 형태. 
  • 가변 매개변수는 리스트처럼 사용하면 됨. 

*args_tuple

이 때, 사전형 (Dictionary Type)을 매개변수로 받아서 print 한다면?

정상 출력
TypeError 발생

  • 여러 개의 사전형 값을 매개변수 값으로 입력하면 TypeError 발생
    • TypeError: print_group() got an unexpected keyword argument 'A'
  • 매개변수 값으로 다수 개의 사전형 값을 사용하고 싶을 때, **agrs_dick의 가변형 매개변수를 사용함.

2. **args_dict: 키워드 매개변수 (Dictionary 형태)

  • Dictionary의 Key 값이 키워드 매개변수의 keyword가 됨. 
  • 파이썬 라이브러리의 함수들을 보다 보면, **kwagrs 라고 표현된 경우가 있는데, 이 때 kw가 KeyWord의 kw 임. 

**args_dict

* 순서: *args_tuple 먼저, **args_dict 나중에 *

  • *args_tuple과 **args_dict 두 가지 유형의 가변 매개변수를 모두 사용하여 함수를 정의할 수 있음. 
  • 단 이 때, *args_tuple 을 먼저 정의하고, **args_dict를 나중에 이어서 정의해야 함. 
    • **args_dict을 먼저 정의하면, 'SyntaxError: invalid syntax' 에러 발생. 

* first, ** second
** fisrt, * second (SyntaxError)

* 가변 매개변수 주의 사항 *

  • 가변 매개변수 뒤에는 일반 매개변수 (위치 매개변수)가 올 수 없음.
    • 책에서는 일반 매개변수라고 칭하고 있어 그대로 가져옴. 이는 위치 매개변수를 의미함. 
  • 가변 매개변수는 하나만 사용할 수 있음. (책에서는 *args_tuple 만을 설명하고 있기 때문에 하나만 사용할 수 있다고 하였지만, *args_tuple과 **kwargs_tuple 2개를 사용할 수 있음)

리턴 (Return) 키워드

  • 함수의 결과
  • '자료 없이 리턴하기'와 '자료와 함께 리턴하기' 2가지 종류가 있음. 

1. 자료 없이 리턴하기

  • 함수를 실행했던 위치로 돌아가라는 뜻
  • 함수가 끝나는 위치

CODE

def return_test():
    print("a 위치")
    return 
    print("b 위치")
    
    
return_test()

OUTPUT

a 위치

2. 자료와 함께 리턴하기

  • 리턴 뒤에 자료를 입력하면 자료를 가지고 리턴함. 

CODE

def return_test():
    return 100
    
value = return_test()
print(value)

OUTPUT

100

아무것도 리턴하지 않기

CODE

def return_test():
    return
    
value = return_test()
print(value)

OUTPUT

None

 

기본적인 함수의 활용

  • 일반적으로 초깃값을 설정할 때는, 연산을 해도 값에 아무런 변화를 주지 않는 것을 사용.
    • 덧셈식: 0
    • 곱셈식: 1