Python 3에서 함수 정의하는 방법

소개

A function is a block of instructions that performs an action and, once defined, can be reused. Functions make code more modular, allowing you to use the same code over and over again.

파이썬에는 여러 내장 함수가 있습니다. 여러분이 익숙할 수 있는 몇 가지는 다음과 같습니다:

  • print() – 객체를 터미널에 인쇄합니다
  • int() – 문자열 또는 숫자 데이터 유형을 정수 데이터 유형으로 변환합니다
  • len() – 객체의 길이를 반환합니다

함수 이름에는 괄호가 포함되며 매개변수가 포함될 수 있습니다.

이 튜토리얼에서는 코딩 프로젝트에서 사용할 사용자 정의 함수를 정의하는 방법에 대해 알아보겠습니다.

전제 조건

컴퓨터 또는 서버에 Python 3가 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경이 설정되어 있지 않은 경우 운영 체제(Ubuntu, CentOS, Debian 등)에 적합한 로컬 프로그래밍 환경 또는 서버용 프로그래밍 환경 설치 및 설정 가이드를 참조할 수 있습니다.

함수 정의하기

우리는 고전적인 “Hello, World!” 프로그램을 함수로 바꾸는 것으로 시작합시다.

우리는 선택한 텍스트 편집기에서 새로운 텍스트 파일을 만들고 프로그램을 hello.py라고 부를 것입니다. 그런 다음 함수를 정의할 것입니다.

A function is defined by using the def keyword, followed by a name of your choosing, followed by a set of parentheses which hold any parameters the function will take (they can be empty), and ending with a colon.

정보: 이 자습서의 예제 코드를 따라하려면 python3 명령을 실행하여 로컬 시스템에서 Python 대화형 셸을 엽니다. 그런 다음 >>> 프롬프트 뒤에 예제를 추가하거나 복사하여 붙여넣을 수 있습니다.

이 경우에는 hello()라는 함수를 정의할 것입니다:

hello.py
def hello():

이는 함수를 생성하기 위한 초기 명령문을 설정합니다.

여기서부터, 함수가 무엇을 하는지에 대한 지시사항을 제공하기 위해 들여쓰기가 된 두 번째 줄을 추가할 것입니다. 이 경우에는 콘솔에 Hello, World!를 출력할 것입니다:

hello.py
def hello():
    print("Hello, World!")

우리의 함수는 이제 완전히 정의되었지만, 이 시점에서 프로그램을 실행해도 아무 일도 일어나지 않습니다. 왜냐하면 우리가 함수를 호출하지 않았기 때문입니다.

따라서 정의된 함수 블록 외부에서 hello() 함수를 호출합시다:

hello.py
def hello():
    print("Hello, World!")

hello()

이제 프로그램을 실행해 봅시다:

  1. python hello.py

다음 출력을 받아야 합니다:

Output
Hello, World!

함수는 위에서 정의한 hello() 함수보다 더 복잡할 수 있습니다. 예를 들어, 함수 블록 내에서 for 루프, 조건문 등을 사용할 수 있습니다.

예를 들어, 아래에 정의된 함수는 입력 값인 name 변수에 모음이 포함되어 있는지 확인하는 조건문을 사용하고, 그런 다음 name 문자열의 문자를 반복하는 for 루프를 사용합니다.

names.py
# 함수 이름 정의
def names():
    # 입력으로 name 변수 설정
    name = str(input('Enter your name: '))
    # name에 모음이 있는지 확인
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')

    # name 반복
    for letter in name:
        print(letter)

# 함수 호출
names()

위에서 정의한 names() 함수는 조건문과 for 루프를 설정하여 코드가 함수 정의 내에서 어떻게 구성될 수 있는지 보여줍니다. 그러나 우리의 프로그램이 의도하는 바와 코드를 어떻게 설정하고자 하는지에 따라, 조건문과 for 루프를 두 개의 별도 함수로 정의할 수도 있습니다.

프로그램 내에서 함수를 정의하면 코드가 모듈식이 되어 재사용 가능하므로 동일한 함수를 다시 작성하지 않고 호출할 수 있습니다.

매개 변수 사용

지금까지 우리는 인수를 가져 오지 않는 빈 괄호로 함수를 살펴 보았지만, 함수 정의에서 괄호 안에 매개 변수를 정의 할 수 있습니다.

A parameter is a named entity in a function definition, specifying an argument that the function can accept.

add_numbers.py
def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    print(a, b, c)

add_numbers(1, 2, 3)

