ה־*args
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 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 אוסף כל מספר של ארגומנטים מיקומיים לתוך tuple. השתמש בו כשאינך יודע כמה ארגומנטים יועברו למתודה. השם 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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםהפרמטר selfמתודותמאפייניםשיטת הבנאי (__init__)חזרה: מחשבון פשוט5פולימורפיזם
בחינה מחדש של דריסת מתודותטיפוסיות ברווזמחלקות ומתודות אבסטרקטיותעיצוב ממשקיםסיכום – מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה לעומת הורשהMixinsמתודות סטטיות ומתודות מחלקהדקורטורים למחלקותמנהלי הקשרתרגלו בעצמכם: קומפיילר Python אונליין