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

Mustafa Suleiman

الأعضاء
  • المساهمات

    15357
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    403

كل منشورات العضو Mustafa Suleiman

  1. لا حاجة لحذفه، وليس هناك إمكانية للحذف، التعديل فقط.
  2. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  3. الكود يعتمد على وجود دوال مثل get_roaad_artists()، get_modern_artists()، وغيرهم، ويفترض أن تكون معرفة في ملفات أخرى artists-roaad.php، artists-modern.php، أو ما شابه، والتي يتم استدعاؤها في القالب الرئيسي. تفقد تلك الملفات واحد تلو الآخر. عامًة قم بتبسيط category-items.php مؤقتًا لمعرفة هل هو المسبب أم لا، باستبدال الكود به بالتالي: <?php define('ARTISTS_IMAGE_PATH', get_template_directory_uri() . '/images/'); function get_category_artists($category_type) { return array( array('name' => 'فنان اختبار', 'url' => '#', 'image' => ARTISTS_IMAGE_PATH . 'test.jpg') ); } ثم أعد تشغيل الصفحة، ولو اختفت المشكلة وعملت الصفحة بشكل صحيح، فالمشكلة مرتبطة بالكود الأصلي أو الملفات المستدعاة.
  4. تفقد ملف القالب page-templates/your-template-file-name.php من خلال محرر vscode، وتأكد تمامًا من أن <?php هي أول شيء في الملف ولا توجد أي مسافات أو أسطر فارغة أو أي رموز قبلها واحذف أي شيء تجده قبلها. ثم استخدم خيار Save with Encoding في محرر الأكواد وتأكد من اختيار UTF-8 ثم احفظ الملف بالضغط على CTRL + S. لو استمرت المشكلة قم بتعليق أي إضافة // في بداية السطر لجميع أسطر require_once مؤقتًا: <?php get_header(); // // استيراد ملفات التصنيفات - تم التعليق مؤقتًا // require_once(get_template_directory() . '/includes/category-items.php'); // require_once(get_template_directory() . '/includes/artists-roaad.php'); // require_once(get_template_directory() . '/includes/artists-modern.php'); // require_once(get_template_directory() . '/includes/artists-hakiba.php'); // require_once(get_template_directory() . '/includes/artists-shaabi.php'); // require_once(get_template_directory() . '/includes/artists-female-voices.php'); ?> احفظ الملف وجرب عرض الصفحة، وتفقد هل اختفت مشكلة طباعة الكود؟ وبالطبع لن تظهر البيانات، لكن يجب ألا يظهر الكود نفسه. إذا اختفت المشكلة، فذلك يعني أن أحد الملفات المُضمَّنة هو السبب، أعد تفعيل أسطر require_once واحدًا تلو الآخر، مع تحديث الصفحة بعد كل واحد، حتى تكتشف أي ملف يتسبب في ظهور المشكلة مجددًا. بمجرد تحديد الملف المُسبب للمشكلة، افتحه وافحصه بحثًا عن مسافات بيضاء أو BOM في بدايته قبل وسم <?php الخاص به، أو أخطاء في بناء الجملة البرمجية Syntax Errors، أو أي كود يقوم بطباعة شيء بشكل غير متوقع. وللمساعدة في تفقد المشكلة، قم بتفعيل وضع التصحيح Debug Mode في ووردبريس، من خلال فتح ملف wp-config.php في المجلد الرئيسي وابحث عن define( 'WP_DEBUG', false );. قم بتغييرها إلى: define( 'WP_DEBUG', true ); if ( WP_DEBUG ) { define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors', 1 ); } بالطبع لا تترك WP_DEBUG_DISPLAY بقيمة true على موقع حي على استضافة يتصفحها المستخدمين، استخدمها فقط للتشخيص. الآن، عند زيارة الصفحة، سترى رسالة خطأ PHP واضحة بدلًا من الكود المطبوع، وسيوجهك مباشرة إلى المشكلة، وتفقد أيضًا من ملف wp-content/debug.log بحثًا عن أي أخطاء مسجلة.
  5. أرفق مجلد المشروع لتفقده
  6. هل قمت بتفعيل نسخة الويندوز؟، عامًة قم بالضغط على extend for 1 week ومن المفترض أن يظهر لك زر مثل التالي: اضغط عليه لتفعيل التحديثات. في حال لم يعمل قم بتشغيل task manager ثم اختر services ثم ابحث عن Windows update واضغط بزر الفأرة الأيمن ثم اختر start: ثم قم بتشغيل CMD كمسؤول administrator ثم تنفيذ الأوامر التالية بالترتيب واحد تلو الآخر: net stop bits net stop wuauserv net stop cryptsvc ren %systemroot%\softwaredistribution softwaredistribution.bak ren %systemroot%\system32\catroot2 catroot2.bak net start bits net start wuauserv net start cryptsvc ثم تفقد التحديثات.
  7. الأغلب منها مخصص لأمريكا وكندا، والمتاح لمنطقة الشرط الأوسط خاصة بالنساء فقط: https://buildyourfuture.withgoogle.com/scholarships/generation-google-scholarship-emea
  8. عبارة عن منح دراسية مقدمة من جوجل، وبها مجموعة متنوعة من البرامج التي تقدمها الشركة لدعم الطلاب المتميزين أكاديمياً والذين يظهرون إمكانات قيادية، خاصة في مجالات التكنولوجيا وعلوم الكمبيوتر والمجالات ذات الصلة مثل علوم الحاسوب، والهندسة، وتصميم تجربة المستخدم، وغيرها. وأيضًا لتشجيع المجموعات غير الممثلة بشكل كافٍ في مجال التكنولوجيا كالنساء، الأقليات العرقية والأشخاص ذوي الإعاقة على متابعة دراساتهم ومهنهم في المجال. فيوجد منحة Generation Google Scholarship وهي موجهة للطلاب الذين يدرسون علوم الحاسوب أو تخصصات تقنية ذات صلة، وتقدم دعماً مالياً متفاوت حيث 10,000 دولار في الولايات المتحدة أو 5,000 دولار كندي في كندا لعام 2025-2026. وGoogle Lime Scholarship مخصصة للطلاب ذوي الإعاقة الذين يدرسون في مجالات تقنية. تستطيع تفقد المنح والتفاصيل هنا: https://buildyourfuture.withgoogle.com/
  9. الهدف الأساسي من بايثون أن يكون الكود واضحًا ومفهومًا قدر الإمكان، قريبًا من اللغة الإنجليزية العادية، لتقليل العبء الذهني على المبرمج والتركيز على ماذا يريد أن يفعله الكود أي حل المشكلة بدلاً من كيفية التعبير عنه بتعقيد لغوي. ومن خلال بناء جملة بسيط ومكتبة أساسية بها الكثير من الأدوات المضمنة في اللغة، ونظام واسع من المكتبات الخارجية Ecosystem، يتمكن اي مطور بايثون من إنجاز المهام بسرعة وبكود أقل مقارنةً بلغات أخرى كثيرة، وذلك من شأنه تقليل الأكواد الزائدة أو المتكررة Boilerplate Code التي لا تخدم مباشرةً منطق حل المشكلة. فبدلاً من كتابة حلقة طويلة معقدة بلغة أخرى، في بايثون يوجد سطر واحد بسيط بواسطة list comprehension لتحقيق نفس النتيجة. لذا بايثون أداة سهلة الاستخدام تسمح للمبرمج بالتفكير في المشكلة نفسها ومنطق حلها، بدلاً من قضاء وقت طويل في التعامل مع تفاصيل لغوية معقدة أو كتابة كود روتيني لا يضيف قيمة مباشرة للحل. وذلك لا يعني أنها خالية من التعقيد تمامًا، فبايثون لغة قوية ومتعددة الاستخدامات، وعند التعامل مع مفاهيم متقدمة كالبرمجة غير المتزامنة، أو الواصفات Descriptors، أو الميتاكلاس أو بناء أنظمة معقدة وكبيرة، ستظهر تعقيدات لا مفر منها، وفي إدارة المشاريع الكبيرة، والتبعيات، والبيئات الافتراضية ستضيف طبقات من التعقيد.
  10. ستجد الحل هنا باستخدام مكتبة whitenoise
  11. الخيار line wrap موجود بالفعل في المتصفح، لكن لاحظ أنه يتم تصفح الكود المصدري source للموقع وذلك بالضغط على زر الفأرة الأيمن في أي مكان فارغ بالموقع ثم اختر view page source وسيظهر لك ذلك الخيار
  12. الطريقة التي أضفت بها إعدادات تقديم ملفات الوسائط في ملف urls.py الرئيسي باستخدام static() تعمل فقط عندما يكون وضع التصحيح DEBUG مضبوطاً على True في ملف settings.py، تأكد من أنّ القيمة هي True. فالطريقة مخصصة لخادم التطوير المدمج في Django من خلال manage.py runserver لتسهيل عملية التطوير، أما في بيئة الإنتاج Production، يجب أن يتولى خادم الويب Nginx أو Apache مهمة تقديم تلك الملفات مباشرة، أو استخدام whitenoise ستجد تفصيل هنا:
  13. يوجد مشكلة syntax لذا الكود لا يتم تنفيذه، بسبب خطأ في كتلة default، يجب أن تتبع كلمة default نقطتان رأسيتان : كالتالي: default: console.log('Invalid Input'); break;
  14. لا مشكلة، فلو لديك أكثر من فئتين وليكن قطة، كلب، طائر، ستقوم الدالة confusion_matrix بإنشاء مصفوفة مربعة أبعادها N x N، حيث N هو عدد الفئات لديك. بينما ConfusionMatrixDisplay تستقبل مصفوفة الارتباك التي تم حسابها في الخطوة السابقة وتقوم برسمها بشكل مرئي كـ heatmap، لتسهيل رؤية الأنماط في أخطاء النموذج. وستوضح لك مصفوفة الارتباك confusion_matrix بشكل دقيق بالضبط أي الفئات يخلط النموذج بينها، وهل يخلط دائماً بين القطة والنمر؟ هل يجد صعوبة في التمييز بين أنواع معينة من الطيور؟ أيضًا تقييم الأداء وحساب المقاييس ومنها الدقة، الاستدعاء، و F1-score لكل فئة على حدة باستخدام قيم مصفوفة الارتباك، وهو أمر مهم جداً في حال أداء النموذج غير متساوٍا عبر الفئات. كذلك أكثر تفصيلاً من الدقة الإجمالية Accuracy، لأنّ الدقة الإجمالية أحيانًا مضللة، خاصًة لو الفئات غير متوازنة، فمصفوفة الارتباك تعطيك صورة أكمل بكثير عن أداء النموذج.
  15. تلك من مكتبة Keras الموجودة الآن ضمن TensorFlow، وهي لتسهيل عملية تحميل الصور وتجهيزها للنماذج العصبونية العميقة، خاصة في حال البيانات منظمة بشكل معين على القرص الصلب، وذلك هو ما لدينا هنا. وتستطيع استخدامها كالتالي: import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator import os structured_data_dir = "/kaggle/input/microsoft-catsvsdogs-dataset/train" datagen = ImageDataGenerator(rescale=1./255) batch_size = 32 img_height = 128 img_width = 128 train_generator = datagen.flow_from_directory( directory=structured_data_dir, target_size=(img_height, img_width), batch_size=batch_size, class_mode='binary', shuffle=True ) print("الفئات التي تم العثور عليها:", train_generator.class_indices) print("عدد الصور الكلي:", train_generator.samples) print("عدد الدفعات في كل دورة تدريب (epoch):", len(train_generator))
  16. التسميات ليست موجودة في ملف منفصل، ولكنها مُضمَّنة مباشرة في أسماء ملفات الصور نفسها. افحص أسماء الملفات، وستجد أن أسماء الصور والملجدات تتبع نمطاً معيناً: cat.0.jpg, cat.1234.jpg dog.567.jpg, dog.9999.jpg بالتالي لو اسم الملف يبدأ بـ cat، فهذه صورة لقطة، ونفس الأمر يبدأ بـ dog، فتلك صورة لكلب، نفس الأمر للمجلدات. ستجد هيكل مجلد مجموعة البيانات كالتالي: data/ train/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ... validation/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ... تفقد المستودع: https://github.com/darshanbagul/Cats-vs-Dogs
  17. أثناء دراسة الدورة، ستجد مشاريع عملية كاملة أي مشروع كامل من البداية للنهاية به مجلدات وملفات، ويستغرق وقت في تنفيذه، تلك هي المشاريع المطلوب تسليمها، وليس التطبيقات العملية البسيطة التي نكتبها في ملف واحد بسيط. ومن المفترض أثناء العمل على المشروع تقوم برفع التغييرات التي تجريها إلى مستودع المشروع على github، أي بعد الإنتهاء من جزء معين تقوم بدفع ذلك إلى المستودع. وستجد هنا تفصيل بخصوص رفع المشروع:
  18. بالضبط، الدالة tf.data.Dataset.list_files() تقوم بإرجاع قائمة بالمسارات التي تطابق النمط المُعطى، لكن أحد المسارات التي تم إرجاعها هو مسار مجلد (.../PetImages/Cat) ليس ملف صورة .jpg. والدالة tf.io.read_file لا تستطيع قراءة محتويات مجلد، هي مصممة لقراءة محتويات ملف واحد، بالتالي عندما حاولت دالة map تطبيق load_and_decode_image على مسار المجلد ذاك، فشلت عملية tf.io.read_file بداخله. أي المشكلة في tf.data.Dataset.list_files فعند تمرير مسار مجلد بدون أي نمط wildcard مثل * أو *.jpg في النهاية، فـ TensorFlow تعتبر أنك تريد ذلك المسار نفسه كعنصر وحيد في مجموعة البيانات، بالتالي أنت قمت بإنشاء مجموعة بيانات cats تحتوي على عنصر واحد فقط، وهو السلسلة النصية '/kaggle/input/microsoft-catsvsdogs-dataset/PetImages/Cat' يجب كتابة التالي: cats = tf.data.Dataset.list_files('/kaggle/input/microsoft-catsvsdogs-dataset/PetImages/Cat/*.jpg')
  19. هناك توضيح هام أولاً، الذكاء الاصطناعي الحالي هو Narrow AI، أي الأنظمة التي نستخدمها اليوم بما في ذلك أنظمة رؤية الحاسوب المتقدمة هي ذكاء اصطناعي ضيق أو متخصص، وتلك مصممة لأداء مهام محددة بكفاءة عالية جداً كالتعرف على الصور، ترجمة اللغات، لعب الشطرنج، لكنها لا تمتلك فهماً أو وعياً عاماً مثل الإنسان. بينما الذكاء الاصطناعي العام AGI ذلك نوع افتراضي ومستقبلي من الذكاء الاصطناعي يمتلك القدرة على فهم وتعلم وتطبيق المعرفة عبر مجموعة واسعة جداً من المهام بنفس مستوى كفاءة الإنسان وأفضل منه، وسيكون قادراً على التفكير المجرد، وحل المشكلات الجديدة تماماً، والتخطيط الاستراتيجي، والتعلم المستمر والتكيف مع أي بيئة أو مهمة. لذا لا يوجد حالياً نظام AGI حقيقي، فما زال البحث في مراحله الأولى، ولا يوجد منهج دراسي محدد لتعلم AGI بنفس الطريقة التي تتعلم بها الجبر أو التعلم العميق، ذلك هدف بحثي طويل الأمد أكثر من كونه مجالاً تطبيقياً تستطيع تعلمه الآن. ركز على إتقان التعلم العميق وتطبيقاته في رؤية الحاسوب بما أنك تتخصص في رؤية الحاسوب، وهذا ما يجب أن يكون تركيزك الأساسي، تعمق في التالي: معماريات CNN المتقدمة ResNet, EfficientNet، وغيرهم. كشف الأجسام Object Detection وتقسيم الصور Segmentation. معالجة الفيديو. النماذج التوليدية للصور GANs, Diffusion Models. محولات الرؤية Vision Transformers - ViT. التعلم ذاتي الإشراف Self-supervised Learning في الرؤية. تطبيقات رؤية الحاسوب ثلاثية الأبعاد 3D Vision.
  20. مجهود ممتاز جدًا حقًا، ستتعلم الكثير عند القيام بمثل تلك المشاريع وسيتطور مستواك بفارق كبير مقارنًة بما كنت عليه عند بدء المشروع، ففي البداية يكون الأمر مبهم وضبابي وشيئًا فشيئًا يتضح لك مع المحاولة والصبر والتعلم من الأخطاء. الكود منظم بشكل جيد ويتبع تسلسل منطقي لخطوات المشروع وهي تحميل -> تنظيف -> EDA -> تقسيم -> تدريب -> تقييم -> تفسير -> تصدير. ينقصه بعض التعليقات في الأماكن الهامة لكن تتمكن من استيعاب المنطق عند العودة إليه بعد فترة، ولا تتكاسل عن ذلك فستنسى بلا شك رغم أنك كتبت الكود، أيضًا تقسيم المشروع إلى ملفات بمعنى وحدات، فحاليًا 1300 سطر من الكود صعب القراءة والصيانة أو التطوير. والكود الخاص بالتصدير للـ Notebook معقد ولكنه مكتوب بشكل جيد، حيث حاولت إعادة بناء الخطوات التي قام بها المستخدم في شكل كود Python داخل Notebook، بما في ذلك تنظيف البيانات، التقسيم، بناء الـ Pipeline، والتدريب مع مراعاة Hyperparameter Tuning في حال تم استخدامه. للتحسين، كبداية في واجهة المستخدم، القوائم المنسدلة لها نفس لون الخلفية ولا يظهر بشكل واضح هل تم الضغط على القائمة أم لا، لأنّ الخيارات لا تظهر بشكل واضح: وحاليًا يستطيع المستخدم تطبيق التوصيات ثم تطبيق طريقة يدوية،والكود لا يمنعه، من الأفضل إضافة st.radio بدلاً من زرين منفصلين وليكن اختر طريقة التعامل: توصيات آلية | طريقة يدوية، أو بعد الضغط على أحد الأزرار، يتم تعطيل disabled=True في الخيارات الأخرى لتلك الخطوة المفقودات أو القيم المتطرفة حتى يتم إعادة تحميل الصفحة أو إضافة زر Reset Cleaning Step. أيضًا أنت تضع الـ cv_scoring في الـ Sidebar، ومن الأفضل نقله إلى قسم Model Selection & Training الرئيسي ليظهر بشكل أوضح بعد خطوة الـ Split وقبل التدريب. و لتحسين الـ UI أكثر في الـ Sidebar اجعل خيار stratify معطلاً disabled=True) في حال st.session_state.problem_type == "Regression" ويا حبذا لو قمت بالتوجيه البصري للمستخدم، من خلال st.info, st.warning, st.success, st.error بشكل أكثر فعالية لتوجيهه خلال الخطوات، مثلاً، بعد الـ Split، اعرض st.info(الخطوة التالية: قم بتحديد مقاييس التقييم من الشريط الجانبي، ثم اختر النماذج وقم بالتدريب). وكذلك مؤشرات تقدم أفضل للمهام الطويلة مثل AutoML, GridSearch، حساب SHAP، اعتمد على st.spinner مع رسائل واضحة، ولو أمكن، حاول تحديث شريط التقدم بشكل أكثر دقة. والإعتماد على st.tabs لتقسيم الأقسام الكبيرة ومنها EDA أو التقييم إلى أجزاء أصغر. أيضًا فكر في كيفية السماح للمستخدم بالعودة لخطوة سابقة وتعديلها دون الحاجة لإعادة كل الخطوات التالية، وذلك تحدٍا في Streamlit ويتطلب تخطيطاً دقيقاً لـ session_state. وحاليًا التطبيق يدعم PolynomialFeatures و OneHotEncoder، حاول إضافة خيارات أخرى شائعة ومنها LabelEncoder مع تحذير بشأن استخدامه، أو ربما طرق Binning للمتغيرات الرقمية. أيضًا السماح للمستخدم بتحديد الأعمدة التي يريد تطبيق Scaling عليها أو Encoding عليها بشكل أدق بدلاً من تطبيقها على كل الأعمدة الرقمية/الفئوية المكتشفة تلقائياً، فحالياً يتم تحديد num_cols و cat_cols تلقائياً. وفي EDA حاول إضافة خيار لعرض توزيع المتغيرات الفئوية Bar plots، وإضافة خيار لرسم العلاقة بين كل متغير مستقل والمتغير التابع Scatter plot للـ Regression، Box plot/Violin plot للـ Classification. أيضًا عليك التعامل مع الأعمدة في الـ Pipeline، حاليًا يوجد st.session_state.num_cols و st.session_state.cat_cols التي يتم تحديدها بعد الـ Split، وذلك جيد. لكن المتغيرات true_num_cols و true_cat_cols هي للتعامل مع الأعمدة الرقمية التي ربما تكون فئوية أي عدد قليل من القيم الفريدة، وهي لتصدير الـ Notebook، من الأبسط والأوضح إعادة تحديد num_cols و cat_cols المستخدمة في ColumnTransformer بناءًا على X_train.dtypes مباشرًة قبل تعريف preprocessor في قسم التدريب، للتأكد من أنها تعكس الحالة الحالية للبيانات بعد كل خطوات التنظيف. وزر Finalize Cleaning، لا ينفذ أي عملية تغيير بيانات إضافية، عليك إما إزالته، أو إعطاؤه وظيفة واضحة كتأكيد أن المستخدم انتهى من التنظيف والانتقال للخطوة التالية، ربما عن طريق إخفاء خيارات التنظيف. وللعلم نماذج مثل CatBoost تستطيع التعامل مع المتغيرات الفئوية مباشرة وأحياناً بشكل أفضل من One-Hot Encoding، والـ Pipeline الحالي يقوم بعمل OHE لكل الأعمدة الفئوية، بإمكانك إضافة خيار للسماح لـ CatBoost بالتعامل مع الأعمدة الفئوية مباشرة إن تم اختياره، لكن ذلك يتطلب تعديل الـ preprocessor لـ CatBoost.
  21. لا مشكلة في الحل، فهو الأفضل من حيث الوقت والمساحة النظرية للخوارزمية نفسها O(1) space complexity لكن مجرد تشغيل مفسر بايثون وتحميل المكتبات الأساسية اللازمة لتشغيل الكود يستهلك قدراً معيناً من الذاكرة، وهو استهلاك أساسي لا مفر منه حتى لو كان الكود بسيطاً جداً. وجميع الحلول الحلول الصحيحة المقدمة بلغة بايثون للمسألة ستكون لها بصمة ذاكرة متشابهة جداً، وقريبة من الحد الأدنى الذي تستهلكه بيئة بايثون. لو أردت استهلاك أقل للذاكرة نستخدم لغة منخفضة مثل C++ وستجد أنها تستهلك 8.44 ميجابايت class Solution { public: int maxContainers(int n, int w, int maxWeight) { return (n*n > maxWeight/w) ? maxWeight / w : n*n; } };
  22. ستحتاج إلى دراس الدورة من البداية وحتى مسار تطبيق تعلم اللغات باستخدام Next.js، لكن تجاهل المسارات التالية: تطوير تطبيق جوال باستخدام React Native تطوير تطبيق سطح مكتب باستخدام Electron.js وتستطيع العودة ودراستهم في أي وقت، طالما أنك حددت دراسة Next.js
  23. return بالنسبة للبيانات الكبيرة كقائمة أو أي مجموعة بيانات تحتوي على عدد كبير جدًا من العناصر، فسيحتاج بايثون إنشاء القائمة كاملة في الذاكرة وتخزين كل عناصرها قبل أن يتم إرجاعها، وعند التعامل مع ملايين العناصر، أو قراءة ملف كبير جدًا، فأحيانًا تستهلك كمية هائلة من ذاكرة الوصول العشوائي RAM، وذلك يبطئ البرنامج أو حتى يؤدي إلى انهياره بسبب نفاد الذاكرة MemoryError. أما yield، فالدالة لا تقوم بإنشاء المجموعة كاملة في الذاكرة دفعة واحدة، بل تُنتج yield قيمة واحدة فقط في كل مرة يتم فيها طلب قيمة من المولّد، وتحتفظ الدالة بحالتها وتتوقف مؤقتًا وعند طلب القيمة التالية، تستأنف من حيث توقفت وتنتج القيمة التالية، وهكذا. بالتالي في أي لحظة زمنية، لا يتم تخزين سوى عنصر واحد أو عدد قليل جدًا من العناصر اللازمة للحساب في الذاكرة، بغض النظر عن الحجم الكلي للتسلسل الذي يمكن للمولّد إنتاجه، وذاك ما يسمى التقييم الكسول Lazy Evaluation.
  24. هناك فرق كبير، return لإنهاء تنفيذ الدالة فورًا وإرسال قيمة أو None في حال لم تُحدد قيمة، وبمجرد أن تصل الدالة إلى جملة return، يتوقف تنفيذها تمامًا، وأي كود يأتي بعد return داخل نفس الدالة لن يتم تنفيذه. أما yield هي خاصة بنوع من الدوال يسمى الدوال المولّدة Generator Functions، وباستخدامها بها تُنتج قيمة مثل return، لكنها لا تنهي الدالة، ما يحدث هو تعليق أو توقف مؤقت لتنفيذ الدالة وتحتفظ بحالتها الداخلية وهي قيمة المتغيرات المحلية ومكان التوقف. وعند استدعاء دالة تحتوي على yield، لا تُنفذ الكود مباشرة، بل تعود بكائن خاص يسمى مولّد Generator Object، وهو مُكرِّر Iterator، وفي كل مرة تطلب فيها قيمة من المولّد من خلال حلقة for أو الدالة next()، تستأنف الدالة تنفيذها من النقطة التي توقفت عندها بعد yield السابقة، وتستمر حتى تصل إلى yield التالية فتنتج قيمة وتتوقف مؤقتًا مرة أخرى أو حتى نهاية الدالة. أي تحتفظ الدالة المولّدة بحالتها بين الاستدعاءات المتعاقبة للمولّد.
  25. ما هي الدورة التي تقوم بدراستها حاليًا؟ فذلك متوفر بالفعل في دورة جافاسكريبت بالأكاديمية حيث يوجد بها مسار إنشاء تطبيق أسئلة وأجوبة باستخدام Next.js لشرح الأساسيات وتطبيق تعلم اللغات باستخدام Next.js وتطبيق أساسيات TypeScript بواسطة Next.js.
×
×
  • أضف...