دليل تعلم بايثون كيفية التحويل بين أنواع البيانات في بايثون 3


محمد الميداوي

تُستخدَم أنواع البيانات في بايثون لتصنيف نوع معيَّن من البيانات، وتحديد القيم التي يمكنك تعيينها لذلك النوع، والعمليات التي يمكنك إجراؤها عليها. هناك أوقات نحتاج إلى تحويل القيم من نوع إلى آخر لأجل معالجتها بطريقة مختلفة. على سبيل المثال، قد نحتاج إلى ضم (concatenate) القيم العددية إلى سلاسل نصية.

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

كيفية التحويل بين أنواع البيانات.jpg

تحويل الأنواع العددية

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

تحويل الأعداد الصحيحة إلى أعداد عشرية

يحوّل التابع float()الأعداد الصحيحة إلى أعداد عشرية. لاستخدام هذه الدالة، ضع عددًا صحيحًا بين القوسين:

float(57)

في هذه الحالة، سيتم تحويل 57 إلى 57.0.

يمكنك أيضًا استخدام هذه الدالة مع المتغيرات. لنُحِل على المتغير f القيمة 57، ثم نطبع العدد العشري الجديد:

f = 57

print(float(f))

الناتج سيكون:

57.0

يمكننا باستخدام الدالة float()‎ تحويل الأعداد الصحيحة إلى أعداد عشرية.

تحويل الأعداد العشرية إلى أعداد صحيحة

بايثون لديه دالة أخرى مضمَّنة لتحويل الأعداد عشرية إلى أعداد صحيحة: وهي int()‎.

تعمل الدالة int()‎ بشكل مشابه للدالة float()‎: يمكنك إضافة عدد عشري داخل القوسين لتحويله إلى عدد صحيح:

int(390.8)

في هذه الحالة، سيتم تحويل 390.8 إلى 390.

يمكنك أيضا استخدام هذه الدالة مع المتغيرات. لنصرِّح أنَّ b يساوي 125.0، وأنَّ c يساوي 390.8، ثم نطبع العددين العشريين الجديدين:

b = 125.0

c = 390.8

  

print(int(b))

print(int(c))

والمخرجات ستكون:

125

390

عند تحويل الأعداد العشرية إلى أعداد صحيحة بواسطة الدالة int()‎، فإنّ بايثون تقتطع الأجزاء العشرية من العدد وتُبقي القيمة الصحيحة؛ لذلك، لن تُحوِّل الدالة int()‎ العدد 390.8 إلى 391.

تحويل الأعداد عبر القسمة

في بايثون 3، عند تقسيم عدد صحيح على آخر، سينتج عدد عشرية على خلاف بايثون 2. بمعنى أنه عند قسمة 5 على 2 في بايثون 3، ستحصل على عدد عشري (مثل 2.5 عند قسمة 5 على 2):

a = 5 / 2

print(a)

وسينتج لنا:

2.5

في بايثون 2، ستحصل على ناتج صحيح، أي 5/2 = 2. يمكنك الحصول على عدد صحيح ناتج عن عملية القسمة باستعمال المعامل // الجديد في بايثون 3:

a = 5 // 2

print(a)

وسينتج لنا:

2

اقرأ درس اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3 إن لم تقرأه مسبقًا.

التحويل مع السلاسل النصية

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

تحويل الأعداد إلى سلاسل نصية

يمكننا تحويل الأعداد إلى سلاسل نصية عبر التابع str()‎. يمكننا أن نمرّر إمَّا عددًا أو متغيرًا بين قوسي التابع، وبعد ذلك سيتم تحويل تلك القيمة العددية إلى قيمة نصية.

دعنا ننظر أولًا في تحويل الأعداد الصحيحة. لتحويل العدد الصحيح 12 إلى سلسلة نصية، يمكنك تمرير 12 إلى التابع str()‎:

str(12)

عند تنفيذ str(12)‎ في سطر أوامر بايثون التفاعلي مع الأمر python في نافذة الطرفية، ستحصل على المخرجات التالية:

'12'

تشير علامات الاقتباس المحيطة بالعدد 12 إلى أنه لم يعد عددًا صحيحًا، ولكنه أصبح الآن سلسلة نصية.

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

user = "Sammy"

lines = 50

  

print("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")

عند تنفيذ الشيفرة أعلاه، سيُطلق الخطأ التالي:

TypeError: Can't convert 'int' object to str implicitly

يتعذر علينا ضمّ (concatenate) السلاسل النصية والأعداد الصحيحة في بايثون، لذلك سيتعين علينا تحويل المتغير lines إلى سلسلة نصية:

user = "Sammy"

lines = 50

  

print("Congratulations, " + user + "! You just wrote " + str(lines) + " lines of code.")

الآن، عندما نُنفِّذ الشيفرة البرمجية، سنحصل على المخرجات التالية، وفيها تهنئة للمستخدم على تقدُّمه:

Congratulations, Sammy! You just wrote 50 lines of code.

إذا أردنا تحويل عدد عشري إلى سلسلة نصية بدلًا من تحويل عدد صحيح إلى سلسلة نصية، فعلينا تتبع نفس الخطوات والصياغة السابقة. عندما نمرّر عددًا عشريًا إلى التابع str()‎، ستُعاد سلسلة نصية. يمكننا استخدام قيمة العدد العشري نفسها، أو يمكننا استخدام متغير:

print(str(421.034))

  

f = 5524.53

print(str(f))

وسينتج لنا:

421.034

5524.53

يمكننا اختبار صحة التحويل عن طريق ضم الناتج إلى سلسلة نصية:

f = 5524.53

print("Sammy has " + str(f) + " points.")

وهذا هو الناتج:

Sammy has 5524.53 points.

الآن تأكدنا من أنَّ عددنا العشري قد حُوِّل بنجاح إلى سلسلة نصية، لأنّ عملية الضم قد تم إجراؤها دون خطأ.

تحويل السلاسل النصية إلى أعداد

يمكن تحويل السلاسل النصية إلى أعداد باستخدام التابعين float()‎ و int()‎.

إذا لم يكن في السلسلة النصية منازل عشرية، فالأفضل أن تحولها إلى عدد صحيح باستخدام التابع int()‎.

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

lines_yesterday = "50"

lines_today = "108"

  

lines_more = lines_today - lines_yesterday

  

print(lines_more)

الناتج هو:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

نظرًا لأنّ القيمتين العدديتين مخزنتان في سلاسل نصية، تلقينا خطأً. سبب ذلك أنَّ معامل الطرح - لا يصلح للسلاسل النصية.

دعنا نعدّل الشيفرة لتضمين التابع int()‎ الذي سيحول السلاسل النصية إلى أعداد صحيحة، ويسمح لنا بالقيام بالعمليات الرياضياتية على القيم التي كانت سلاسل نصية في الأصل.

lines_yesterday = "50"

lines_today = "108"

  

lines_more = int(lines_today) - int(lines_yesterday)

  

print(lines_more)

وهذه هي المخرجات:

58

المتغير line_more هو عدد صحيح تلقائيًّا، ويساوي القيمة العددية 58 في هذا المثال.

يمكننا أيضًا تحويل الأعداد في المثال أعلاه إلى قيم عشرية باستخدام التابع float()‎ بدلًا من التابع int()‎. وبدلًا من الحصول على الناتج 58، سنحصل على الناتج 58.0، وهو عدد عشري.

المستخدم Sammy سيكسب نقاطًا على شكل قيم عشرية:

total_points = "5524.53"

new_points = "45.30"

  

new_total_points = total_points + new_points

  

print(new_total_points)

الناتج:

5524.5345.30

في هذه الحالة، يعد استخدام المعامل + مع سلسلتين نصيتين عمليةً صالحةً، لكنه سيضم السلسلتين النصّيتين بدلًا من جمع القيمتين العدديتين؛ لذلك، سيبدو الناتج غير اعتيادي، لأنه نتيجة لصق القيمتين إلى جانب بعضهما بعضًا.

سنحتاج إلى تحويل هذه السلاسل النصية إلى أعداد عشرية قبل إجراء أي عمليات عليها، وذلك باستخدام التابع float()‎:

total_points = "5524.53"

new_points = "45.30"

  

new_total_points = float(total_points) + float(new_points)

  

print(new_total_points)

وسينتج عن ذلك:

5569.83

الآن، وبعد أن حوّلنا السلسلتين النصيتين إلى عددين عشريين، سنحصل على النتيجة المتوقعة، والتي هي جمع 45.30 و 5524.53.

إذا حاولنا تحويل سلسلة نصية ذات منازل عشرية إلى عدد صحيح، فسنحصل على خطأ:

f = "54.23"

print(int(f))

المخرجات:

ValueError: invalid literal for int() with base 10: '54.23'

إذا مرّرنا عددًا عشريًا موضوعًا في سلسلة نصية إلى التابع int()‎، فسنحصل على خطأ، لأنها لن تُحوَّل إلى عدد صحيح.

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

التحويل إلى صفوف وقوائم

يمكنك استخدام التابعين list()‎ و tuple()‎ لتحويل القيم المُمرّرة إليهما إلى قائمة أو صف على التوالي. في بايثون:

  • القائمة هي تسلسل مرتب قابل للتغيير من العناصر الموضوعة داخل قوسين معقوفين [].

  • الصف عبارة عن تسلسل مرتب ثابت (غير قابل للتغيير) من العناصر الموضوعة بين قوسين ().

التحويل إلى صفوف

نظرًا لكون الصفوف غير قابلة للتغيير، فيمكن أن يحسِّن تحويل قائمة إلى صف أداء البرامج تحسينًا كبيرًا. عندما نستخدم التابع tuple()‎، فسوف يُعيد القيمة المُمرَّرة إليه على هيئة صف.

print(tuple(['pull request', 'open source', 'repository', 'branch']))

المخرجات:

('pull request', 'open source', 'repository', 'branch')

نرى أنّ الصف قد طُبع في المخرجات، إذ أنَّ العناصر موضوعة الآن بين قوسين، بدلًا من القوسين المربعين.

دعنا نستخدم tuple()‎‎ مع متغير يحتوي قائمة:

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']

print(tuple(sea_creatures))

سينتج:

('shark', 'cuttlefish', 'squid', 'mantis shrimp')

مرة أخرى، نرى أنّ القائمة حُوِّلت إلى صف، كما يشير إلى ذلك القوسان. يمكننا تحويل أي نوع قابل للتكرار (iterable) إلى صف، بما في ذلك السلاسل النصية:

print(tuple('Sammy'))

المخرجات:

('S', 'a', 'm', 'm', 'y')

نظرًا لأنه يمكننا التكرار (iterate) على السلاسل النصية، يمكننا تحويلها إلى صفوف باستخدام التابع tuple()‎. أمَّا أنواع البيانات غير القابلة للتكرار، مثل الأعداد الصحيحة والأعداد العشرية، فستُطلق عملية تحويلها خطأً:

print(tuple(5000))

والناتج سيكون:

TypeError: 'int' object is not iterable

في حين أنه من الممكن تحويل عدد صحيح إلى سلسلة نصية، ومن ثم تحويل السلسلة النصية إلى صف، كما في العبارة tuple(str(5000))‎، فمن الأفضل تجنب مثل هذه التعليمات البرمجية المعقدة.

التحويل إلى قوائم

يمكن أن يكون تحويل القيم، وخاصة الصفوف، إلى قوائم مفيدًا عندما تحتاج إلى نسخة قابلة للتغيير من تلك القيم.

سنستخدم التابع list()‎ لتحويل الصف التالي إلى قائمة. ونظرًا لأنّ صياغة القوائم تستخدم الأقواس، تأكد من تضمين أقواس التابع list()‎، وكذلك الأقواس الخاصة بالتابع print()‎:

print(list(('blue coral', 'staghorn coral', 'pillar coral')))

المخرجات هي:

['blue coral', 'staghorn coral', 'pillar coral']

تشير الأقواس المعقوفة [] إلى أنَّه قد تم إرجاع قائمة من الصف الأصلي الذي مُرِّر عبر التابع list()‎.

لجعل الشيفرة سهلة القراءة، يمكننا إزالة أحد أزواج الأقواس باستخدام متغير:

coral = ('blue coral', 'staghorn coral', 'pillar coral')

list(coral)

إن طبعنا list(coral)‎، فسنتلقى المخرجات نفسها الموجودة أعلاه.

تمامًا مثل الصفوف، يمكن تحويل السلاسل النصية إلى قوائم:

print(list('shark'))

الناتج:

['s', 'h', 'a', 'r', 'k']

هنا حُوِّلَت السلسلة shark إلى قائمة، وهذا يوفر لنا نسخة قابلة للتغيير من القيمة الأصلية.

خلاصة

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

هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3.

ترجمة -وبتصرّف- للمقال How To Convert Data Types in Python 3 لصاحبته Lisa Tagliaferri

اقرأ أيضًا





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن