Tuple في بايثون هي تسلسل مرتب يخزن عدة قيم مثل List، لكن الفرق الأساسي أن List قابلة للتعديل (Mutable) بينما Tuple غير قابلة للتعديل (Immutable) بعد إنشائها. لذلك استخدم List عندما تتوقع إضافة العناصر أو حذفها أو تغييرها، واستخدم Tuple عندما تمثل البيانات مجموعة ثابتة مثل الإحداثيات أو الأبعاد.
في هذا الدرس من أساسيات بايثون 17 ستتعلم إنشاء Tuples والوصول إلى عناصرها، وTuple من عنصر واحد، والتحويل بينها وبين Lists، وPacking وUnpacking، ومتى تستخدم كل نوع. وإذا أردت مراجعة القوائم أولًا فارجع إلى شرح Lists في بايثون.
{getToc} $title={محتوى المقال}
{alertInfo} فكر في Tuple كأنها قائمة ثابتة: تخزن عدة عناصر، لكن لا تريد تغييرها بعد إنشائها.
ما هي Tuple في بايثون؟
الـ Tuple هي نوع بيانات في Python يستخدم لتخزين عدة عناصر داخل متغير واحد. غالبًا تكتب عناصر Tuple بين أقواس دائرية ()، وتفصل بين العناصر باستخدام الفواصل.
مثال بسيط:
colors = ("red", "green", "blue")
print(colors)
الناتج:
('red', 'green', 'blue')
في هذا المثال، المتغير colors يحتوي على ثلاث قيم داخل Tuple واحدة. ويمكن أن تحتوي Tuple على نصوص، أرقام، قيم منطقية، أو حتى أنواع بيانات مختلفة داخل نفس المجموعة.
لماذا نستخدم Tuple في Python؟
نستخدم Tuple عندما نريد تخزين مجموعة عناصر، لكن لا نحتاج إلى تعديلها لاحقًا. بمعنى آخر: البيانات تكون ثابتة أو نريد حمايتها من التغيير غير المقصود أثناء كتابة البرنامج.
أمثلة على أشياء مناسبة لاستخدام Tuple:
- إحداثيات نقطة مثل
(10, 20). - أبعاد صورة مثل
(1200, 800). - ألوان ثابتة في البرنامج.
- بيانات لا تريد تغيير ترتيبها أو قيمها.
- إرجاع أكثر من قيمة من دالة.
- تخزين إعدادات بسيطة وثابتة.
{alertSuccess} استخدم Tuple عندما تكون البيانات ثابتة ولا تريد تعديلها بالخطأ أثناء كتابة البرنامج.
كيف تنشئ Tuple في بايثون؟
أسهل طريقة لإنشاء Tuple هي كتابة العناصر بين أقواس دائرية:
numbers = (10, 20, 30)
print(numbers)
ويمكنك إنشاء Tuple من نصوص:
days = ("Saturday", "Sunday", "Monday")
print(days)
ويمكن أيضًا إنشاء Tuple بدون أقواس، لكن للمبتدئ الأفضل استخدام الأقواس حتى يكون الكود واضحًا:
point = 10, 20
print(point)
الناتج:
(10, 20)
إنشاء Tuple تحتوي على عنصر واحد
هذه نقطة مهمة جدًا للمبتدئين. إذا أردت إنشاء Tuple تحتوي على عنصر واحد فقط، يجب وضع فاصلة بعد العنصر.
مثال خاطئ:
item = ("Python")
print(type(item))
الناتج:
<class 'str'>
هنا Python اعتبرها نصًا عاديًا وليس Tuple، لأن الأقواس وحدها لا تكفي في حالة العنصر الواحد.
الحل الصحيح:
item = ("Python",)
print(type(item))
الناتج:
<class 'tuple'>
{alertWarning} عند إنشاء Tuple من عنصر واحد، الفاصلة مهمة جدًا: اكتب ("Python",) وليس ("Python").
الوصول إلى عناصر Tuple باستخدام index
مثل القوائم تمامًا، يمكن الوصول إلى عناصر Tuple باستخدام الفهرس index. ويبدأ الفهرس في Python من الرقم 0.
colors = ("red", "green", "blue")
print(colors[0])
print(colors[1])
print(colors[2])
الناتج:
red
green
blue
لاحظ أن:
colors[0]تعني العنصر الأول.colors[1]تعني العنصر الثاني.colors[2]تعني العنصر الثالث.
استخدام الفهرس السالب مع Tuple
يمكنك استخدام الفهرس السالب للوصول إلى العناصر من النهاية. الرقم -1 يعني آخر عنصر، والرقم -2 يعني العنصر قبل الأخير.
colors = ("red", "green", "blue")
print(colors[-1])
print(colors[-2])
الناتج:
blue
green
هل يمكن تعديل عناصر Tuple؟
لا. هذه هي الفكرة الأساسية في Tuple. بعد إنشائها لا يمكنك تغيير عنصر داخلها مباشرة.
مثال خاطئ:
colors = ("red", "green", "blue")
colors[0] = "black"
سيظهر خطأ لأن Tuple لا تسمح بتعديل عناصرها بعد الإنشاء. إذا كنت تحتاج إلى تعديل العناصر، استخدم List بدل Tuple.
{alertInfo} الفرق الأهم: List قابلة للتعديل، أما Tuple ثابتة ولا يمكن تعديل عناصرها مباشرة.
هل كل ما داخل Tuple يصبح غير قابل للتعديل؟
عدم قابلية Tuple للتعديل تعني أنك لا تستطيع استبدال عناصرها أو إضافة عناصر جديدة إليها. لكن إذا كان أحد عناصرها كائنًا قابلًا للتعديل مثل List، فيمكن تعديل محتوى تلك القائمة نفسها.
data = ("Python", [1, 2])
data[1].append(3)
print(data)
الناتج سيكون ('Python', [1, 2, 3]). لم نستبدل العنصر داخل Tuple؛ بل عدّلنا القائمة الموجودة داخله. لذلك كلمة Immutable تصف بنية Tuple نفسها، ولا تجعل كل كائن بداخلها غير قابل للتعديل تلقائيًا.
معرفة عدد عناصر Tuple باستخدام len
يمكنك استخدام الدالة len() لمعرفة عدد عناصر Tuple.
days = ("Saturday", "Sunday", "Monday")
print(len(days))
الناتج:
3
المرور على عناصر Tuple باستخدام for loop
يمكنك المرور على عناصر Tuple باستخدام حلقة for مثل القوائم.
languages = ("Python", "JavaScript", "PHP")
for language in languages:
print(language)
الناتج:
Python
JavaScript
PHP
تقطيع Tuple باستخدام Slicing
يمكنك أخذ جزء من Tuple باستخدام slicing، مثلما نفعل مع القوائم. هذه الطريقة مفيدة عندما تريد استخراج جزء من البيانات بدون تغيير Tuple الأصلية.
numbers = (10, 20, 30, 40, 50)
print(numbers[1:4])
الناتج:
(20, 30, 40)
هنا بدأنا من الفهرس 1 وتوقفنا قبل الفهرس 4.
الفرق بين List و Tuple في Python
الآن وصلنا لأهم جزء في الدرس: ما الفرق بين List و Tuple؟
| المقارنة | List | Tuple |
|---|---|---|
| طريقة الكتابة | [1, 2, 3] |
(1, 2, 3) |
| القابلية للتعديل | يمكن تعديلها | لا يمكن تعديلها مباشرة |
| الإضافة والحذف | تدعم append و remove و pop | لا تدعم الإضافة والحذف المباشر |
| الاستخدام المناسب | بيانات تتغير | بيانات ثابتة |
| الوصول بالفهرس | نعم | نعم |
| المرور باستخدام for | نعم | نعم |
| الاستخدام كمفتاح Dictionary | لا؛ List غير قابلة للـ hash | ممكن إذا كانت جميع العناصر بداخلها قابلة للـ hash |
| الذاكرة والأداء | مرنة للنمو والتعديل، وقد يكون لها حمل إضافي بسيط | غالبًا أخف وأسرع قليلًا في بعض العمليات، لكن الفرق صغير في الاستخدام العادي |
في CPython تكون Tuples عادةً أقل استهلاكًا للذاكرة وأسرع قليلًا في الإنشاء أو المرور من Lists بسبب ثبات حجمها، لكن هذا الفرق غالبًا صغير في البرامج العادية. اختر النوع أساسًا حسب معنى البيانات: هل ستتغير أم يجب أن تبقى ثابتة؟
مثال يوضح الفرق عمليًا
القائمة يمكن تعديلها:
names = ["Ali", "Sara", "Omar"]
names[0] = "Ahmed"
print(names)
الناتج:
['Ahmed', 'Sara', 'Omar']
أما Tuple فلا يمكن تعديلها بنفس الطريقة:
names = ("Ali", "Sara", "Omar")
names[0] = "Ahmed"
هذا سيؤدي إلى خطأ لأن Tuple ثابتة.
هل يمكن تحويل Tuple إلى List؟
نعم، إذا احتجت إلى تعديل Tuple، يمكنك تحويلها مؤقتًا إلى List، ثم تعديلها، ثم تحويلها مرة أخرى إلى Tuple.
colors = ("red", "green", "blue")
colors_list = list(colors)
colors_list[0] = "black"
colors = tuple(colors_list)
print(colors)
الناتج:
('black', 'green', 'blue')
لكن انتبه: إذا كنت تحتاج إلى التعديل كثيرًا، فالأفضل من البداية استخدام List بدل Tuple.
إرجاع أكثر من قيمة من دالة باستخدام Tuple
من الاستخدامات المهمة في بايثون أن الدالة تستطيع إرجاع أكثر من قيمة، وغالبًا يتم التعامل مع الناتج كـ Tuple.
def get_user():
return "Ahmed", 25
user = get_user()
print(user)
الناتج:
('Ahmed', 25)
ويمكنك استقبال القيم مباشرة في متغيرين:
name, age = get_user()
print(name)
print(age)
الناتج:
Ahmed
25
{alertInfo} عندما ترجع الدالة أكثر من قيمة في بايثون، يمكنك التعامل مع الناتج كأنه Tuple.
Tuple Packing وUnpacking في بايثون
عندما تكتب قيمًا مفصولة بفواصل مثل point = 10, 20 فإن بايثون تجمعها في Tuple؛ وهذا يسمى Tuple Packing. أما Unpacking فهو العملية العكسية: تفكيك عناصر Tuple وتخزينها في متغيرات منفصلة.
point = (10, 20)
x, y = point
print(x)
print(y)
الناتج:
10
20
لكن يجب أن يكون عدد المتغيرات مساويًا لعدد عناصر Tuple.
مثال خاطئ:
point = (10, 20, 30)
x, y = point
هنا يوجد 3 عناصر، لكننا وضعنا متغيرين فقط، لذلك سيظهر خطأ.
أهم دوال Tuple في بايثون
بما أن Tuple ثابتة، فهي لا تحتوي على دوال كثيرة مثل List. لكن هناك دالتان مهمتان جدًا:
| الدالة | وظيفتها | مثال |
|---|---|---|
count() |
تحسب كم مرة تكررت قيمة معينة | items.count("Python") |
index() |
تعطيك فهرس أول ظهور لقيمة معينة | items.index("Python") |
مثال على count
numbers = (1, 2, 2, 3, 2)
print(numbers.count(2))
الناتج:
3
مثال على index
languages = ("HTML", "Python", "CSS")
print(languages.index("Python"))
الناتج:
1
متى أستخدم Tuple بدل List؟
استخدم Tuple عندما تكون البيانات ثابتة أو تريد حماية القيم من التعديل غير المقصود.
أمثلة مناسبة:
- إحداثيات نقطة:
(x, y) - مقاسات ثابتة:
(width, height) - ألوان ثابتة:
("red", "green", "blue") - إرجاع أكثر من قيمة من دالة.
- بيانات مرجعية لا تريد تغييرها أثناء تنفيذ البرنامج.
واستخدم List عندما تريد إضافة أو حذف أو تعديل العناصر باستمرار.
استخدام Tuple كمفتاح في Dictionary
يمكن استخدام Tuple كمفتاح في Dictionary إذا كانت جميع عناصرها قابلة للـ hash، مثل الأرقام والنصوص وTuples أخرى مناسبة. أما إذا احتوت Tuple على List مثلًا، فلن تصلح كمفتاح لأن القائمة نفسها غير قابلة للـ hash.
locations = {
(10, 20): "A",
(30, 40): "B"
}
print(locations[(10, 20)])
أخطاء شائعة عند استخدام Tuple
1. محاولة تعديل عنصر داخل Tuple
هذا من أشهر الأخطاء:
items = ("A", "B", "C")
items[0] = "X"
الحل: استخدم List إذا كنت تريد تعديل العناصر.
2. نسيان الفاصلة في Tuple من عنصر واحد
اكتب:
item = ("Python",)
ولا تكتب:
item = ("Python")
3. الخلط بين الأقواس المربعة والدائرية
القائمة تستخدم أقواسًا مربعة:
my_list = [1, 2, 3]
أما Tuple فتستخدم غالبًا أقواسًا دائرية:
my_tuple = (1, 2, 3)
مثال تطبيقي بسيط
لنفترض أن لدينا موقعًا ونريد تخزين أبعاد صورة ثابتة:
image_size = (1200, 800)
width, height = image_size
print("العرض:", width)
print("الارتفاع:", height)
الناتج:
العرض: 1200
الارتفاع: 800
هنا استخدام Tuple مناسب لأن أبعاد الصورة غالبًا بيانات ثابتة نريد قراءتها فقط، وليس تعديلها في كل مرة.
أسئلة شائعة
ما معنى Tuple في بايثون؟
Tuple هي نوع بيانات يستخدم لتخزين عدة عناصر داخل متغير واحد، وغالبًا تكتب باستخدام الأقواس الدائرية ().
ما الفرق بين Tuple و List؟
الفرق الأساسي أن List قابلة للتعديل، بينما Tuple ثابتة ولا يمكن تعديل عناصرها مباشرة بعد إنشائها.
هل يمكن الوصول إلى عناصر Tuple باستخدام index؟
نعم، يمكنك الوصول إلى عناصر Tuple باستخدام الفهرس مثل items[0]، ويبدأ الفهرس في Python من صفر.
هل يمكن تحويل Tuple إلى List؟
نعم، يمكنك استخدام list() لتحويل Tuple إلى List، ثم استخدام tuple() لإعادتها إلى Tuple بعد التعديل.
متى أستخدم Tuple؟
استخدم Tuple عندما تكون البيانات ثابتة ولا تريد تعديلها، مثل الإحداثيات، الأبعاد، أو القيم التي ترجع من دالة.
هل Tuple أسرع من List في بايثون؟
غالبًا تكون Tuple أخف في الذاكرة وأسرع قليلًا في بعض العمليات، خصوصًا في CPython، لكن الفرق عادةً صغير. اختر Tuple أساسًا عندما تكون البيانات ثابتة، وليس لمجرد البحث عن سرعة بسيطة.
هل يمكن استخدام Tuple كمفتاح في Dictionary؟
نعم، إذا كانت كل عناصر Tuple قابلة للـ hash. فإذا احتوت على List أو كائن آخر غير قابل للـ hash فلن تصلح كمفتاح.
إذا كنت تريد مقارنة أوسع تشمل List وTuple وSet وDictionary معًا، فراجع الفرق بين List وTuple وSet وDictionary في بايثون. أما هذا الدرس فيركز على Tuple نفسها والفرق المباشر بينها وبين List.
مصدر خارجي مفيد
الخلاصة
تعلمنا في هذا الدرس أن Tuple في بايثون تشبه القائمة List من حيث أنها تخزن عدة عناصر داخل متغير واحد، ويمكن الوصول إلى عناصرها باستخدام الفهرس والمرور عليها باستخدام for loop.
لكن الفرق الأساسي أن List قابلة للتعديل، بينما Tuple ثابتة ولا يمكن تعديل عناصرها مباشرة. لذلك استخدم List عندما تحتاج إلى إضافة أو حذف أو تعديل العناصر، واستخدم Tuple عندما تكون البيانات ثابتة وتريد الحفاظ عليها من التغيير.
{alertSuccess} القاعدة الذهبية: إذا كانت البيانات ستتغير استخدم List، وإذا كانت ثابتة استخدم Tuple.