Menu

Tuples ב-Python: רצפים שאינם ניתנים לשינוי, פריסה ו-Named Tuples

מתי לבחור ב-tuple במקום ברשימה: חוסר שינוי, פריסה (unpacking), named tuples והמצבים ש-tuples נועדו להם.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

tuple הוא רשימה שאי אפשר לשנות

tuples ורשימות נראים דומים במבט ראשון: שניהם רצפים מסודרים, ושניהם תומכים באינדקסים ובמעבר בלולאה. אבל הבדל קריטי אחד משנה הכול: tuples אינם ניתנים לשינוי. אחרי שיוצרים tuple, אי אפשר להוסיף לו, להסיר ממנו או להחליף בו פריט.

כותבים tuples בסוגריים עגולים (ולפעמים בלעדיהם):

tuple עם פריט אחד צריך פסיק בסוף, אחרת Python מתייחסת לסוגריים כקיבוץ:

ול-tuples ריקים, השתמשו ב-():

חוסר שינוי, בפועל

נסו לשנות tuple ו-Python תעצור אתכם:

אפשר לקרוא מ-tuple בחופשיות: אינדקסים, slicing, מעבר בלולאה, in. פשוט אי אפשר לשנות אותו. אם צריך tuple אחר, יוצרים חדש.

למה שתרצו משהו שאי אפשר לשנות?

חוסר שינוי נשמע כמו מגבלה, אבל לעיתים קרובות זו בדיוק התכונה שרוצים.

  1. בטיחות. tuple שמעבירים לפונקציה לא יכול להשתנות מאחורי הגב שלכם.
  2. Hashability. tuples של ערכים שאינם ניתנים לשינוי יכולים לשמש כמפתחות ב-dictionary או כאיברים ב-set, ורשימות לא.
  3. כוונה. tuple אומר "זו רשומה בצורה קבועה". point = (3, 4) מעביר "שתי קואורדינטות" בצורה ברורה יותר מ-point = [3, 4].

tuples מצטיינים בדברים כמו:

  • קואורדינטות: (x, y), (lat, lon)
  • צבעי RGB: (255, 128, 0)
  • רשומות: (name, email, signup_date)
  • החזרת כמה ערכים מפונקציה

פריסה (Unpacking)

tuples ותחביר הפריסה נועדו זה לזה:

הפסיק בצד שמקבל את ההשמה הוא מה שמבצע את הפריסה. Python רואה שני שמות ו-tuple עם שני ערכים, ומקשרת אותם בזוגות.

זה נמצא בכל מקום ב-Python אידיומטית:

אפשר להשתמש ב-* כדי לאסוף את "כל השאר":

שימושי כשחשובים לכם רק האיבר הראשון והאחרון.

tuples כמפתחות ב-Dictionary

מכיוון ש-tuples הם hashable (כל עוד התוכן שלהם hashable), אפשר להשתמש בהם כמפתחות ב-dict. רשימות לא יכולות לעשות את זה:

הדפוס הזה, מפתח שמורכב מכמה ערכים, שימושי באופן מפתיע. חשבו על "הניקוד של משתמש X ביום Y" או "המסלול הטוב ביותר מ-A ל-B".

tuples להחזרת כמה ערכים

פונקציה שצריכה להחזיר יותר מדבר אחד מחזירה בדרך כלל tuple:

הפונקציה המובנית divmod() של Python עושה בדיוק את זה. השמת הפריסה בקוד הקורא הופכת את זה לקריא וטבעי.

Named Tuples, כשמיקום לא מספיק

ברגע שה-tuples שלכם גדלים מעבר לשניים או שלושה פריטים, לזכור איזה מיקום אומר מה נהיה מייגע. collections.namedtuple פותר את זה:

עכשיו לפריטים של ה-tuple יש שמות. הוא עדיין אינו ניתן לשינוי, ועדיין tuple (כך שפריסה ואינדקסים עובדים), אבל דרך הגישה ידידותית הרבה יותר. לכל דבר מורכב יותר יש dataclasses, ונכיר אותן בהמשך בפרק על מחלקות.

tuple מול רשימה: מדריך החלטה מהיר

  • צורה קבועה, לכל מיקום יש משמעות: tuple.
  • אוסף שעשוי לגדול או לקטון: רשימה.
  • החזרת כמה ערכים מפונקציה: tuple.
  • צריך מפתח ל-dict או איבר ל-set: tuple (רשימה לא תעבוד).
  • אתם מתכוונים לשנות אותו: רשימה (tuple לא ייתן לכם).

ממשיכים הלאה

tuples מכסים קצה אחד של הספקטרום: קבוע, קטן, מובנה. הבא בתור: sets, שמכסים תפקיד שונה לגמרי, בדיקת שייכות מהירה וייחודיות.

שאלות נפוצות

מה זה tuple ב-Python?

tuple הוא רצף מסודר שאינו ניתן לשינוי: כמו רשימה, אבל אחרי שהוא נוצר אי אפשר להוסיף, להסיר או לשנות את הפריטים שלו. כותבים tuples בסוגריים עגולים: point = (3, 4).

מה ההבדל בין tuple לרשימה?

שניהם רצפים מסודרים. רשימות ניתנות לשינוי, כלומר אפשר לשנות אותן אחרי היצירה, ו-tuples אינם ניתנים לשינוי. tuples משמשים בדרך כלל לאוספים קטנים של ערכים ששייכים יחד כ"רשומה" אחת, כמו קואורדינטות או כמה ערכים מוחזרים מפונקציה.

מתי להשתמש ב-tuple?

השתמשו ב-tuple כשיש לכם רשומה בגודל קבוע שבה לכל מיקום יש משמעות: קואורדינטות, צבעי RGB, שורה ממסד נתונים. השתמשו ב-tuples גם כמפתחות ב-dictionary או כאיברים ב-set, כי רשימות לא יכולות לשמש שם. לכל השאר, כשהאוסף עשוי לגדול או לקטון, רשימות הן ברירת המחדל.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל