محتويات الدورة

بايثون / الأساسيات / الدرس 5

المجموعات ونصوص يونيكود

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

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • الاختيار بحسب المسؤولية
  • النص يختلف عن البايتات

الاختيار بحسب المسؤولية

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

الفهرسة والاقتطاع والعضوية

تبدأ فهارس المتتاليات من الصفر، وتحسب الفهارس السالبة من النهاية. يشمل الاقتطاع values[1:4] البداية ويستبعد النهاية، وقد ينتج جزءا فارغا دون خطأ. أما قراءة موضع خارج الحدود مباشرة فتثير IndexError. تختبر in وجود عنصر لا موقعه. وتفحص مفاتيح القاموس؛ استخدم values() إذا أردت القيم. يمنع نمط الوصول الواضح البحث غير الضروري والخلط بين الغياب وصفر صحيح أو نص فارغ مشروع. لا تختر قيمة افتراضية إلا إذا كان المجال يعتبرها مكافئة للغياب.

العد باستخدام القاموس

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

python العد باستخدام القاموس — مثال محلول
words = ["Tea", "tea", "Bread"]
counts = {}
for word in words:
    key = word.casefold()
    counts[key] = counts.get(key, 0) + 1
for key in sorted(counts):
    print(key, counts[key])
الناتج المتوقع
bread 1
tea 2

يشترك الشكلان في مفتاح موحد للشاي. يحدد الترتيب شكل التقرير دون الاعتماد على ترتيب ظهور الفئات في المدخلات.

تشارك المراجع والنسخ السطحي

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

python تشارك المراجع والنسخ السطحي — مثال محلول
original = [[1], [2]]
copy = original.copy()
copy[0].append(9)
copy[1] = [7]
print(original)
print(copy)
الناتج المتوقع
[[1, 9], [2]]
[[1, 9], [7]]

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

النص يختلف عن البايتات

تمثل str نص يونيكود، وتمثل bytes تسلسلات بايتات مرمزة. رمّز النص عند عبور حد يتعامل مع البايتات، وفك الترميز وفق الاتفاق. يعد UTF-8 خيارا صريحا شائعا، لكن توثيق التنسيق الخارجي هو المرجع. تحسب len(text) نقاط يونيكود البرمجية، وقد تختلف عن عدد المحارف المرئية أو عرضها بسبب علامات التشكيل وتسلسلات الرموز. تعيد طرائق النص سلاسل جديدة لأن النصوص غير قابلة للتعديل. احتفظ بالأصل للعرض أو التدقيق، واستخدم قيمة موحدة مستقلة للمقارنة.

الأخطاء الشائعة وإصلاحها

ظهور KeyError لحقل اختياري

لماذا يحدث؟
تفترض الفهرسة المباشرة وجود المفتاح.
كيف تصلحه؟
استخدم get بقيمة مناسبة أو تحقق أولا من المفاتيح المطلوبة.
كيف تتجنب تكراره؟
وثق الحقول المطلوبة وتلك التي يجوز غيابها.

تغيير نسخة للبيانات الداخلية في الأصل

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

تغير ترتيب تقرير set بين مرات التشغيل

لماذا يحدث؟
ليس ترتيب المرور على set عقدا للعرض.
كيف تصلحه؟
رتب العناصر قبل عرض مخرجات قابلة للمقارنة.
كيف تتجنب تكراره؟
حدد ترتيب التقرير صراحة.

اختبر فهمك

1. احذف تكرار ["b", "a", "b"] وأنتج ترتيبا أبجديا.

اعرض الحل المشروح

حوّل القائمة إلى set للتعبير عن التميز ثم استخدم sorted. تعيد sorted(set(["b", "a", "b"])) القائمة ["a", "b"]. تزيل المجموعة التكرار، ويحقق الترتيب شرط العرض المستقل.

2. فسر اختلاف len("é") عن عدد بايتات ترميزه UTF-8.

اعرض الحل المشروح

المحرف المركب مسبقا é نقطة يونيكود واحدة، لكن تمثيله في UTF-8 يستخدم بايتين. تعطي len("é") القيمة 1 وتعطي len("é".encode("utf-8")) القيمة 2. يجيب طول النص وطول تخزينه المرمز عن سؤالين مختلفين، ولا يجوز خلطهما في الحدود.

أهم ما تعلمته

  • اختر المجموعة بحسب العمليات المطلوبة.
  • يحفظ النسخ السطحي مراجع الكائنات الداخلية.
  • للنص والبايتات المرمزة أطوال وأدوار مختلفة.

المراجع الرسمية