פרק קודם:
פייתון 10 - מיזוג רשימותמה נלמד
- Named Tuples
- Counter
- ChainMap
- Deque
הקדמה
לפייתון יש כמה יכולות נוספות מתחת לשרוול שייעזרו בביצוע משימות פשוטות.
Named Tuples
אם אתם לא וזכרים מה זה טאפל:
פייתון 9 - מילונים, טופלים וסטיםNamed tuple
מוסיף שמות לערכי הטאפל כך שאנחנו יכולים לגשת בעזרת שם לערך מסוים.
1 | from collections import namedtuple |
פרמטרים לפונקציה namedtuple
:
1 | collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)¶ |
typename
- שם הטאפל, בעזרתו ניצור טאפלים חדשיםfield_named
- רשימה של הפרמטרים.
ניתן להעביר רשימה, או מחרוזת עם שמות, השמות יכולים להיות מופרדים ברווח או פסיקים:1
2
3Person = namedtuple('Person', ['Name','Age'])
Person2 = namedtuple('Person2', 'Name Age')
Person3 = namedtuple('Person3', 'Name,Age')rename
- מוודא שהשמות של המשתנים נכונים לפי שפת פייתון.
למשל אסור להתחיל משתנה עם מספר,
או אסור ששם משתנה יהיה מילה שמורה בפייתון.
במידה ושם המשתנה לא תקין הפונקציה תחליף אותו לקו תחתון ומספר.
1 | Person = namedtuple('Person',['Age','def'], rename=True) |
defaults
- רשימה של ערכים בברירת מחדל כאשר יוצרים טאפל ריק.module
- מחליף את הפרמטר__module__
במידה ומועבר הפרמטר.
מודולים ניתן ללמוד בפרק 14: פייתון 14 - מודולים
גישה למשתנים
ניתן לגשת למשתנים בעזרת אינדקסים כי טאפל הוא מאודנקס!
1 | p = Person(Name='Bob', Age = 42) |
ניתן לפצל טאפל למשתנים:
1 | p = Person(Name='Bob', Age = 42) |
פיצול טאפלים הוא קונספט נפוץ בתכנות וקיים גם בשפות אחרות - קונספט זה נקרא Deconstruction
.
לא להתבלבל עם ה-Dtor
או ה-Destructor
האחראי על מחיקה של מידע.
בפייתון זה לא נפוץ ולכן אין צורך להשתמש בזה כל כך.
ניתן לגשת למשתנים על פי שם:
1 | p = Person(Name='Bob', Age = 42) |
תרגילים
- שלחו לנו קטע קוד, אך בגלל באג קיבלנו רק את חלקו!
עזרו להשלים את החסר:
1 | from collections import ______ |
1 | from collections import namedtuple |
בתרגיל הזה ניתן לראות שימוש מעולה לnamedtuple
.
אנחנו ממירים מידע לא מיוצג - רשימה של מספרים,
למידע מפורש - נקודות.
במקום לגשת לאינדקסים:
1 | x = data[0] |
ניתן להשתמש בגישה מפורשת:
1 | points[0].X |
Counter
Counter
הוא אובייקט פשוט - ניתן לייחס אותו לרשימה של מילים עם מספרים.
כל מטרתו הוא לעזור לספור כמות של כל דבר שאנו רוצים.
מאחורי הקלעים Counter
הוא מילון.
1 | from collections import Counter |
היכולת העוצמתית של האובייקט הזה הוא בעצם לקבל מחרוזות או רשימות שונות כפרמטר,
למשל, כדי לספור את כל התווים במחרזות:
1 | countChars = Counter('abcbfbccfaabcafbcabcfabcabc').most_common(3) |
פונקציות שימושיות
most_common(n)
- יחזיר את המופעים הנפוצים ביותר.elements
- יחזיר את כל המופעים כאלמנטים בודדים.
למשל אם יש לנו 8 פעמיםa
הוא יוצג כ8 מופעים שונים של התו:
1 | everything = Counter('abcbfbccfaabcafbcabcfabcabc').elements() |
total
- מחזיר את כמות כל האלמנטים.- פעולות חיבור, חיסור ומיזוג:
1 | from collections import Counter |
חיבור וחיסור:
1 | productsA + productsB |
מיזוג:
1 | productsA & productsB |
איחוד:
1 | productsA | productsB |
השוואה:
1 | productsA == productsB |
בדיקת הכלה:
1 | productsA <= productsB |
תרגיל
- כתבו תכנית שסופרת פריטים אשר המשתמש רושם.
כאשר המשתמש רשם “end” על התכנית לסכם את הכל ולהציג את הפריטים ואת כמותם.
תכנית הרצה לדוגמא:1
2
3
4
5
6
7
8
9
10milk
milk
eggs
flour
end
----------------------
milk : 2
eggs : 1
flour : 1
----------------------
1 | from collections import Counter |
ChainMap
שרשרת מפות או ה-ChainMap
הוא מילון אשר מקבץ בתוכו מילונים.
הוא יותר מהיר לפעולות קלות כדי למזג כמה מילונים יחדיו,
במקום לעדכן מילון אחד בערכים חדשים.
כמובן זה תלוי בסוג המיזוג שאנחנו מעוניינים לעשות כפי שלמדנו בפרק 10:
פייתון 10.2 - אובייקטי רשימות ויכולות1 | dictOne = {'a':2, 'b': 3,'d':6 } |
לחילופין, נוכל להשתמש ב-ChainMap
:
1 | from collections import ChainMap |
בעזרת המשתנה maps
נוכל לגשת לרשימה של המילונים.
1 | print(chain.maps) |
deque
deque
הוא קיצור ל- Double Ended Queue
.
קוראים את המילה כ-דק
או deck
.
הרשימה הזו היא בעצם תור דו כיווני - ניתן להכניס איברים מסוף התור או תחילת התור.
ובכך לממש שני קונספטים:
- LIFO - Last in First Out - מחסנית
- FIFO - First in First out - תור
ההתחלה של התור מצד שמאל, וסוף התור הוא מצד ימין.
FIFO - First in First Out - תור
תור כמו שהוא במציאות הוא רשימה שהראשון שנכנס הוא הראשון שיוצא!
אם יש לנו יותר מאלנט אחד הם נאגרים וכאשר אנחנו מוציאים אלמנט - הראשון יוצא.
תורים בתכנות קיימים בכל מקום כי זה הגיוני שכאשר בקשה מתקבלת אנחנו נטפל בה,
ואז כשעוד אחת מתקבלת היא נאגרת בתור ותהיה הבאה בתור!
LIFO - Last in First Out - מחסנית
מחסנית עובדת בשיטה הפוכה - האלמנט האחרון שנכנס הוא הראשון שיוצא.
דוגמא טובה לזה תהיה מחסנית קריאות קוד!
נתקלנו בזה בפרק 8 - כשלמדנו על רקורסיות:
Deque API
deque([maxlen])
- יוצר דק עם כמות מקסימלית, אם לא כותבים כמות מקסימלית אז הדק יכול לגדול לעד.append
- משתמש ברשימה בצורה רגילה, מוסיף אלמנט מצד ימין.appendleft
- מוסיף אלמנט לצד השמאלי של הרשימה.pop
- מוריד אלמנט מהצד הימני של הדק.popleft
- מוריד אלמנט מהצד השמאלי של הדק.
תרגיל
- השתמשו ב-
deque
כדי ליצור תור.
כתבו תכנית אשר קולטת מספרים מהמשתמש ומכניסה אותם לתור.
כאשר המשתמש כותבpop
התוכנה תדפיס את כל המספרים.
שימו לב שהסדר צריך להיות כמו בתור!
1 | from collections import deque |
מתודות שימושיות נוספות
extend
- מוסיף אלמנטים לצד ימיןextendleft
- מוסיף אלמנטים לצד שמאל
1 | myList = [1,2,3] |
רשומות deque
הן מאונדקסות:
index
- מחפש את האינדקס של האלמנטinsert
- מכניס אלמנט לאינדקס ספציפי
1 | deck = deque() |
כמו כן ניתן גם לסובב את האלמנטים בפנים:
reverse
- מחזיר את הדק בסדר הפוך.rotate
- מסובב את הדק ימינה או שמאלה.
תרגול
- עבדו את המחרוזת הבאה:
SIMP*L*Y**C*O***D*E
על כל אות יש להוסיף את האות למחסנית,
ועל כל כוכבית להוריד אות מהמחסנית.
הדפיסו את המחסנית כל שלב.
1 | from collections import deque |
אלו כמה סוגי רשימות שייעזרו לא לכתוב את הגלגל מחדש.
בפרק הבא נלמד כיצד לעבוד עם קבצים!
פייתון 11 - קידוד וקבצים