x, y, 그리고 z를 매개 변수로 사용하는 작은 프로그램을 만들어 보겠습니다. 다른 구성으로 매개 변수를 추가하는 함수를 만들겠습니다. 이들의 합계는 함수에 의해 인쇄 될 것입니다. 그런 다음 함수를 호출하고 숫자를 함수에 전달하겠습니다.

우리는 x 매개 변수에 숫자 1, y 매개 변수에 숫자 2, z 매개 변수에 숫자 3을 전달했습니다. 이 값들은 주어진 순서대로 각 매개 변수와 일치합니다.

a = 1 + 2
b = 1 + 3
c = 2 + 3

프로그램은 주어진 매개 변수에 전달된 값에 따라 다음 수학을 수행합니다:

  1. python add_numbers.py
Output
3 4 5

add_numbers() 함수에 1, 2, 그리고 3을 매개 변수로 전달 할 때, 예상 한 출력을받습니다.

매개변수는 일반적으로 함수 정의 내에서 변수로 정의되는 인수입니다. 메소드를 실행할 때 인수를 함수에 전달하여 값을 할당할 수 있습니다.

키워드 인수

매개변수를 순서대로 호출하는 것 외에도 함수 호출 시 키워드 인수를 사용하여 호출자가 매개변수 이름으로 인수를 식별할 수 있습니다.

키워드 인수를 사용하면 Python 인터프리터가 제공된 키워드를 사용하여 값을 매개변수에 매핑하기 때문에 순서에 상관없이 매개변수를 사용할 수 있습니다.

이제 사용자의 프로필 정보를 표시하는 함수를 만들어 보겠습니다. 이를 위해 문자열로 의도된 username과 정수로 의도된 followers 형식으로 매개변수를 전달할 것입니다.

profile.py
# 매개변수가 있는 함수 정의
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

함수 정의 문 내에서 profile_info() 함수의 괄호 안에 usernamefollowers가 포함되어 있습니다. 함수의 블록은 두 개의 매개변수를 사용하여 사용자에 대한 정보를 문자열로 출력합니다.

이제 함수를 호출하고 매개변수를 할당할 수 있습니다:

profile.py
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# 위와 같이 매개변수를 할당하여 함수 호출
profile_info("sammyshark", 945)

# 키워드 인수를 사용하여 함수 호출
profile_info(username="AlexAnglerfish", followers=342)

첫 번째 함수 호출에서는 사용자 이름이 sammyshark이고 팔로워가 945인 정보를 채웠고, 두 번째 함수 호출에서는 키워드 인수를 사용하여 인수 변수에 값을 할당했습니다.

프로그램을 실행해 봅시다:

  1. python profile.py
Output
Username: sammyshark Followers: 945 Username: AlexAnglerfish Followers: 342

결과는 두 사용자의 사용자 이름과 팔로워 수를 보여줍니다.

이는 매개변수의 순서를 수정할 수 있도록도 허용하며, 다음과 같은 예제의 프로그램에서도 다른 호출로 순서를 변경할 수 있습니다:

profile.py
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# 매개변수의 순서 변경
profile_info(followers=820, username="cameron-catfish")

다음과 같은 명령으로 프로그램을 다시 실행하면, 다음과 같은 출력을 받게 됩니다:

Output
Username: cameron-catfish Followers: 820

함수 정의는 print() 문의 순서를 유지하므로 키워드 인수를 사용하면 함수 호출에 어떤 순서로 전달하든 상관 없습니다.

기본 인수 값

하나 또는 둘 모두에 대한 기본값을 제공할 수도 있습니다. followers 매개변수에 값이 1인 기본값을 만들어 보겠습니다:

profile.py
def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

이제 사용자 이름 함수만 할당하여 함수를 실행할 수 있으며, 팔로워 수는 자동으로 기본값 1로 설정됩니다. 또한 원하는 경우 팔로워 수를 여전히 변경할 수 있습니다.

profile.py
def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

profile_info(username="JOctopus")
profile_info(username="sammyshark", followers=945)

python profile.py 명령어로 프로그램을 실행하면 다음과 같은 출력을 받게 됩니다:

Output
Username: JOctopus Followers: 1 Username: sammyshark Followers: 945

기본값을 갖는 매개변수를 제공하면 이미 기본값을 가진 각 인수의 값을 정의하는 것을 건너뛸 수 있습니다.

값 반환하기

함수에 매개변수 값을 전달할 수 있으며, 함수는 또한 값을 생성할 수 있습니다.

A function can produce a value with the return statement, which will exit a function and optionally pass an expression back to the caller. If you use a return statement with no arguments, the function will return None.

