تنسيق النصوص في بايثون: اصنع جملة فيها متغيّراتك
تعلّم كيف تضع المتغيّرات داخل جملة في بايثون باستخدام %s و %d و %.2f، ثم الطريقة الحديثة f-string، وتجنّب أشهر الأخطاء.
تخيّل أن لعبتك تريد أن تقول لك: “أحسنت يا سالم! جمعت 120 نقطة”. الاسم والنقاط يتغيّران مع كل لاعب، لكن شكل الجملة ثابت. كيف نكتب جملة واحدة تعمل مع كل الأسماء وكل الأرقام؟ هذا بالضبط ما ستتعلّمه في هذا الدرس.
🎯 ماذا ستتعلم؟
بنهاية هذا الدرس ستكون قادرًا على:
- وضع قيمة متغيّر داخل جملة باستخدام
%s. - إدخال أكثر من قيمة في الجملة نفسها.
- التحكّم في شكل الأرقام بـ
%dو%.2f. - كتابة الجملة نفسها بالطريقة الحديثة
f-string. - تجنّب الأخطاء التي يقع فيها المبتدئون عند التنسيق.
🧰 ماذا تحتاج قبل أن تبدأ؟
يجب أن تعرف ما هو المتغيّر، والفرق بين النص والرقم الصحيح والرقم العشري. إن لم تكن متأكدًا، اقرأ أولًا المتغيّرات وأنواع البيانات في بايثون. ويفيدك أيضًا أن تعرف العمليات الحسابية الأساسية. كل الأمثلة تعمل في مترجم بايثون في المتصفح بدون تثبيت.
الفكرة ببساطة
هل رأيت بطاقة دعوة مطبوعة فيها فراغ؟ مكتوب عليها: “عزيزي (اكتب الاسم هنا)، ندعوك لحفل نهاية العام”. كل الكلمات جاهزة، وأنت تكتب الاسم في الفراغ فقط.
تنسيق النصوص (string formatting) هو الفكرة نفسها. تكتب جملة فيها فراغات، ثم تخبر بايثون بما تضعه في كل فراغ. الجملة تسمّى القالب (format string)، والفراغ يُكتب بعلامة خاصة مثل %s.
في هذا الدرس ستتعلّم طريقتين. الأولى تستخدم علامة %، وهي قديمة لكنك ستراها في كثير من الأمثلة. والثانية تسمّى f-string، وهي الأحدث والأسهل، وهي التي ننصحك باستخدامها.
الخطوة 1: فراغ واحد بـ %s
الحرف s في %s اختصار لكلمة string أي “نص”. تكتب القالب، ثم علامة %، ثم المتغيّر الذي يملأ الفراغ.
name = "سالم"
print("مرحبًا يا %s!" % name)
مرحبًا يا سالم!
اقرأ السطر الثاني هكذا: “اطبع هذا القالب، وضع مكان %s قيمة name”. لاحظ أن علامة التعجب التصقت بالاسم مباشرة، بدون مسافة زائدة. هذا شيء يصعب فعله بالفاصلة في print().
جرّب أن تغيّر الاسم إلى اسمك، وستجد الجملة تتغيّر وحدها.
الخطوة 2: أكثر من فراغ في الجملة
ماذا لو أردت الاسم والنقاط معًا؟ ضع فراغين في القالب، وضع القيمتين بين قوسين مفصولتين بفاصلة. الأولى تذهب إلى الفراغ الأول، والثانية إلى الثاني.
name = "نورة"
points = 120
print("%s جمعت %d نقطة في اللعبة." % (name, points))
نورة جمعت 120 نقطة في اللعبة.
لاحظ شيئين. الأول أن القيمتين بين قوسين ( )، وهذا القوسان ضروريان عندما يكون عندك أكثر من قيمة. والثاني أننا استخدمنا %d للنقاط بدل %s. الحرف d يعني رقمًا صحيحًا (integer)، وهو يخبر بايثون أن هذا الفراغ لرقم.
🚀 للمتقدمين: القيم بين القوسين تسمّى صفًّا (tuple)، وهو يشبه القائمة لكنه لا يتغيّر بعد إنشائه. و
%sيقبل أي شيء، حتى القائمة كاملة: جرّبprint("قائمتي: %s" % [1, 2, 3]).
الخطوة 3: التحكّم في الأرقام العشرية
الأرقام العشرية لها علامة خاصة هي %f. الحرف f يعني float أي رقمًا عشريًا. لكن انتبه إلى المفاجأة في الناتج:
price = 12.5
print("سعر الكتاب %f ريال" % price)
سعر الكتاب 12.500000 ريال
ستة أصفار! هذا لأن %f تطبع ست خانات بعد الفاصلة دائمًا. الحل أن تكتب عدد الخانات التي تريدها بين % و f، هكذا:
price = 12.5
print("سعر الكتاب %.2f ريال" % price)
print("سعر الكتاب %.1f ريال" % price)
سعر الكتاب 12.50 ريال
سعر الكتاب 12.5 ريال
%.2f تعني “رقم عشري بخانتين بعد الفاصلة”، وهذا ما نستخدمه للأسعار. وهذه الطريقة مفيدة جدًا عندما تحسب متوسطًا ويخرج رقم طويل:
total = 275
count = 3
average = total / count
print("متوسط درجاتك: %.2f" % average)
متوسط درجاتك: 91.67
بدون التنسيق كان الناتج سيكون 91.66666666666667، وهو رقم لا يحب أحد قراءته.
🚀 للمتقدمين: إذا استخدمت
%dمع رقم عشري، فإن بايثون تحذف ما بعد الفاصلة بدون تقريب. جرّبprint("%d" % 91.67)وستحصل على 91. وهناك أيضًا%xلطباعة الرقم بالنظام السداسي عشر (hex).
الخطوة 4: الطريقة الحديثة f-string
منذ إصدار بايثون 3.6 ظهرت طريقة أسهل بكثير. تضع الحرف f قبل علامة التنصيص، ثم تكتب اسم المتغيّر داخل قوسين معقوفين { } في مكانه من الجملة.
name = "خالد"
goals = 3
print(f"سجّل {name} {goals} أهداف في المباراة.")
سجّل خالد 3 أهداف في المباراة.
قارن هذا بالخطوة 2. لا تحتاج أن تتذكّر ترتيب القيم، ولا أن تفرّق بين %s و %d. اسم المتغيّر يظهر في مكانه مباشرة، فتقرأ الجملة وتفهمها من أول نظرة.
والأجمل أنك تستطيع كتابة عملية حسابية كاملة داخل القوسين. ولضبط الخانات العشرية تكتب :.2f بعد الاسم:
price = 4.5
quantity = 3
print(f"المجموع: {price * quantity} ريال")
print(f"المجموع: {price * quantity:.2f} ريال")
المجموع: 13.5 ريال
المجموع: 13.50 ريال
في السطر الأول حسبت بايثون 4.5 * 3 ووضعت الناتج في الفراغ. وفي السطر الثاني أضفنا :.2f فظهر الناتج بخانتين، تمامًا كما فعلت %.2f في الخطوة 3.
نصيحتنا لك: استخدم f-string في برامجك الجديدة. لكن تذكّر طريقة % لأنك ستراها في كتب وأمثلة كثيرة على الإنترنت.
🚀 للمتقدمين: هناك طريقة ثالثة بينهما تاريخيًا هي
"{} جمع {} نقطة".format(name, points). تعمل جيدًا، لكنf-stringأقصر منها وأسرع.
⚠️ أخطاء شائعة
الأخطاء طبيعية جدًا في البداية، وكل مبرمج مرّ بها. إليك ثلاثة تقابلها كثيرًا مع التنسيق:
1. نسيان القوسين مع أكثر من قيمة
❌ هذا الكود يتوقف بخطأ
name = "سالم"
age = 13
print("%s عمره %d سنة" % name, age)
TypeError: not enough arguments for format string
الرسالة تعني: “القالب يحتاج قيمًا أكثر”. بايثون أعطت القالب القيمة name فقط، ولم تفهم أن age تخصّه. الحل أن تجمع القيمتين بين قوسين:
# ✅ القيمتان بين قوسين
name = "سالم"
age = 13
print("%s عمره %d سنة" % (name, age))
سالم عمره 13 سنة
2. استخدام %d مع نص
❌ هذا الكود يتوقف بخطأ
print("عندك %d نقطة" % "مئة")
TypeError: %d format: a number is required, not str
الفراغ %d يقبل الأرقام فقط، و “مئة” نص. إمّا أن تعطيه رقمًا حقيقيًا، أو تستخدم %s الذي يقبل كل شيء:
# ✅ رقم حقيقي مع %d
print("عندك %d نقطة" % 100)
عندك 100 نقطة
3. نسيان الحرف f قبل النص
❌ الكود لا يتوقف، لكن الناتج خاطئ
name = "هند"
print("مرحبًا {name}")
مرحبًا {name}
بدون الحرف f تظن بايثون أن {name} كلمة عادية فتطبعها كما هي. أضف f قبل علامة التنصيص:
# ✅ الحرف f قبل علامة التنصيص
name = "هند"
print(f"مرحبًا {name}")
مرحبًا هند
🧪 جرّب بنفسك
التحدي 1: بطاقة ترحيب
عندك اسم أول واسم عائلة وعمر. اطبع الجملة: “مرحبًا ليلى أحمد. عمرك 14 سنة.” باستخدام طريقة % وقوسين فيهما القيم الثلاث.
first = "ليلى"
last = "أحمد"
age = 14
print(first, last, age)
ليلى أحمد 14
💡 اضغط لرؤية الحل
first = "ليلى"
last = "أحمد"
age = 14
print("مرحبًا %s %s. عمرك %d سنة." % (first, last, age))
مرحبًا ليلى أحمد. عمرك 14 سنة.
التحدي 2: المصروف الشهري
مصروفك الأسبوعي 15.75 ريالًا. احسب مصروف الشهر (4 أسابيع) واطبعه بخانتين عشريتين هكذا: “مصروفك الشهري: 63.00 ريال”.
weekly = 15.75
# احسب المصروف الشهري ثم اطبعه بخانتين عشريتين
print(weekly)
15.75
💡 اضغط لرؤية الحل
weekly = 15.75
monthly = weekly * 4
print("مصروفك الشهري: %.2f ريال" % monthly)
# أو بالطريقة الحديثة
print(f"مصروفك الشهري: {monthly:.2f} ريال")
مصروفك الشهري: 63.00 ريال
مصروفك الشهري: 63.00 ريال
التحدي 3: تقرير الفريق
فريقك فاز في 7 مباريات وخسر 3. استخدم f-string لطباعة سطرين: عدد المباريات الكلي، ونسبة الفوز بخانة عشرية واحدة. النسبة هي عدد مرات الفوز مقسومًا على العدد الكلي مضروبًا في 100.
team = "النجوم"
wins = 7
losses = 3
# اطبع: فريق النجوم لعب 10 مباريات.
# ثم: نسبة الفوز: 70.0%
print(team, wins, losses)
النجوم 7 3
💡 اضغط لرؤية الحل
team = "النجوم"
wins = 7
losses = 3
games = wins + losses
print(f"فريق {team} لعب {games} مباريات.")
print(f"نسبة الفوز: {wins / games * 100:.1f}%")
فريق النجوم لعب 10 مباريات.
نسبة الفوز: 70.0%
✅ اختبر نفسك
-
ماذا يطبع
print("%d" % 7.9)؟- أ) 7.9
- ب) 7
- ج) 8
-
صح أم خطأ: لوضع قيمتين في قالب
%يجب أن تكونا بين قوسين. -
ماذا يطبع
print(f"{2 + 3}")؟- أ) {2 + 3}
- ب) 5
- ج) 2 + 3
💡 اضغط لرؤية الإجابات
- ب) 7، لأن
%dتحذف ما بعد الفاصلة العشرية بدون تقريب. - صح. بدون القوسين تعطي بايثون خطأ
TypeError. - ب) 5، لأن
f-stringتحسب أي عملية داخل القوسين المعقوفين ثم تطبع الناتج.
📝 الخلاصة
- القالب جملة فيها فراغات، والتنسيق هو ملء هذه الفراغات بقيم المتغيّرات.
%sللنصوص وأي شيء آخر، و%dللأرقام الصحيحة، و%fللأرقام العشرية.%.2fتعرض خانتين بعد الفاصلة، وهي مثالية للأسعار والمتوسطات.- مع أكثر من قيمة، ضع القيم بين قوسين وبينها فواصل.
f-stringهي الطريقة الحديثة: حرفfقبل النص، والمتغيّر داخل{ }، وهي التي ننصح بها.
⏭️ الخطوة التالية
صرت الآن تكتب رسائل جميلة ومنسّقة فيها متغيّراتك. جرّب أن تطبع بطاقة تعريف عنك: اسمك وصفّك ومادتك المفضّلة في جملة واحدة. وفي الدرس القادم ستتعرّف على العمليات على النصوص: كيف تعرف طول النص، وتحوّله إلى أحرف كبيرة، وتقطع منه جزءًا. إلى ذلك الحين، افتح مترجم بايثون وجرّب كل الأمثلة بقيم من عندك.