פורמט מחרוזות (""f)

פורמט מחרוזות (""f)#

עריכת מחרוזות לפני פורמט: String Formatting#

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

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

כך, למשל, המספר 3 עובר המרה ל"3", שלאחר מכן מודפס למסך

print(3)
3

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

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

לדוגמא, בהנתן 2 משתנים המחזיקים את שם הסטודנט וציונו, אם נרצה להדפיס מחרוזת שמייצגת ציון לי סטודנט בפורמט name-grade נוכל לעשות זאת באופן הבא:

name="Avi"
grade=90
print(name+"-"+str(grade))
Avi-90

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

studs = {"Avi": 90, "Moshe": 80, "Adam": 70}

for name, grade in studs.items():
    print(name+"-"+str(grade))
Avi-90
Moshe-80
Adam-70

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

כדי למנוע את הבעיות הללו, יצרנו עבורנו בפייתון כלי שנקרא String format, או ''f""/f.
באמצעות String format, ניתן לייצר את פורמט מחרוזת שאנו רוצים באמצעותה לייצג את האובייקטים שלנו כמחרוזת מיוחדת, שהיא בעצם שבלונה, או טמפלייט, המכיל נקודות כניסה לקוד המסומנות באמצעות סוגריים מסולסלים {}. הקוד שבתוך הסוגריים הללו זה ירוץ באופן אוטומטי, יומר למחרוזת ויחובר למחרוזת בדיוק במקום בו נכתב.

נדגים זאת באמצעות שכתוב הקוד שלעיל עם String format:

studs = {"Avi": 90, "Moshe": 80, "Adam": 70}

for name, grade in studs.items():
    print(f"{name}-{grade}")
Avi-90
Moshe-80
Adam-70

שימו לב כי שבסה”כ לשים את המשתנים בתוך הסוגריים המסולסלים המתאימים, והString format כבר דאג לחבר אותם ביחד.

נסו בעצמכם

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

אחרי שהצלחתם, נסו “לשחק” עם הפורמט: להוסיף פעולות יותר מורכבות בתוך הסוגריים המסולסלים, להוסיף זוגות של סוגריים מסולסלים נוספים וכו’

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

pi = 3.14159265359 

זהו כמובן אינו המספר המלא, הנמשך למעשה אינסוף ספרות לאחר הנקודה. דוגמא נוספת למספר המכיל אינסוף ספרות לאחר הנקודה הוא 2/3.
מובן שמספרים כאלו לא נרצה להדפיס במלואם. אפילו מספרים עם 5 או 10 ספרות אחר הנקודה נרצה לעיתים קרובות “לקצץ” לדיוק של 2 או 3 ספרות שלאחר הנקודה.

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

נתבונן בדוגמא הבאה

name = 'Avi'
pi = 3.14159265359
print(f"My name is {name} and I like {pi}")
My name is Avi and I like 3.14159265359

נרצה כעת “לקצץ” את הדיוק של מספר הפאי ל2 ספרות לאחר הנקודה. על מנת לממש זאת, נוכל להוסיף בסוף הסוגריים המסולסלים נקודותיים (:) עם רמת הדיוק הנדרשת (2.) והדרך בה נרצה שמספר יוצג (f, כמו float/עשרוני)

print(f"My name is {name} and I like {pi:.2f}")
My name is Avi and I like 3.14

באופן כללי, קיימות מגוון אפשרות לתצוגות מספריות עבור int ו-float בString format, שניתן להפעיל עם S.d: בסוף הסוגריים המסולסלים, כאשר:

  • : מציין היכן מתחילה עריכת התצוגה

  • .d רמת הדיוק — כמה ספרות אחרי הנקודה העשרונית

  • S סגנון מספרי (נקודה עשרונית, מדעי וכו’)

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

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

name = 'Avi'
small_pi=0.0000000314159265359
print(f"My name is {name} and I like {small_pi:.2f}")
My name is Avi and I like 0.00

אבל כך נקבל פשוט 0, וזה כמובן לא ייצוג אינפורמטיבי.

לעומת זאת, באמצעות תצוגה מדעית (e כמו אקספוננט) אנו יכולים “לחתוך” את כל האפסים שנמצאים בתחילת המספר עד שנגיע למספר שאינו 0

print(f"My name is {name} and I like {small_pi:.2e}")
My name is Avi and I like 3.14e-08

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

נסו בעצמכם

נסו להשתמש בתצוגה מדעית על מנת לייצג גם מספרים מאוד גדולים, כמו 31415926535900000

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

אנו מזמינים אתכם לקרוא עוד על String format בתיעוד הרשמי של פייתון.