• בלוג
  • תרגיל פייתון פשוט

תרגיל פייתון פשוט

24/09/2020

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

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

1. מה אנחנו בונים

נכתוב תוכנית פייתון המקבלת 10 מספרים מהמשתמש ומדפיסה את המספר הגדול מביניהם.

2. ניסיון 1

סכום של 10 מספרים? קלי קלות, אני יודע לכתוב לולאות for:

nums = []
for i in range(10):
    num = input("Enter a number: ")
    nums.append(int(num))

print(f"Maximum number is: {max(nums)}")

עובד? כן. אבל:

  1. הקוד שומר רשימה של כל הערכים שקיבלנו מהמשתמש בזיכרון.

  2. אין טיפול בערך לא תקני.

  3. הקוד מרגיש מסורבל, למרות שבמבט ראשון לא לגמרי ברור איך לשפר את זה.

בואו נתחיל עם הדברים שאנחנו יודעים איך לפתור.

3. ניסיון 2 - טיפול בקלט לא תקין ושמירת רק מספר אחד בזיכרון

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

def numeric_input(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("Numeric input required")
            continue

max_num = float('-inf')

for i in range(10):
    next_value = numeric_input(f"Enter a number #{i+1}: ")
    max_num = max(max_num, next_value)

print(f"Maximum number is: {max_num}")

הקוד אולי יותר ארוך אבל נראה הרבה יותר טוב. את פונקציית העזר numeric_input כדאי להוציא לקובץ חיצוני ואז גם נוכל לקצר את התוכנית.

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

4. ניסיון 3 - נארגן אחרת את הקוד כך שישתמש בפונקציה max בצורה טובה יותר

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

def numeric_input(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("Numeric input required")
            continue

max_num = max(numeric_input(f"Enter a number #{i+1}: ") for i in range(10))

print(f"Maximum number is: {max_num}")

וכמובן אחרי שנוציא את numeric_input לקובץ חיצוני נישאר עם קוד קצר יותר, מדויק יותר וגם נכון יותר.