Ali Ahmed55 نشر الأربعاء في 13:17 أرسل تقرير نشر الأربعاء في 13:17 السلام عليكم هو اي الyield في الباثيون واي الفرق مابينو وبين return ؟ 4 اقتباس
0 ياسر مسكين نشر الأربعاء في 13:27 أرسل تقرير نشر الأربعاء في 13:27 وعليكم السلام ورحمة الله تعالى وبركاته، يمكنك التعرف علىمفهوم الكلمة المفتاحية yield واستخداماتها في لغة بايثون من خلال الإجابتين هاتين: بالنسبة للفرق بينها وبين return فيكمن ذلك في أن yield تعمل مثل return في إعادة القيمة التي تم حسابها ولكنها لا توقف عمل الدالة بشكل كامل بل تسمح لنا بإعادة استدعاء الدالة نفسها مع حفظ آخر خطوة قمنا بها والعمل على الخطوة التالية. 1 اقتباس
0 Mustafa Suleiman نشر الأربعاء في 13:28 أرسل تقرير نشر الأربعاء في 13:28 هناك فرق كبير، return لإنهاء تنفيذ الدالة فورًا وإرسال قيمة أو None في حال لم تُحدد قيمة، وبمجرد أن تصل الدالة إلى جملة return، يتوقف تنفيذها تمامًا، وأي كود يأتي بعد return داخل نفس الدالة لن يتم تنفيذه. أما yield هي خاصة بنوع من الدوال يسمى الدوال المولّدة Generator Functions، وباستخدامها بها تُنتج قيمة مثل return، لكنها لا تنهي الدالة، ما يحدث هو تعليق أو توقف مؤقت لتنفيذ الدالة وتحتفظ بحالتها الداخلية وهي قيمة المتغيرات المحلية ومكان التوقف. وعند استدعاء دالة تحتوي على yield، لا تُنفذ الكود مباشرة، بل تعود بكائن خاص يسمى مولّد Generator Object، وهو مُكرِّر Iterator، وفي كل مرة تطلب فيها قيمة من المولّد من خلال حلقة for أو الدالة next()، تستأنف الدالة تنفيذها من النقطة التي توقفت عندها بعد yield السابقة، وتستمر حتى تصل إلى yield التالية فتنتج قيمة وتتوقف مؤقتًا مرة أخرى أو حتى نهاية الدالة. أي تحتفظ الدالة المولّدة بحالتها بين الاستدعاءات المتعاقبة للمولّد. 1 اقتباس
0 عبدالباسط ابراهيم نشر الأربعاء في 13:28 أرسل تقرير نشر الأربعاء في 13:28 وعليكم السلام ورحمة الله وبركاته. الفرق الأساسي بينهما هو أن yield تُستخدم في تعريف الدوال المولدة (generators). وعندما تستخدم yield داخل دالة، فإنها تُرجع قيمة وتُحفظ حالة الدالة بحيث يمكن استئناف التنفيذ منها لاحقاً عند طلب القيمة التالية. هذا يعني أن الدالة لا تنتهي بالكامل بعد تنفيذ yield، بل تنتظر حتى يُطلب منها العنصر التالي. بينما return تقوم بإرجاع قيمة واحدة وتنهي عمل الدالة بالكامل، بحيث لا يمكن استئنافها بعد ذلك. وإليك المثال التالي للتوضيح def generate_numbers(): for i in range(5): yield i gen = generate_numbers() for number in gen: print(number) # ستتم طباعة الأرقام من 0 إلى 4 تدريجياً بينما باستخدام return def return_number(): for i in range(5): return i # ستعيد القيمة 0 وتنهي الدالة فوراً print(return_number()) # سيطبع 0 فقط 1 اقتباس
0 محمد عاطف17 نشر الأربعاء في 13:30 أرسل تقرير نشر الأربعاء في 13:30 وعليكم السلام ورحمة الله وبركاته. في بايثون إن yield و return هما كلمتان رئيسيتان يتم إستخدامهم في الدوال ولكل واحدة منهما لها سلوك مختلف عن الآخر . حيث عندما تستخدم yield في دالة فإنها تحول الدالة إلى مولد (Generator) و المولد هو نوع خاص من الدوال التي تعيد قيمة واحدة في كل مرة عند استدعاء next() عليها. وعند الوصول إلى yield فإنه يتم إرجاع القيمة الموجودة بعده ولكن دون إنهاء الدالة.و يتم حفظ حالة التنفيذ عند نقطة yield ويمكن استئنافها في المرة التالية التي يتم إستدعاء المولد. ويمكنك متابعة الدرس التالي على موسوعة حسوب : https://wiki.hsoub.com/Python/generators 1 اقتباس
0 Ali Ahmed55 نشر الأربعاء في 13:32 الكاتب أرسل تقرير نشر الأربعاء في 13:32 بتاريخ 3 دقائق مضت قال Mustafa Suleiman: هناك فرق كبير، return لإنهاء تنفيذ الدالة فورًا وإرسال قيمة أو None في حال لم تُحدد قيمة، وبمجرد أن تصل الدالة إلى جملة return، يتوقف تنفيذها تمامًا، وأي كود يأتي بعد return داخل نفس الدالة لن يتم تنفيذه. أما yield هي خاصة بنوع من الدوال يسمى الدوال المولّدة Generator Functions، وباستخدامها بها تُنتج قيمة مثل return، لكنها لا تنهي الدالة، ما يحدث هو تعليق أو توقف مؤقت لتنفيذ الدالة وتحتفظ بحالتها الداخلية وهي قيمة المتغيرات المحلية ومكان التوقف. وعند استدعاء دالة تحتوي على yield، لا تُنفذ الكود مباشرة، بل تعود بكائن خاص يسمى مولّد Generator Object، وهو مُكرِّر Iterator، وفي كل مرة تطلب فيها قيمة من المولّد من خلال حلقة for أو الدالة next()، تستأنف الدالة تنفيذها من النقطة التي توقفت عندها بعد yield السابقة، وتستمر حتى تصل إلى yield التالية فتنتج قيمة وتتوقف مؤقتًا مرة أخرى أو حتى نهاية الدالة. أي تحتفظ الدالة المولّدة بحالتها بين الاستدعاءات المتعاقبة للمولّد. اه عشان كده الyield افضل من حيث استهلاك الذاكرة صح الف شكراا جدا لحضرتكم جزاكم الله كل خير 1 اقتباس
0 Mustafa Suleiman نشر الأربعاء في 13:38 أرسل تقرير نشر الأربعاء في 13:38 بتاريخ 1 دقيقة مضت قال Ali Ahmed55: اه عشان كده الyield افضل من حيث استهلاك الذاكرة صح الف شكراا جدا لحضرتكم جزاكم الله كل خير return بالنسبة للبيانات الكبيرة كقائمة أو أي مجموعة بيانات تحتوي على عدد كبير جدًا من العناصر، فسيحتاج بايثون إنشاء القائمة كاملة في الذاكرة وتخزين كل عناصرها قبل أن يتم إرجاعها، وعند التعامل مع ملايين العناصر، أو قراءة ملف كبير جدًا، فأحيانًا تستهلك كمية هائلة من ذاكرة الوصول العشوائي RAM، وذلك يبطئ البرنامج أو حتى يؤدي إلى انهياره بسبب نفاد الذاكرة MemoryError. أما yield، فالدالة لا تقوم بإنشاء المجموعة كاملة في الذاكرة دفعة واحدة، بل تُنتج yield قيمة واحدة فقط في كل مرة يتم فيها طلب قيمة من المولّد، وتحتفظ الدالة بحالتها وتتوقف مؤقتًا وعند طلب القيمة التالية، تستأنف من حيث توقفت وتنتج القيمة التالية، وهكذا. بالتالي في أي لحظة زمنية، لا يتم تخزين سوى عنصر واحد أو عدد قليل جدًا من العناصر اللازمة للحساب في الذاكرة، بغض النظر عن الحجم الكلي للتسلسل الذي يمكن للمولّد إنتاجه، وذاك ما يسمى التقييم الكسول Lazy Evaluation. 1 اقتباس
0 Ali Ahmed55 نشر الأربعاء في 13:40 الكاتب أرسل تقرير نشر الأربعاء في 13:40 بتاريخ 1 دقيقة مضت قال Mustafa Suleiman: return بالنسبة للبيانات الكبيرة كقائمة أو أي مجموعة بيانات تحتوي على عدد كبير جدًا من العناصر، فسيحتاج بايثون إنشاء القائمة كاملة في الذاكرة وتخزين كل عناصرها قبل أن يتم إرجاعها، وعند التعامل مع ملايين العناصر، أو قراءة ملف كبير جدًا، فأحيانًا تستهلك كمية هائلة من ذاكرة الوصول العشوائي RAM، وذلك يبطئ البرنامج أو حتى يؤدي إلى انهياره بسبب نفاد الذاكرة MemoryError. أما yield، فالدالة لا تقوم بإنشاء المجموعة كاملة في الذاكرة دفعة واحدة، بل تُنتج yield قيمة واحدة فقط في كل مرة يتم فيها طلب قيمة من المولّد، وتحتفظ الدالة بحالتها وتتوقف مؤقتًا وعند طلب القيمة التالية، تستأنف من حيث توقفت وتنتج القيمة التالية، وهكذا. بالتالي في أي لحظة زمنية، لا يتم تخزين سوى عنصر واحد أو عدد قليل جدًا من العناصر اللازمة للحساب في الذاكرة، بغض النظر عن الحجم الكلي للتسلسل الذي يمكن للمولّد إنتاجه، وذاك ما يسمى التقييم الكسول Lazy Evaluation. تمام جدا الف شكراا جدا لحضرتك ولتيم اكاديمية حسوب علي المعلومات القيمه جدا جدا جزاكم الله كل خير اقتباس
السؤال
Ali Ahmed55
السلام عليكم
هو اي الyield في الباثيون واي الفرق مابينو وبين return ؟
7 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.