א.9 — tuple
טאפל (tuple) שומר רצף של ערכים, בדומה לרשימה, ואפשר לגשת לכל איבר בו לפי אינדקס. ההבדל המרכזי הוא שאחרי יצירת הטאפל אי אפשר להוסיף לו איברים, להסיר ממנו איברים או להחליף איבר באחר.
למה שנרצה רצף שאי אפשר לשנות? יש נתונים שמטבעם באים כקבוצה קבועה: נקודה במישור היא תמיד זוג (x, y), צבע הוא שלישייה של אדום, ירוק וכחול, ותאריך הוא יום, חודש ושנה. לאוסף כזה אין טעם "להוסיף איבר", והבטחה שהוא לא ישתנה מגינה מטעויות: פונקציה שמקבלת נקודה אינה יכולה לשנות אותה בטעות, ופייתון תעצור אותנו מיד אם ננסה. כבר פגשנו טאפל בפרק א.7, כשפונקציה החזירה כמה ערכים יחד.
למשל, אפשר לשמור את שתי הקואורדינטות של נקודה יחד בטאפל. כך הן עוברות בתוכנית כזוג אחד; אם רוצים לייצג מיקום אחר, אפשר ליצור טאפל חדש. בפרק נשווה אותו לרשימה שכבר הכרנו: תחילה מה משותף להם, אחר כך מה מבדיל ביניהם, ולבסוף כיצד אורזים ומפרקים ערכים.
פתיחת המחברת ב־Colab · השיעור וההרצאה באתר הקורס
מחברות האוניברסיטה הפתוחה — 5-רשימות
הדמיון ל־list
tuple (טאפל), כמו list, שומר רצף מסודר של איברים ויכול להכיל כפילויות. קוראים איבר באמצעות אינדקס שמתחיל ב־0, מקבלים את האורך באמצעות len וסורקים באמצעות for.
numbers = [3, 5]
point = (3, 5)
print(numbers[0], point[0])
print(len(numbers), len(point))
פלט
3 3
2 2
הרשימה numbers והטאפל point מחזיקים את אותם שני ערכים, ופעולות הקריאה [0] ו־len מחזירות עבורם אותן תוצאות. ההבדל בין השניים אינו בקריאה אלא בשינוי.
ההבדל: אי אפשר לשנות את הרצף
ברשימה אפשר להחליף, להוסיף ולהסיר איברים. ב־tuple אי אפשר לעשות זאת לאחר יצירתו. רשימה נכתבת עם סוגריים מרובעים []; בדרך כלל כותבים tuple עם סוגריים עגולים (). לכן tuple מתאים, למשל, לייצוג זוג קואורדינטות.
numbers = [3, 5]
numbers[0] = 8
print(numbers)
point = (3, 5)
print(point)
פלט
[8, 5]
(3, 5)
ההשמה numbers[0] = 8 החליפה את האיבר הראשון ברשימה. לעומת זאת, הפקודה point[0] = 8 תגרום לשגיאה, ולכן היא אינה מופיעה בדוגמה. אם איבר בתוך tuple הוא בעצמו רשימה, עדיין אפשר לשנות את הרשימה הפנימית.
ב־tuple בעל איבר יחיד חייבים פסיק: (7,). ללא הפסיק, (7) הוא רק המספר 7 בסוגריים.
בדומה לרשימה, אפשר לפרק רצף למשתנים: x, y = point. נדרשים כאן שני איברים, אחד לכל משתנה. זו גם הדרך לקבל את זוג הערכים שהחזרנו מפונקציה בפרק א.7.
אריזה, פירוק והחלפת ערכים
טאפל נוח במיוחד כשרוצים להעביר כמה ערכים יחד ואחר כך לעבוד עם כל אחד מהם בנפרד, כמו נקודה שמתקבלת מפונקציה ואז מפורקת ל־x ול־y. לשני הכיוונים האלה יש שמות. אריזה מרכזת כמה ערכים בטאפל אחד. פירוק משייך את איבריו למשתנים לפי הסדר. בדוגמה נראה גם שימוש נפוץ בפירוק: החלפת ערכים בין שני משתנים בשורה אחת, בלי משתנה עזר.
point = (5, 7)
x, y = point
print(x, y)
reversed_point = (y, x)
print(reversed_point)
x, y = y, x
print(x, y)
פלט
5 7
(7, 5)
7 5
בפקודה x, y = y, x פייתון מחשבת תחילה את שני הערכים בצד ימין, ורק אז משייכת אותם לצד שמאל; כך הם מתחלפים בלי לדרוס ערך שעדיין צריך. הטאפל המקורי point לא השתנה. בפירוק הרגיל הזה, מספר המשתנים חייב להתאים למספר האיברים.
אפשר גם לכתוב point = 5, 7: הפסיק הוא שיוצר את הטאפל; הסוגריים מקלים על הקריאה.
טאפל בתוך רשימה
שני המבנים משלימים זה את זה: הרשימה מתאימה לאוסף שגדל ומשתנה, והטאפל לקבוצת ערכים קבועה. לכן נפוץ לשלב ביניהם. אפשר לשמור מסלול כרשימה של נקודות, למשל [(0, 0), (1, 2), (3, 5)]. הרשימה מאפשרת להוסיף נקודות למסלול; כל טאפל מרכז את הקואורדינטות של נקודה אחת. זו אותה אריזה ששימשה להחזרת כמה תוצאות מפונקציה.