פוסט

f-strings: עיצוב טקסט ב-Python

איך עובדים f-strings ב-Python: שמים ביטויים בסוגריים מסולסלים, מפרטי עיצוב לרוחב, יישור, דיוק, מפרידי אלפים ואחוזים, מציין ה-= לדיבוג, והמרות !r.

f-string היא מחרוזת עם f לפני הגרש הפותח. כל מה שבתוכה בסוגריים מסולסלים הוא ביטוי ש-Python מחשבת ומכניסה לטקסט. זו הדרך הסטנדרטית לבנות פלט היום, והיא מחליפה ברוב הקוד החדש את עיצוב % ואת str.format().

כל דוגמה הורצה עם Python 3.13 ונבדקה מול ההפניה ל-f-strings ומיני-שפת מפרטי העיצוב.

היסודות

name = "Ada"
age = 36
print(f"{name} is {age} years old")
print(f"{age + 1} next year")
print(f"{name.upper()}")
Ada is 36 years old
37 next year
ADA

לפי התיעוד, הביטוי מטופל כמו כל ביטוי רגיל של Python.

אם הביטוי צריך גרשיים, משתמשים בגרש מסוג אחר בתוך הסוגריים. מאז Python 3.12 אפשר גם אותו סוג, אבל עדיף לא:

print(f"{'nested ' + 'quotes'}")
nested quotes

סוגריים מסולסלים שרוצים להדפיס כמות שהם נכתבים בכפל:

print(f"{{literal braces}}")
{literal braces}

מפרטי עיצוב: אחרי הנקודתיים

נקודתיים אחרי הביטוי פותחים מפרט עיצוב: fill, align, sign, width, grouping, precision ו-type, וכולם אופציונליים.

עשרוניים ואלפים

pi = 3.14159265
price = 1234567.891
print(f"{pi:.2f}")
print(f"{price:,.2f}")
3.14
1,234,567.89

.2f פירושו שתי ספרות אחרי הנקודה העשרונית, והפסיק מוסיף מפריד כל שלוש ספרות. _ במקום , נותן קו תחתון.

print(f"{1_000_000:_}")
1_000_000

ריפוד ויישור

< ליישור לשמאל, > לימין, ו-^ למרכז, עם רוחב:

name = "Ada"
print(f"{name:>6}|{name:<6}|{name:^7}|")
   Ada|Ada   |  Ada  |

תו לפני סימן היישור הוא תו המילוי. * לפני ^ נותן כוכביות:

print(f"{'x':*^9}")
****x****

מילוי מספר באפסים: 05d נותן חמש ספרות, עם אפסים מובילים.

age = 36
print(f"{age:05d}")
00036

אחוזים, הקסדצימלי ובינארי

print(f"{0.257:.1%}")
print(f"{255:x} {255:b} {255:#o}")
25.7%
ff 11111111 0o377

% מכפיל ב-100 ומוסיף סימן אחוז. x, b ו-o נותנים הקסדצימלי, בינארי ואוקטלי. # מוסיף את הקידומת.

רוחב דינמי

הרוחב או הדיוק יכולים לבוא ממשתנה, בתוך זוג סוגריים מסולסלים מקונן:

pi = 3.14159265
width = 8
print(f"{pi:{width}.3f}|")
   3.142|

מציין ה-= לדיבוג

שמים = אחרי ביטוי כדי להדפיס גם את הטקסט של הביטוי וגם את הערך. זה נוסף ב-Python 3.8:

age = 36
print(f"{age=}")
age=36

המרות: !r

!r מציג את הערך כמו repr(), וזה שימושי למחרוזות עם גרשיים או רווחים. התיעוד מזכיר גם את !s (str()) ואת !a (ascii()):

name = "Ada"
print(f"{name!r}")
'Ada'

טעויות נפוצות

  • שכחה של ה-f. "{name} is {age}" מדפיס את הסוגריים כמו שהם.
  • שימוש במפרט במקום בהמרה. ההמרה היא !r, והמפרט הוא נקודתיים ואחריהם הפורמט.
  • הסתמכות על עיגול בתצוגה. f"{2.675:.2f}" מציג 2.67, מאותה סיבה כמו round(2.675, 2) בפוסט על פעולות על מספרים.
  • תבנית מקלט משתמש. משתמשים ב-f-strings רק עם תבנית שאתם שולטים בה.

מה הלאה

בפוסט הבא: פעולות על מספרים: /, ‏//, ‏% ו-**.