*args について
CoddyのPythonジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 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 を返す
- ブール値(
True/False)はここでは数値として扱わず、boolがintのサブクラスであるにもかかわらず、拒否する必要がある
number_utils.py ファイルには、実装の指針となる詳細な TODO コメントが含まれています。解答がすべての要件を満たすように、これらのコメントに注意深く従ってください。
自分で試してみよう
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を返すべきこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