קלט

מה זה קלט?

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

דוגמאות לקלט

  1. משתמש מזין בתוכנה באמצעות המקלדת את שם המשתמש והסיסמה שלו.
  2. משתמש ב־Google מזין שאילתה, ואז לוחץ על "חיפוש".
  3. משתמש מזין את הקוד הסודי שלו בכספומט.
  4. משתמש פותח את הנעילה של הטלפון שלו באמצעות טביעת האצבע שלו.
  5. משתמש מכניס תמונה לתוכנת Photoshop, שתכליתה עריכת תמונות, כדי לבצע עליה פעולות גרפיות.
  6. משתמש פותח קובץ Word באמצעות התוכנה Microsoft Office.

כיצד מקבלים קלט?

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


In [ ]:
name = input("Please enter your name: ")
message = "Hello, " + name + "!"
print(message)

השורה הראשונה היא החידוש פה: בשורה זו אנחנו מבקשים קלט מהמשתמש (את השם שלו), ושומרים את הקלט שהזין במשתנה בשם name.
ברגע שפייתון מגיעה ל־input(), היא עוצרת כל פעולה, עד שתקבל קלט מהמשתמש.
לאחר מכן היא "מחליפה" את input() בקלט שקיבלה מהמשתמש.
לדוגמה, אם הזנתי כקלט Moishalah, מה שיקרה בפועל אלו השורות הבאות (השוו עם הקוד מלמעלה):


In [ ]:
name = "Moishalah"
message = "Hello, " + name + "!"
print(message)

תרגול

כתבו קוד המבקש כקלט שלושה נתונים: שם פרטי, שם משפחה ותאריך לידה.
הקוד יציג למשתמש ברכה חביבה.
לדוגמה, עבור הנתונים Israel, Cohen, 22/07/1992, הוא יציג:

Hi Israel Cohen! Your birthday is on 22/07/1992.


In [ ]:

המרת ערכים

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


In [ ]:
type(5)

In [ ]:
type(1.5)

In [ ]:
type('Hello')

אם אתם מרגישים שממש הספקתם לשכוח, שווה לכם להציץ בפרק 3, שמלמד על טיפוסים.

אם נשתעשע מעט עם input(), נגלה מהר מאוד שלפעמים הקלט מהמשתמש לא מגיע אלינו בדיוק כמו שרצינו.
בואו נראה דוגמה:


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
orly_apples = input("How many apples does Orly have? ")
apples_together = moshe_apples + orly_apples
print("Together, they have " + apples_together + " apples!")

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

חשוב!
פתרו לפני שתמשיכו!

  1. למשה יש 0 תפוחים, ולאורלי יש 5 תפוחים.
  2. למשה יש 2 תפוחים, ולאורלי יש 3 תפוחים.
  3. למשה יש -15 תפוחים, ולאורלי יש 2 תפוחים.
  4. למשה יש 2 תפוחים, ולאורלי יש -15 תפוחים.
  5. למשה יש nananana תפוחים, ולאורלי יש batman! תפוחים.

אז מה קרה בתרגול?

אף על פי שרצינו להתייחס לקלט כאל נתון מספרי (int), פייתון החליטה להתייחס אליו כמחרוזת (str), ולכן חיברה בין מחרוזות ולא בין מספרים.
מכאן אנחנו לומדים חוק חשוב מאוד, שאם ניטיב לזכור אותו יחסוך לנו הרבה תקלות בעתיד:

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

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


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
moshe_apples = moshe_apples + 1  # Give Moshe a single apple
print(moshe_apples)

המרת טיפוסים (Casting)

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

נזכיר שהטיפוס של כל קלט שנקבל בעזרת input() תמיד יהיה מחרוזת (str):


In [ ]:
color = input("What is your favorite color? ")
print("The type of the input " + color + " is...")
type(color)

In [ ]:
age = input("What is your age? ")
print("The type of the input " + age + " is...")
type(age)

כזכור, כל עוד הקלט שלנו הוא מסוג מחרוזת, פעולות כמו חיבור שלו עם מספר ייכשלו.
לכן נצטרך לדאוג ששניהם יהיו מאותו סוג על ידי המרה של אחד הערכים מסוג אחד לסוג אחר.
תהליך הפיכת ערך לסוג טיפוס אחר נקרא המרת טיפוסים, או Casting / Type Conversion.
אם נבחן את בעיית התפוחים של משה מהכותרת הקודמת:


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
moshe_apples = moshe_apples + 1  # Give Moshe a single apple
print(moshe_apples)

נראה שהקוד לא יעבוד, כיוון שאין אפשרות לחבר בין מחרוזת (מספר התפוחים של משה מהקלט של המשתמש) לבין מספר (ה־1 שאנחנו רוצים להוסיף).
כיוון שהמטרה היא להוסיף תפוח 1 למספר מסוים של תפוחים, נבחר להמיר את moshe_apples למספר שלם (int) במקום מחרוזת (str).
נעשה זאת כך:


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
moshe_apples = int(moshe_apples)  # <--- Casting
moshe_apples = moshe_apples + 1
print(moshe_apples)

איזה כיף, המרנו את מספר התפוחים של משה לערך מטיפוס שלם (שורה 2), ועכשיו הקוד עובד!
שימו לב שעכשיו אם נרצה להדפיס את מספר התפוחים לצד משפט שאומר "למשה יש X תפוחים", אנחנו עלולים להיתקל בבעיה.
המשפט שאנחנו רוצים להדפיס הוא str, ומספר התפוחים שחישבנו ושננסה לשרשר אליו יהיה int.
ראו איך זה ישפיע על התוכנית:


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
moshe_apples = int(moshe_apples)  # <--- Casting
moshe_apples = moshe_apples + 1
print("Moshe has " + moshe_apples + " apples")

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


In [ ]:
moshe_apples = input("How many apples does Moshe have? ")
moshe_apples = int(moshe_apples)  # <--- Casting to int
moshe_apples = moshe_apples + 1
moshe_apples = str(moshe_apples)  # <--- Casting to str
print("Moshe has " + moshe_apples + " apples")

טבלת המרה

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

צורת המרה שם בפייתון שם באנגלית שם בעברית
str(something) str string מחרוזת
int(something) int integer מספר שלם
float(something) float float מספר עשרוני

תרגול

קרמבו

לגברת עמיטלי מחוות ביסקוויט יש מפעל משוגע לייצור קרמבו.
אחד התפקידים במפעל הוא הרכבת קופסאות לאריזת הקרמבו ומילויה. אדון מרקוב מאייש תפקיד זה.
מרקוב מחליט על מימדיה של כל קופסת קרמבו טעים חדשה שהוא ממלא: כמה יחידות קרמבו יכנסו לגובה, כמה יכנסו לרוחב וכמה יכנסו לאורך האריזה.
בנו תוכנה שתעזור למרקוב לחשב את כמות הקרמבו שהוא הכניס לקופסה, לפי הנוסחה: $w \times h \times l$, רוחב כפול גובה כפול אורך.
לדוגמה: התוכנה תקבל ממרקוב כקלט 3 עבור האורך, 4 עבור הרוחב ו־2.5 עבור הגובה, ותחזיר את הפלט 30, שהוא $2.5 \times 3 \times 4$.


In [ ]:

תה אמריקה II

חזרו למחברת 2. זוכרים את התרגיל האחרון שהיה שם, על התה והמרת מעלות פרנהייט לצלזיוס?
בואו נבנה מחשבון פרנהייט לצלזיוס! בקשו מהמשתמש להכניס מספר בפרנהייט, והדפיסו את המספר בצלזיוס.
להזכירכם, הנוסחה היא: (5 חלקי 9) כפול (מעלות בפרנהייט פחות 32), או בכתיב מתמטי, $C = \frac{5}{9}\times(F - 32)$.
לדוגמה: עבור הקלט 212 התוכנה תדפיס 100, כיוון ש־212 מעלות פרנהייט הן 100 מעלות צלזיוס.


In [ ]:

מסטיק בזוקה

לפי מסטיק בזוקה, עד גיל 21 תגיעו לירח. אנחנו פחות אופטימיים (לנו פשוט זה פחות עבד), ומנבאים לך הצלחה עד גיל 90.
כתוב תוכנה שמקבלת כקלט את השם שלך ואת הגיל שלך, ומחשבת בעוד כמה שנים תגיע לירח לפי הנבואה שלנו.
התוכנה תדפיס את המשפט: X, wait another Y years., כאשר X יוחלף בשמך ו־Y יוחלף במספר השנים שתצטרך לחכות עד גיל 90.
לדוגמה: אם הכנסת לתוכנה שגילך הוא 25 ושמך הוא ים, התוכנה תדפיס:

Yam, wait another 65 years.


In [ ]: