מתודות של רשימות#
תזכורת:
mutable (בת שינוי) – ניתן לשנות את האובייקט המקורי לאחר יצירתה immutable (בלתי־ניתן לשינוי) – לא ניתן לשנות את האובייקט המקורי לאחר יצירתו. כל שינוי ניתן רק על ידי שכפול והחלפה של ערכים.
שיטה (מתודה) היא פונקציה שמוגדרת עבור טיפוס מסוים, והיא “שייכת” לאובייקט שמאותו הטיפוס. האובייקט יכול לקרוא לה כדי לבצע פעולה כלשהי לפי התחביר הבא:
my_object.action()
כעת נכיר מספר מתודות שימושיות של רשימות משנות את הרשימה המקוריות מהן הופעלו#
appendremovepopsort
append: הוספת איבר לרשימה#
הוספת איבר לסוף הרשימה.
hello_list = ['h','e','l','l','o']
hello_list_new=hello_list.append('!')
print(hello_list) # This is the original list!!
['h', 'e', 'l', 'l', 'o', '!']
שימו לב
המחרוזת “!” נוספת למשתנה המקורי ללא פעולת השמה.
אז מה מחזיר append?#
hello_list = ['h','e','l','l','o']
hello_list_new=hello_list.append('!')
print(hello_list)
['h', 'e', 'l', 'l', 'o', '!']
print(hello_list_new)
None
כלומר הפונקציה לא החזירה כלום, וההשמה לאחר append מיותרת.
hello_list = ['h','e','l','l','o']
hello_list.append('!')
print(hello_list)
['h', 'e', 'l', 'l', 'o', '!']
טיפ להמשך
אם מתודה משנה את האובייקט המקורי, היא כנראה לא תחזיר אותו. למה לעשות פעמיים?
remove: הסרת איבר מרשימה#
המתודה מסירה את האיבר הראשון המתאים לערך שהועבר בקלט
hello_list = ['h','e','l','l','o']
hello_list.remove('e')
print(hello_list)
['h', 'l', 'l', 'o']
מה יקרה אם ננסה להסיר איבר שלא קיים ברשימה?
hello_list = ['h','e','l','l','o']
hello_list.remove('e')
print(hello_list)
hello_list.remove('e')
print(hello_list)
['h', 'l', 'l', 'o']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 4
2 hello_list.remove('e')
3 print(hello_list)
----> 4 hello_list.remove('e')
5 print(hello_list)
ValueError: list.remove(x): x not in list
pop: חילוץ איבר מרשימה#
המתודה pop מאפשרת לנו להוציא איבר מרשימה לפי אינדקס וגם לקבל אותו חזרה. כלומר, כשאנחנו קוראים ל־pop(i):
המתודה שומרת את האיבר שנמצא באינדקס i.
היא מוחקת את האיבר הזה מהרשימה.
היא מחזירה לנו את הערך שהיה באינדקס i, כך שנוכל להשתמש בו מיד או לשמור אותו במשתנה.
כך אפשר לעבוד עם איברים ברשימה בלי לאבד אותם, וגם לעדכן את הרשימה בו-זמנית.
hello_list = ['h','e','l','l','o']
res=hello_list.pop(0)
print(hello_list, res)
hello_list.pop() # Note that here we do not assign the popped element to res
print(hello_list, res)
['e', 'l', 'l', 'o'] h
['e', 'l', 'l'] h
שימו לב
פעולה זו לא “שוברת” את כלל האצבע מקודם - המתודה הזו עדיין לא מחזירה את הרשימה המקורית, אלא ערך אחר.
sort: מיון רשימה#
המתודה ממיינת את הרשימה המקורית.
שימו לב שכאשר משתמשים בפונקציה המובנית (built-in function) sorted שראינו כבר, ערך ההחזר הוא רשימה חדשה ממויינת
a = [3,7,1]
b = sorted(a)
print(a)
print(b)
[3, 7, 1]
[1, 3, 7]
לעומת זאת, המתודה sort ממיינת את הרשימה המקורית ואינה מחזירה דבר
a = [3,7,1]
b = a.sort()
print(a)
print(b)
[1, 3, 7]
None
ראינו פה שני דרכים שונות לפעולה של פונקציות:
פונקציות שמשנות את האובייקט המקורי נקראות in-place operation.
לעומתן, פונקציות שיוצרות ערך חדש, מבלי לשנות את האובייקט המקורי, נקראות copy operations.
עיצרו וחישבו: האם קיימים in-place operations למחרוזות? אם כן, אילו? אם לא, מדוע?
לא - מחרוזות בפייתון הן immutable (לא ניתנות לשינוי). כל פעולה על מחרוזת יוצרת מחרוזת חדשה במקום לשנות את המקור. לדוגמה, חיתוך או replace מחזירים מחרוזת חדשה, והמקור נשאר כפי שהוא.
מתודות פופולריות של רשימה#
להלן טבלה עם מתודות שימושיות עבור רשימות - על חלקן כבר דיברנו ועל חלקן עוד לא. נסו את הפונקציות החדשות כדי לראות מה הן עושות בעצמכם!
שיטה |
תיאור |
|---|---|
|
מוסיפה פריט לסוף הרשימה |
|
מחזירה את מספר הפעמים שהערך מופיע ברשימה |
|
מרחיבה את הרשימה על ידי הוספת פריטים מרשימה אחרת |
|
מחזירה את האינדקס הראשון שבו מופיע הערך |
|
מכניסה פריט לפני מיקום מסוים ברשימה |
|
מסירה את הפריט במיקום הנתון ומחזירה אותו (אם לא נמסר אינדקס – תסיר את הפריט האחרון) |
|
מסירה את ההופעה הראשונה של הערך ברשימה |
|
הופכת את סדר הרשימה (משנה את הרשימה עצמה) |
|
ממיינת את הרשימה (משנה את הרשימה עצמה) |
|
יוצר עותק שטחי של הרשימה |
|
מוחק את כל האיברים מהרשימה (משנה את הרשימה עצמה) |
*שיטות מודגשות אינן משנות את הרשימה
# Try these methods!
lst = ["hello", "world", "python"]
נסו בעצמכם#
ממשו את הפונקציה update_playlist(playlist) אשר מקבלת רשימת מחרוזות בה כל מחרוזת היא שם של שיר.
הפונקציה תבצע את העדכונים הבאים לרשימה:
תוסיף את השיר החדש “Imagine” לסוף הרשימה (משנה את הרשימה המקורית).
אם “Piano man” כבר מופיע, תוציא את ההופעה הראשונה שלו (משנה את הרשימה המקורית).
תוסיף את השיר “Iris” במקום השני ברשימה (משנה את הרשימה המקורית).
תיצור עותק חדש של הרשימה, ותחזיר את הרשימה בסדר הפוך (בלי לשנות את הרשימה המקורית!)
מלאו את שלד הפונקציה שלפניכם. אם הפונקציה מומשה כהלכה, יודפסו למסך שני True.
def update_playlist(playlist):
# Write you code here
pass
old_playlist = ["Piano man", "Bohemian Rhapsody", "Hey Jude"]
print(update_playlist(old_playlist) == ['Imagine', 'Hey Jude', 'Iris', 'Bohemian Rhapsody'])
print(old_playlist == ['Bohemian Rhapsody', 'Iris', 'Hey Jude', 'Imagine'])
False
False
לחצו כאן כדי לצפות בפתרון
def update_playlist(playlist):
playlist.append("Imagine")
playlist.remove("Piano man")
playlist.insert(1, "Iris")
lst = playlist.copy()
lst.reverse()
return lst