מחרוזות

כל רצף של תו אחד או יותר בפייתון, מוגדר "מחרוזת" (string) שזה בעצם אובייקט מסוג str.

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

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

פונקציות VS מתודות

כדי לבצע פעולות שונות על אובייקטים בפייתון אנו יכולים להשתמש בפונקציות (functions) ומתודות (methods). ההבדל בין השתיים בא לידי ביטוי בשני אופנים עיקריים:

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

האובייקטים שהפונקציה מקבלת נקראים פרמטרים וכל פונקציה דורשת מספר מוגדר של פרמטרים כדי לבצע את פעולתה (לדוגמה פונקציה המחזירה סכום של שני מספרים חייבת לקבל את המספר הראשון ואת המספר השני כדי להחזיר תוצאה).
גם במקרה הזה מתודות עובדות באותה צורה – הם נכתבות עם סוגריים המיועדים לפרמטרים. ההבדל הוא שהן נרשמות אחרי האובייקט שעליו הן מבצעות את הפעולה.

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

שינוי גודל אותיות

כמו שכבר ראינו, גודל האותיות בפייתון הוא קריטי ובשונה משפות מסוימות אחרות, אות גדולה לא שווה לאות קטנה. באנגלית זה נקרא Case Sensitive, כלומר, פייתון רגישה לגודל האות.

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

המתודה upper מחזירה כל מחרוזת שתקבל ב-upper case – אותיות גדולות בלבד. אותיות שכבר היו גדולות לא יושפעו.

upper נחשבת למתודה ולא לפונקציה מפני שהפעולה שלה רלוונטית למחרוזות בלבד. אין משמעות לביצוע הפעולה על מספר או משתנה בוליאני ולכן היא לא יכולה לפעול על טיפוסים אחרים. הנקודה אחרי שם המשתנה (string) מסמנת לנו שהמתודה upper תבצע את פעולתה על המשתנה string ובגלל שהיא לא דורשת פרמטרים נוספים הסוגריים שמלווים אותה נשארים ריקים (אך עדיין חייבים להיכתב).

לביצוע הפעולה ההפוכה נשתמש במתודה lower.

במקרה הזה כמעט כל האותיות כבר היו קטנות כך שלמעט האות הראשונה למתודה לא הייתה השפעה.

שתי המתודות הללו מבצעות חישוב על המחרוזת שקיבלו (הגדלה או הקטנה) ומחזירות לנו את התוצאה אך השינוי אינו נשמר במשתנה המקורי.

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

אם נרצה לבדוק את גודל האותיות במחרוזת שקיבלנו, נוכל להשתמש במתודה islower ו- isupper כדי לבדוק האם המחרוזת מורכבת מאותיות גדולות, או קטנות, בהתאמה.

כדי שאחת הפקודות האלה יחזירו True על כל האותיות להיות קטנות (או גדולות)

המתודה capitalize תגדיל את האות הראשונה בלבד. המתודה title תגדיל את האות הראשונה בכל מילה במחרוזת.

פיצול מחרוזות

לעתים נרצה לפרק מחרוזת ארוכה לחלקים קטנים יותר באופן שיהיה יותר נוח לעיבוד. המתודה split מאפשרת לנו להגדיר "סימן הפרדה" (delimiter) שיגדיר את אופן החלוקה של המחרוזת למחרוזות הקטנות יותר.

בדוגמה הזאת פיצלנו את המחרוזת למחרוזות קטנות על כל נקודה במחרוזת המקורית. מה שקיבלנו בחזרה הוא רצף מחרוזות קטנות בתוך אובייקט הנקרא רשימה (list) עליו נדבר בהמשך.
במידה ולא נציב פרמטר בסוגריים הפיצול יעשה ע"פ תו ברירת המחדל – רווח

ניתן לראות שהדוגמא האחרונה יצרה לנו רשימה המכילה כל מילה בנפרד – מפני שהמילים במחרוזת המקורית מופרדות ע"י רווחים.

דרך נוספת לפיצול מחרוזות היא שימוש במתודה partition. בצורה הזאת נגדיר מחרוזת כפרמטר ונקבל בחזרה רשימה המורכבת מ-3 מחרוזות: כל מה שקדם למחרוזת שביקשנו, המחרוזת עצמה וכל מה שמופיע אחריה.

מיון וספירת תווים

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

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

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

כברירת מחדל, הערכים חוזרים ממוינים בסדר עולה. אותיות גדולות יופיעו לפני אותיות קטנות (האות Z נחשבת "קטנה" יותר מהאות a). מספרים מופיעים לפני אותיות וסימני פיסוק יופיעו אפילו לפניהם. אם נרצה להפוך את הסדר נוכל להעביר לפונקציה פרמטר נוסף בשם reversed וערך בוליאני

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

החלפת תווים וסילוק רווחים

כשמקבלים מחרוזות ממקור אחר (מסמך אקסל או אפליקציית web למשל), ריווחים מיותרים לפני ואחרי המחרוזת הם תרחיש נפוץ. כדי להיפטר מהם נוכל להשתמש ב-lstrip לטיפול ברווחים לפני המילה ו-rstrip לטיפול ברווחים אחרי המילה.

לצורך ההדגמה אשתמש בציטוט החביב הבא בתוספת של 3 רווחים לפני ואחרי המשפט. לצד הציטוט עצמו אדפיס את האורך שלו (כמות התווים, כולל רווחים)

בואו נראה איך יושפע האורך לאחר השימוש במתודות. זאת גם הזדמנות להציג עיקרון חדש וחשוב מאוד בתכנות – קינון פונקציות (function nesting). במקרה הזה אני מבצע פעולה על המחרוזת – lstrip ואז מציב את התוצאה כפרמטר בתוך פונקציה אחרת – len. הפונקציה תבצע את הספירה על המחרוזת לאחר הסרת הרווחים, ולכן נקבל מספר שונה מהמספר המקורי.

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

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

ומה אם רוצים להסיר את הרווחים הפנימיים בין המילים? בשביל זה יש לנו מתודה בשם replace שמקבלת שני פרמטרים – מה אנחנו רוצים להחליף, ובמה אנחנו רוצים להחליף את זה.

בדוגמה הזאת ביקשנו מהמתודה replace לרוץ על המחרוזת במשתנה string ובכל פעם שהיא נתקלת בתו רווח (' ') להחליף אותו במחרוזת ריקה ("). המשמעות היא בפועל הסרה של כל הרווחים לאלתר. כמובן שנוכל להחליף בצורה הזאת כל תו ואפילו מחרוזות שלמות בתוך המחרוזת המקורית.

ולסיום, המתודות startswith ו- endswith מקבלות מחרוזת כפרמטר ובודקות האם המחרוזת שעליה הופעלו מתחילה, או מסתיימת במחרוזת שקיבלו.

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