Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ *args

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 42 من 64.

تسمح المعلمة *args للدالة بقبول أي عدد من الوسائط الموضعية (positional arguments). تقوم النجمة بتجميع كافة الوسائط الموضعية الإضافية في صف (tuple).

إليك مثال على طريقة تستخدم *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}")

استدعِ الطريقة (method) بأعداد مختلفة من الوسائط (arguments):

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 بجمع كافة الوسائط في صف (tuple):

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 في دوال البناء (constructor methods):

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 تجمع أي عدد من الوسائط الموضعية (positional arguments) في صف (tuple). استخدمها عندما لا تعرف عدد الوسائط التي سيتم تمريرها إلى الطريقة. الاسم args هو اسم متعارف عليه - يمكنك استخدام أي اسم بعد النجمة، ولكن args هو المعيار.

challenge icon

التحدي

سهل

في هذا التحدي، ستقوم بتنفيذ دالة أداة أرقام مرنة.

قم بتحرير ملف number_utils.py لتنفيذ دالة sum_all_numbers التي تقبل أي عدد من الوسائط الرقمية وتعيد مجموعها. يجب على الدالة:

  • إرجاع 0 إذا لم يتم توفير أي وسائط
  • طباعة "Error: All arguments must be numbers" وإرجاع None إذا تم توفير أي وسائط غير رقمية

يحتوي ملف number_utils.py على تعليقات TODO مفصلة لتوجيه عملية التنفيذ الخاصة بك. اتبع هذه التعليقات بعناية للتأكد من أن حلك يلبي جميع المتطلبات.

ورقة مرجعية

يسمح المعامل *args للطريقة (method) بقبول أي عدد من الوسائط الموضعية (positional arguments). تقوم النجمة بتجميع كافة الوسائط الموضعية الإضافية في صف (tuple).

الاستخدام الأساسي لـ *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 في طرق البناء (constructor methods):

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 بتجميع أي عدد من الوسائط الموضعية في صف (tuple). الاسم 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming