Contents
פריסה של רצפים בפייתון 2
שאלה:
כיצד פועלת פעולת פריסה (slicing) עבור רצפים (למשל, רשימות או מחרוזות) בפייתון, ומה יקרה אם יצוינו אינדקסים החורגים מגבולות הרצף?
- פריסות יוצרות עותק של חלק מהרצף. אם האינדקסים חורגים מגבולות, תמיד נוצרת שגיאת
IndexError
. - פריסות יוצרות עותק שטחי של חלק מהרצף, המוגדר על ידי אינדקס התחלה, אינדקס סוף (לא כולל) ואינדקס צעד. אם אינדקסים של פריסה חורגים מגבולות, פייתון מטפל בכך כראוי, מחזיר את החלק הזמין או רצף ריק, מבלי לגרום לשגיאה.
- פריסות משנות את הרצף המקורי, מסירות אלמנטים מחוץ לטווח המצוין. שגיאת
IndexError
מתרחשת אם אינדקס ההתחלה גדול מאינדקס הסוף. - פריסות ניתנות ליישום רק על מחרוזות, אך לא על רשימות. הן תמיד מחזירות אלמנט אחד, התואם את אינדקס ההתחלה.
תשובה:
👇
תשובה נכונה: B
הסבר:
פריסה (slicing) היא דרך לקבל תת-רצף מתוך רצף קיים, מבלי לשנות את המקור.
תחביר:
sequence[start:stop:step]
start
— אינדקס התחלה (כולל, ברירת מחדל: 0).stop
— אינדקס סוף (לא כולל).step
— קפיצה בין איברים (ברירת מחדל: 1). ניתן גם להשתמש בערכים שליליים.
התנהגות בעת חריגה מגבולות:
- בניגוד לגישה ישירה לרשומה בודדת (כמו
sequence[100]
, שעלולה להוביל ל-IndexError
), פעולת פריסה לא גורמת לשגיאה כאשר האינדקסים חורגים מהגבולות. - פייתון פשוט מחזירה את התת-רצף האפשרי, או רצף ריק אם אין תוצאה מתאימה.
עותק שטחי:
- פעולת פריסה יוצרת עותק חדש (shallow copy) של החלק המתאים ברצף.
- כלומר, שינוי ברשימת המקור לא ישפיע על תוצאת הפריסה (אם האלמנטים עצמם בלתי-ניתנים לשינוי), ולהפך.
דוגמה:
my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
my_string = "abcdefghij"
# פריסות רגילות
print(my_list[2:5]) # [2, 3, 4]
print(my_string[:3]) # 'abc'
print(my_list[5:]) # [5, 6, 7, 8, 9]
print(my_string[::2]) # 'acegi'
# פריסות עם אינדקסים החורגים מגבולות
print(my_list[5:100]) # [5, 6, 7, 8, 9]
print(my_string[-100:3]) # 'abc'
print(my_list[100:200]) # [] (רשימה ריקה)
סיכום:
- פריסה (
slicing
) מאפשרת גזירת תתי-רצפים בצורה בטוחה ואלגנטית. - לא נוצרת שגיאה כאשר האינדקסים חורגים מהגבולות.
- תמיד מוחזר עותק חדש של תת-הרצף — או חלק תקף מהרצף, או רצף ריק.
לכן התשובה הנכונה היא: B
מעולה! הנה גרסה מלאה עם תיבה של "💡 טיפ" בסוף — שיכולה להתאים מאוד לסטייל של סדרת הסברים תאורטיים או פוסטים לבלוג/למידה:
💡 טיפ שימושי לפריסה בפייתון:
- כדי ליצור עותק מלא של רשימה (או מחרוזת, טאפל) — השתמש בפריסה מלאה:
copy_list = my_list[:] # עותק של כל הרשימה
- כדי להפוך רצף (למשל רשימה או מחרוזת), ניתן להשתמש בצעד שלילי:
reversed_list = my_list[::-1]
reversed_string = my_string[::-1]
- פריסה שימושית גם בעבודה עם מבני נתונים מורכבים, לדוגמה — חיתוך חלקים ממחרוזת או תת-קבוצות של נתונים:
last_three = my_list[-3:] # שלושת האיברים האחרונים
every_second = my_string[::2] # כל תו שני
הנה טבלה חזותית קטנה שמסבירה כיצד slicing עובד על רצפים בפייתון, יחד עם תרשים ASCII המדגים את האינדקסים — כולל אינדקסים שליליים. זהו כלי לימוד מעולה למי שמתקשה להבין את המיקום של start, stop ו־step:
🧩 טבלת דוגמה: פריסה של רשימה
my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
0 1 2 3 4 5 6 # אינדקסים חיוביים
-7 -6 -5 -4 -3 -2 -1 # אינדקסים שליליים
תחביר | פלט | הסבר |
---|---|---|
my_list[2:5] | ['c', 'd', 'e'] | מ־index 2 עד 4 (5 לא כולל) |
my_list[:3] | ['a', 'b', 'c'] | התחלה מהתחלה עד index 2 |
my_list[4:] | ['e', 'f', 'g'] | מ־index 4 עד הסוף |
my_list[::2] | ['a', 'c', 'e', 'g'] | כל איבר שני |
my_list[::-1] | ['g', 'f', 'e', 'd', 'c', 'b', 'a'] | הפוך |
my_list[-3:-1] | ['e', 'f'] | אינדקסים שליליים: לפני הסוף |
my_list[100:200] | [] | חריגה מגבולות — מוחזר רצף ריק |
🎯 טיפ לסיום:
Slicing לא מרים שגיאות כשאינדקסים חורגים!
זה הופך אותו לכלי בטוח מאוד לשימוש — לדוגמה, אם לא בטוחים באורך הרשימה, אפשר לנסותmy_list[:5]
גם אם היא קצרה יותר.