Maram Jouriah نشر 19 أبريل 2021 أرسل تقرير نشر 19 أبريل 2021 ما هو استخدام المفتاح '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_ ؟ ومالذي تعيده؟ اقتباس
1 Wael Aljamal نشر 19 أبريل 2021 أرسل تقرير نشر 19 أبريل 2021 تستخدم الكلمة المفتاحية 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 يقوم بحفظ المرحلة التي وصل لها من الاستدعاء أي سيرجع العنصر التالي دوما (له ذاكرة داخلية خاصة) 1 اقتباس
0 بلال زيادة نشر 20 أبريل 2021 أرسل تقرير نشر 20 أبريل 2021 لفهم ما يفعله 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 اقتباس
السؤال
Maram Jouriah
ما هو استخدام المفتاح 'yield' ضمن البايثون؟
احاول ان افهم الكود الآتي:
وهذا هو كود المناداة:
ماذا يحدث عند استدعاء get_child_candidates_ ؟ ومالذي تعيده؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.