النصوص (Strings)

الآن سنتعلم عن النصوص. أنت تعرف بالفعل كيفية كتابتها في كود Python.

'This is string'
"And this is also string"

في بعض الأحيان ستحتاج إلى نص طويل من الأسطر. ولكن يمكنك كتابة نصوص على سطر واحد فقط في Python (يمكنك بالفعل الكتابة على المزيد من الأسطر ولكن النص سيظهر على سطر واحد فقط).

في النص الخاص بك ، يمكنك استخدام حرف خاص يعني سطر جديد \n:

print('Hello word\nHow are you?')

تسمح لنا الشرطة المائلة العكسية (backslash) بكتابة الأحرف التي لا يمكننا كتابتها بسهولة على لوحة المفاتيح.

تسمح لنا الشرطة المائلة العكسية(backslash) أيضًا باستخدام كلا نوعي الاقتباسات ( " و ' ) في جزء واحد من النص.

print('"Don\'t do it", said dad.')
print("\"Don't do it\", said dad.")

يمكن للشرطة المائلة العكسية أيضًا إدراج أحرف غريبة ليس لديك على لوحة المفاتيح. يمكن كتابة الأحرف المميزة كـ \N واسم حرف في الأقواس المركبة ("{}"). جرب على سبيل المثال الأحرف التالية (قد لا يعمل البعض على نظامك):

print('--\N{LATIN SMALL LETTER L WITH STROKE}--')
print('--\N{SECTION SIGN}--')
print('--\N{PER MILLE SIGN}--')
print('--\N{BLACK STAR}--')
print('--\N{SNOWMAN}--')
print('--\N{KATAKANA LETTER TU}--')

إذا كنت تريد كتابة حرف الشرطة العكسية (backlash) في النص الخاص بك، فيجب عليك كتابته مرتين (على سبيل المثال، في مسار إلى ملف في Windows). لذا فإن التسلسل \\ يعني شرطة عكسية واحدة.

print('C:\\Khartoum\\New Folder')

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

basen = '''Hello World!
How are you?'''

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

def multiply(a, b):
    """ This function multiplies two arguments and returns the result.

    Both arguments should be numbers.
    """

    return a * b

ومع ذلك، يمكنك استخدام الدالة المضمنة (inbuilt) ()help في أي دالة لرؤية docstring الخاصة بها. لمغادرة نافذة التعليمات المفتوحة حديثًا، اضغط على q كـ quit.

سنلقي الآن نظرة على كيفية العمل مع النصوص.

تجزئة النصوص (Subscripting)

أنت تعرف بالفعل كيفية ربط النصوص عن طريق الجمع والضرب.

concatenated_string = 'a' + 'b'
long_string = 'o' * 100

الآن سنتعلم كيفية الحصول على جزء من نص. سنبدأ بالأحرف المفردة. يتم ذلك عن طريق تجزئة النص (Subscripting). تبدو البنية النحوية (syntax) مشابهة لاستدعاء دالة ولكن باستخدام أقواس مربعة!

fifth_character = 'Khartoum'[5]

print(fifth_character)

هل يعمل؟ هل حصلت حقًا على الحرف الخامس؟

الحل

كما ربما لاحظت بالفعل ، يبدأ المبرمجون في Python بالعد من الصفر. يأتي الأول 0 ، ثم 1 ، وهكذا.

الأمر نفسه ينطبق على النصوص - الحرف الأول في الموضع صفر.

لم ذلك؟ يجب أن تعرف عن المؤشرات (pointers) والمصفوفات (arrays) لفهمها تمامًا ، لذلك دعونا نفترض الآن أن المبرمجين غريبو الأطوار. أو أنهم يحبون فقط الأرقام الغريبة.

   [0] [1] [2] [3] [4] [5] [6] [7]

  ╭───┬───┬───┬───┬───┬───┬───┬───╮
  │ K │ h │ a │ r │ t │ o │ u │ m │
  ╰───┴───┴───┴───┴───┴───┴───┴───╯

ماذا يحدث إذا اخترت أحرفًا بأرقام سالبة؟

الحل

يمكن للنصوص القيام بالمزيد من الحيل. يمكنك معرفة طول النص ، أو إذا كان يحتوي على نص فرعية معينة.

الرمز الوصف مثال
len(r) طول النص len('Khartoum')
x in r True إذا كان النص x موجود في النص r 'toum' in 'Khartoum'
x not in r عكس x in r 'eye' not in 'Khartoum'

Python حساس لحالة الأحرف ، لذلك 'Toum' in 'Khartoum' تعطي نتيجة False. إذا كنت تريد إجراء اختبار غير حساس لحالة الأحرف ، عليك تغيير حالة النصين (كلاهما إلى lower ، أو كلاهما إلى upper) ثم قم بإجراء x in y.

وكيفية تغيير حالة نصنا؟ لذلك ، سنحتاج إلى ميزة Python أخرى: الطرق(Methods).

الطرق (Methods)

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

تغير طريقتا النص upper() و lower() الحالة.

string = 'Hello'
print(string.upper())
print(string.lower())
print(string)

لاحظ أن النص الأصلي لم يتغير. تعيد الطرق نصًا جديدًا ويبقى النص القديم كما كان.

هذا هو سلوك Python القياسي: لا يمكن تغيير النص الموجود بالفعل ، يمكننا فقط إنشاء نص جديد - مشتق من النص القديم.

لكن ليس صحيحًا أن جميع الطرق لا تغير ال object الأصلي الذي يتم استدعاؤه عليه. هذا صحيح فقط بالنسبة للنصوص.

الأحرف الأولى (Initials)

لممارسة الطرق وتجزئة النص (subscripting) ، حاول كتابة برنامج ، الذي سيطلب من المستخدم اسمه ، ثم اسم عائلته ثم سيقوم بطباعة الحروف الأولى له - الحرف الأول من الاسم واسم العائلة.

الحروف الأولى دائمًا بأحرف كبيرة (حتى إذا لم يكتبها المستخدم بهذه الطريقة).

الحل

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

جميع الطرق موجودة في وثائق Python.

لاحظ أن len ليست طريقة ولكنها دالة. كتبت len(s) وليس ()r.len , ستكتشف لماذا الأمر كذلك لاحقا.

التنسيق (Formatting)

من المفيد بشكل خاص طريقة format ، والتي تحل محل زوج من الأقواس المجعدة {} في النص لأي شيء يحصل عليه كوسيطة.

write = '{}×{} equals {}'.format(3, 4, 3 * 4)
print(write)

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

النص '{}×{} equals {}' يشبه نوعًا من القالب او النموذج (Template). تخيلها كنموذج ، حيث قمنا بتمييز الحقول التي يملأ Python القيم فيها.

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

write = 'Hi {name}! The result is {number}.'.format(number=7, name='Mary')
print(write)

يتم استخدام التنسيق عندما تحتاج إلى تضمين قيمة متغير (variable) في النص

number = 3 + 4
name = "Mary"
write = 'Hi {}! The result is {}.'.format(name, number)
print(write)

نصوص f (F-strings)

هناك طريقة أخرى (أحدث وأقصر) لاستخدام التنسيق في Python وهي تتضمن f-strings. بدلاً من استخدام طريقة .format() ، يمكنك إضافة حرف f قبل النص أو النص متعدد الأسطر وسوف يستبدل Python أسماء المتغيرات الموجودة في الأقواس المجعدة داخل القالب بقيمها أثناء تنفيذ البرنامج النصي.

يبدو بناء الجملة كما يلي:

number = 3 + 4
name = "Mary"
write = f"Hi {name}! The result is {number}."
print(write)

النصوص الفرعية (Substrings)

الآن سنعود إلى لتجزئة النصوص. حاول معرفة ما يفعله البرنامج التالي:

string = 'Khartoum'
substring = string[5:]
print(substring)

تذكر أننا لا نزال نعد من 0!

الحل

يمكننا أيضًا استخدام string[:5] ، والذي سيحدد جميع الأحرف حتى الحرف الخامس ، والذي لا يتم تضمينه. لذلك string[:5] + string[5:] == string.

ماذا يفعل string[2:5]؟

ماذا عن string[-4:]؟

string = 'Khartoum'
print(string[:4])
print(string[2:5])
print(string[-4:])

يجب أن تفكر في الرقم ، أي الرقم التتابعي (index) ، الذي تريد استخدامه.

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

  ╭───┬───┬───┬───┬───┬───┬───┬───╮
  │ K │ h │ a │ r │ t │ o │ u │ m │
  ├───┼───┼───┼───┼───┼───┼───┼───┤
  │   │   │   │   │   │   │   │   │
  0   1   2   3   4   5   6   7   8
 -8  -7  -6  -5  -4  -3  -2  -1

  ╰───────────────╯
  'Khartoum'[:4] == 'Khar'

          ╰───────────────╯
        'Khartoum'[2:6] == 'arto'

                      ╰───────────╯
                      'Khartoum'[-3:] == 'oum'