Sami Remili نشر 9 فبراير 2021 أرسل تقرير نشر 9 فبراير 2021 سلام عليكم هل من شرح بأمثلة بخصوص generators مافهمته ان generator لا تنشئ مكان في ذاكرة كما تفعل مثال list فهي تنشأ رقم برقم و الكلمة المجوزة yield بمثابة وقف مؤقت للدالة و المولدات تمسك فقط القيمة الحالية أما القيمة السابقة تحذف من الذاكرة اتمنى الرد قريبا 1 اقتباس
0 Salah Eddin Beriani2 نشر 9 فبراير 2021 أرسل تقرير نشر 9 فبراير 2021 نعم مفهومك عنها صحيح وهي غالبا تستعمل مع الملفات التي تحتوي على عدد لا بأس به من القيم تفاديا لاستهلاك الميموري ويمكنك ان ترى في المثال في الاسفل 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 1 اقتباس
0 عبدالباسط ابراهيم نشر 9 فبراير 2021 أرسل تقرير نشر 9 فبراير 2021 (معدل) ال 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 تم التعديل في 9 فبراير 2021 بواسطة عبدالباسط ابراهيم اقتباس
0 Sami Remili نشر 16 فبراير 2021 الكاتب أرسل تقرير نشر 16 فبراير 2021 بتاريخ 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 شكرا أخي اقتباس
السؤال
Sami Remili
سلام عليكم
هل من شرح بأمثلة بخصوص generators
مافهمته ان generator لا تنشئ مكان في ذاكرة كما تفعل مثال list
فهي تنشأ رقم برقم و الكلمة المجوزة yield بمثابة وقف مؤقت للدالة
و المولدات تمسك فقط القيمة الحالية أما القيمة السابقة تحذف من الذاكرة
اتمنى الرد قريبا
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.