본문으로 바로가기

Python 함수: 함수 호출 및 작성 방법

재사용 가능하고 효율적인 Python 함수를 작성하는 방법을 알아보세요. 매개변수, return 문, 람다 함수 같은 고급 주제를 마스터하고 main() 등 모범 사례로 코드를 더 잘 구성하세요.
업데이트됨 2026년 5월 18일  · 14분 읽다
datacamp 배너로 커리어를 만드는 python 기술

함수는 Python 프로그래밍 언어의 핵심 요소입니다. Python 언어에 내장된 수많은 훌륭한 함수나 라이브러리 생태계와 함께 제공되는 함수들을 이미 사용해 보셨을 수도 있습니다. 하지만 데이터 과학자라면, 데이터가 제기하는 문제를 해결하기 위해 스스로 함수를 작성해야 할 일이 끊임없이 생깁니다. 

이 튜토리얼은 Python 3 문법을 사용합니다. 모든 예제는 Python 3.10+에서 동작하며 최신 관례(f-문자열, 타입 힌트, 위치 전용 및 키워드 전용 매개변수)를 반영해 업데이트되었습니다. 현재 안정 버전은 Python 3.14입니다.

이 튜토리얼의 예제 코드를 직접 쉽게 실행하려면 Python이 사전 설치되어 있고 모든 코드 샘플이 포함된 DataLab 워크북을 무료로 생성하세요. Python 함수 작성 연습을 더 원하신다면 이 실습형 DataCamp 연습을 확인하거나 Python Data Science Toolbox 과정을 수강해 보세요!

Python의 함수

프로그래밍에서 함수는 반복적으로 사용하고 싶거나, 복잡해서 별도의 하위 프로그램으로 분리해 필요할 때 호출하는 것이 더 적절한 일련의 명령을 묶는 데 사용됩니다. 즉, 함수는 특정 작업을 수행하도록 작성된 코드 조각입니다. 해당 작업을 수행하는 데 함수가 여러 입력이 필요할 수도 있고 필요하지 않을 수도 있습니다. 작업이 수행되면 함수는 하나 이상의 값을 반환할 수도 있고 반환하지 않을 수도 있습니다.

Python의 함수는 세 가지 유형이 있습니다:

  • help()로 도움말을 요청하고, min()으로 최솟값을 구하고, print()로 터미널에 객체를 출력하는 등 내장 함수. 이러한 함수에 대한 더 많은 개요는 여기에서 확인할 수 있습니다.

  • 사용자 정의 함수(UDF). 사용자가 자신의 작업을 돕기 위해 만드는 함수이며,

  • 익명 함수. 표준 def 키워드로 선언되지 않기 때문에 람다(lambda) 함수라고도 합니다.

함수 vs. 메서드

메서드는 클래스의 일부인 함수를 말합니다. 클래스의 인스턴스 또는 객체로 접근합니다. 함수는 이러한 제한이 없습니다. 독립적인 함수를 가리킵니다. 즉, 모든 메서드는 함수이지만 모든 함수가 메서드는 아닙니다.

다음 예제를 살펴보세요. 먼저 plus() 함수를 정의한 뒤 sum() 메서드를 가진 Summation 클래스를 정의합니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGEgZnVuY3Rpb24gYHBsdXMoKWBcbmRlZiBwbHVzKGEsYik6XG4gIHJldHVybiBhICsgYlxuICBcbiMgQ3JlYXRlIGEgYFN1bW1hdGlvbmAgY2xhc3NcbmNsYXNzIFN1bW1hdGlvbihvYmplY3QpOlxuICBkZWYgc3VtKHNlbGYsIGEsIGIpOlxuICAgIHNlbGYuY29udGVudHMgPSBhICsgYlxuICAgIHJldHVybiBzZWxmLmNvbnRlbnRzICJ9

이제 Summation 클래스의 일부인 sum() 메서드를 호출하려면 먼저 해당 클래스의 인스턴스 또는 객체를 정의해야 합니다. 그러니 그런 객체를 정의해 봅시다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIHBsdXMoYSxiKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuY2xhc3MgU3VtbWF0aW9uKG9iamVjdCk6XG4gIGRlZiBzdW0oc2VsZiwgYSwgYik6XG4gICAgc2VsZi5jb250ZW50cyA9IGEgKyBiXG4gICAgcmV0dXJuIHNlbGYuY29udGVudHMgIiwic2FtcGxlIjoiIyBJbnN0YW50aWF0ZSBgU3VtbWF0aW9uYCBjbGFzcyB0byBjYWxsIGBzdW0oKWBcbnN1bUluc3RhbmNlID0gU3VtbWF0aW9uKClcbnN1bUluc3RhbmNlLnN1bSgxLDIpIn0=

plus() 함수를 호출할 때에는 이런 인스턴스화가 필요하지 않다는 점을 기억하세요! DataCamp Light 코드 청크에서 plus(1,2)를 문제없이 실행할 수 있습니다!

매개변수 vs. 인자

매개변수(parameters)는 함수나 메서드를 정의할 때 사용하는 이름으로, 여기에 인자(arguments)가 매핑됩니다. 다시 말해, 인자는 함수나 메서드를 호출할 때 제공하는 값이며, 함수나 메서드의 코드는 이 인자들을 매개변수 이름으로 참조합니다.

다음 예제를 살펴보고 위의 DataCamp Light 청크를 떠올려 보세요. Summation 클래스의 sum() 메서드에는 두 개의 인자를 전달하지만, 이전에는 self, a, b라는 세 개의 매개변수를 정의했습니다.

self는 어떻게 된 걸까요?

모든 클래스 메서드의 첫 번째 인자는 항상 클래스의 현재 인스턴스를 가리킵니다. 여기서는 Summation이 그 대상입니다. 관례적으로 이 인자를 self라고 부릅니다.

즉, 이 경우에는 메서드를 호출하는 인스턴스를 참조하는 인자가 암묵적으로 전달되므로, self에 대한 참조를 직접 전달하지 않습니다. self는 인자 목록에 암묵적으로 삽입됩니다.

함수 정의 방법: 사용자 정의 함수(UDF)

Python에서 함수를 정의하는 네 단계는 다음과 같습니다:

  1. def 키워드로 함수를 선언하고 뒤에 함수 이름을 붙입니다.

  2. 함수에 매개변수를 추가합니다. 매개변수는 함수의 괄호 안에 있어야 합니다. 줄 끝에는 콜론을 붙입니다.

  3. 함수가 실행해야 할 구문을 추가합니다.

  4. 함수가 어떤 값을 출력해야 한다면 return 문으로 함수를 끝맺습니다. return 문이 없으면 함수는 None 객체를 반환합니다.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4gIn0=

물론 진행하면서 함수는 더 복잡해질 수 있습니다. for 루프, 제어 흐름 등 더 세밀하게 만들기 위한 요소를 추가할 수 있습니다:

def hello():
    name = input("Enter your name: ")
    if name:
        print(f"Hello {name}")
    else:
        print("Hello World")

hello()

위 함수에서는 사용자에게 이름을 입력하도록 요청합니다. 이름이 주어지지 않으면 함수는 “Hello World”를 출력합니다. 그렇지 않으면 사용자에게 개인화된 “Hello” 응답을 제공합니다.

기억하세요 UDF에 하나 이상의 함수 매개변수를 정의할 수 있습니다. 자세한 내용은 아래의 함수 인자 섹션에서 배우게 됩니다. 또한 함수 결과로 하나 또는 여러 값을 반환할 수도 있고 반환하지 않을 수도 있습니다.

return 문

UDF hello()에서 무언가를 출력하고 있으므로 굳이 반환할 필요는 없습니다. 위 함수와 아래 함수 사이에 차이는 없습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsb19ub3JldHVybigpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpICJ9

하지만 함수의 결과를 계속 사용하고, 그 결과에 대해 여러 연산을 해보고 싶다면 실제로 값을 반환하도록 return 문을 사용해야 합니다. 예를 들어, hello()가 문자열 "hello"를 반환하는 반면, hello_noreturn() 함수는 None을 반환하는 다음 상황을 살펴보세요:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4oXCJoZWxsb1wiKVxuXG5kZWYgaGVsbG9fbm9yZXR1cm4oKTpcbiAgcHJpbnQoXCJIZWxsbyBXb3JsZFwiKVxuICBcbiMgTXVsdGlwbHkgdGhlIG91dHB1dCBvZiBgaGVsbG8oKWAgd2l0aCAyIFxuaGVsbG8oKSAqIDJcblxuIyAoVHJ5IHRvKSBtdWx0aXBseSB0aGUgb3V0cHV0IG9mIGBoZWxsb19ub3JldHVybigpYCB3aXRoIDIgXG5oZWxsb19ub3JldHVybigpICogMiJ9

두 번째 함수는 None에 대해 어떠한 연산도 수행할 수 없기 때문에 에러가 발생합니다. NoneType(hello_noreturn()의 결과인 None)과 int(2)에 대해 곱셈 연산을 할 수 없다는 TypeError가 발생합니다.

함수는 return 문을 만나면 즉시 종료됩니다. 값을 반환하지 않더라도 마찬가지입니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBydW4oKTpcbiAgZm9yIHggaW4gcmFuZ2UoMTApOlxuICAgICBpZiB4ID09IDI6XG4gICAgICAgcmV0dXJuXG4gIHByaW50KFwiUnVuIVwiKVxuICBcbnJ1bigpIn0=

return 문을 사용할 때 알아둘 점이 하나 더 있습니다. 튜플을 사용하면 여러 값을 반환할 수 있습니다.

기억하세요 이 데이터 구조는 리스트와 매우 유사하며 여러 값을 담을 수 있습니다. 그러나 튜플은 불변이므로 그 안에 저장된 값을 수정할 수 없습니다. 튜플은 괄호 ()로 생성합니다. 쉼표와 할당 연산자를 사용해 튜플을 여러 변수로 언패킹할 수 있습니다.

함수가 여러 값을 반환하는 방법을 이해하려면 다음 예제를 확인하세요:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgXG5kZWYgcGx1cyhhLGIpOlxuICBzdW0gPSBhICsgYlxuICByZXR1cm4gKHN1bSwgYSlcblxuIyBDYWxsIGBwbHVzKClgIGFuZCB1bnBhY2sgdmFyaWFibGVzIFxuc3VtLCBhID0gcGx1cygzLDQpXG5cbiMgUHJpbnQgYHN1bSgpYFxucHJpbnQoc3VtKSJ9

참고 return 문에서 return sum, areturn (sum, a)와 동일한 결과를 냅니다. 전자는 실제로 내부적으로 suma를 튜플에 포장(packing)합니다!

함수 호출 방법

이전 섹션에서 이미 함수를 호출하는 방법의 예제를 많이 보셨습니다. 함수를 호출한다는 것은 정의한 함수를 실행한다는 뜻입니다. Python 프롬프트에서 직접 실행할 수도 있고(“중첩 함수” 섹션에서 보게 되듯) 다른 함수를 통해 실행할 수도 있습니다.

새로 정의한 함수 hello()는 아래 DataCamp Light 청크에서처럼 hello()를 실행하기만 하면 호출됩니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiJoZWxsbygpIn0=

Python 함수에 독스트링 추가 방법

Python에서 함수 작성의 또 다른 핵심 요소는 독스트링(docstring)입니다. 독스트링은 함수가 수행하는 계산이나 반환값 등 함수를 설명합니다. 이러한 설명은 함수의 문서 역할을 하므로, 누가 보더라도 함수 정의의 모든 코드를 추적하지 않고도 함수가 무엇을 하는지 이해할 수 있습니다.

함수 독스트링은 함수 헤더 바로 다음 줄에 위치하며 삼중 따옴표로 감쌉니다. hello() 함수에 적절한 독스트링은 ‘Prints “Hello World”’입니다.

def hello() -> None:
    """Prints "Hello World"."""
    print("Hello World")

참고 독스트링은 여기 예시보다 더 길어질 수 있습니다. 독스트링을 더 자세히 공부하고 싶다면 scikit-learn이나 pandas 같은 Python 라이브러리의 Github 리포지토리를 살펴보세요. 예시가 매우 많습니다!

타입 힌트

독스트링과 밀접하게 관련되어 있으며, 최신 Python 코드에서 거의 그만큼 흔한 것이 타입 힌트입니다. Python 3.5부터는 함수의 매개변수와 반환값에 예상되는 타입을 주석으로 달 수 있습니다. 가장 단순한 예시는 다음과 같습니다:

def plus(a: int, b: int) -> int:
    return a + b

각 매개변수 뒤의 : int는 “정수여야 한다”는 뜻이고, 괄호 뒤의 -> int는 “이 함수는 정수를 반환한다”는 뜻입니다. Python 자체는 런타임에 이 주석을 강제하지 않습니다. 여전히 plus()에 문자열을 전달해도, 무언가가 깨질 때까지 Python은 불평하지 않습니다. 하지만 mypy, pyright 같은 도구와 VS Code, PyCharm 등의 에디터에 내장된 타입 체커는 이러한 힌트를 활용해 코드를 실행하기도 전에 버그를 잡아 냅니다.

더 복잡한 타입의 경우, 내장 제네릭을 직접 사용(Python 3.9+)하거나 typing 모듈에서 임포트할 수 있습니다:

def greet(names: list[str]) -> None:
    for name in names:
        print(f"Hello {name}")

def find_user(user_id: int) -> dict | None:
    # returns the user dict, or None if not found
    ...
타입 힌트는 선택 사항이지만, 재사용하거나 공유할 계획이 있는 함수, 혹은 6개월 뒤에 다시 보게 될 함수에는 모범 사례로 간주됩니다. 타입 힌트는 기계가 검사할 수 있는 문서처럼 동작합니다. IDE가 이를 바탕으로 자동 완성을 제공하고, 오타를 잡아내며, 잘못된 타입을 전달할 때 경고합니다.

Python의 함수 인자

앞서 매개변수와 인자의 차이에 대해 배웠습니다. 간단히 말해, 인자는 함수나 메서드를 호출할 때 제공하는 값이며, 함수나 메서드의 코드는 매개변수 이름으로 인자를 참조합니다. Python UDF가 받을 수 있는 인자 유형은 네 가지입니다:

  • 기본값 인자(default arguments)
  • 필수 인자(required arguments)
  • 키워드 인자(keyword arguments)
  • 가변 개수의 인자(variable number of arguments)

기본값 인자

기본값 인자는 함수 호출 시 인자 값이 전달되지 않으면 기본값을 사용하는 인자입니다. 다음 예제처럼 할당 연산자 =로 기본값을 지정할 수 있습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIgPSAyKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuIyBDYWxsIGBwbHVzKClgIHdpdGggb25seSBgYWAgcGFyYW1ldGVyXG5wbHVzKGE9MSlcblxuIyBDYWxsIGBwbHVzKClgIHdpdGggYGFgIGFuZCBgYmAgcGFyYW1ldGVyc1xucGx1cyhhPTEsIGI9MykifQ==

필수 인자

이름에서 알 수 있듯이, UDF의 필수 인자는 반드시 포함되어야 하는 인자입니다. 이러한 인자는 함수 호출 시 정확한 순서로 전달되어야 하며, 다음 예제와 같습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGIifQ==

오류 없이 함수를 호출하려면 ab 매개변수에 매핑되는 인자가 필요합니다. ab의 순서를 바꿔도 결과는 달라지지 않지만, plus()를 다음과 같이 변경하면 달라질 수 있습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYS9iIn0=

키워드 인자

