مقدمة في Python Functools

مرحباً ، هابروفسك. لقد أعددنا ترجمة لقطعة أخرى من المواد المفيدة قبل بدء دورة المطور Python .




Python هي لغة برمجة عالية المستوى موجهة للكائنات. واحدة من أكبر مزايا Python هي أنه يحتوي على وظيفة خاصة تسمح لك بكتابة تعليمات برمجية قابلة لإعادة الاستخدام باستخدام أدوات اللغة المدمجة.

Functools هي مكتبة Python تم تصميمها للعمل مع وظائف عالية الترتيب. يمكن أن تأخذ هذه الوظائف وظائف أخرى ووظائف الإرجاع. وهي تساعد المطور على كتابة التعليمات البرمجية التي يمكن إعادة استخدامها. يمكن استخدام الوظائف أو تمديدها دون إعادة كتابتها بالكامل. توفر وحدة functools في Python أدوات متنوعة تسمح لك بتحقيق التأثير الموصوف. على سبيل المثال ، ما يلي:

  • جزئي
  • ترتيب كامل
  • update_wrapperل جزئية .

الوظيفة الجزئية هي واحدة من الأدوات الرئيسية التي توفرها functools . دعونا نكتشف ذلك مع الأمثلة.

ميزة جزئية في Python


في وحدة functools ، تعتبر الوظيفة الجزئية واحدة من أهم الأدوات. باستخدام دالة جزئية ، يمكنك استبدال دالة موجودة تم تمريرها بالفعل وسيطات. علاوة على ذلك ، يمكننا أيضًا إنشاء نسخة جديدة من الوظيفة بإضافة وثائق عالية الجودة.

يمكننا إنشاء وظائف جديدة عن طريق تمرير الحجج الجزئية. يمكننا أيضًا تجميد بعض الحجج الوظيفية ، والتي ستؤدي إلى ظهور كائن جديد. هناك طريقة أخرى لتمثيل جزئي ، وهي أنه بمساعدتنا يمكننا إنشاء دالة بقيم افتراضية. جزئي يدعم الكلمات الأساسية والحجج الموضعية على أنها ثابتة.
دعونا نلقي نظرة على الأمثلة.

كيفية إنشاء وظيفة جزئية ؟


لإنشاء وظيفة جزئية ، استخدم functoolspartial() من المكتبة . مكتوب على النحو التالي:

partial(func, /, *args, ** kwargs)

لذلك تقوم بإنشاء وظيفة جزئية تستدعي func ، وتمريرها بكلمات رئيسية ثابتة وحجج موضعية. هنا ، يتم عادةً تمرير بعض الحجج الضرورية لاستدعاء وظيفة func . يتم تمرير الوسيطات المتبقية في * args و ** kwargs .

افترض أن الوظيفة أدناه تضيف رقمين:

def multiply(x, y):
 
    return x * y

الآن فكر في الحالة عندما كنا بحاجة إلى مضاعفة أو مضاعفة رقم معين. في هذه الحالة ، نحدد الوظائف الجديدة كما هو موضح أدناه:

def multiply(x, y):
        return x * y
 
def doubleNum(x):
       return multiply(x, 2)
 
def tripleNum(x):
       return multiply(x, 3)

عندما يكون البرنامج النصي للدالة 2-3 فقط ، بالطبع ، فمن المنطقي القيام به ، كما هو موضح أعلاه. ولكن عندما تحتاج إلى كتابة 100 وظيفة أخرى ، فلن يكون من المنطقي إعادة كتابة نفس الرمز عدة مرات. هذا هو المكان الذي تكون فيه الوظائف الجزئية في متناول اليد . لاستخدامها ، أولاً ، نحتاج إلى استيراد جزئي من Functools .

from functools import partial
 
def multiply(x, y):
       return x * y
 
doubleNum = partial(multiply, 2)
   tripleNum = partial(multiply, 3)
 
Print(doubleNum(10))
 
Output: 20

كما ترى من المثال ، سيتم استبدال القيم الافتراضية بالمتغيرات الموجودة على اليسار. بدلاً من x سيكون هناك 2 ، وبدلاً من y سيكون هناك 10 عند استدعاء doubleNum (10) . في هذا المثال ، لن يهم الترتيب ، ولكن في الاستخدامات الأخرى ، قد يهم. دعونا نلقي نظرة على مثال لهذه الحالة لفهم ترتيب استبدال المتغير.

from functools import partial
def orderFunc(a,b,c,d):
      return a*4 + b*3 + c*2 + d
 
result = partial(orderFunc,5,6,7)
print(result(8))
 
Output: 60

الطلب الكامل


لدينا دالة orderFunc()نضرب فيها a4 ، b3 ، c2 ، ونضيف dقيمًا إلى المجموع.