지금까지 함수에서 print() 문을 사용했습니다. 대신에 return 문을 사용하는 프로그램을 만들어보겠습니다.

square.py라는 새 텍스트 파일에서, 매개변수 x를 제곱하고 변수 y를 반환하는 프로그램을 만들 것입니다. 우리는 3을 전달하여 square() 함수를 실행하여 형성된 result 변수를 출력합니다.

square.py
def square(x):
    y = x ** 2
    return y

result = square(3)
print(result)

프로그램을 실행하고 결과를 받을 수 있습니다:

  1. python square.py
Output
9

정수 9가 출력되며, 이는 Python에 3의 제곱을 찾도록 요청한 것과 일치합니다.

return 문이 작동하는 방식을 더 잘 이해하기 위해 프로그램에서 return 문을 주석 처리할 수 있습니다:

square.py
def square(x):
    y = x ** 2
    # return y

result = square(3)
print(result)

이제 프로그램을 다시 실행해 보겠습니다:

  1. python square.py
Output
None

여기서 return 문을 사용하지 않으면 프로그램이 값을 반환할 수 없으므로 값이 None으로 기본 설정됩니다.

다른 예로, 위의 add_numbers.py 프로그램에서 print() 문을 return 문으로 바꿀 수 있습니다.

add_numbers.py
def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    return a, b, c

sums = add_numbers(1, 2, 3)
print(sums)

함수 외부에서는, 우리는 변수 sums를 위해 함수의 결과로서 1, 2, 그리고 3을 넣어준 것처럼 설정했습니다. 그런 다음 sums 변수를 출력했습니다.

이제 return 문이 있는 프로그램을 다시 실행해 봅시다:

  1. python add_numbers.py
Output
(3, 4, 5)

우리는 함수 내부에서 print() 문을 사용하여 이전에 받았던 것과 동일한 숫자인 3, 4, 그리고 5를 출력합니다. 이번에는 return 문의 식 목록이 최소한 하나의 쉼표를 가지고 있기 때문에 튜플로 전달됩니다.

return 문을 만나면 함수는 즉시 종료되며 값이 반환되는 여부에 상관없이 종료됩니다.

return_loop.py
def loop_five():
    for x in range(0, 25):
        print(x)
        if x == 5:
            # x == 5에서 함수를 중단합니다.
            return
    print("This line will not execute.")

loop_five()

for 루프 내에서 return 문을 사용하면 함수가 종료되므로 루프 외부에 있는 줄이 실행되지 않습니다. 대신 break을 사용한 경우에는 루프만 해당 시점에서 종료되고 마지막 print() 줄이 실행됩니다.

return 문은 함수를 종료하며, 매개변수와 함께 사용될 때 값을 반환할 수 있습니다.

main()을 함수로 사용하기

파이썬에서는 프로그램의 맨 아래에서 함수를 호출하여 실행할 수 있지만 (위의 예제에서 한 것처럼), C++ 및 Java와 같은 많은 프로그래밍 언어는 실행을 위해 main 함수가 필요합니다. main() 함수를 포함하는 것은 필수는 아니지만, 프로그램의 가장 중요한 구성 요소를 하나의 함수로 구조화할 수 있습니다. 또한, 이렇게 하면 파이썬 이외의 프로그래머도 우리의 프로그램을 쉽게 읽을 수 있습니다.

우리는 위의 hello.py 프로그램에 main() 함수를 추가하는 것부터 시작하겠습니다. hello() 함수를 유지한 채로, main() 함수를 정의하겠습니다:

hello.py
def hello():
    print("Hello, World!")

def main():

main() 함수 내부에는 main() 함수에 있는지를 알려주는 print() 문을 포함하겠습니다. 또한, main() 함수 내에서 hello() 함수를 호출하겠습니다:

hello.py
def hello():
    print("Hello, World!")


def main():
    print("This is the main function")
    hello()

마지막으로, 프로그램의 맨 아래에서 main() 함수를 호출하겠습니다:

hello.py
def hello():
    print("Hello, World!")

def main():
    print("This is the main function.")
    hello()

main()

이 시점에서 프로그램을 실행할 수 있습니다:

  1. python hello.py

다음과 같은 출력을 받게 됩니다:

Output
This is the main function. Hello, World!

hello() 함수를 main() 함수 내에서 호출하고 나서, main() 함수를 호출하여 실행했기 때문에, Hello, World! 텍스트는 한 번만 출력되었습니다. 그리고 그 다음에는 메인 함수에 있는 것을 알려주는 문자열 뒤에 나왔습니다.

