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

السؤال

نشر (معدل)

مرحبًا
ما المقصود من الكلمة yield في بايثون؟ رايتها هنا في هذا المقطع من الكود:

def validate(sent, stats):
    for s in sent:
        aspects = s.find('aspectTerms') or []
        for aspect in list(aspects):
            polarity = aspect.attrib['pol']
            if polarity == 'conflict':
                aspects.remove(aspect)
                stats['conflicts'] += 1
        if not aspects:
            stats['rejected'] += 1
            continue
        yield s

 

تم التعديل في بواسطة Ali Haidar Ahmad
توضيح عنوان السؤال

Recommended Posts

  • 0
نشر

أولاً: ما هي yield.

yield عبارة عن كلمة مفتاحية في Python تُستخدم للعودة من الدالة بدون تدمير حالة المتغيرات المحلية "local variable" الخاص بها وعندما يتم استدعاء الدالة، يبدأ التنفيذ من حيث توقفت الدالة في المرة الأخيرة عندما صادفت الكلمة المفتاحية yield. أي دالة تحتوي على الكلمة المفتاحية yield تسمى مولد "generator". وبالتالي، فإن yield هو الذي يتم من خلاله صنع المولد. هذه الكلمة المفتاحية قليلة الشهرة في بايثون ومع ذلك لها فائدة أكثر مما قد تتوقعينه.

ثانياً:أمثلة لتوضيح عمله.

مثال 1:

# generator to print even numbers
# مولّد لطباعة الأعداد الفردية
def printOdd(numbers) :
    for i in numbers:
        if i % 2 != 0:
            yield i
# تحديد مجموعة من الأرقام
numbers = [1, 2, 5, 4, 9]
# طباعة الأعداد الفردية
print ("The even numbers in list are : ", end = " ")
for j in printOdd(numbers):
    print (j, end = " ")
# الخرج:
# The even numbers in list are :  1 5 9 

كما ذكرت فإن أي دالة تحتوي على هذه الكلمة المفتاحية يكون اسمها مولّد، وهذا ما يؤكده الاستدعاء التالي:

printOdd(numbers)
# <generator object printOdd at 0x00000216842B4DC8>

لاحظ أيضاً في المثال السابق أن j تقوم بالمرور على عناصر هذا المولد، وفي كل استدعاء له يقوم بالتنفيذ من حيثما توقف بدلاً من العودة للبداية.

مثال 2:

# برنامج لتوليد مربعات الأعداد من 1 ل 50
# سنعرّف الآن دالة توليد لانهائية تقوم بتوليد مربعات الأعداد بدءاً من 1
def nextSquare():
	i = 1
	# حلقة لانهائية لتوليد مربعات  الأعداد
	while True:
		yield i*i				
		i += 1 # الاستدعاء التالي للدالة سيتم فيها بدء التنفيذ من هنا
# استدعاء الدالة لتحقيق المطلوب
for num in nextSquare():
	if num > 50:
		break
	print(num)

لاحظ أن التنفيذ بعد كل استدعاء يبدأ من التعليمة التي تلي yield، ففي أول استدعاء يبدأ التنفيذ من بداية الدالة، لكن في الاستدعاءات التالي يتم التنفيذ بدءاً من السطر الذي أشرت إليه في الكود.
 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...