لقد أنشأنا جزئية وظيفة result()أن المكالمات orderFunc()مع القيم 5 و 6 و 7. الآن القيم 5 و 6 و 7 سيحل محل المتغيرات a، bو cفقا لذلك. dسيتم استبدال المتغير بـ 8 ، حيث يتم إرساله عند استدعاؤه result(). تكون النتيجة (4 * 5 + 6 * 3 + 7 * 2 + 8) = 60.

في هذه الحالة ، سيكون ترتيب القيم المرسلة مهمًا ، لأنه إذا تغير الترتيب ، فستتغير النتيجة أيضًا. لإصلاح المتغيرات ، يمكنك استخدام الكلمات الأساسية بدلاً من الحجج الموضعية. دعنا نعيد كتابة الرمز أعلاه باستخدام الكلمات الرئيسية كوسيطات.

from functools import partial
def orderFunc(a,b,c,d):
       return a*4 + b*3 + c*2 + d
 
 result = partial(orderFunc,c=5,d=6)
print(result(8,4))
 
Output: 60

هنا قمنا بإصلاح القيمة 5 للمتغير cو 6 للمتغير d. بدلاً من المتغيرات a، bستظهر قيم 8 و 4. ونتيجة لذلك نحصل على (8 * 4 + 4 * 3 + 5 * 2 + 6) = 60. يمكن تحديد الوظيفة

الجزئية في حلقة واستخدامها للحسابات المتكررة. لنلقي نظرة على مثال:

from functools import partial
 
def add(x,y):
      return x + y
 
add_partials = []
for i in range (1, 10):
      function = partial(add, i)
      add_partials.append(function)
      print('Sum of {} and 2 is {}'.format(i,add_partials[i-1](2)))
 
  
Output:
 
Sum of 1 and 2 is 3
Sum of 2 and 2 is 4
Sum of 3 and 2 is 5
Sum of 4 and 2 is 6
Sum of 5 and 2 is 7
Sum of 6 and 2 is 8
Sum of 7 and 2 is 9
Sum of 8 and 2 is 10
Sum of 9 and 2 is 11

في هذا المثال ، سنلخص نطاقًا معينًا من القيم مع 2 ، مع إعادة استخدام الوظيفة الحالية. يمكننا استدعاء جزئي في الحلقة واستخدام وظائفه لحساب المبالغ. كما يتبين من القيم عند الخرج ، لدينا دورة من 1 إلى 10 وتضاف جميع القيم في هذا الفاصل إلى 2 باستخدام الدالة الجزئية ، التي تستدعي وظيفة الإضافة.

البيانات الوصفية


على الرغم من أن الوظائف الجزئية مستقلة ، إلا أنها تحتفظ بذاكرة (البيانات الوصفية) الخاصة بالوظيفة التي تقوم بتمديدها.

from functools import partial
 
def add(x,y):
      return x + y
 
# create a new function that multiplies by 2
result = partial(add,y=5)
print(result.func)
print(result.keywords)
 
Output:
<function add at 0x7f27b1aab620>
{'y': 5}

ستقوم المكالمة الأولى لـ func بتمرير اسم الوظيفة وعنوانها في الذاكرة ، وستقوم المكالمة الثانية باستخدام الكلمات الأساسية بتمرير الكلمات الرئيسية إلى الوظيفة. وبالتالي ، يمكن تسمية الوظائف الجزئية بالتوثيق الذاتي باستخدام البيانات الوصفية التي تتلقاها من دالة قابلة للتوسيع. يمكننا تحديث البيانات الوصفية للوظيفة باستخدام أداة أخرى من functools . هي أداة يمكنك استخدامها لتحديث بيانات تعريف الميزة. دعونا نكتشف ذلك بمثال.

update_wrapper partial

Update_wrapper

def multiply(x, y):
 
    """Test string."""
 
    return x * y
 
 result = functools.partial(multiply, y=2)
 
 try:
 
    print ('Function Name:'+result.__name__)
 
except AttributeError:
 
    print('Function Name: __no name__')
 
 print ('Function Doc:'+result.__doc__)
 
 print('Updating wrapper:')
 
functools.update_wrapper(result, multiply)
 
 print ('Function Name:'+result.__name__)
 
print ('Function Doc:'+result.__doc__)
 
Output:
 
Function Name: __no name__
 
Function Doc:partial(func, *args, **keywords) - new function with partial application
 
    of the given arguments and keywords.
 
 
Updating wrapper:
 
Function Name: multiply
Function Doc: Test string.

الآن ، كما ترون من الناتج ، قبل استخدام الغلاف ، لم يكن للدالة اسم أو مستند مخصص لها. حالما نحصل تحديث اسم و ثيقة مع وظائف update_wrapper، رأينا نتيجة المقابلة في الإخراج.

استنتاج


باستخدام أدوات functools يمكننا التخلص من التعليمات البرمجية الزائدة وزيادة إمكانيات إعادة استخدام التعليمات البرمجية في Python. كلما استخدمت الوظيفة الجزئية في كثير من الأحيان ، كلما فتحت حالات استخدام أكثر. جرب واستمتع بها!



احصل على الدورة.



All Articles