*args について
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 42/64。
*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メソッドを呼び出す際に引数をアンパックすることもできます:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # リストをアンパックします
print(result) # 15重要ポイント: *args は、任意の数の位置引数をタプルとしてまとめます。メソッドに渡される引数の数がわからない場合に使用してください。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")メソッドを呼び出す際に引数をアンパックする:
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":
# ゼロ値を使用したテスト
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を返すはずこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。