اذهب إلى المحتوى

السؤال

نشر

ما هو استخدام المفتاح 'yield' ضمن البايثون؟

احاول ان افهم الكود الآتي:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  

وهذا هو كود المناداة:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

ماذا يحدث عند استدعاء  get_child_candidates_ ؟ ومالذي تعيده؟

 

Recommended Posts

  • 1
نشر

تستخدم الكلمة المفتاحية yield فيما يدعى generators أو المولدات, حيث أن yield تعمل مثل return في إعادة القيمة التي تم حسابها ولكنها لا توقف عمل الدالة بشكل كامل بل تسمح لنا بإعادة استدعاء الدالة نفسها مع حفظ آخر خطوة قمنا بها والعمل على الخطوة التالية.

حيث يتم الاعتماد على المولدات مثلا لتوليد سلاسل من الأعداد التي تتبع لعلاقة رياضية ما و بدل الانتظار لحساب كامل السلسلة و من ثم تخزينها (دالة عادية تقوم بتوليد السلسلة ثم تقوم بإرجاع array) وثم المرور عليها، تسمح لنا generator بتوليد القيمة التي نريدها بشكل متتالي عند كل استدعاء لهذه الدالة أي تعيد عنصر واحد عند كل استدعاء.

مثلا إذا أردنا إرجاع عدة قيم لنفرض 1 2 3 يمكن عمل التالي:

def simpleGeneratorFun():
    yield 1            
    yield 2            
    yield 3            
   
# Driver code to check above generator function
for value in simpleGeneratorFun(): 
    print(value)

لاحظي استدعاء الدالة ضمن الحلقة حيث يمكن اعتبارها مصفوفة ولكن العنصر الحالي غير موجود حتى يتم حسابه و إعادته من خلال yield.

بالنسبة للشيفرة لديكِ:

تقوم بعمل Iterator (تكرار) على القائمة node لجلب العنصر التالي ويمكنك ملاحظة أننا نقوم بالاستدعاء بدون ذكر دليل العنصر أو index لأن ال Generator يقوم بحفظ المرحلة التي وصل لها من الاستدعاء أي سيرجع العنصر التالي دوما (له ذاكرة داخلية خاصة)

  • 0
نشر

لفهم ما يفعله yield , يجب أن تفهم ما هي المولدات (generators). وقبل أن تتمكن من فهم المولدات , يجب أن تفهم العناصر التكرارية (iterables).

العناصر التكرارية iterables:

عند إنشاء قائمة , يمكنك قراءة عناصرها واحدًا تلو الآخر

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

المولدات Generators :

المولدات هي مكررات , نوع من التكرارات لا يمكنك تكرارها إلا مرة واحدة. لا تخزن المولدات جميع القيم في الذاكرة , بل تولد القيم بسرعة: 

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

Yield:

العائد عبارة عن كلمة رئيسية تستخدم مثل return , باستثناء أن function ستعيد مولدًا (generator).

>>> def create_generator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = create_generator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object create_generator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...