كيفية استخدام محولات السلسلة في Python 3

### مقدمة

طريقة str.format() في فئة السلسلة في Python تسمح لك بإجراء استبدالات متغيرة وتنسيق قيم. هذا يتيح لك دمج العناصر معًا داخل سلسلة من خلال التنسيق الوضعي.

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

المتطلبات المسبقة

يجب أن يكون لديك Python 3 مثبتًا وبيئة برمجية معدة على جهاز الكمبيوتر أو الخادم الخاص بك. إذا لم يكن لديك بيئة برمجية معدة، يمكنك الرجوع إلى دلائل التثبيت والإعداد لـ بيئة برمجية محلية أو لـ بيئة برمجية على خادمك المناسبة لنظام التشغيل الخاص بك (Ubuntu، CentOS، Debian، إلخ).

## استخدام المنسقين

يعمل مُنسقو النصوص عن طريق وضع حقل أو حقول البديل أو العناصر النائبة – المحددة بزوج من الأقواس المنحنية {} – داخل سلسلة نصية واستدعاء طريقة str.format(). ستمرر إلى الطريقة القيمة التي ترغب في دمجها مع السلسلة. سيتم تمرير هذه القيمة في نفس المكان الذي يتم فيه توضيح العنصر النائب عند تشغيل البرنامج.

لنقم بطباعة سلسلة تستخدم منسقًا:

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

print("Sammy has {} balloons.".format(5))
Output
Sammy has 5 balloons.

في المثال أعلاه، قمنا ببناء سلسلة نصية بزوج من الأقواس المنحنية كعنصر نائب:

"Sammy has {} balloons."

ثم قمنا بإضافة طريقة str.format() وقمنا بتمرير قيمة العدد الصحيح 5 إلى تلك الطريقة. يتم وضع قيمة 5 في السلسلة في الموضع نفسه الذي كانت فيه الأقواس المنحنية:

Sammy has 5 balloons.

يمكننا أيضًا تعيين متغير ليكون مساويًا لقيمة سلسلة تحتوي على عناصر نائبة للمنسق:

open_string = "Sammy loves {}."
print(open_string.format("open source"))
Output
Sammy loves open source.

في هذا المثال الثاني، قمنا بدمج سلسلة "open source" مع السلسلة الأكبر، واستبدال الأقواس المنحنية في السلسلة الأصلية.

المُنسقون في Python يسمحون لك باستخدام الأقواس المنحنية كعناصر نائبة للقيم التي ستمرر من خلالها باستخدام طريقة str.format().

##استخدام المُنسقين مع عدة عناصر نائبة

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

new_open_string = "Sammy loves {} {}."                      #2 {} الأماكن المحجوزة
print(new_open_string.format("open-source", "software"))    #قم بتمرير سلسلتين إلى الطريقة، مفصولة بفاصلة
Output
Sammy loves open-source software.

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

وبمتابعة نفس الصيغة، يمكننا إضافة استبدالات إضافية:

sammy_string = "Sammy loves {} {}, and has {} {}."                      #4 {} الأماكن المحجوزة
print(sammy_string.format("open-source", "software", 5, "balloons"))    #قم بتمرير 4 سلاسل إلى الطريقة
Output
Sammy loves open-source software, and has 5 balloons.

في sammy_string أضفنا 4 أزواج من الأقواس المتعرجة كأماكن محجوزة للاستبدال المتغير. ثم، قمنا بتمرير 4 قيم إلى طريقة str.format()، مختلطة بين أنواع بيانات السلسلة والعدد الصحيح. يتم فصل كل من هذه القيم بفاصلة.

##إعادة ترتيب المنسقين باستخدام الوسائط الإجبارية والمفتاحية

عندما نترك الأقواس المتعرجة فارغة بدون أي معلمات، ستقوم Python بتبديل القيم الممرة من خلال طريقة str.format() بالترتيب. كما رأينا حتى الآن، سيبدو بناء المنسق مع زوجي أقواس متعرجة فارغتين مع قيمتين ممرتين بهذا الشكل:

print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
Output
Sammy the shark has a pet pilot fish!

يتم استبدال الزوج الأول من الأقواس المتعرجة بقيمة السلسلة "سمكة القرش"، ويتم استبدال الزوج الثاني بقيمة السلسلة "سمكة الطيار".

القيم الموجودة داخل الطريقة تبدو كما يلي:

("shark", "pilot fish")

هي في الأساس نوع بيانات القرد ويمكن استدعاء كل قيمة فردية تحتويها القرد باستخدام رقم فهرسها، الذي يبدأ بالرقم 0.

يمكننا تمرير هذه الأرقام الفهرسية إلى الأقواس المنحنية التي تعمل كحاويات في السلسلة الأصلية:

print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))

في المثال أعلاه، سيكون الإخراج هو ما نحصل عليه بدون تمرير أرقام الفهرس إلى الأقواس حيث نقوم باستدعاء القيم في القرد بالترتيب:

Output
Sammy the shark has a pet pilot fish!

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

print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Output
Sammy the pilot fish has a pet shark!

إذا قمت باستدعاء رقم فهرس 2 في قرد يحتوي على قيم في مواقع الفهرس 0 و 1، فإنك تقوم بطلب قيمة خارج النطاق. عندما تطلب رقم فهرس خارج النطاق، ستتلقى رسالة خطأ:

print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
Output
IndexError: tuple index out of range

الرسالة الخطأ التي نراها تشير إلى أن القرد يحتوي فقط على قيم في مواقع الفهرس 0 و 1، لذلك يتم وضع رقم الفهرس 2 خارج النطاق.

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

print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a happy, smiling and blue shark!

بدون معلمات، يتم دمج القيم التي يتم تمريرها إلى طريقة str.format() في السلسلة بالترتيب.

تتوافق القيم السلسلة الموجودة في القرد مع أرقام الفهرس التالية:

“happy” “smiling” “blue” “shark”
0 1 2 3

لنستخدم أرقام الفهرس لقيام تغيير ترتيب ظهور القيم في السلسلة:

print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a shark, blue, and smiling happy!

منذ بدأنا بالفهرس رقم 3، دعونا نستدعي قيمة "shark" الأخيرة أولاً. الفهارس الأخرى المضمنة كمعلمات تغيير ترتيب طريقة ظهور الكلمات داخل السلسلة الأصلية.

بالإضافة إلى الوسائط الأساسية، يمكننا أيضًا إدخال وسائط معرفة باسمها الرئيسي:

print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
Output
Sammy the shark made a pull request.

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

print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
Output
Sammy the pull request made a shark.

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

##تحديد النوع

يمكننا تضمين المزيد من المعلمات داخل الأقواس المجعدة لبناء بنية النحو الخاصة بنا. سنستخدم بنية رمز التنسيق {field_name:conversion}، حيث يُحدد field_name رقم الفهرس للوسيط الذي تمريره إلى طريقة str.format() التي تمت إعادة ترتيبها في القسم المتعلق بإعادة الترتيب، وconversion يشير إلى رمز التحويل لنوع البيانات الذي تستخدمه مع المنسق.

نوع التحويل يشير إلى رمز النوع الذي يستخدمه Python. الرموز التي سنستخدمها هنا هي s للسلسلة، d لعرض الأعداد الصحيحة العشرية (نظام 10)، وf الذي سنستخدمه لعرض الأعداد العشرية مع الأماكن العشرية. يمكنك قراءة المزيد عن لغة التنسيق الدقيقة من خلال توثيق Python 3 الرسمي.

لنلقي نظرة على مثال حيث يتم تمرير عدد صحيح من خلال الطريقة، لكننا نريد عرضه على أنه عدد عشري بإضافة وسيمة نوع التحويل f:

print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Output
Sammy ate 75.000000 percent of a pizza!

استخدمنا بنية {field_name:conversion} للحقل البديل للفاصلة السنبلية الأولى لإخراج عدد عشري. الأقواس السنبلية الثانية تستخدم فقط المعامل الأول {field_name}.

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

إذا كان سامي قد أكل 75.765367% من البيتزا، ولكن لا نحتاج إلى مستوى عال من الدقة، يمكننا تقييد الأماكن بعد الفاصلة إلى 3 عن طريق إضافة .3 قبل نوع التحويل f:

print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.765 percent of a pizza!

إذا كنا نريد فقط مكان عشري واحد، يمكننا إعادة صياغة السلسلة والطريقة على النحو التالي:

print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.8 percent of a pizza!

يرجى ملاحظة أن تعديل الدقة سيتسبب في تقريب العدد.

على الرغم من أننا نعرض الأعداد بدون أماكن عشرية كمتغير عائم، إلا أننا إذا حاولنا تغيير المتغير العائم إلى عدد صحيح باستخدام نوع التحويل d، سنتلقى خطأ:

print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
Output
ValueError: Unknown format code 'd' for object of type 'float'

إذا كنت ترغب في عدم عرض أماكن عشرية، يمكنك كتابة المنسق الخاص بك على النحو التالي:

print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

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

## استبدال متغيرات الوسادة

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

يمكننا إضافة عدد للإشارة إلى حجم الحقل (بالأحرف) بعد النقطتين : في الأقواس المعوجة لبنية البيانات لدينا:

print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

في المثال أعلاه، قمنا بإعطاء الرقم 5 حجم حقل أحرف يبلغ 4، وسلسلة النص balloons حجم حقل أحرف يبلغ 16 (لأنها سلسلة نصية طويلة).

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

دعونا نقوم بمحاذاة الرقم على اليسار وتوسيط النص:

print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

الآن نرى أن 5 مُحاذ إلى اليسار، مما يوفر مساحة في الحقل قبل red، وballoons مُوسَّط في حقله مع مسافة على يمينه ويساره.

بشكل افتراضي، عندما نقوم بتكبير حقل باستخدام المُنسِّقات، سيملأ Python الحقل بأحرف فارغة. يمكننا تعديل ذلك ليكون حرفًا مختلفًا عن طريق تحديد الحرف الذي نريد استخدامه مباشرة بعد النقطة والفاصلة:

print("{:*^20s}".format("Sammy"))
Output
*******Sammy********

نحن نقبل السلسلة التي تم تمريرها إلى str.format() في موضع الفهرس 0 لأننا لم نحدد غير ذلك، بما في ذلك النقطة والفاصلة، ونحدد أننا سنستخدم * بدلاً من المسافة لملء الحقل. نحن نُوسِّط السلسلة بواسطة ^، ونحدد أن الحقل بحجم 20 حرفًا، ونشير أيضًا إلى أننا نعمل مع نوع تحويل سلسلة بواسطة تضمين s.

يمكننا دمج هذه المعلمات مع المعلمات الأخرى التي استخدمناها من قبل:

print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

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

##استخدام المتغيرات

حتى الآن، قمنا بتمرير أعداد صحيحة وأعداد عائمة وسلاسل إلى طريقة str.format()، ولكن يمكننا أيضًا تمرير المتغيرات من خلال الطريقة. يعمل هذا مثل أي متغير آخر.

nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Output
Sammy has 8 balloons today!

يمكننا استخدام المتغيرات لكل من السلسلة الأصلية وما يتم تمريره إلى الطريقة:

sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Output
Sammy has 8 balloons today!

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

##استخدام المنسقين لتنظيم البيانات

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

لنلق نظرة على حلقة الـ for التقليدية في Python التي ستطبع القيم i, i*i, و i*i*i في النطاق من 3 إلى 12:

for i in range(3,13):
    print(i, i*i, i*i*i)
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

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

لنستخدم المنسقين لإعطاء المزيد من المساحة لهذه الأرقام:

for i in range(3,13):
    print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))

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

Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

يمكننا تحديد رقم حجم الحقل المتسق من أجل الحصول على أعمدة متساوية، مما يتأكد من أننا نستوعب الأرقام الأكبر:

for i in range(3,13):
    print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

يمكننا أيضًا تلاعب في توجيه الأعمدة عن طريق إضافة <، ^، و > لتوجيه النص، وتغيير d إلى f لإضافة الأماكن العشرية، وتغيير أرقام فهرس اسم الحقل، وأكثر من ذلك لضمان عرض البيانات كما نرغب.

## الاستنتاج

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3