Python variable argument - Arabic
مقدمة
الـ varargs او الـ Python variable argument حاجة لازم هتقابلها خلال البرمجة سواء بالـ Python او اي لغة برمجة تانية, مش هطول عليك ونبداء على طول.
- varargs هي اختصار لـ variable argument
- args* اختصار لـ non-keyword argument
- kwargs* اختصار لـ keyword argument
تقدر تروح للعناوين بسرعة من هنا:
?How Does It Work
اكتب الكود التالي
# Example 1 Hard-Coded way
def ex_1(first, second, third):
print(first)
print(second)
print(third)
ex_1('a', 'b', 'z')
# ERROR
ex_1('a', 'b', 'z', 'x', 'm', 'y')
# Example 2
def ex_2(*args):
# Tuple length depends on passed arguments.
print('Tuple length =', len(args))
for arg in args:
print(arg)
ex_2('A: Apple', 'B: Bin', 'Z: Zoo', 'X: X-Men', 'M: Mohamed')
# Example 3
def ex_2(**kwargs, *args):
pass
Example 1 مرتبط بعدد arguments معين في الـ function ... باستخدام الـ function لازم عدد الـ vaules يكون مساوي لعدد الـ arguments, لاحظ الـ ERROR.
Example 2 تقدر تزود vaules زي ما تحب ... الـ Tuple Length هيزيد حسب عدد الـ arguments الـ هدخله لما تشغل الـ function ... الهدف الرئيسي من الـ varargs هو المرونة في الكود.
Example 3 هيديك ERROR, ده لان الـ args* بتيجي قبل الـ kwargs** في الترتيب.
بعض النقط الهامة
- الـ args output عبارة عن Tuple
- الـ kwargs output عبارة عن Dictionary
- بالتالي تقدر تستخدم الـ methods الخاصة بالـ Tuple والـ Dict
- كلمة args و kwargs هي الاسماء التي يفضل استخدمها
- لكن ممكن args تبقئ car و kwargs تبقي watermelon عادي
- الـ بيفرق * للـ non-keyword argument
- و الـ ** للـ keyword argument
مطلوب هنا فهم الفكرة العامة, لكن من غير تطبيق بنفسك ومرجعة الـ output هيكون كلام هيتبخر اسرع من طعم الـ PEPSI ... التالي كله معتمد على التطبيق ... هاكتب كود وانت هتفهمة من الـ output بسهولة جدآ
ملاحظة : في ERROR متساب داخل بعض الاكود للتوضيح (زي الكود الفائت) راجع الـ comments كويس, وشغل كل function لوحدها لتجنب تعطيل الكود كله
Practical Code
args*
خليك فاكر تشغل كل function لوحدها لتجنب تعطيل الكود كله
# Example 1
def ex1_fun(*num):
sum = 0
for n in num:
sum = sum + n
print("Sum:", sum)
ex1_fun(3, 5)
ex1_fun(4, 5, 6, 7)
ex1_fun(1, 2, 3, 5, 6)
# Example 2
def ex2_fun(*args):
return args
dream_catcher = ex2_fun(1, 2, 3)
print(type(dream_catcher))
print(dream_catcher[1])
print(dream_catcher[1:2])
# Error
dream_catcher[0] = 's'
# Example 3
number = [1, 2, 3]
# One item not 3 items
print(ex3_fun(number))
# Index the list item
print(ex3_fun(number)[0][0:2])
لاحظ الـ output في الـ Example 3 ... ده لان الـ args عبارة عن tuple بتعامل الـ List كـ Item واحد فقط, راجع اخر سطر ... هتلاقي اني عملت Index للـ List بعد كده عملت Range للـ Values داخل الـ List
kwargs**
# Example 1
def ex1_fun(name, lname):
print(name, lname)
ex1_fun(name='mohamed', lname='ayman')
# Error
ex1_fun(name='mohamed', lname='ayman', new='name')
# Example 2
def ex2_fun(**kwargs):
return kwargs
items = {'k': 'kite', 'c': 'cup', 'p': 'phone'}
dream_catcher = ex2_fun(**items)
print("Use Dict get() ==> ", dream_catcher.get('k'))
for k, v in dream_catcher.items():
print(f'Dict key {k} with value ==> {v}')
Use *args with **kwargs
def myFun(*args, **kwargs):
# print out all args
print("args values ==> ", args)
# print out all kwargs
print("kwargs values ==> ", kwargs)
myFun(
'geeks', 'for', 'geeks', 'name1', 'name2', 'name3',
first="Geeks", mid="for", last="Geeks"
)
Unpacking
لو حسيت انك فاصل ومش مستوعب الكود التالي يبقئ محتاج تريح, تشحن وتيجي تكمل
# Example 1
def ex1_fun(a, b, c):
return a, b, c
ex1_items = [1, 2, 3]
print(ex1_fun(*ex1_items))
# Example 2
def ex2_fun(name, language, framework):
return name, language, framework
ex2_items = {'name': 'mohamed', 'language': 'python', 'framework': 'django'}
print(ex2_fun(**ex2_items))
لاحظ ان
- لازم عدد عناصر الـ Items يكون متساوي مع عدد الـ Arguments في الـ Example1 والـ Example2
- لازم الاسماء تكوم متشابهة بالنسبة للـ kwargs في الـ Example2 ... جرب تزود Value كمان للـ ex2_items
- بمعنى, dcit_keys نفسها زي الـ function arguments في التسمية جرب تضيف value جديدة للسطر قبل الاخير
Generous Data Structure
طبق الكود التالي وحاول تربطها بالاسم, الاسم انا الـ مسمية ... الكود سهل جدا
items = [1, 2, 3, 4, 5, 6]
*a, b, c = items
print(a)
print(b)
print(c)
المراجع
RealPython
Programiz