*args
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 42번째.
*args 매개변수는 메서드가 임의의 개수의 위치 인자를 수락할 수 있도록 합니다. 별표는 모든 추가적인 위치 인자를 튜플로 수집합니다.
다음은 *args를 사용하는 메서드의 예시입니다:
class Calculator:
def add_numbers(self, *args):
return sum(args)
def show_numbers(self, *args):
for i, num in enumerate(args):
print(f"Number {i+1}: {num}")서로 다른 개수의 인수를 사용하여 메서드를 호출합니다:
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1) # 6
print(result2) # 150*args는 모든 인수를 튜플로 수집합니다:
calc.show_numbers(5, 10, 15, 20)출력:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20일반 매개변수를 *args와 결합합니다:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # 새 줄
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")생성자 메서드에서 *args를 사용하세요:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
def show_team(self):
print(f"Team: {self.team_name}")
for player in self.players:
print(f"- {player}")
team = Team("Warriors", "Alice", "Bob", "Charlie", "Diana")
team.show_team()출력:
6
150
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20
[INFO] User logged in
[ERROR] Connection failed
Team: Warriors
- Alice
- Bob
- Charlie
- Diana메서드를 호출할 때 인수를 언팩(unpack)할 수도 있습니다:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # 리스트를 언팩합니다
print(result) # 15핵심 포인트: *args는 임의의 개수의 위치 인자(positional arguments)를 튜플로 수집합니다. 메서드에 얼마나 많은 인자가 전달될지 모를 때 사용하세요. args라는 이름은 관례적인 것입니다. 별표 뒤에 어떤 이름을 사용해도 되지만, args가 표준입니다.
챌린지
쉬움이 챌린지에서는 유연한 숫자 유틸리티 함수를 구현하게 됩니다.
number_utils.py 파일을 수정하여 임의의 개수의 숫자 인수를 받아 그 합계를 반환하는 sum_all_numbers 함수를 구현하세요. 이 함수는 다음을 수행해야 합니다:
- 인수가 제공되지 않으면 0을 반환합니다.
- 숫자가 아닌 인수가 제공되면 "Error: All arguments must be numbers"를 출력하고 None을 반환합니다.
number_utils.py 파일에는 구현을 돕기 위한 상세한 TODO 주석이 포함되어 있습니다. 솔루션이 모든 요구 사항을 충족하도록 이 주석들을 주의 깊게 따르십시오.
치트 시트
*args 매개변수는 메서드가 임의의 개수의 위치 인자를 받을 수 있도록 합니다. 별표(*)는 모든 추가 위치 인자를 튜플로 수집합니다.
*args의 기본 사용법:
class Calculator:
def add_numbers(self, *args):
return sum(args)
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3) # 6
result2 = calc.add_numbers(10, 20, 30, 40, 50) # 150일반 매개변수와 *args 결합하기:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print()
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")생성자 메서드에서 *args 사용하기:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
team = Team("Warriors", "Alice", "Bob", "Charlie")메서드를 호출할 때 인자 언패킹(Unpack)하기:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # 리스트를 언패킹합니다핵심 포인트: *args는 임의의 개수의 위치 인자를 튜플로 수집합니다. args라는 이름은 관례적이지만, 별표 뒤에 원하는 이름을 사용할 수 있습니다.
직접 해보기
from number_utils import sum_all_numbers
# 종합 테스트 케이스 처리기
test_case = input()
if test_case == "basic_test":
# 양의 정수를 사용한 기본 기능 테스트
print(sum_all_numbers(1, 2, 3)) # 6을 반환해야 함
print(sum_all_numbers()) # 0을 반환해야 함
print(sum_all_numbers(10, 20, 30, 40)) # 100을 반환해야 함
print(sum_all_numbers(1, 2, "three")) # 오류를 출력하고 None을 반환해야 함
elif test_case == "float_test":
# 부동 소수점 숫자를 사용한 테스트
print(sum_all_numbers(1.1, 2.2, 3.3)) # 6.6을 반환해야 함
print(sum_all_numbers(5.5, 5.0)) # 10.5를 반환해야 함
elif test_case == "mixed_numbers_test":
# 정수와 부동 소수점이 혼합된 테스트
print(sum_all_numbers(5, 5.5)) # 10.5를 반환해야 함
print(sum_all_numbers(10, 20.5, 30, 40)) # 100.5를 반환해야 함
elif test_case == "zero_values_test":
# 0 값을 사용한 테스트
print(sum_all_numbers(0, 0, 0)) # 0을 반환해야 함
print(sum_all_numbers(0)) # 0을 반환해야 함
print(sum_all_numbers()) # 0을 반환해야 함
elif test_case == "negative_values_test":
# 음수 값을 사용한 테스트
print(sum_all_numbers(-1, -2, -3)) # -6을 반환해야 함
print(sum_all_numbers(-5, -5)) # -10을 반환해야 함
print(sum_all_numbers(-5, 5)) # 0을 반환해야 함
elif test_case == "large_values_test":
# 매우 큰 값을 사용한 테스트
print(sum_all_numbers(1000000000, 1000000000)) # 2000000000을 반환해야 함
print(sum_all_numbers(1000000000, 2000000000.5)) # 3000000000.5를 반환해야 함
elif test_case == "single_value_test":
# 단일 값을 사용한 테스트
print(sum_all_numbers(5)) # 5를 반환해야 함
print(sum_all_numbers(-10)) # -10을 반환해야 함
print(sum_all_numbers(3.5)) # 3.5를 반환해야 함
elif test_case == "error_handling_test":
# 다양한 비숫자 값을 사용한 테스트
print(sum_all_numbers("string")) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers([1, 2, 3])) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers({"key": "value"})) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers(True)) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers(None)) # 오류를 출력하고 None을 반환해야 함
elif test_case == "mixed_valid_invalid_test":
# 유효한 값과 유효하지 않은 값이 혼합된 테스트
print(sum_all_numbers(1, 2, "three")) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers(1, [2, 3], 4)) # 오류를 출력하고 None을 반환해야 함
print(sum_all_numbers(1.5, "two", 3)) # 오류를 출력하고 None을 반환해야 함
elif test_case == "empty_args_test":
# 인자가 없는 경우의 테스트
print(sum_all_numbers()) # 0을 반환해야 함이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.