جوزيه: مرحبًا يا رفاق
، وفي هذا الفيديو نتحدث عن المولدات في بايثون.
أنا متحمس حقًا لهذا
القسم لأننا سنتحدث عن بعض الأشياء المتقدمة
والمولدات هي إحدى هذه الموضوعات في Python
التي لا تذكرها الكثير من الدورات
التدريبية ولكنها ضرورية للأداء وأيضًا لأن e -تطوير
المزامنة في Python ، فإن التطوير المتزامن الإلكتروني الذي سنتعلمه لاحقًا
مبني على هذه المولدات.
عندما تفهم المولدات ، تبدأ
الكثير من الأشياء في بايثون في أن تصبح أكثر وضوحًا.
إذن ما هو المولد؟
المولد في بايثون هو وظيفة.
إنها وظيفة خاصة.
شاهد وظيفة تتذكر الحالة التي كانت
عليها بين عمليات التنفيذ
، بحيث يمكنك تشغيل الوظيفة عدة
مرات وستتذكر ما فعلته في آخر
مرة قمت بتشغيلها فيها.
هذا يبدو غريبًا جدًا ، دعني أوضح بمثال.
تخيل أنك أردت إنشاء قائمة من
100 رقم ، مباشرة جدًا
، تريد الحصول على قائمة جديدة بأرقام من صفر إلى 99
، وليس بما في ذلك 100.
لذا يمكنك عمل دالة مثل هذه.
من الواضح عدم استخدام النطاق وما إلى ذلك ، كما تعلم النطاق.
دعنا لا نستخدم النطاق بدلاً من ذلك ، فلنقم ببناء قائمة من البداية.
كيف يمكنك أن تفعل ذلك.
من الطرق الجيدة للقيام بذلك أن تبدأ بقائمة فارغة.
لنفترض أن نسميها أرقام ونجعلها مساوية لقائمة فارغة.
وابدأ أيضًا بمؤشر يساوي صفرًا.
ثم بينما أنا أقل من 100
، قل nums dot append i.
لذا ستلحق صفرًا في البداية.
ثم ستزيد i بواحد ، مما يجعلها
واحدة.
ستلحق واحدًا ، كرر ، تضيف
اثنين ، ثم ثلاثة وهكذا ، حتى تحصل على 99.
وفي نهاية هذه الوظيفة ، تُرجع
الأعداد ، وهي قائمة الأرقام الخاصة بك.
إذا قمنا بطباعة مائة رقم وقمنا بتشغيل ذلك.
يمكننا أن نرى أنه يحتوي
هنا على قائمتنا المكونة من مائة رقم.
بالطبع يمكننا استخدام قائمة الفهم لهذا الغرض.
يمكننا استخدام دالة
النطاق ، لكن الآن لنفترض أن
هذه طريقة رائعة للقيام بذلك ، لأن ما أشرحه
حقًا هو في الأساس كيفية عمل دالة النطاق في الداخل.
لذلك نقوم ببناء قائمة
، ونملأها بأول مائة رقم ثم نعيدها.
الآن لدينا مائة رقم في القائمة.
هذه القائمة بأكملها موجودة في ذاكرة أجهزة الكمبيوتر الخاصة
بك مخزنة كقيمة إرجاع للوظيفة.
الآن مائة رقم ليست كبيرة
جدًا ، إنها مساحة صغيرة
جدًا ، لكن دعنا نقول أننا أردنا تخزين 10 ملايين
، مليون رقم مثل مائة رقم ، لكن
سيكون مثل مليون رقم.
يمكنك إنشاء قائمة بملايين الأرقام وتخزينها
في هذا المتغير الذي يذهب
إلى ذاكرة الكمبيوتر الخاص بك ويفترض
أنه يحتوي على قدر أكبر من الذاكرة التي تستهلكها
، لأن كل رقم من هذه الأرقام يستهلك قدرًا
صغيرًا من ذاكرة جهاز الكمبيوتر الخاص بك.
إذا كنت تريد 10 ملايين رقم فهو أكبر وهكذا.
الآن وجود 10 ملايين رقم ليس مثالًا رائعًا ، لكن
تخيل فقط أن لديك قائمة طويلة جدًا من شيء ما.
على سبيل المثال ، غالبًا ما تُستخدم
هذه في حساب الأعداد الأولية وفي البيانات
الضخمة وأشياء من هذا القبيل
ربما تريد أحيانًا قوائم كبيرة من الأشياء.
لذلك يتم استخدام المولد للتحايل على هذه
المشكلة لأن الافتراض هو أنك لست بحاجة إلى
100 رقم دفعة واحدة.
ما تحتاجه هو صفر حتى تتمكن من فعل شيء به.
ثم واحد بحيث يمكنك فعل شيء به.
ثم اثنان حتى تتمكن من فعل شيء به.
على سبيل المثال مع هذه المائة رقم يمكننا
بعد ذلك الذهاب وضربها جميعًا في اثنين وتخزينها في قائمة أخرى.
كيف يمكنك أن تفعل ذلك؟
ستفعل شيئًا مثل فهم أقل ،
x ضرب اثنين لـ x بمئة رقم.
ما تفعله هنا هو أنك تستخدم
هذه القائمة لعزلها ، وضرب كل رقم في اثنين.
لنفترض أن هذا الضرب في اثنين
هو عملية نريد القيام بها بهذه
الأعداد لحساب شيء ما.
مثال آخر هو ، إذا كان لديك الكثير
من المستخدمين وأردت حساب التفاعل من حولهم
، أو مدى تفاعلهم مع نظامك ، أو
شيء من هذا القبيل.
بشكل أساسي ، تريد مراجعة
كل عنصر وإجراء عملية.
الشيء هنا هو أنك لست بحاجة إلى كل العناصر دفعة واحدة.
أنت بحاجة إليهم واحدًا تلو الآخر.
لذلك هذا ما تستخدم من أجله المولدات.
بدلاً من الحصول على قائمة كاملة من العناصر
، ما تفعله ، هو أن المُنشئ يمنحك
العنصر الأول في القائمة ،
دون تخزين كل القائمة في الذاكرة.
في المرة التالية التي تتصل
فيها بالمولد ، فإنه يتذكر العنصر الذي قدمه لك
أخيرًا ، ويعرف أنه يمنحك العنصر الثاني.
ثم تقوم بتشغيله مرة أخرى ويعطيك العنصر الثالث
، وهكذا دواليك.
لا يخزن القائمة أبدًا في الذاكرة
، فهو دائمًا يتذكر فقط الرقم الأخير الذي قدمته لك ، لذلك
يمكنه بعد ذلك إعطائك الرقم التالي.
عليك أن تستمتع بالوظيفة
في كل مرة تريد فيها رقمًا جديدًا ، ولهذا
يطلق عليها اسم المولد ، لأنها تولد أرقامًا
، أو سلاسل بالفعل ، أو مستخدمين أو أيًا كان ما تريد إنشاؤه.
إليك كيفية القيام بذلك ، بدلاً من "الأعداد. append (i) "، أنت تقول" ينتج
i "، لأن i هو الرقم الذي نريد إرجاعه ، ولم نعد بحاجة
إلى هذه الأعداد المتساوية
بين قوسين مربعين ، ولم نعد بحاجة
إلى مقطع العودة أيضًا.
الآن هذه الوظيفة تسمى وظيفة المولد.
العائد يشبه إلى حد كبير العائد ، لكن ما
يحدث هو أنه يمنحك عندما تسميه ، ثم يتذكر
أنه هنا ، تم إيقافه قبل السطر الخامس
مباشرة. بعد السطر الرابع هناك
في المنتصف.
في المرة القادمة التي تستدعي فيها الوظيفة
، ستستمر ، لذا ما ستفعله هو أنها
ستزيد i بواحدة ، وستعيد تشغيل الحلقة وتنتج
واحدة ، وتعطيك واحدة ثم تتوقف.
في المرة القادمة التي تسميها
، ستستمر في الزيادة أشتري
واحدة وأكرر الحلقة ثم أعطيك اثنين ، ثم ستتوقف ، وهكذا دواليك.
في النهاية عندما تنفد الأرقام
، فلن تسفر عن شيء.
وبعد ذلك تعرف أنه انتهى.
إذن ، كيف سنفعل هذا؟
دعونا ، أولا وقبل كل شيء ، نطبع مائة رقم.
لاحظ كيف أنه لم يعد يعطينا قائمة
، فهو الآن يعطينا كائن مولد ، يسمى
مائة رقم ، وبالتالي اسم وظيفتنا.
كما أنه يعطينا عنوان ذاكرة كائننا.
لاحظ كيف حددنا وظيفة ، لكن الطباعة
تخبرنا أن هذا كائن ، لأن Python في
الخلفية تدرك أنك استخدمت
العائد ، وأنت تصنع مولدًا ،
وتحولها إلى كائن بيثون.
سأخبرك كيف تصنع هذه الأشياء
بنفسك بدون وظيفة لاحقًا.
لذا ، دعنا نخزن المولد الخاص بنا في متغير.
سنطلق عليه "g" ، وهو اسم شائع
إلى حد ما لمولد في برنامج صغير.
إذا كان لديك العديد من المولدات
بالطبع ، فسيتعين عليك البحث عن اسم وصفي أكثر.
ثم سنقوم بطباعة القيمة التالية
التي سيقدمها لنا المولد.
لاحظ أنه عندما تقوم بتهيئة مولد ، على هذا النحو
، فإنه لا يقوم بتشغيل الوظيفة ، ويبدأ من الأعلى
دون تشغيل على الإطلاق.
عندما تطلبها عن القيمة التالية ، فإنها
ستستمر حتى العائد وتعطيك
أي قيمة قد حققتها.
الطريقة التي تطلبها من القيمة
التالية هي عدم تشغيل الوظيفة مرة أخرى ، لكنك تقول بعد ذلك "g".
إذن التالي هو وظيفة مضمنة تؤثر على المولدات
، وتخبرها أن ترتفع إلى الناتج.
حسنًا ، إذا قمنا بتشغيل هذا ، يمكنك أن ترى أننا نحصل
على صفر ، لأن هذا هو أول رقم ناتج.
الآن توقف مولدنا "g" هنا عند
السطر 4. 5 بين 4 و 5 ، لذلك إذا
طلبنا منه رقمًا آخر ، لاحظ أنه بالطبع ، في نهاية البرنامج ، يتم تدمير
المولد ، لذلك إذا قمنا بتشغيل هذا
البرنامج مرة أخرى ، فسيكون هذا صفرًا مرة
أخرى وسيكون هذا واحدًا الآن.
لا يتذكرها عبر عمليات تنفيذ البرنامج
، فهذه ليست طريقة عمل بايثون.
يمكننا الآن طلب الرقم الأول ثم
الرقم التالي.
بعد الرقم الأول ، سيتوقف
بين أربعة وخمسة.
عندما نقول بعد ذلك ، فإنه يستمر حتى العائد التالي
، مما يعني تكرار هذه الحلقة مرة واحدة ويعطينا واحدة.
تمام.
من المهم جدًا أن تتذكر الوظيفة المكان الذي توقفت فيه.
لذلك في أي وقت ، يمكنك إيقاف تشغيل الوظيفة ،
وبعد ذلك يمكنك الاتصال بعد ذلك من أجل متابعتها.
لذلك ، فهي ليست مفيدة فقط لتوليد الأرقام أو أي شيء آخر ، فهي
مفيدة أيضًا عندما تريد إيقاف تشغيل وظيفة
مؤقتًا ، وبعد ذلك يمكنك متابعة
تشغيلها متى شئت ، عن طريق
الاتصال بعد ذلك.
لذلك ربما لا يكون هذا شيئًا
منطقيًا الآن ، ولكن تذكر فقط أنه عندما نحتاج
إليه عندما نقوم ببرمجة متزامنة.
إذن ماذا عن دالة المدى؟
لقد قلت سابقًا أن هذا كان
يشرح بشكل أساسي كيف تعمل وظيفة النطاق من الداخل ، وهذا صحيح
، لكن وظيفة النطاق
لا تمنحك مولدًا مباشرًا.
هنا ، لنفعل شيئًا مثل "كائن
النطاق الخاص بي" ، فسيكون النطاق
10.
هذا يتصرف إلى حد كبير مثل المولد ، ولكن إذا اتصلت
بعد ذلك بـ "كائن النطاق الخاص بي"
، فستتلقى خطأ ، وتنظر إلى ذلك.
هذا لأن كائن النطاق ليس منشئًا تمامًا على الرغم
من أنه يتصرف بهذه الطريقة
، فإنه لا يُنشئ قائمة ثم يسمح لك بالتكرار
عليها ، ويتصرف بطريقة الجيل هذا ليكون أكثر كفاءة.
"كائن النطاق الخاص بي" ، على الرغم
من ذلك ، يمكنك أن تتذكر أننا قمنا
بطباعته في وقت مبكر جدًا من الدورة
التدريبية وتلقينا نطاقًا غريبًا من صفر إلى عشرة أشياء.
هذه مجرد وظيفة "repr" التي يتم استدعاؤها ، وكما ترى
إذا قمنا بطباعة نتيجة "repr" ، فإننا نرى أيضًا
نطاقًا من صفر إلى عشرة.
لذا فإن "كائن النطاق الخاص بي" هو شيء يتصرف
مثل هذا إلى حد كبير ، سنتعلم في
بضع مقاطع فيديو في الوقت المحدد بالضبط كيف يمكننا التكرار على
كائن من أجل جعله يتصرف مثل كائن النطاق.
لذلك ، تعلمنا عن هذه المولدات ، وشيء آخر أردت أن أذكره
في الواقع ، حول المولدات هو
أن وظيفة القائمة يمكنها تحويل المولد إلى قائمة.
حتى نتمكن من طباعة قائمة "g".
هنا ما أطلقنا عليه "التالي" ثم "التالي"
مرة أخرى ، ثم "قائمة".
إذن لدينا الآن صفر وواحد مطبوع لهذين هما الشيئين في
وظائفنا "التالية" ، ثم قمنا
بإنشاء قائمة بالمولد ، لكن هذه
القائمة بالطبع تستمر من حيث توقفنا.
يتذكر المولد نفسه ما كان عليه
، لذلك تبدأ القائمة من اثنين ، وليس من الصفر.
لذا ، من المهم حقًا تذكر مكان وجودهم
في المولدات.
لذلك ، عندما تنشئ واحدًا ، هذا هو أساسًا من اللحظة التي تبدأ فيها في استخدامه
، لحظة بدء الاتصال بـ "التالي"
عليه ، يتذكر مكانه ، ولا يمكنك الرجوع
إلى الوراء. تمام.
الآن ، في مقاطع الفيديو القليلة التالية
، سنتعلم المزيد عن المولدات.
سنتعرف على فئات المولد
، وكيف يمكنك إنشاء فصل يتصرف مثل المولد ، وسنتعرف
أيضًا على التكرارات والمتغيرات في Python ،
وأهداف النطاق هي أحد الأمثلة
على ذلك.
ثم سننتقل إلى بعض
أمثلة البرمجة الوظيفية
، مثل التصفية والخريطة وأي وكل والعدد.
لذلك ، متحمس جدًا لهذا
القسم ، أنا واثق من أن المولدات ستكون شيئًا
ستحتاجه في تطوير Python الخاص بك ، خاصةً
مع المضي قدمًا في الدورة التدريبية.
مع ذلك ، سأراك في الفيديو التالي.