تابع + نجم ، تعلم مهارات Python الجديدة كل يوم

من الإنترنت والتطفل والحذف

بصفتك مبرمجًا ، ربما تكون قد مررت بمقابلات تقنية إلى حد ما ، بعضها يتعلق بلغة البرمجة نفسها ، وبعضها يتعلق بالهندسة.
سنلخص اليوم 9 أسئلة يتم طرحها غالبًا عند إجراء مقابلات مع مبرمجي بايثون. لمجموعتك المرجعية.

1: ما الفرق بين قوائم Python و tuples والقواميس؟

يجب طرح هذا السؤال مرارًا ، ونشرحه بالتفصيل هنا.

  • List (List) ، قائمة Python هي في الواقع مصفوفة ديناميكية ، مخزنة في كتلة ذاكرة مستمرة ، وتعقيد الوصول العشوائي هو O (1) ، سيؤدي إدخال العناصر وحذفها إلى تحريك كتلة الذاكرة ، والوقت التعقيد هو O ( ن). في نفس الوقت ، هو كائن قابل للتغيير. عندما نقوم بتعيين قيمة للقائمة ، نحصل فقط على عنوان الذاكرة الخاص بها. إذا احتجنا إلى نسخ جميع محتويات القائمة إلى متغير آخر ، فنحن بحاجة إلى استخدام نسخة (نسخة سطحية ) و deepcopy (نسخة عميقة). نسخة).

  • Tuple ، مجموعة Python هي بنية بيانات ثابتة ، وهي في الأساس مصفوفة. نظرًا لأنه كائن غير قابل للتغيير ، يكون طول Tuple ثابتًا عند إنشائه ، لذلك لا يمكننا إضافة عناصر منه أو إزالتها. ومع ذلك ، فإن الكائنات الموجودة في Tuple قابلة للتغيير. عندما نسند متغيرًا يحتوي على مجموعة إلى متغير آخر ، فإننا في الواقع نعيد تطبيق مساحة ذاكرة جديدة في الذاكرة لإنشاء مجموعة جديدة.

  • القاموس (Dict) ، قاموس Python هو جدول تجزئة ، وهي بنية بيانات يتم الوصول إليها مباشرة وفقًا لزوج القيمة الرئيسية (مفتاح ، قيمة). لا يوجد الكثير من التحليل حول دالة التجزئة هنا ، يمكنك فهمها بنفسك. إذا كان القاموس ينتج عنه تضارب في التجزئة ، أي عندما يواجه المفتاح نسخة مكررة. ستحسب Python موضع المرشح التالي من خلال طريقة العنونة المفتوحة ، وتختبر بشكل متكرر للتأكد من أن قيمة التجزئة التي تم إنشاؤها لن تتعارض. القواميس ، مثل القوائم ، هي أيضًا كائنات قابلة للتغيير. يلزم أيضًا نسخ (نسخة ضحلة) ونسخة عميقة (نسخة عميقة) لنسخ المحتوى.

2: كيفية إخراج سلسلة أو رقم بترتيب عكسي؟

ترتيب عكسي للسلسلة ، يمكننا استخدام شريحة Python لعكس السلسلة ، والرجوع إلى الكود التالي:

str1 = "长风几万里,吹度玉门关"print(str1[::-1])

تنسيق معلمة الشريحة: [start_index: stop_index: step]

إذا لم نقم بتعبئة معلمات موضع البداية والنهاية للشريحة ، فسيكون الإعداد الافتراضي هو أخذ محتوى السلسلة بالكامل. عندما تكون معلمة الخطوة (حجم الخطوة) سالبة ، ستأخذ السلسلة القيم تلقائيًا من اليمين إلى اليسار ، -1 هو أخذ القيم بالتسلسل ، ومن الطبيعي أن يكون بترتيب عكسي.

يمكننا أيضًا إخراج الأرقام بترتيب عكسي من خلال مبدأ التقطيع.

# 正整数的情况number = 10002new_number = int(str(number)[::-1])# 负整数的情况number = -10002new_number = int('-{0}'.format(str(abs(number))[::-1]))


3: تحدث عن آلية إدارة ذاكرة Python

تمتلك لغة البرمجة Python آلية مدمجة لجمع البيانات المهملة ، ويعد حساب المرجع جزءًا من هذه الآلية.

في كود مصدر Pyhton ، يتم استخدام وحدتي الماكرو Py_INCREF (op) و Py_DECREF (op) لزيادة العدد المرجعي وإنقاصه.

عند إنشاء كائن ، وتعيينه ، وتمريره بواسطة معلمات ، وقبل إرجاع الدالة ، يمكن زيادة قيمة عدد مرجعها (ob_refcnt) بمقدار 1 (INC) ، وتظل تتراكم.

عندما يخرج متغير الكائن عن النطاق ، تنخفض قيمة العد المرجعي بمقدار 1 (DEC).

عندما يتم تقليل عدد مرجع الكائن إلى 0 (ob_refcnt يساوي 0) ، فإن Py_DECREF (op) سوف يستدعي " التدمير " للكائن (__del__) لتحريره من الذاكرة.


4: ما هي الجلسة ، ملفات تعريف الارتباط ، الرمز المميز؟

الجلسة هي مفهوم حيث يتم تخزين المعلومات على جانب الخادم.

ملف تعريف الارتباط هو تنفيذ للجلسة ، ويتم تخزين المعلومات في العميل (المتصفح).

بسبب الطبيعة عديمة الحالة لبروتوكول HTTP ، نحتاج إلى إنشاء بيانات اعتماد بين المتصفح والخادم لتحديد هوية المستخدم والمعلومات التفصيلية.يمكن أن تكون بيانات الاعتماد هذه إما ملف تعريف ارتباط أو رمز مميز.

عندما يقوم المستخدم بتسجيل الدخول بنجاح ، يمكننا إنشاء معلومات جلسة على الخادم باستخدام بيانات اعتماده وحفظها في ملف أو قاعدة بيانات أو ذاكرة. عادةً ما يكون للجلسة معرف جلسة.

نظرًا لأن معرف الجلسة مطلوب للوصول إلى معلومات الجلسة من جانب الخادم ، فإننا عادةً نخزن معرف الجلسة في ملف تعريف الارتباط.

في الواقع ، تقوم معلومات ملف تعريف الارتباط بإرجاع معرف الجلسة أو معلومات إضافية أخرى إلى العميل بعد أن يقوم المستخدم بتسجيل الدخول لإنشاء معلومات الجلسة ، والتي يتم تخزينها في الملف المحلي بواسطة العميل.

عندما يبدأ المستعرض طلبًا إلى الخادم ، فإنه سيصل إلى الخادم بمعرف الجلسة في ملف تعريف الارتباط. يعثر الخادم على معلومات الجلسة المخزنة وفقًا لمعرف الجلسة. إذا كان من الممكن العثور على المعلومات وكان المحتوى صحيحًا ، فإن الوصول يعتبر ساري المفعول.

بالإضافة إلى تخزين معرّف الجلسة ، يمكن لملفات تعريف الارتباط أيضًا تخزين معلومات أخرى غير حساسة (مثل الأسماء المستعارة للمستخدم ، والصور الرمزية ، وما إلى ذلك) ، والتي يتم توفيرها للمتصفح للاستخدام المباشر دون الحاجة إلى الحصول عليها من الخادم في كل مرة.

فيما يتعلق بالرمز المميز ، يتم استخدامه أكثر في الخدمات المستندة إلى RESTAPI.

آلية المصادقة الخاصة به هي أنه عندما يقوم المستخدم بتسجيل الدخول ، يقوم الخادم بحساب معلومات الرمز المميز وتخزينها على الخادم وإعادتها إلى العميل. يتضمن المحتوى عادةً معرف المستخدم والطابع الزمني الحالي والتوقيع ومعلومات أخرى.

يتم تخزين الرموز بشكل عام في localStorage أو cookie أو sessionStorage من جانب العميل. يتم تخزين الخادم بشكل عام في قاعدة البيانات.

عندما يطلب العميل الخادم مرة أخرى ، سيحصل على معلومات الرمز محليًا ويضعها في الرؤوس.عندما يتلقى الخادم الطلب ، سيذهب تلقائيًا إلى الرؤوس للحصول على الرمز للتحليل لتحديد هوية المستخدم.


5: ما هو الفرق والوظيفة بين GET و POST؟

لا يوجد فرق بين GET و POST من حيث الجوهر ، ولا يحدد بروتوكول HTTP الحد الأقصى لطول البيانات المرسلة عن طريق GET و POST.

قد توجد القيود الوحيدة على الخادم والمتصفح من جانب الخادم.

عادة في Nginx أو برامج خدمة WebServer المختلفة ، هناك حد لتعريف الحد الأقصى لطول إرسال GET و POST.

عادةً ما يعتمد حد طول البيانات المقدمة من GET على المتصفح ، ويختلف حد كل متصفح.

في بروتوكول HTTP ، لا توجد علاقة فعلية بين الطريقة المستخدمة وكيفية نقل البيانات ، في معظم خوادم الويب. البيانات المقدمة من GET و POST موجودة بالفعل في منطقة BODY. يمكننا نقل الملفات من خلال GET أو POST.

السبب وراء تعريف GET عادةً للحصول على البيانات و POST لإرسال البيانات هو أن طلبات GET غير فعالة ، في حين أن طلبات POST ليست كذلك.

يعني عدم القدرة على تحمل العاطفة أنه يجب أن يكون للطلبات مرة واحدة ومتعددة للحصول على مورد نفس الآثار الجانبية. بعبارات بسيطة ، فهذا يعني أن الطلبات المتعددة لنفس عنوان URL يجب أن تعرض نفس النتيجة.

استنادًا إلى مبدأ idempotency ، عندما نستخدم GET لإضافة البيانات وتعديلها وحذفها ، ستكون هناك آثار جانبية ، لأن GET ستحاول تلقائيًا إعادة المحاولة عندما تكون حالة الشبكة غير جيدة ، مما يزيد من مخاطر تكرار عمليات البيانات. واستخدامه للحصول على البيانات لن ينطوي على مثل هذه المخاطر ، لأنه حتى لو طلبنا موردًا مليون مرة ، فلن يتغير مع ذلك.

يعتمد هذا السؤال على المستوى الفني للمقابل ، فإذا كان القائم بإجراء المقابلة على استعداد للتحدث معك بعمق أكبر ، فيمكنك الإجابة بهذه الطريقة. إذا كان لدى القائم بإجراء المقابلة بعض الإجابات القياسية في ذهنه ، فمن المستحسن الإجابة فقط على GET للحصول على البيانات و POST لإرسال البيانات.

بالإضافة إلى ذلك ، فإن طريقة الحذف هي في الواقع غير فعالة ، حتى إذا حذفت مليون مرة ، فسيتم حذف البيانات مرة واحدة فقط.

6: ما هو مصمم بايثون.

إن مصمم Python هو في الأساس وظيفة ، ويتم استخدامه للسماح للوظائف الأخرى بإضافة وظائف متعلقة بوظيفة التزيين دون إجراء الكثير من التغييرات في الكود.

دعونا نلقي نظرة أولا على تنفيذ وتطبيق الديكور.

صورة

أعلاه قمنا بتطبيق مصمم بايثون بسيط ، والذي يطبع السجلات في بداية ونهاية وظيفة fun1. من خلال هذا المثال ، يمكننا أن نجد أن مصمم Python يبسط بالفعل رمز الاتصال بالنسبة لنا. إذا لم يتم استخدام مصمم ، فسيتم استخدام الكود أعلاه يمكن كتابتها على هذا النحو.

صورة

سوف يستدعي الكود أعلاه بشكل صريح الوظيفة func1 من خلال وظيفة السجل ، والتي ليس من السهل فهمها ، كما أنه يدمر ترتيب استدعاءات الكود ، وهو أمر غير أنيق. إذا احتجت إلى إضافة أكثر من 10 مصممين إلى مقدمة المرح 1 ، يجب أن أكتب علاقة المكالمة هذه أكثر من عشر مرات ، وهي في الأساس كارثة من حيث فهم القراءة.

عادة ما يتم استخدام أدوات تزيين بايثون على سبيل المثال لا الحصر في المواقف التالية.

  • طباعة السجل

  • اختبار أداء

  • معالجة معاملات قاعدة البيانات

  • تحقق إذن

  • معالجة ذاكرة التخزين المؤقت

باختصار ، فإن استخدام مصمم Pyhton هو السماح لنا بإعادة استخدام الكود بشكل أفضل ، واعتماد بنية كود أكثر انسجامًا مع الفهم البشري عند تنفيذ نفس الكود الوظيفي.

في الواقع ، مصمم Python هو برمجة AOP (موجهة إلى شرائح) بلغة JAVA.


الشكل 7: مفاهيم Python للأقفال والعمليات والخيوط وكوروتين

يعد قفل Python العام بمثابة حل وسط تم إجراؤه لضمان أمان الخيط.ببساطة ، بغض النظر عن عدد مراكز وحدة المعالجة المركزية ، يمكن تشغيل مؤشر ترابط واحد فقط في نفس الوقت. بالنسبة لعمليات IO المكثفة ، فإن خيوط المعالجة المتعددة بالكاد قابلة للاستخدام. إذا كانت كثيفة استخدام وحدة المعالجة المركزية ، فإن خيوط Python المتعددة تكون عديمة الفائدة تقريبًا.

إذا كنت ترغب في الاستفادة من وحدة المعالجة المركزية متعددة النواة ، فيمكنك استخدام العمليات. تعالج وحدة المعالجة المتعددة في Pyhton هذه المشكلة. ستبدأ كل مهمة حوسبة عملية Python منفصلة ، مما يسمح للمهمة بالعمل في بيئة مترجم مستقل لتحسين الحوسبة نجاعة.

مفهوم coroutine هو أن الخيوط والعمليات ستولد الكثير من الأداء الزائد عند التبديل بين وضع مستخدم وحدة المعالجة المركزية ووضع النواة.

في هذه الحالة ، ظهر مفهوم الكوروتينات أو الخيوط الدقيقة.

بعد Python 3.5 ، استخدم الكلمة الأساسية غير المتزامنة / انتظار للتعامل مع coroutines.

مزاياه هي:

  • لا يوجد عبء للتبديل بين الخيوط.

  • لا توجد آلية قفل الخيط ، نظرًا لوجود مؤشر ترابط واحد فقط ، ولا يوجد قفل متغير مشترك ، مما يزيد من الكفاءة.


8: قائمة الفهم وفهم القاموس

# 列表推导list1 = [i for i in range(5)]# 字典推导dict1 = {k:v for k,v in dict.items()}# 集合推导set1 = {x*2 for x in [1,2]}

يعد فهم القائمة وفهم القاموس وفهم المجموعة كلها ميزات في Python ، ويتوفر فهم القاموس بعد Python 2.7.

تتمثل وظائف طرق الاشتقاق الثلاثة هذه في بناء هيكل تسلسل بيانات جديد آخر من تسلسل البيانات الحالي ، وهو أمر ضروري من منظور قابلية قراءة الكود والتقارب ، وتجنب الرموز المعقدة والتافهة.


9: مولد

# 构造生成器x = (i for i in range(10))# 输出x<generator object <genexpr> at 0x10e9d40c0>

يمكننا أن نرى من الكود أعلاه أن تنسيق المولد مشابه جدًا لتنسيق فهم القائمة. والفرق الوحيد هو أن الأقواس المربعة يتم استبدالها بأقواس.لم يعد الكائن الذي تم إنشاؤه بواسطة المولد قائمة ، بل مولد هدف.

تتمثل وظيفة المولد في أنه عندما نريد إنشاء تسلسل طويل جدًا ، لا نحتاج بالضرورة إلى استخدامه على الفور ، لذلك لا نحتاج إلى فتح مساحة ذاكرة كبيرة عند إنشائها مرة أخرى ، ولكننا نعلن الكائن أولاً وأخبره أنني بحاجة إلى مساحة ذاكرة كبيرة ، لكن يمكنني إنشاؤها واحدة تلو الأخرى عند استخدامها. هناك كلمة لهذا في لغات أخرى تسمى "التقييم الكسول".

يمكننا استخدام الحلقة for مباشرة لاجتياز كائن المولد واسترداد القيم بدوره.

دعنا نتحدث عن أسئلة المقابلة التسعة هذه أولاً. نظرًا لمحدودية المساحة ، فإننا لا نتحدث عنها بعمق ، لأننا إذا أردنا التحدث عنها بعمق ، يمكن لكل نقطة معرفة هنا أن تأخذ فصلًا كاملاً للتحدث عنها بالتفصيل ، ولكني أعتقد أنه يمكن للجميع فهم وممارسة المزيد من التفاصيل بناءً على نقاط المعرفة هذه.

بالنسبة إلى القائم بإجراء المقابلة ، لا تتعلق مقابلة المبرمج في الواقع بعدد الأسئلة التي يمكنك الإجابة عليها بشكل صحيح ، ولكن ما إذا كانت جودة الأسئلة التي تجيب عليها في الجزء الذي يوافق عليه. يتفق الحزب مع ذلك ، وكلما زاد معدل النجاح.

صورة


اضغط لفترة طويلة أو امسح رمز الاستجابة السريعة أدناه للحصول على  دورات Python المجانية المفتوحة ومئات الجيجابايت من المواد التعليمية التي تم تجميعها وتنظيمها من قبل اللاعبين الكبار ، بما في ذلك على سبيل المثال لا الحصر كتب Python الإلكترونية ، والبرامج التعليمية ، وأوامر المشروع ، وكود المصدر ، وما إلى ذلك.

صورة

امسح رمز الاستجابة السريعة ضوئيًا - احصل عليه مجانًا

اقتراحات للقراءة


صورة
انقر على "قراءة النص الأصلي" لإعادة الشحن معًا!