English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
فيدالة معينة من قبل المستخدمفي هذا المقال، تعلمنا حول كيفية تعريف الدوال واستدعائها. إذا لم تكن تعلم كيفية استدعاء الدوال، قد يؤدي ذلك إلى أخطاء غير متوقعة. إليك مثال.
def greet(name, msg): """هذه دالة معاينة" المعطيات هي name و msg print("مرحبًا", name + ", " + msg) greet("Monica", "صباحًا!")
نتائج الإخراج
مرحبًا Monica، صباحًا!
دالة greet() تحتوي على معطياتين.
بما أننا استدعينا الدالة باستخدام معطياتين، فإن الدالة تعمل بشكل طبيعي وليس هناك أي أخطاء.
إذا تم استدعاء الدالة باستخدام عدد مختلف من المعطيات، فإن المترجم سيظهر رسالة خطأ. إليك مثال على استدعاء الدالة باستخدام معطيات واحدة وليس لها معطيات، والرسائل الخطأ التي تظهر عند تشغيلها.
>>> greet("Monica") خطأ: greet() يفتقر إلى 1 معطيات إلزامية موقعة: 'msg'
>>> greet() # لم يتم إرسال أي معلمات TypeError: greet() requires 2 positional arguments: 'name' and 'msg'
حتى الآن، تحتوي الوظائف على عدد ثابت من المعلمات. هناك أيضًا طرق أخرى في Python لتحديد وظائف يمكن أن تأخذ عددًا غير محدد من المعلمات.
سأقوم بشرح ثلاثة أشكال مختلفة من هذا النوع حتى الآن.
يمكن للوظائف في Python أن تحتوي على قيم افتراضية للمعلمات.
يمكننا استخدام عميل التخصيص (=) لتقديم قيم افتراضية للمعلمات. هذا مثال.
def greet(name, msg = "صباحًا!"): """ تتحدث الوظيفة هذه إلى الشخص الذي يقدم الرسالة. إذا لم يتم تقديم الرسالة، فسيكون افتراضيًا "صباحًا" """ print("مرحبًا", name + ', ' + msg) greet("Zhang") greet("Li", "كيف حالك مؤخرًا?")
نتائج الإخراج
مرحبًا، ز، صباحًا! مرحبًا، لي، كيف حالك مؤخرًا؟
في هذه الوظيفة، المعلمة name ليس لها قيمة افتراضية، لذا يجب تقديم قيمة المعلمة name عند استدعاء الوظيفة (إلزامي).
من ناحية أخرى، القيمة الافتراضية للمعلمة msg هي "Good morning!". لذلك، يمكن تجنب إرسال القيمة عند استدعاء الوظيفة. إذا تم إرسال قيمة عند استدعاء الوظيفة، فإنها ستغطي القيمة الافتراضية.
يمكن للوظيفة أن تحتوي على أي عدد من المعلمات مع القيم الافتراضية. ولكن بمجرد أن تكون هناك معلمة افتراضية، يجب أن تكون جميع المعلمات اليمنى لها قيم افتراضية أيضًا.
هذا يعني أن المعلمات غير الافتراضية لا يمكن أن تتبع المعلمات الافتراضية. على سبيل المثال، إذا قمنا بتعريف رأس الوظيفة أعلاه على النحو التالي:
def greet(msg = "Good morning!", name):
سنحصل على رسالة خطأ التالية:
SyntaxError: argument غير افتراضي يتبعه معلمة افتراضية
عندما نستدعي وظيفة تحتوي على بعض القيم، يتم تخصيص هذه القيم للمعلمات بناءً على موقعها.
على سبيل المثال، في الوظيفة greet() المذكورة أعلاه، عندما نطلق عليها greet("Bruce", "How do you do?")، يتم تخصيص القيمة "Bruce" للمعلمةاسم، بينما تم تخصيص "How do you do?" إلى msg.
يُسمح لـ Python باستخدام المعلمات المفتوحة لاستدعاء الوظائف. عندما نستدعي الوظيفة بهذه الطريقة، يمكن تغيير ترتيب المعلمات (الموقع). هذا صحيح للدعوات اللاحقة للوظيفة، ويولد نفس النتيجة.
# 2 معلمات مفتاحية greet(name="Bruce",msg="How do you do?") # 2 معلمات مفتاحية، تغيير ترتيب المعلمات greet(msg="How do you do?",name="Bruce") # 1 معلمات مكانية، 1 معلمات مفتاحية greet("Bruce", msg="How do you do?")
كما رأينا، يمكننا دمج المعلمات المكانية والكلمات المفتاحية أثناء استدعاء الدالة. ولكن يجب أن نتذكر أن المعلمات المفتاحية يجب أن تأتي بعد المعلمات المكانية.
وضع معلمات مكانية بعد معلمات مفتاحية سيؤدي إلى خطأ. على سبيل المثال، استدعاء الدالة كالتالي:
greet(name="Bruce","How do you do?")
سيؤدي ذلك إلى خطأ:
SyntaxError: non-keyword arg after keyword arg
في بعض الأحيان، لا نعرف مقدار المعلمات التي سنقوم بتحويلها إلى الدالة مقدماً. يسمح لنا بيباي بمعالجة هذا النوع من الحالات من خلال استدعاء دالة تحتوي على عدد غير محدد من المعلمات.
في تعريف الدالة، نستخدم علامة النجمة (*) قبل اسم المعلمات لتحديد هذا النوع من المعلمات. هذا مثال.
def greet(*names): """هذا الدالة تقوم بتسليمها الأشخاص الذين تم استقبال التحية منهم كل شخص في قائمة الكومات.""" # الاسم هو كومة تحتوي على معلمات للمسميات في names: print("Hello", name) greet("Monica", "Luke", "Steve", "John")
نتائج الإخراج
مرحبًا، مونيكا مرحبًا، لوك مرحبًا، ستيف مرحبًا، جان
في هذا السياق، قمنا بتسمية دالة تحتوي على عدة معلمات. هذه المعلمات يتم تعبئتها في كومة قبل إرسالها إلى الدالة. في الدالة، نستخدم حلقة for لاسترجاع جميع المعلمات.