Python 함수 매개변수

PythonBeginner
지금 연습하기

소개

본 실습에서는 Python 에서 매개변수 (parameter) 를 가진 함수를 정의하고 사용하는 방법을 탐구합니다. 함수는 입력을 받을 수 있을 때 훨씬 강력해지며, 이는 함수를 동적이고 재사용 가능하게 만듭니다.

본 실습에서는 위치 매개변수 (positional parameters), 기본값 (default values), 키워드 인수 (keyword arguments), 가변 길이 인수 (variable-length arguments) 를 포함한 여러 유형의 함수 매개변수를 다룰 것입니다. 실습 예제를 통해 다양한 입력을 처리할 수 있는 유연한 함수를 만드는 방법을 배우게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 95%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

위치 매개변수를 사용하여 함수 정의하기

매개변수 (parameter) 를 사용하면 함수에 데이터를 전달할 수 있어, 함수가 받는 입력에 따라 동작을 조정할 수 있게 됩니다. 가장 일반적인 유형인 위치 매개변수 (positional parameters) 부터 시작하겠습니다. 함수에 전달되는 인수 (argument) 들은 순서에 따라 이 매개변수들에 할당됩니다.

먼저, WebIDE 왼쪽 파일 탐색기에서 positional_params.py 파일을 찾아 열어보십시오.

이제 name이라는 하나의 매개변수를 받는 hello라는 함수를 정의해 보겠습니다. positional_params.py 파일에 다음 코드를 추가하십시오:

def hello(name):
    print(f'Hello, {name}!')

hello('John')
hello('Alice')

이 코드에서 name은 함수 정의에서 자리 표시자 (placeholder) 역할을 하는 매개변수입니다. 우리가 hello('John')처럼 함수를 호출할 때, 값 'John'name 매개변수에 할당되는 인수입니다.

스크립트를 실행하려면, 상단 메뉴에서 Terminal -> New Terminal을 클릭하여 WebIDE 에서 새 터미널을 여십시오. 그런 다음 다음 명령어를 실행하십시오:

python3 ~/project/positional_params.py

함수가 서로 다른 인수에 대해 다른 결과를 생성했음을 보여주는 다음과 같은 출력을 보게 될 것입니다:

Hello, John!
Hello, Alice!

함수가 위치 매개변수로 정의된 경우, 함수를 호출할 때 각 매개변수에 해당하는 인수를 반드시 제공해야 합니다. 이를 누락하면 오류가 발생합니다.

기본 매개변수 값 사용하기

매개변수에 기본값 (default value) 을 제공하는 것이 유용한 경우가 많습니다. 함수 호출 시 해당 매개변수에 대한 인수가 제공되지 않으면 기본값이 사용됩니다. 이로 인해 해당 매개변수는 선택 사항 (optional) 이 됩니다.

필수 인수가 없이 함수를 호출했을 때 어떤 일이 발생하는지 살펴보겠습니다. default_params.py 파일을 열고 다음 코드를 추가하십시오:

def hello(name):
    print(f'Hello, {name}!')

hello()

파일을 저장하고 터미널에서 실행하십시오:

python3 ~/project/default_params.py

그러면 함수 hello는 하나의 인수를 예상했지만 받지 못했기 때문에 TypeError가 발생합니다.

Traceback (most recent call last):
  File "/home/labex/project/default_params.py", line 4, in <module>
    hello()
TypeError: hello() missing 1 required positional argument: 'name'

이 문제를 해결하기 위해 name 매개변수에 기본값을 할당할 수 있습니다. default_params.py 파일의 내용을 다음 코드로 대체하여 수정하십시오:

def hello(name="World"):
    print(f'Hello, {name}!')

hello()
hello("Jobs")

이제 스크립트를 다시 실행하십시오:

python3 ~/project/default_params.py

출력 결과는 다음과 같습니다:

Hello, World!
Hello, Jobs!

첫 번째 호출은 기본값 "World"를 사용하고, 두 번째 호출은 제공된 인수 "Jobs"를 사용합니다.

중요 규칙: 함수 정의에서 기본값이 없는 모든 매개변수는 기본값이 있는 매개변수보다 앞에 와야 합니다. 예를 들어, def func(a, b="default")는 올바르지만, def func(a="default", b)SyntaxError를 유발합니다.

키워드를 사용하여 인수 전달하기

함수를 호출할 때, 인수를 제공하는 매개변수의 이름을 명시적으로 지정할 수 있습니다. 이를 **키워드 인수 (keyword arguments)**라고 합니다. 키워드 인수의 주요 장점은 순서가 중요하지 않다는 점이며, 이는 코드를 더 읽기 쉽게 만들 수 있습니다.

keyword_args.py 파일을 열고 다음 코드를 추가하십시오:

def person(name, age):
    print(f"{name} is {age} years old.")

## 키워드 인수로 호출하기 - 순서는 중요하지 않음
person(name="Zhang San", age=25)
person(age=50, name="Li Si")

파일을 저장하고 터미널에서 실행하십시오:

python3 ~/project/keyword_args.py

인수 순서에 관계없이 두 호출 모두 올바르게 작동하는 것을 볼 수 있습니다:

Zhang San is 25 years old.
Li Si is 50 years old.

단일 함수 호출에서 위치 인수 (positional arguments) 와 키워드 인수를 혼합하여 사용할 수도 있습니다. 하지만 한 가지 규칙을 따라야 합니다: 모든 위치 인수는 모든 키워드 인수보다 먼저 와야 합니다.

이제 keyword_args.py의 내용을 다음으로 대체하여 이 규칙이 실제로 어떻게 적용되는지 확인해 봅시다:

def person(name, age):
    print(f"{name} is {age} years old.")

## 이것은 위치 인수와 키워드 인수의 유효한 혼합입니다
person("Wang Wu", age=26)

## 이것은 SyntaxError 를 유발합니다: positional argument follows keyword argument
## person(age=28, "Zhao Liu")

스크립트를 다시 실행하십시오. 유효한 호출은 예상대로 실행될 것입니다.

python3 ~/project/keyword_args.py

예상 출력:

Wang Wu is 26 years old.

가변 개수의 인수 처리하기

Python 함수는 가변적인 개수의 인수를 받도록 설계될 수 있습니다. 이는 함수에 전달될 인수의 개수를 미리 알 수 없을 때 유용합니다.

가변 위치 인수 (*args)

매개변수 이름 앞에 별표 (*) 를 붙이면, 임의의 개수의 위치 인수를 튜플 (tuple) 로 모을 수 있습니다. args라는 이름은 관례이지만, 유효한 다른 매개변수 이름을 사용할 수도 있습니다.

가변 키워드 인수 (**kwargs)

매개변수 이름 앞에 별표 두 개 (**) 를 붙이면, 임의의 개수의 키워드 인수를 딕셔너리 (dictionary) 로 모을 수 있습니다. kwargs라는 이름 역시 관례입니다.

이 개념들을 결합해 보겠습니다. variable_args.py 파일을 열고 다음 코드를 추가하십시오:

## *args 를 사용하여 가변 개수의 숫자를 합산
def calculate_sum(*numbers):
    print(f"Arguments received as a tuple: {numbers}")
    total = sum(numbers)
    print(f"Sum: {total}\n")

## **kwargs 를 사용하여 추가 프로필 정보를 캡처
def person_profile(name, age, **other_info):
    print(f"Name: {name}")
    print(f"Age: {age}")
    print(f"Other Info: {other_info}\n")

## 함수 호출
calculate_sum(1, 2, 3)
calculate_sum(10, 20, 30, 40, 50)

person_profile('Wang Wu', 26, gender="Male", job="Writer")
person_profile('Zhao Liu', 28, city="Beijing", status="Active")

터미널에서 스크립트를 실행하십시오:

python3 ~/project/variable_args.py

출력 결과는 numbers가 튜플이고 other_info가 딕셔너리임을 보여줍니다:

Arguments received as a tuple: (1, 2, 3)
Sum: 6

Arguments received as a tuple: (10, 20, 30, 40, 50)
Sum: 150

Name: Wang Wu
Age: 26
Other Info: {'gender': 'Male', 'job': 'Writer'}

Name: Zhao Liu
Age: 28
Other Info: {'city': 'Beijing', 'status': 'Active'}

특수 매개변수 유형 탐색하기

Python 은 함수에 인수가 전달되는 방식을 강제할 수 있게 하여, 함수의 시그니처 (signature) 를 더 명확하고 모호하지 않게 만듭니다. 위치 전용 (positional-only) 또는 키워드 전용 (keyword-only) 으로 매개변수를 지정할 수 있습니다.

위치 전용 매개변수 (/)

매개변수가 오직 위치로만 전달될 수 있음을 지정하려면, 함수 정의에서 슬래시 (/) 앞에 해당 매개변수들을 배치합니다.

키워드 전용 매개변수 (*)

매개변수가 오직 키워드로만 전달될 수 있음을 지정하려면, 별표 (*) 뒤에 해당 매개변수들을 배치합니다. 만약 * 뒤에 매개변수 이름이 없다면, 그 뒤에 오는 모든 매개변수는 키워드 전용이어야 함을 의미합니다.

이러한 유형들을 결합하는 방법을 살펴보겠습니다. special_params.py 파일을 열고 다음 코드를 추가하십시오. 이 예제는 위치 전용, 표준, 키워드 전용 매개변수를 가진 함수를 정의합니다.

def school_info(name, /, standard_param, *, city):
    print(f'Positional-Only (name): {name}')
    print(f'Standard (standard_param): {standard_param}')
    print(f'Keyword-Only (city): {city}')
    print('---')

## 이 함수에서:
## - `name` 은 위치로 전달되어야 합니다.
## - `standard_param` 은 위치 또는 키워드로 전달될 수 있습니다.
## - `city` 는 키워드로 전달되어야 합니다.

## 유효한 호출
school_info("Peking University", "PKU", city="Beijing")
school_info("Tsinghua University", standard_param="THU", city="Beijing")

## 유효하지 않은 호출 예시 (오류 방지를 위해 주석 처리됨)
## school_info(name="Zhejiang University", "ZJU", city="Hangzhou")  ## TypeError: name is positional-only
## school_info("Fudan University", "FDU", "Shanghai")               ## TypeError: city is keyword-only

스크립트를 실행하여 유효한 호출의 결과를 확인하십시오:

python3 ~/project/special_params.py

출력 결과는 다음과 같습니다:

Positional-Only (name): Peking University
Standard (standard_param): PKU
Keyword-Only (city): Beijing
---
Positional-Only (name): Tsinghua University
Standard (standard_param): THU
Keyword-Only (city): Beijing
---

이 구문은 함수를 호출하는 방식의 모호성을 줄여주어, 더 강력하고 자체 문서화된 함수를 만드는 데 도움이 됩니다.

요약

본 실습 (lab) 에서는 Python 함수에서 매개변수를 사용하는 기본 사항을 학습했습니다. 위치 매개변수를 정의하고 호출하는 방법, 기본값을 제공하여 매개변수를 선택 사항으로 만드는 방법, 그리고 더 읽기 쉬운 코드를 위해 키워드 인수를 사용하는 방법을 다루었습니다. 또한 가변적인 개수의 위치 인수 (*args) 와 키워드 인수 (**kwargs) 를 받을 수 있는 유연한 함수를 만드는 방법도 탐구했습니다. 마지막으로, 인수가 전달되어야 하는 방식을 강제하기 위해 특수 구문 (/*) 을 살펴보았으며, 이는 함수의 명확성과 견고성을 향상시킵니다.