이제 우리는 여러 함수를 다루게 될 것이기 때문에 전역 변수와 지역 변수의 변수 범위를 재검토하는 것이 가치가 있습니다. 함수 블록 내에서 변수를 정의하면 해당 함수 내에서만 해당 변수를 사용할 수 있습니다. 함수 간에 변수를 사용하려면 전역 변수를 선언하는 것이 더 좋을 수 있습니다.

파이썬에서 '__main__'은 최상위 코드가 실행될 범위의 이름입니다. 프로그램이 표준 입력, 스크립트 또는 대화형 프롬프트에서 실행될 때, 그 __name__'__main__'으로 설정됩니다.

이것 때문에 다음과 같은 구조를 사용하는 것이 관례입니다:

if __name__ == '__main__':
    # 이것이 주된 프로그램인 경우에 실행할 코드를 여기에

이것은 프로그램 파일을 다음과 같이 사용할 수 있게 합니다:

  • 주된 프로그램으로 사용하여 if 문 뒤에 나오는 것을 실행합니다
  • 모듈로 사용하여 if 문 뒤에 나오는 것을 실행하지 않습니다.

이 문 안에 포함되지 않은 모든 코드는 실행됩니다. 프로그램 파일을 모듈로 사용하는 경우, 이 문 안에 없는 코드도 보조 파일을 실행하는 동안 실행됩니다.

위의 names.py 프로그램을 확장하고 more_names.py라는 새 파일을 만들어 보겠습니다. 이 프로그램에서는 전역 변수를 선언하고 원래의 names() 함수를 수정하여 명령을 두 개의 개별 함수로 만들 것입니다.

첫 번째 함수인 has_vowel()name 문자열에 모음이 포함되어 있는지 확인합니다.

두 번째 함수 print_letters()name 문자열의 각 글자를 출력할 것입니다.

more_names.py
# 모든 함수에서 사용할 전역 변수 name을 선언합니다.
name = str(input('Enter your name: '))


# 모음이 포함되어 있는지 확인하는 함수를 정의합니다.
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# 이름 문자열의 각 글자를 반복합니다.
def print_letters():
    for letter in name:
        print(letter)

이 설정으로, has_vowel()print_letters() 함수를 호출하는 main() 함수를 정의해 보겠습니다.

more_names.py
# 모든 함수에서 사용할 전역 변수 name을 선언합니다.
name = str(input('Enter your name: '))


# 모음이 포함되어 있는지 확인하는 함수를 정의합니다.
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# 이름 문자열의 각 글자를 반복합니다.
def print_letters():
    for letter in name:
        print(letter)


# 다른 함수를 호출하는 main 메서드를 정의합니다.
def main():
    has_vowel()
    print_letters()

마지막으로, 파일 맨 아래에 if __name__ == '__main__': 구조를 추가할 것입니다. 우리의 목적을 위해, 우리가 main() 함수에 넣은 모든 함수를 사용하기 때문에, 이 if 문 다음에 main() 함수를 호출할 것입니다.

more_names.py
# 모든 함수에서 사용할 전역 변수 이름 선언
name = str(input('Enter your name: '))


# 이름에 모음이 포함되어 있는지 확인하는 함수 정의
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# 이름 문자열의 문자를 반복하는 함수 정의
def print_letters():
    for letter in name:
        print(letter)


# 다른 함수를 호출하는 main 메서드 정의
def main():
    has_vowel()
    print_letters()


# main() 함수 실행
if __name__ == '__main__':
    main()

이제 프로그램을 실행할 수 있습니다:

  1. python more_names.py

프로그램은 names.py 프로그램과 동일한 출력을 표시하지만, 여기서 코드는 더 정리되어 수정 없이 모듈식으로 사용될 수 있습니다.

만약 main() 함수를 선언하지 않으려면, 다음과 같이 프로그램을 종료할 수도 있습니다:

more_names.py
...
if __name__ == '__main__':
    has_vowel()
    print_letters()

main()을 함수로 사용하고 if __name__ == '__main__': 문을 사용하면 코드를 논리적으로 구성하여 가독성과 모듈성을 높일 수 있습니다.

결론

함수는 프로그램 내에서 작업을 수행하는 명령어 코드 블록으로, 코드를 재사용 가능하고 모듈식으로 만들어주어 프로그램을 도와줍니다.

코드를 더 모듈화하는 방법에 대해 자세히 알고 싶다면 Python 3에서 모듈 작성하기 가이드를 읽어보세요.

Source:
https://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3