دورة أساسيات مقابلات البرمجة بلغة بايثون
دورة بايثون منظمة لمقابلات البرمجة تغطي أساسيات اللغة وهياكل البيانات والدوال والفهم والبرمجة الكائنية والاستثناءات، إضافة إلى الخوارزميات واستراتيجية المقابلة مع أسئلة تدريب مرتبطة.
ما ستتعلمه
- شرح أساسيات بايثون وقابلية التغيير وتلميحات الأنواع والإعداد
- اختيار واستخدام القوائم والصفوف والمجموعات والقواميس والدوال المدمجة بالتعقيد الصحيح
- كتابة دوال وفهم وإغلاقات ومزينات ومولدات فعّالة
- تطبيق البرمجة الكائنية والوراثة وتعدد الأشكال والطرق الخاصة ومعالجة الاستثناءات
- حل مشكلات المقابلة باستخدام خوارزميات شائعة واستراتيجية قابلة للتكرار
قبل أن تبدأ
- خبرة برمجية أساسية بأي لغة
- الإلمام بالمتغيرات والدوال والحلقات
- بيئة Python 3 أو مترجم عبر الإنترنت للتدريب
درس 1 أساسيات بايثون وعقلية المقابلة
في مقابلات بايثون، وضوح التفكير لا يقل أهمية عن الحل النهائي. يقيّم المحاورون كيف تقسم المشكلة، وما الأسئلة التي تطرحها، وكيف تشرح قراراتك. التواصل المستمر أثناء الحل إشارة قوية مثل كتابة كود صحيح.
المتغيرات في بايثون مراجع إلى كائنات، وليست صناديق تخزن القيم. تكشف الدالة id() هوية الكائن، ويقارن العامل is الهويات بينما يقارن == القيم. فهم هذا الفرق يتجنب أخطاء خفية مع القوائم والقواميس والقيم الافتراضية.
الأنواع القابلة للتغيير مثل list وdict وset يمكن تعديلها في مكانها، أما الأنواع غير القابلة للتغيير مثل int وstr وtuple فلا يمكن تعديلها. عندما يُشارَك كائن قابل للتغيير بين الدوال، تظهر التعديلات في كل الأماكن التي تشير إليه. معرفة متى تنسخ باستخدام copy() أو copy.deepcopy() جزء أساسي من كتابة كود يمكن توقعه.
التلميحات النوعية، مثل def greet(name: str) -> str:، توثق التوقعات وتساعد في اكتشاف الأخطاء باستخدام أدوات ثابتة مثل mypy. على الرغم من أن بايثون لا تطبقها أثناء التشغيل، إلا أن المحاورين يقدرون استخدامها في توقيعات الدوال. تجعل هذه التلميحات قصد الكود صريحًا وأسهل في المناقشة.
البيئة مهمة: تعرف على إصدار بايثون المتاح وعلى بنى البيانات التي توفرها المكتبة القياسية. تدرب في محرر يحتوي على REPL سريع لتجربة مقاطع الكود أثناء المقابلة. إتقان الأدوات الأساسية يتيح لك التركيز على المشكلة نفسها بدلًا من التفاصيل الميكانيكية.
قبل كتابة الحل، أعد صياغة المشكلة بكلماتك وتأكد من الحالات الحدية. اختر بنية بيانات مع تبرير واذكر التكلفة الزمنية والمكانية المتوقعة. يحوّل هذا النمط الإجابة التقنية إلى محادثة مهنية وموثوقة.
نصيحة تدريبية أساسيات بايثون وعقلية المقابلة: راجع هذا الدرس في جلسات قصيرة يوميًا. بعد كل تمرين، اذكر القاعدة أو الخطوة التي استخدمتها؛ إذا لم تستطع، راجع الموضوع قبل المتابعة. الاستمرارية تثبت المادة أفضل من جلسة طويلة.
مثال
خلال مكالمة الفرز الأولى، يطلب منك المحاور شرح معنى None وكيف يقيّم بايثون القيم الصحيحة. تجيب أن None كائن فردي وأن الحاويات الفارغة والصفر والسلاسل الفارغة تُعد قيمًا خاطئة. ثم تذكر أن المقارنات يجب أن تستخدم is None لإظهار فهم دقيق لأساسيات بايثون.
أعد قراءة السؤال قبل الانتهاء وتأكد من معنى إجابتك.
درس 2 اختيار بنية البيانات المناسبة
تحل بنى البيانات في بايثون معظم مشكلات المقابلات دون الحاجة إلى تنفيذها من الصفر. تحافظ list على الترتيب وتتيح الوصول عبر الفهرس، بينما تكون tuple غير قابلة للتغيير ومناسبة للبيانات ذات الطول الثابت. تزيل set التكرارات وتوفر فحص وجود سريعًا، ويربط dict المفاتيح بالقيم.
تعزز الدوال المدمجة هذه البنى. تُرجع len() عدد العناصر، وينشئ sorted() نسخة مرتبة، ويضيف enumerate() فهارس أثناء المرور على تسلسل. يجمع zip() عدة تسلسلات في أزواج، ويجد min() وmax() القيم القصوى والدنيا مع مفتاح اختياري.
يوجه التعقيد الزمني الاختيار: الوصول إلى عنصر قائمة عبر الفهرس يستغرق وقتًا ثابتًا، لكن البحث عن قيمة يستغرق وقتًا خطيًا. في set أو dict، يكون فحص العضوية والبحث عن مفتاح ثابتين في المتوسط. المرور على أي بنية بحجم n يستغرق وقتًا خطيًا، وهو مقبول عادةً في الحل الأول.
يبدأ اختيار البنية الصحيحة بسؤال: ما العمليات التي تتكرر؟ إذا كنت تحتاج إجابات سريعة عن وجود عنصر، فإن set يتفوق على القائمة. وإذا كنت تحتاج ربط معلومات فريدة بكل مفتاح، فإن dict هو الخيار الطبيعي.
يتوقع المحاورون أن تذكر تكلفة العمليات قبل التنفيذ. على سبيل المثال، الإدراج في نهاية قائمة ثابت في المتوسط، لكن الإدراج في بدايتها خطي. استخدام collections.deque للعمليات على الطرفين يُظهر معرفة عملية بالمكتبة القياسية.
عند مقارنة الحلول، اشرح أي بنية تضحي بالذاكرة وأيها تضحي بالوقت. غالبًا ما يقلل تحويل بسيط، مثل تحويل قائمة إلى set، الخوارزمية من O(n²) إلى O(n). يُظهر هذا النوع من التفكير أنك لا تعرف الصيغة فحسب، بل تعرف أيضًا متى تطبقها.
نصيحة تدريبية اختيار بنية البيانات المناسبة: راجع هذا الدرس في جلسات قصيرة يوميًا. بعد كل تمرين، اذكر القاعدة أو الخطوة التي استخدمتها؛ إذا لم تستطع، راجع الموضوع قبل المتابعة. الاستمرارية تثبت المادة أفضل من جلسة طويلة.
مثال
تحتاج إلى التحقق من وجود عنصر بشكل متكرر ضمن قائمة قد تحتوي على مئات الآلاف من العناصر. تنتقل إلى استخدام set بحيث يعمل item in seen في وقت ثابت، وتوضح أن هذا بحث يعتمد على التجزئة. كما تذكر أنه إذا لزم الحفاظ على الترتيب، فيجب استخدام dict أو قائمة حسب القيود.
أعد قراءة السؤال قبل الانتهاء وتأكد من معنى إجابتك.
درس 3 الدوال والاستيعابات والمولدات
الدوال هي الوحدة الأساسية لتنظيم الحل. تحدد المعاملات الموضعية والمعاملات المسماة الواجهة، وتجعل القيم الافتراضية الوسائط الاختيارية صريحة. توصل التوقيعات الواضحة القصد دون الحاجة إلى تعليقات طويلة.
يجمع *args الوسائط الموضعية الإضافية في مجموعة (tuple)، بينما يجمع **kwargs الوسائط المسماة في قاموس. هذه المعاملات مفيدة للمغلفات والمزخرفات والدوال التي تفوض العمل إلى دوال أخرى. عند استخدامها، أبقِ الأسماء دالة على المعنى حتى لا تحجب المرونة الغرض.
يحدد النطاق الأسماء التي تراها كل جزء من الكود. المتغير المعرّف داخل دالة لا يوجد خارجها، وتتيح nonlocal تعديل متغير من نطاق خارجي محيط. تتذكر الإغلاقات ذلك النطاق حتى بعد انتهاء الدالة الخارجية، مما يتيح مصانع الدوال وحالة خاصة.
تلف المزخرفات الدوال لإضافة سلوك دون تكرار الكود. يستقبل المزخرف البسيط دالة، ويعيد دالة أخرى، ويُطبَّق بصيغة @timer. وهي مثالية للتسجيل والمصادقة وقياس الوقت، وغالبًا ما تظهر في المقابلات المتقدمة.
تنشئ تعبيرات الفهم (comprehensions) المجموعات بطريقة موجزة. يستبدل فهم قائمة مثل [x * x for x in nums if x > 0] حلقة كاملة، والفكرة نفسها تنطبق على dict وset. يجب أن تقود قابلية القراءة استخدامها: إذا أصبحت العبارة معقدة، فالحلقة الصريحة أفضل.
تنتج المولدات القيم عند الطلب باستخدام yield وتقيّم بتكاسل. بما أنها لا تحمّل التسلسل كاملًا في الذاكرة، تتيح معالجة تدفقات كبيرة أو لا نهائية بتكلفة يمكن توقعها. تمييز متى يكفي فهم قائمة ومتى نحتاج مولدًا يظهر نضجًا في اللغة.
نصيحة تدريبية الدوال والاستيعابات والمولدات: راجع هذا الدرس في جلسات قصيرة يوميًا. بعد كل تمرين، اذكر القاعدة أو الخطوة التي استخدمتها؛ إذا لم تستطع، راجع الموضوع قبل المتابعة. الاستمرارية تثبت المادة أفضل من جلسة طويلة.
مثال
يطلب منك المحاور تحويل قائمة معرّفات المستخدمين إلى أسماء صغيرة دون بناء قائمة وسيطة ضخمة. تكتب names = (name.lower() for name in users) وتشرح أن التعبير المولّد ينتج القيم بشكل كسول. وتقارنه بفهم القائمة وتؤكد أن استهلاك الذاكرة هو المفاضلة الأساسية.
أعد قراءة السؤال قبل الانتهاء وتأكد من معنى إجابتك.
درس 4 البرمجة كائنية التوجه ومعالجة الاستثناءات في المقابلات
تنظم الصفوف البيانات والسلوك في وحدة واحدة. يهيئ الأسلوب __init__ سمات كل نسخة، بينما تكون سمات الصف مشتركة بين جميع النسخ. تعريف السمات بوضوح يتجنب الخلط بين الحالة المشتركة والحالة الخاصة.
يتيح الوراثة إعادة استخدام السلوك وتخصيصه: ترث الفئة الفرعية أساليب الفئة الأم ويمكنها تجاوزها. يجعل تعدد الأشكال كائنات من صفوف مختلفة تستجيب للرسائل نفسها. الكود الذي يعتمد على الواجهات بدلًا من الأنواع المحددة أسهل في التوسعة والاختبار.
أساليب dunder، مثل __repr__ و__eq__ و__len__، تدمج الكائنات مع صيغة بايثون. تنفيذ __eq__ مع __hash__ ضروري لاستخدام النسخ في المجموعات والقواميس. تحوّل هذه الأساليب الصف إلى مواطن من الدرجة الأولى في اللغة.
يفصل التعامل مع الاستثناءات التدفق الطبيعي عن تدفق الأخطاء. يلتقط تركيب try/except الأخطاء المحددة، وينفذ else كودًا عندما لا يحدث استثناء، ويضمن finally التنظيف في جميع الحالات. التقاط الاستثناءات التي تعرف كيفية التعامل معها فقط يتجنب إخفاء الأخطاء الحقيقية.
يرمي raise استثناءً عندما تجعل حالة معينة المتابعة مستحيلة. تتيح الاستثناءات المخصصة، التي ترث من Exception، تسمية مواقف خاصة بمجال العمل. عند إنشائها، أبقِ الرسائل مفيدة والتقط الاستثناء المحدد بدلًا من Exception أو BaseException.
في المقابلات، تقيّم أمثلة البرمجة الكائنية قرارات التصميم وليس الصيغة فقط. اشرح لماذا تختار الوراثة بدلًا من التركيب، وما مسؤوليات كل صف. أما الاستثناءات فتُظهر أنك تفكر في مسارات الخطأ قبل حدوثها.
نصيحة تدريبية البرمجة كائنية التوجه ومعالجة الاستثناءات في المقابلات: راجع هذا الدرس في جلسات قصيرة يوميًا. بعد كل تمرين، اذكر القاعدة أو الخطوة التي استخدمتها؛ إذا لم تستطع، راجع الموضوع قبل المتابعة. الاستمرارية تثبت المادة أفضل من جلسة طويلة.
مثال
يجب أن يحمّل حلك ملفات المستخدمين من واجهة برمجية بعيدة وأن يعيد المحاولة عند فشل الشبكة. تعرّف فئة فرعية مخصصة RetryableError وتغلّف الاستدعاء داخل كتلة try/except تسجل الفشل. وتشرح أن أنواع الاستثناء المحددة تجعل عقد الفئة أوضح وأسهل في الاختبار.
أعد قراءة السؤال قبل الانتهاء وتأكد من معنى إجابتك.
درس 5 الخوارزميات والتعقيد واستراتيجية المقابلة
تحليل التعقيد هو اللغة المشتركة في مقابلات الخوارزميات. يصف تدوين Big O كيف ينمو الوقت أو الذاكرة عندما يزداد حجم المدخلات. قبل كتابة الكود، اقترح تعقيدًا متوقعًا وتأكد أن المحاور يعتبره معقولًا.
تحل أنماط متعددة جزءًا كبيرًا من المشكلات. يمر مؤشران عبر تسلسل من الطرفين، ويحوّل التجزئة (hashing) عمليات البحث الخطية إلى استعلامات ثابتة، وتعالج النافذة المنزلقة المتتاليات المتجاورة في مرور واحد. التعرف على هذه الأنماط يوفر الوقت ويظهر الخبرة.
غالبًا ما يكون الفرز الخطوة الأولى التي تبسط المشكلة، حتى عندما لا يكون الفرز نفسه هو الهدف. يحلل العودية المشكلة إلى نسخ أصغر منها ويتطلب حالة أساسية واضحة. عند استخدام العودية، اذكر الحالة الأساسية وإمكانية التخزين المؤقت لتجنب تكرار العمل.
يجعل التواصل عملية تفكيرك مرئية. اقرأ الكود بصوت عالٍ أثناء الكتابة، واشرح كل كتلة، واذكر القرارات المهمة. يستطيع المحاور الذي يفهم تفكيرك أن يقدم لك اقتراحات قبل أن تضيع وقتًا طويلًا.
تميز اختبارات الحالات الحدية الحل المكتمل من الحل الذي يعمل مع المثال فقط. اختبر مدخلات فارغة، وعنصرًا واحدًا، وقيمًا مكررة، وسالبة، وحدودًا من نص السؤال. تحقق أيضًا من خصائص بسيطة، مثل أن يحافظ الناتج على الترتيب أو الحجم المتوقع.
ينظم تدفق قابل للتكرار المقابلة: حل، واشرح، وحسّن. أولًا اعرض نهجك بصوت عالٍ، ثم نفذه بوضوح، وأخيرًا حسّن التعقيد إذا سمح الوقت. تقلل هذه الطريقة التوتر وتحول كل مقابلة إلى عرض متسق لعملية عملك.
نصيحة تدريبية الخوارزميات والتعقيد واستراتيجية المقابلة: راجع هذا الدرس في جلسات قصيرة يوميًا. بعد كل تمرين، اذكر القاعدة أو الخطوة التي استخدمتها؛ إذا لم تستطع، راجع الموضوع قبل المتابعة. الاستمرارية تثبت المادة أفضل من جلسة طويلة.
مثال
بإعطائك مصفوفتين مرتبتين، تبدأ بالقول إن الدمج بالقوة الغاشمة هو O(n log n) وأن الدمج بمؤشرين يمكن أن يصل إلى O(n). تستعرض ثوابت الحلقة قبل كتابة الكود، وهو ما يعكس تفكيرًا خوارزميًا منظمًا. ثم تلخص المفاضلة بين التعقيد الزمني وبساطة الكود للمحاور.
أعد قراءة السؤال قبل الانتهاء وتأكد من معنى إجابتك.