דוגמאות
תוכניות קצרות שמחברות כמה יחידות. כל אחת נבדקה שהיא רצה.
אלה לא התרגילים של הקורס. הן נכתבו כאן כדי לראות איך הנושאים מתחברים, ובכל אחת כתוב מאיזו יחידה מגיע כל חלק. נסו לפתור לבד קודם, ורק אחר כך לקרוא את הפתרון.
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.1SECRETבאותיות גדולות, כי זה קבוע. ומותר לקרוא אותו מתוך הפונקציה, כי זה קבוע (פרק 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 מחוץ ללולאה, אחרת הפונקציה הייתה
חוזרת אחרי האיבר הראשון.