487
2

10 טיפים וטריקים שכל מפתח פייטון צריך להכיר

487
זמן קריאה: 4 דקות

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

*המאמר נכתב עבור פייתון 3.0+ אך חלק מהדברים תקפים גם עבור גרסאות נמוכות יותר של השפה.

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

  1. השמה מרובה למשתנים – השמה מרובה פירושה לתת לשני משתנים או יותר את אותו הערך. במקום לעשות השמה לתוך משתנה בכל שורה, ניתן לעשות השמה מרובה בשורה אחת באופן הבא:

2. list comprehension – לדעתי האישית, מדובר באחת מהיכולות החזקות של השפה. מדובר ביכולת שעוזרת לנו להיפטר מבלוקים של לולאות for/while למניהן. בנוסף, זה נחשב למהיר יותר מאשר בלוק של לולאת for וגם קריא יותר:

3. משפטים מותנים – מדובר למעשה בגרסא קריאה יותר של אופרטור טרינארי שקיים בשפת C. על מנת להימנע מבלוקים של if..else ולגרום לקוד להיות יותר “קצר” וקריא ע”י משפטים מותנים. ניתן להשתמש ביכולת זו בהמון מקומות בקוד, לדוגמא: בlist comprehension, בפונקציית print, השמות למשתנים ועוד:

4. הכרת המימוש מאחורי הקלעים של List – בשיעורים התיאורטיים נוהגים ללמד אותנו כי יש מערך ויש רשימה, ממומשת בד”כ על-ידי רשימה מקושרת (מבנה עם מצביע למבנה הבא). בפייתון, המבנה List ממומש ע”י מערך. כלומר, נוכל לגשת לאיברים לפי אינדקס בזמן O(1) – אבל, במידה והקוד שלנו מרובה בהכנסות לראש הרשימה, באמצעות השגרה list.insert(index, element), אנו “נשלם” מאחורי הקלעים בזמן ריצה שכן בגלל אופן המימוש בכל הכנסה מתבצעת הזזה של איברי הרשימה מהמקום index ועד לסוף הרשימה.
לכן נעדיף להשתמש בlist.append אשר מכניסה איבר לסוף הרשימה, או שעדיף להשתמש במבנה deque מתוך מודול collections, אשר ממומש ע”י רשימה (מסורתית) דו כיוונית.

5. swap בשורה אחת – טריק נחמד שאפשר לעשות כדי להחליף ערך של אובייקטים בשורה אחת “ללא משתנה עזר”.

6. f-strings – במקרים בהם אנו נדרשים לשרשר מחרוזת עם ערך של משתנה לטובת השמה, הדפסה וכו’, מומלץ להשתמש ב f-strings. השימוש בהם שומר על הקוד אלגנטי, נקי, קריא ומהיר. שימו לב לדוגמא המצורפת. שורה 4 הינה בזבזנית עקב האופן שבו ממומשים סטרינגים בפייתון, שורה 5 יכולה להפוך בקלות להיות לא קריאה וקשה למעקב (תארו לכם שהיו 5 משתנים בתוך המרכאות ולא רק 2) ובשורה 6 מודגמת היכולת של f-string.

7. return מרובה ערכים – באופן כללי, ניתן להחזיר ערך 1 לכל היותר מפונקציה (לא נכנס לזה כאן, אבל מדובר במגבלה מהמימוש שמתורגם מאחורי הקלעים לשפת אסמבלי). פייתון הביאה את היכולת להחזיר “כמה” ערכים – ה”כמה” נרשם במרכאות מפני שמאחורי הקלעים האינטרפטר של פייתון עוטף את המשתנים לתוך משתנה Tuple ומחזיר אותו, כך יוצא שבסוף מחזירים משתנה אחד. כשחוזרים למקום שממנו נקראה הפונקציה, מבוצע Unpack לTuple לתוך משתנים כמספר הערכים שהחזרנו:

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

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

10. בדיקה האם פלינדרום – מכירים את השאלה הזו בראיונות עבודה שמבקשים לבדוק האם בהינתן סטרינג הוא פלינדרום? אז בפייתון ניתן לבדוק זאת בשורה אחת, באמצעות היכולות של slicing. סליסינג בנוי כך שהוא יכול לקבל עד 3 פרמטרים [start:stop:step], ישנו ערך דיפולטיבי לפרמטרים כך שבמידה ונעביר רק step = -1 אנו למעשה נעבור על כל הרשימה מהסוף להתחלה:

עומרי נעים
WRITEN BY

עומרי נעים

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

2 thoughts on “10 טיפים וטריקים שכל מפתח פייטון צריך להכיר

  1. ברור שכל מפתח פייתון צריך להכיר את זה, אלו פיצ’רים מאוד בסיסיים בשפה, מי שלא מכיר אחד מהדברים האלה לא יכול להיקרא מפתח פייתון.
    וגם list comprehension הוא הרבה פחות קריא מסתם לולאת for, רק בדוגמא שלך לקחת קוד שלא אמור להיות מידי קריא בשביל להראות שהוא יותר קריא באמצעות list comprehension, אבל הדוגמא עצמה לא טובה, כי היא יכולה להיות הרבה יותר קצרה וקריאה – numberts_list = list(range(10))
    וגם 5 ו-7 זה אותו דבר בדיוק, רק ש-7 החזרת tuple מפונקציה, וב-5 כתבת את הtuple בהשמה.

    • · 18 במאי 2022 at 22:21

      ראשית תודה על הביקורת, אנחנו כאן כדי להתפתח וללמוד, וכך גם הקוראים שלנו 🙂

      לגבי הדוגמא של list comprehension, כשמה כן היא, דוגמא. המטרה הייתה להמחיש כיצד משתמשים בפיצ’ר.

      לגבי 5,7 – מדובר בuse cases שונים לחלוטין ולכן ראיתי לנכון להקדיש לכל אחד מהם סקשן משלו.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *