קורס Python 3 שיעור לולאות


זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/07-loops

בתרגיל for range) demo 4)
אני מקבל הודעת שגיאה

    print( i * J, end ="")
NameError: name 'J' is not defined

יתכן שצריך להוריד ספריות? אם כן איזה?

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

לייק 1

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

הי אליעזר,

ברוך הבא לפורום - קודם כל אתה יכול להיכנס למסך הפרופיל שלך (לחיצה על המספר 1 בעיגול אדום בצד שמאל למעלה) ולבחור לך שם יותר נחמד מ 11155.

לגבי השאלה - הרעיון שבדרך כלל print מדפיס משהו למסך ומיד יורד שורה. לכן אם אכתוב את הקוד הבא:

print("one")
print("two")
print("three")

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

print("one", end="")
print("two", end="")
print("three", end="")

ידפיס את שלושת המילים one, two ו three ברצף כמילה אחת בשורה אחת (נסה את זה כדי לראות מה קורה).

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

אפשר לראות את זה אם תריץ את הקוד הבא אצלך על המכונה:

print("one", end="")
print("two")
print("three")

הדפסה כזו תדפיס את המילה one ואחריה ברצף באותה שורה את המילה two, ואז תרד שורה ותדפיס את three בשורה חדשה. אפשר היה לכתוב את אותו קטע גם כך:

print("one", end="")
print("two", end="")
print()
print("three")

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

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

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

הי אליעזר,
המפתח הוא שתי הלולאות:

  1. הלולאה החיצונית (הראשונה) עוברת על השורות
  2. והלולאה הפנימית (השניה) על הערכים בכל שורה

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

מה הפונקציה item עושה לא הוסבר אשמח להסבר תודה

הי,

אני לא מוצא בשיעור התיחסות לפונקציה בשם item (יש בפייתון פונקציה בשם items אבל לדעתי גם בה לא השתמשתי בשיעור זה)

יכול להדביק כאן את דוגמת הקוד שראית איתה? אפילו רק שורה

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

name = 'ynon'

או:

item = 'think'

לולאה היא עוד דרך להגדיר משתנה, והיא מיוחדת כיוון שפייתון מריץ את ״גוף הלולאה״ מספר פעמים, וכל פעם נותן למשתנה ערך אחר. בדוגמה של לולאת for שהדבקת גוף הלולאה הוא בסך הכל שורת ה print הבודדת שנמצאת בשורה שאחרי ה for, אבל אפשר להוסיף שם כמה שורות שנרצה. פקודת for מגדירה את המשתנה, תריץ את גוף הלולאה מספר פעמים וכל פעם למשתנה item יהיה ערך אחר.

בדוגמה של פקודת for היא מריצה את גוף הלולאה מספר פעמים שיתאים למספר הפריטים שכתבנו לה אחרי המילה in. בקוד שהדבקת הפונקציה text.split() מחזירה את כל המילים במשפט, ולכן גוף הלולאה ירוץ מספר פעמים כמספר המילים במשפט, וכל ריצה שלו פקודת for תתן למשתנה item ערך שונה מתוך רשימת המילים, לפי סדר המילים.