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

السؤال

نشر

سلام عليكم 

هل من شرح بأمثلة بخصوص generators 

مافهمته ان generator لا تنشئ مكان في ذاكرة كما تفعل مثال list 

فهي تنشأ رقم برقم  و الكلمة المجوزة yield  بمثابة وقف مؤقت للدالة 

و المولدات  تمسك فقط القيمة الحالية أما القيمة السابقة تحذف من الذاكرة 

 

اتمنى الرد قريبا

Recommended Posts

  • 0
نشر

نعم مفهومك عنها صحيح وهي غالبا تستعمل مع الملفات التي تحتوي على عدد لا بأس به من القيم تفاديا لاستهلاك الميموري ويمكنك ان ترى في المثال في الاسفل 

def numbers_sum(nums):
    result = []
    for i in nums:
        result.append(i+i)
    return result


my_nums = numbers_sum([1, 2, 3, 4, 5])

print(my_nums)  # [2, 4, 6, 8, 10]

في المثال لدينا قائمة وببساطة نحن نرجع قائمة اخرى للقيم مجموعة لنفسها وطول القائمة هو 5 لكن  لو كانت لديك قائمة طولها 100 مليون وادخلتها للمعالجة في الكود السابق سوف تلاحظ مشاكل في الكمبيوتر وقد يتوقف عن الاستجابة اذا كان كمبيوتر قديم نوعا ما ولحل المشكلة نستخدم generators ونقرا القائمة قيمة بعد قيمة

def numbers_sum(nums):
    for i in nums:
        yield(i+i)


my_nums = numbers_sum([1, 2, 3, 4, 5])

print(my_nums)  # <generator object numbers_sum at 0x7f95f264f518>

for num in my_nums:
    print(num)

الكود في الاعلى هو محاكات للكود السابق لكن باستخدام generators الفرق هنا انك ستتلقى كل قيمة على حدى عوض انك ستتلقاهم في قائمة وتلاحظ انني استخدمت for loop للدوران على my_nums وذلك لان for loop لديها القابلية للتوقف عند انتهاء القيم فعند مناداة next  على my_num اكثر من 5 مرات في مثالنا سنتحصل على خطأ برمجي يخبرنا ان القيم انتهت 

print(next(my_nums))  # 2
print(next(my_nums))  # 4
print(next(my_nums))  # 6
print(next(my_nums))  # 8
print(next(my_nums))  # 10
print(next(my_nums))  # error StopIteration

 

  • 0
نشر (معدل)

 ال generator هي دالة تقوم بتسهيل عمل loop عن طريق استخدام ال yield و ال next 

تقوم هذه الدالة بتوليد object قبل حتى أن تبدأ بالتنفيذ وعند إستدعاء الدالة next تقوم بالتنفيذ حتى تصل لل yield ثم تقوم بإسترجاع القيمة المحددة كالمثال التالي

def yrange(n):
    i = 0
    while i < n:
   # تقوم yield بإسترجاع القيمة المحددة
        yield i
        i += 1
y = yrange(3)

next(y)
0
next(y)
1
#بدلا من ان تقوم الدالة بإسترجاع نفس القيمة وهي ال 0 قامت بإسترجاع ال 1 
#حفظت الدالة قيمة ال I 
next(y)
2

 

تم التعديل في بواسطة عبدالباسط ابراهيم
  • 0
نشر
بتاريخ On 2/10/2021 at 00:20 قال Salah Eddin Berriani:

نعم مفهومك عنها صحيح وهي غالبا تستعمل مع الملفات التي تحتوي على عدد لا بأس به من القيم تفاديا لاستهلاك الميموري ويمكنك ان ترى في المثال في الاسفل 


def numbers_sum(nums):
    result = []
    for i in nums:
        result.append(i+i)
    return result


my_nums = numbers_sum([1, 2, 3, 4, 5])

print(my_nums)  # [2, 4, 6, 8, 10]

في المثال لدينا قائمة وببساطة نحن نرجع قائمة اخرى للقيم مجموعة لنفسها وطول القائمة هو 5 لكن  لو كانت لديك قائمة طولها 100 مليون وادخلتها للمعالجة في الكود السابق سوف تلاحظ مشاكل في الكمبيوتر وقد يتوقف عن الاستجابة اذا كان كمبيوتر قديم نوعا ما ولحل المشكلة نستخدم generators ونقرا القائمة قيمة بعد قيمة


def numbers_sum(nums):
    for i in nums:
        yield(i+i)


my_nums = numbers_sum([1, 2, 3, 4, 5])

print(my_nums)  # <generator object numbers_sum at 0x7f95f264f518>

for num in my_nums:
    print(num)

الكود في الاعلى هو محاكات للكود السابق لكن باستخدام generators الفرق هنا انك ستتلقى كل قيمة على حدى عوض انك ستتلقاهم في قائمة وتلاحظ انني استخدمت for loop للدوران على my_nums وذلك لان for loop لديها القابلية للتوقف عند انتهاء القيم فعند مناداة next  على my_num اكثر من 5 مرات في مثالنا سنتحصل على خطأ برمجي يخبرنا ان القيم انتهت 


print(next(my_nums))  # 2
print(next(my_nums))  # 4
print(next(my_nums))  # 6
print(next(my_nums))  # 8
print(next(my_nums))  # 10
print(next(my_nums))  # error StopIteration

 

شكرا أخي على الرد 

بتاريخ On 2/9/2021 at 12:21 قال عبدالباسط ابراهيم:

 ال generator هي دالة تقوم بتسهيل عمل loop عن طريق استخدام ال yield و ال next 

تقوم هذه الدالة بتوليد object قبل حتى أن تبدأ بالتنفيذ وعند إستدعاء الدالة next تقوم بالتنفيذ حتى تصل لل yield ثم تقوم بإسترجاع القيمة المحددة كالمثال التالي


def yrange(n):
    i = 0
    while i < n:
   # تقوم yield بإسترجاع القيمة المحددة
        yield i
        i += 1

y = yrange(3)

next(y)
0
next(y)
1
#بدلا من ان تقوم الدالة بإسترجاع نفس القيمة وهي ال 0 قامت بإسترجاع ال 1 
#حفظت الدالة قيمة ال I 
next(y)
2

 

شكرا أخي 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...