تنسيق السلاسل النصية

8.4 تنسيق السلاسل النصية

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على:

  • تنسيق قالب سلسلة نصية باستخدام وسائط الإدخال.
  • استخدام format() لإنشاء تنسيقات رقمية بناءً على قالب معين.

مواصفات تنسيق السلاسل النصية

توفر بايثون صياغة استبدال السلاسل النصية لتنسيق السلاسل النصية باستخدام وسائط الإدخال. يشمل تنسيق السلسلة النصية (formatting string) تحديد قواعد النمط وتعديل السلسلة النصية وفقًا لمواصفات التنسيق. ومن أمثلة ذلك استخدام الأنماط لبناء قيم سلاسل نصية مختلفة، وتحديد قواعد لطول السلسلة النصية ومحاذاتها.

تنسيق السلاسل النصية باستخدام حقول الاستبدال

تُستخدم حقول الاستبدال (Replacement fields) لتعريف نمط لإنشاء قيم سلاسل نصية متعددة تتوافق مع تنسيق معين. يوضح المثال أدناه قيمتين لسلسلتين نصيتين تستخدمان نفس القالب لتقديم طلبات لأفراد مختلفين لأخذ دورات مختلفة.

مثال 8.5

قيم السلاسل النصية من نفس القالب

    Dear John, I'd like to take a programming course with Prof. Potter.

    Dear Kishwar, I'd like to take a math course with Prof. Robinson.

في المثال أعلاه، حقول الاستبدال هي: 1) اسم الفرد الذي يُقدم إليه الطلب، 2) عنوان الدورة، و 3) اسم المدرب. لإنشاء قالب، يمكن إضافة حقول الاستبدال باستخدام {} لإظهار مكان مخصص لإدخال المستخدم. يُستخدم التابع format() لتمرير المدخلات لحقول الاستبدال في قالب سلسلة نصية.

مثال 8.6

تنسيق قالب السلسلة النصية لطلبات التسجيل في الدورات

يُعرَّف قالب سلسلة نصية بحقول استبدال أدناه لإنشاء قيم سلاسل نصية بوسائط إدخال مختلفة. يُستخدم التابع format() لتمرير المدخلات إلى القالب بنفس الترتيب.

    s = "Dear {}, I'd like to take a {} course with Prof. {}."

    print(s)
    print(s.format("John", "programming", "Potter"))
    print(s.format("Kishwar", "math", "Robinson"))

مخرجات الشِفرة أعلاه هي:

    Dear {}, I'd like to take a {} course with Prof. {}.
    Dear John, I'd like to take a programming course with Prof. Potter.
    Dear Kishwar, I'd like to take a math course with Prof. Robinson.

مفاهيم تطبيقية

قالب السلسلة النصية وتنسيقها

1.
ما مخرجات print("Hello {}!".format("Ana"))؟
  1. Ana
  2. Hello Ana
  3. Hello Ana!
2.
ما مخرجات print("{}:{}".format("One", "1"))؟
  1. One1
  2. One:1
  3. 1:One
3.
ما مخرجات print("{}".format("one", "two", "three"))؟
  1. one
  2. two
  3. onetwothree

حقول الاستبدال المُسمَّاة

يمكن وسم حقول الاستبدال بعلامة، تُسمى حقول استبدال مُسمَّاة (named replacement fields)، لسهولة الوصول وقابلية قراءة الشِفرة. يوضح المثال أدناه كيف يمكن استخدام حقول الاستبدال المُسمَّاة في قوالب السلاسل النصية.

مثال 8.7

قالب طقس الموسم باستخدام حقول الاستبدال المُسمَّاة

الوسيط المُسمَّى للاستبدال هو طريقة ملائمة لتعيين علامات أسماء لحقول الاستبدال وتمرير القيم المرتبطة بحقول الاستبدال باستخدام الأسماء المقابلة (بدلاً من تمرير القيم بالترتيب).

    s = "Weather in {season} is {temperature}."

    print(s)
    print(s.format(season = "summer", temperature = "hot"))
    print(s.format(season = "winter", temperature = "cold"))

مخرجات الشِفرة أعلاه هي:

    Weather in {season} is {temperature}.
    Weather in summer is hot.
    Weather in winter is cold.

الاستخدام المتعدد لوسيط مُسمَّى

نظرًا لأن حقول الاستبدال المُسمَّاة يُشار إليها بمفتاح اسم، يمكن أن يظهر حقل الاستبدال المُسمَّى ويُستخدم أكثر من مرة في القالب. كما أن الترتيب الموضعي ليس ضروريًا عند استخدام حقول الاستبدال المُسمَّاة.

    s = "Weather in {season} is {temperature}; very very {temperature}."

    print(s)
    print(s.format(season = "summer", temperature = "hot"))
    print(s.format(temperature = "cold", season = "winter"))

مخرجات الشِفرة أعلاه هي:

    Weather in {season} is {temperature}; very very {temperature}.
    Weather in summer is hot; very very hot.
    Weather in winter is cold; very very cold.

مفاهيم تطبيقية

أمثلة على حقول الاستبدال المُسمَّاة

4.
ما مخرجات print("Hey {name}!".format(name = "Bengio"))؟
  1. Hey name!
  2. Hey Bengio
  3. Hey Bengio!
5.
ما مخرجات print("Hey {name}!".format("Bengio"))؟
  1. Hey name!
  2. KeyError
  3. Hey Bengio!
6.
ما مخرجات الشِفرة التالية؟
greeting = "Hi"
name = "Jess"
print("{greeting} {name}".format(greeting = greeting, name = name))
  1. greeting name
  2. Hi Jess
  3. Jess Hi

حقول الاستبدال المُرَقَّمة

يمكن للتابع format() الخاص بالسلاسل النصية في بايثون استخدام الترتيب الموضعي لمطابقة الوسائط المُرَقَّمة. تُسمى حقول الاستبدال التي تستخدم الترتيب الموضعي للوسائط حقول الاستبدال المُرَقَّمة (numbered replacement fields). يبدأ فهرسة الوسائط من 0. مثال: print("{1}{0}".format("Home", "Welcome")) تُخرج قيمة السلسلة النصية "Welcome Home". الوسيط الأول، "Home"، موجود في الفهرس 0، والوسيط الثاني، "Welcome"، موجود في الفهرس 1. استبدال هذه الوسائط بترتيب "{1}{0}" ينشئ السلسلة النصية "Welcome Home".

يمكن لحقول الاستبدال المُرَقَّمة استخدام قيم الوسائط لحقول استبدال متعددة باستخدام نفس فهرس الوسيط. يوضح المثال أدناه كيف يُستخدم وسيط واحد لأكثر من حقل استبدال مُرقَّم.

مثال 8.8

حقل استبدال مُرقَّم لبناء عبارة

تُستخدم حقول الاستبدال المُرَقَّمة في هذا المثال لبناء عبارات مثل "very very cold" أو "very hot".

    template1 = "{0} {0} {1}"
    template2 = "{0} {1}"

    print(template1.format("very", "cold"))
    print(template2.format("very", "hot"))

مخرجات الشِفرة أعلاه هي:

    very very cold
    very hot

تنسيق طول السلسلة النصية ومحاذاتها

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

مثال 8.9

جدول مُنسَّق لقائمة طلاب فصل

جدول مُنسَّق لقائمة طلاب فصل

    Student Name              Major          Grade
    ----------------------------------------------
    Manoj Sara          Computer Science        A-
    Gabriel Wang     Electrical Engineering      A
    Alex Narayanan       Social Sciences        A+

في المثال أعلاه، تم تنسيق الجدول إلى ثلاثة أعمدة. يشغل العمود الأول 15 حرفًا ومحاذاته لليسار. يستخدم العمود الثاني 25 حرفًا ومحاذاته للمنتصف، ويستخدم العمود الأخير حرفين ومحاذاته لليمين. تُستخدم مواصفات التحكم في تنسيق المحاذاة والطول لإنشاء الجدول المُنسَّق.

يُستخدم عرض الحقل (field width) في مواصفات تنسيق السلسلة النصية لتحديد الطول الأدنى للسلسلة النصية المعطاة. إذا كانت السلسلة النصية أقصر من الطول الأدنى المحدد، فسيتم حشو السلسلة النصية بأحرف مسافة. يتم تضمين عرض الحقل في حقل مواصفات التنسيق باستخدام عدد صحيح بعد نقطتين رأسيتين. مثال: {name:15} يحدد أن الطول الأدنى لقيم السلاسل النصية التي يتم تمريرها إلى حقل name هو 15.

نظرًا لأنه يمكن استخدام عرض الحقل لتحديد الطول الأدنى للسلسلة النصية، يمكن حشو السلسلة النصية بأحرف مسافة من اليمين أو اليسار أو كليهما لتكون محاذية لليسار أو لليمين أو في المنتصف، على التوالي. يتم تحديد نوع محاذاة النص (string alignment type) باستخدام الأحرف < أو > أو ^ بعد النقطتين الرأسيتين عند تحديد طول الحقل. مثال: {name:^20} يحدد حقل استبدال مُسمَّى بطول أدنى يبلغ 20 حرفًا ومحاذاته للمنتصف.

نوع المحاذاة الرمز مثال المخرجات
محاذاة لليسار

<

template = "{hex:<7}{name:<10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000Red #00FF00green

محاذاة لليمين

>

template = "{hex:>7}{name:>10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000          Red #00FF00        green

توسيط ^

template = "{hex:^7}{name:^10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000   Red #00FF00  green

جدول 8.2 تنسيق محاذاة السلاسل النصية.

مفاهيم تطبيقية

تحديد عرض الحقل والمحاذاة

7.
ما مخرجات الشِفرة التالية؟
template = "{name:12}"
formatted_name = template.format(name = "Alice")
print(len(formatted_name))
  1. 5
  2. 12
  3. "Alice"
8.
ما مخرجات الشِفرة التالية؟
template = "{greeting:>6}"
formatted_greeting = template.format(greeting = "Hello")
print(formatted_greeting[0])
  1. H
  2. " Hello"
  3. حرف مسافة
9.
ما مخرجات الشِفرة التالية؟
template = "{:5}"
print(template.format("123456789"))
  1. 56789
  2. 123456
  3. 123456789

تنسيق الأرقام

يمكن استخدام التابع format() لتنسيق القيم الرقمية. يمكن حشو القيم الرقمية للحصول على طول أدنى معين، ودقة، وحرف إشارة. تتبع صياغة تعديل القيم الرقمية البنية {[index]:[width][.precision][type]}. في الصياغة المعطاة،

  • يشير حقل index إلى فهرس الوسيط.
  • يشير حقل width إلى الطول الأدنى للسلسلة النصية.
  • يشير حقل precision إلى دقة الفاصلة العائمة (floating-point precision) للرقم المعطى.
  • يوضح حقل type نوع الإدخال الذي يتم تمريره إلى التابع format(). يتم تعريف مدخلات الفاصلة العائمة والعشرية بواسطة "f" و "d" على التوالي. كما يتم تعريف قيم السلاسل النصية بواسطة "s".

يلخص الجدول أدناه خيارات التنسيق لتعديل القيم الرقمية.

مثال المخرجات الشرح

print("{:.7f}".format(0.9795))

0.9795000

تُظهر مواصفات التنسيق .7 أن المخرجات يجب أن تحتوي على سبع خانات عشرية. مواصفة f هي مُعرِّف لتنسيق الفاصلة العائمة.

print("{:.3f}".format(12))

12.000

تُظهر مواصفات التنسيق .3 أن المخرجات يجب أن تحتوي على ثلاث خانات عشرية. مواصفة f هي مُعرِّف لتنسيق الفاصلة العائمة.

print("{:+.2f}".format(4))

+4.00

تُظهر مواصفات التنسيق .2 أن المخرجات يجب أن تحتوي على خانتين عشريتين. مواصفة f هي مُعرِّف لتنسيق الفاصلة العائمة. تُضيف علامة + قبل مواصفات الدقة حرف إشارة إلى المخرجات.

print("{:0>5d}".format(5))

00005

تُعرّف مواصفات التنسيق 0>5 حقل width بأنه 5، وبالتالي يجب أن يكون للمخرجات طول أدنى يبلغ 5. وإذا كان الرقم يحتوي على أقل من خمسة أرقام، فيجب حشو الرقم بالأصفار من الجانب الأيسر. مواصفة d هي مُعرِّف لتنسيق الأرقام العشرية.

print("{:.3s}".format("12.50"))

12.

تُظهر مواصفات التنسيق .3 أن المخرجات ستتكون من ثلاثة أحرف. مواصفة s هي مُعرِّف لتنسيق السلاسل النصية.

جدول 8.3 خيارات تنسيق الأرقام.

مفاهيم تطبيقية

أمثلة على تنسيق القيم الرقمية

10.
ما مخرجات print('{0:.3f}'.format(3.141592))؟
  1. 3.141592
  2. 3.1
  3. 3.142
11.
ما مخرجات print('{:1>3d}'.format(3))؟
  1. 113
  2. 311
  3. 3.000
12.
ما مخرجات print('{:+d}'.format(123))؟
  1. 123
  2. +123
  3. :+123

جرّب بنفسك

تنسيق قائمة من الأرقام

بالنظر إلى قائمة من الأرقام (ذات فاصلة عائمة أو صحيحة)، اطبع الأرقام بدقة خانتين عشريتين وعلى الأقل ستة أحرف.

    Input: [12.5, 2]
    Prints: 012.50
    
    002:00