모든 매개변수를 올바른 순서로 호출하고 싶다면, 함수 호출에 키워드 인자를 사용할 수 있습니다. 이는 매개변수 이름으로 인자를 식별하는 방식입니다. 위의 예제를 가져와 조금 더 명확히 해보겠습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIFxucGx1cygyLDMpXG5cbiMgQ2FsbCBgcGx1cygpYCBmdW5jdGlvbiB3aXRoIGtleXdvcmQgYXJndW1lbnRzXG5wbHVzKGE9MSwgYj0yKSJ9

키워드 인자를 사용하면 매개변수의 순서를 바꿔도 함수를 실행했을 때 동일한 결과를 얻을 수 있다는 점에 유의하세요:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBrZXl3b3JkIGFyZ3VtZW50c1xucGx1cyhiPTIsIGE9MSkifQ==

가변 개수의 인자

함수에 전달할 인자의 정확한 개수를 모를 때는 *args를 사용한 다음 문법을 사용할 수 있습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uIHRvIGFjY2VwdCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHNcbmRlZiBwbHVzKCphcmdzKTpcbiAgcmV0dXJuIHN1bShhcmdzKVxuXG4jIENhbGN1bGF0ZSB0aGUgc3VtXG5wbHVzKDEsNCw1KSJ9

별표(*)는 모든 비키워드 가변 인자의 값을 담는 변수 이름 앞에 붙입니다. 여기서 *varint, *var_int_args 또는 다른 어떤 이름이든 plus() 함수에 전달해도 무방하다는 점에 유의하세요.

: *args를 별표가 포함된 다른 이름으로 바꿔 보세요. 위 코드는 그대로 동작합니다!

위 함수는 내장 함수 sum()을 사용해 plus()에 전달된 모든 인자의 합을 계산합니다. 

전역 변수 vs. 지역 변수

일반적으로 함수 본문 안에서 정의된 변수는 지역 범위를 가지며, 바깥에서 정의된 변수는 전역 범위를 가집니다. 즉, 지역 변수는 함수 블록 내에서 정의되고 그 함수 내부에서만 접근할 수 있는 반면, 전역 변수는 스크립트의 모든 함수에서 접근할 수 있습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgR2xvYmFsIHZhcmlhYmxlIGBpbml0YFxuaW5pdCA9IDFcblxuIyBEZWZpbmUgYHBsdXMoKWAgZnVuY3Rpb24gdG8gYWNjZXB0IGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xuZGVmIHBsdXMoKmFyZ3MpOlxuICAjIExvY2FsIHZhcmlhYmxlIGBzdW0oKWBcbiAgdG90YWwgPSAwXG4gIGZvciBpIG4gYXJnczoXG4gICAgdG90YWwgKz0gaVxuICByZXR1cm4gdG90YWxcbiAgXG4jIEFjY2VzcyB0aGUgZ2xvYmFsIHZhcmlhYmxlXG5wcmludChcInRoaXMgaXMgdGhlIGluaXRpYWxpemVkIHZhbHVlIFwiICsgc3RyKGluaXQpKVxuXG4jIChUcnkgdG8pIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVcbnByaW50KFwidGhpcyBpcyB0aGUgc3VtIFwiICsgc3RyKHRvdGFsKSkifQ==

함수 본문 안에서 정의된 지역 변수 total을 출력하려 하면 name 'total' is not defined라는 NameError가 발생하는 것을 볼 수 있습니다. 반면 init 변수는 문제없이 출력됩니다.

위치 전용과 키워드 전용 매개변수

Python 3.8부터는 함수 시그니처에 두 가지 특수 표식 / 와 * 를 사용해 인자를 어떻게 전달해야 하는지 더 엄격히 제어할 수 있습니다. / 앞의 것은 위치 인자로만 전달할 수 있고, * 뒤의 것은 키워드로만 전달할 수 있습니다.

def greet(name, /, greeting="Hello", *, punctuation="!"):
    print(f"{greeting} {name}{punctuation}")

 호출 위치에서의 동작은 다음과 같습니다:

greet("Alice")                          # works
greet("Alice", greeting="Hi")           # works
greet("Alice", "Hi", punctuation="?")   # works

greet(name="Alice")                     # TypeError: name is positional-only
greet("Alice", "Hi", "?")               # TypeError: punctuation is keyword-only

왜 이렇게 할까요? 두 가지 주요 이유가 있습니다.

첫째, 위치 전용 매개변수를 사용하면 이후에 이름을 바꿔도 누구의 코드를 망가뜨리지 않습니다. 매개변수 이름을 키워드로 사용할 수 없으므로 마음대로 바꿀 수 있습니다.

둘째, 키워드 전용 매개변수는 호출자가 무엇을 전달하는지 명확히 하도록 강제합니다. 선택적 플래그나 설정이 여러 개 있을 때 호출이 더 읽기 쉬워집니다.

요약하면, 의도를 깔끔하게 강제하는 방법입니다.

Python의 익명 함수

익명 함수는 Python에서 람다 함수라고도 부릅니다. 표준 def 키워드 대신 lambda 키워드로 선언하기 때문입니다.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRvdWJsZSA9IGxhbWJkYSB4OiB4KjJcblxuZG91YmxlKDUpIn0=

위 DataCamp Light 청크에서 lambda x: x*2가 익명 또는 람다 함수입니다. x는 인자이고, x*2는 평가되어 반환되는 식 또는 명령입니다. 이 함수의 특별한 점은, 이 튜토리얼 앞부분의 예시들과 달리 이름이 없다는 것입니다. 위 함수를 UDF로 작성한다면 결과는 다음과 같습니다:

def double(x):
  return x*2

두 개의 인자로 작업하는 람다 함수의 또 다른 예를 살펴보겠습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgYHN1bSgpYCBsYW1iZGEgZnVuY3Rpb25cbnN1bSA9IGxhbWJkYSB4LCB5OiB4ICsgeTtcblxuIyBDYWxsIHRoZSBgc3VtKClgIGFub255bW91cyBmdW5jdGlvblxuc3VtKDQsNSlcblxuIyBcIlRyYW5zbGF0ZVwiIHRvIGEgVURGXG5kZWYgc3VtKHgsIHkpOlxuICByZXR1cm4geCt5In0=

익명 함수는 짧은 시간 동안 이름 없는 함수가 필요하고 런타임에 생성될 때 사용합니다. 특히 filter(), map(), reduce()와 함께 작업할 때 유용합니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcblxubXlfbGlzdCA9IFsxLDIsMyw0LDUsNiw3LDgsOSwxMF1cblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYGZpbHRlcigpYFxuZmlsdGVyZWRfbGlzdCA9IGxpc3QoZmlsdGVyKGxhbWJkYSB4OiAoeCoyID4gMTApLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYG1hcCgpYFxubWFwcGVkX2xpc3QgPSBsaXN0KG1hcChsYW1iZGEgeDogeCoyLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYHJlZHVjZSgpYFxucmVkdWNlZF9saXN0ID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIG15X2xpc3QpXG5cbnByaW50KGZpbHRlcmVkX2xpc3QpXG5wcmludChtYXBwZWRfbGlzdClcbnByaW50KHJlZHVjZWRfbGlzdCkifQ==

filter() 함수는 이름에서 알 수 있듯이 기준 >10에 따라 원래 입력 리스트 my_list를 필터링합니다. 반면 map()은 리스트 my_list의 모든 항목에 함수를 적용합니다. 이 경우 모든 요소에 2를 곱합니다.

reduce() 함수는 functools 라이브러리의 일부입니다. 이 함수는 my_list의 항목들에 왼쪽에서 오른쪽으로 누적 적용하여, 이 경우 하나의 값 55로 줄입니다.

Python에서 main()을 함수로 사용하기

Java 같은 다른 프로그래밍 언어를 사용해 본 경험이 있다면, main 함수가 함수를 실행하는 데 필요하다는 것을 알고 있을 것입니다. 위의 예제에서 보았듯이 Python에서는 반드시 그럴 필요는 없습니다. 하지만 Python 프로그램에 main() 함수를 포함하면 코드를 논리적으로 구성하는 데 도움이 됩니다. 가장 중요한 구성 요소가 모두 이 main() 함수에 담기기 때문입니다.

main() 함수를 쉽게 정의하고, 위의 다른 함수들처럼 호출할 수 있습니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG5cbm1haW4oKSJ9

하지만 현재 상태에서는 이 모듈을 임포트할 때 main() 함수의 코드가 호출됩니다. 이를 방지하려면 __name__ == '__main__'일 때에만 main() 함수를 호출합니다.

즉, 위 코드 청크는 다음과 같이 변경됩니다:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG4gIFxuIyBFeGVjdXRlIGBtYWluKClgIGZ1bmN0aW9uIFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcbiAgICBtYWluKCkifQ==

참고 __main__ 함수 외에도 클래스나 객체의 인스턴스를 초기화하는 __init__ 함수가 있습니다. 간단히 말해 생성자 또는 이니셜라이저로 동작하며, 클래스의 새 인스턴스를 만들 때 자동으로 호출됩니다. 이 함수에서는 새로 생성된 객체가 이 튜토리얼 앞에서 본 self 매개변수에 할당됩니다. 다음 예제를 살펴보세요:

class Dog:
    """A simple Dog class.

    Args:
        legs: Number of legs so that the dog can walk.
        color: The color of the fur.
    """

    def __init__(self, legs: int, color: str) -> None:
        self.legs = legs
        self.color = color

    def bark(self) -> str:
        return "bark" * 2

if __name__ == "__main__":
    dog = Dog(4, "brown")
    print(dog.bark())

Python 함수 계속 연습하기

축하합니다! Python의 함수에 관한 짧은 튜토리얼을 마쳤습니다. 다른 기초 Python 프로그래밍 내용을 복습하고 싶다면 Data Types for Data Science 과정을 놓치지 마세요. 이 과정에서는 리스트, 딕셔너리, 튜플, 세트, 날짜와 시간에 대한 지식을 공고히 하고 연습할 수 있습니다.

Python 함수에 대한 자주 묻는 질문

Python에서 함수란 무엇인가요?

함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 입력을 받아 처리하고 출력을 반환할 수 있습니다.

Python에서 함수를 어떻게 정의하나요?

Python에서 함수를 정의하려면 def 키워드를 사용해 함수 이름을 지정하고, 괄호에 선택적 매개변수를 적은 뒤, 코드를 작성하고 필요하다면 값을 return합니다.

Python에서 함수와 메서드의 차이는 무엇인가요?

함수는 독립적이지만, 메서드는 클래스에 속합니다. 모든 메서드는 함수이지만 모든 함수가 메서드는 아닙니다.

Python의 함수 유형에는 무엇이 있나요?

Python에는 내장 함수(print() 등), 사용자 정의 함수(직접 만든 함수), 익명 함수(단명성의 lambda 함수)가 있습니다.

매개변수와 인자의 차이는 무엇인가요?

매개변수는 함수 정의에 있는 자리표시자이고, 인자는 함수를 호출할 때 전달하는 실제 값입니다.

람다 함수란 무엇인가요?

람다 함수는 간단한 작업을 위한 한 줄짜리, 이름 없는 함수입니다.

왜 __main__ 함수를 사용하나요?

__main__ 함수는 코드를 체계화하고, 스크립트를 직접 실행할 때만 특정 부분이 실행되도록 하며, 임포트 시에는 실행되지 않게 해줍니다.

전역 변수와 지역 변수의 차이는 무엇인가요?

전역 변수는 어디서든 동작하지만, 지역 변수는 해당 함수 내부에서만 존재합니다.

주제

Python 더 알아보기

courses

Python 입문

4
6.8M
Python으로 데이터 분석 기초를 단 4시간 만에 마스터하세요. 이 온라인 강의는 Python 인터페이스를 소개하고 인기 있는 패키지를 살펴봅니다.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow