פייתון

דוגמאות

תוכניות קצרות שמחברות כמה יחידות. כל אחת נבדקה שהיא רצה.

בעמוד הזה1. ממוצע וציון2. ספירת מילים3. ניחוש מספר4. מילה הפוכה ופלינדרום5. מלאי6. ממיר טמפרטורות

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

1. ממוצע וציון

המשימה: פונקציה שמקבלת רשימת ציונים, ומחזירה את הממוצע ואת הציון במילה.

יחידות: 4, 5, 6.

>>> def grade_report(grades):
...     """Returns the average and a word for it.
...
...     :param grades: the grades
...     :type grades: list
...     :return: the average and the word
...     :rtype: tuple
...     """
...     average = sum(grades) / len(grades)
...     if average >= 90:
...         word = "excellent"
...     elif average >= 70:
...         word = "good"
...     else:
...         word = "needs work"
...     return average, word
...
>>> grade_report([95, 80, 72])
(82.33333333333333, 'good')

מה לשים לב: word מקבל ערך בכל אחד משלושת הענפים. אם היה חסר else, ממוצע נמוך היה משאיר את word בלי ערך, ו-return היה נותן UnboundLocalError, סוג של NameError. זו המלכודת שפרק 4.2 מזכיר.

2. ספירת מילים

המשימה: כמה פעמים כל מילה מופיעה ברשימה.

יחידות: 7, 8.

>>> def count_words(words):
...     counts = {}
...     for word in words:
...         if word in counts:
...             counts[word] += 1
...         else:
...             counts[word] = 1
...     return counts
...
>>> count_words(["to", "be", "or", "not", "to", "be"])
{'to': 2, 'be': 2, 'or': 1, 'not': 1}

מה לשים לב: בלי הבדיקה if word in counts, הפעם הראשונה של כל מילה הייתה נותנת KeyError, כי אין עוד מה להגדיל.

3. ניחוש מספר

המשימה: לבקש מהמשתמש לנחש עד שיצליח, ולספור ניסיונות.

יחידות: 2, 4, 5, 7.

SECRET = 7


def main():
    attempts = 0
    while True:
        guess = int(input("Guess a number: "))
        attempts += 1
        if guess == SECRET:
            print("Got it in %d tries" % attempts)
            break
        elif guess < SECRET:
            print("Higher")
        else:
            print("Lower")


if __name__ == "__main__":
    main()

מה לשים לב:

  • int(...) סביב input. בלעדיו זו בדיוק השגיאה הלוגית מפרק 7.1
  • SECRET באותיות גדולות, כי זה קבוע. ומותר לקרוא אותו מתוך הפונקציה, כי זה קבוע (פרק 5.2)
  • while True עם break כשיש יציאה ברורה מבפנים

4. מילה הפוכה ופלינדרום

המשימה: האם מילה זהה כשקוראים אותה מהסוף.

יחידות: 3, 5.

>>> def is_palindrome(word):
...     word = word.lower()
...     return word == word[::-1]
...
>>> is_palindrome("Level")
True
>>> is_palindrome("Python")
False

מה לשים לב: return word == word[::-1] מחזיר את תוצאת ההשוואה ישירות. אין צורך ב-if ...: return True else: return False. ו-lower, אחות של upper, כדי ש-L ו-l ייחשבו שווים.

5. מלאי

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

יחידות: 7, 8.

>>> stock = {"apples": 12, "bread": 0,
...          "milk": 3, "eggs": 0}
>>> for item, amount in stock.items():
...     if amount == 0:
...         print("Out of %s" % item)
...
Out of bread
Out of eggs

מה לשים לב: for item, amount in stock.items() פורק כל זוג לשני משתנים, אותו פירוק כמו ב-a, b = b, a. הסרטון עובר על items עם משתנה אחד, ושני הסגנונות עובדים.

6. ממיר טמפרטורות

המשימה: רשימה של מעלות צלזיוס, ורשימה חדשה בפרנהייט.

יחידות: 5, 6, 7.

>>> def to_fahrenheit(celsius_list):
...     result = []
...     for c in celsius_list:
...         result.append(c * 9 / 5 + 32)
...     return result
...
>>> to_fahrenheit([0, 100, 37])
[32.0, 212.0, 98.6]

מה לשים לב: result = [] לפני הלולאה. אם היה בתוכה, הרשימה הייתה מתאפסת בכל איטרציה. ו-return result מחוץ ללולאה, אחרת הפונקציה הייתה חוזרת אחרי האיבר הראשון.