והפעם שאלה (קטנה) לחכמי שפת (כת/דת) נחש הפיתון....

jellymean

New member
והפעם שאלה (קטנה) לחכמי שפת (כת/דת) נחש הפיתון....

# שפת/כת/דת נחש הפיתון

איך אתם מסמנים בקוד סיום של לולאה?

חשבתי אולי להשתמש בהערה בסכנון הבא.....

# E.O.L - End Of Loop

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

hopipe

New member
סימון לולאה

אני לא ראיתי אי פעם שמישהו סימן סיום לולאה בpython,
אם זה רק למטרת לימוד אפשר להוסיף הערה אבל הייתי מוריד אותה אחרי השיעורים הראשונים שהתלמיד לא יתחיל להכניס את זה לכל לולאה שהוא כותב
 

jellymean

New member
בשפות תכנות תמיד היה סימון להתחלה וסיום של בלוק של פקודות

בשפות מסויימות (פסקל) זה היה begin...end, בשפת בייסיק לולאת FOR הגיעה עם פקודת NEXT ובשפת C++ הסוגריים המסולסלות המפורסמות.

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

לנחש פיתון פיתרונים.
 

bismark1

New member
לא ככה

בפייתון אינדנטציה שבורה == קוד שבור, או שהאינטרפרטר יצעק או שיהיה לך באג. יש תקן לשפה PEP-8 שמגדיר בדיוק איך הקוד צריך להראות ורוב העורכים יודעים לעבוד איתו, מומלץ להצמד אליו.
בכל מקרה, אל תלמד לדחוף הערה בסוף כל בלוק, שאר המתכנתים בגן יצחקו עליו.
 

יבגניי34

New member
וכתוצאה מפתחים בילו שעות בוויכוחים איפה לשים אותם ״סימונים״

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

jellymean

New member
אז מה עושים במקרה הבא....

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

בנוסף, כאשר רוצים לעטוף בלוק בלולאה, צריך לעדכן את כל האינדנטציות.
כאשר רוצים לבטל לולאה צריך לתקן את כל האינדנטציות.

הסימן של התחלת/סיום בלוק זה לא "פורמט" במובן של קישוט. זה חלק מהמבנה ומהמשמעות של הקוד.
 

choo

Active member
בדיוק כמו שבפועל עושים בכל שפה אחרת

&nbsp
בכל שפה שתומכת בבלוקים, אנשים עדיין מבצעים אינדנטציה של הקוד שבתוך הבלוק, כדי שויזואלית יהיה קל לראות את הקינון. אחד מפרידים בין שני בלוקים? עם שורה ריקה. צריך להזיז את כל השוקות כשמכניסים לבלוק? גם בשפות אחרות עושים את זה בפועל, אחרת מקבלים קוד בלתי קריא.
&nbsp
כל מה שאמרו שפייתון הוא: אם ממילא אנשים עובדים קשה לדאוג לאינדנטציה של הקוד, אין טעם לדרוש מהם להשקיע גם בהוספת סימון סיום בלוק. זה מונע את הבעיה שמישהו דאג לאינדנטציה, אבל שכח את פקודות תחילת/סיום הבלוק. הוא "קורא" בעיניים שיש כאן בלוק, אבל הקומפיילר מצידו חושב שאין בלוק. בפייתון - הקוד יעבוד לפי איך שהוא נראה ויזואלית, ולכן תקלה כזו לא תתרחש. מאוד קל להתרגל לזה, אחרי שמתגברים על הנטיה להיצמד לדברים (הלאו-דווקא טובים) המוכרים.
 

jellymean

New member
יש על זה ויכוחים רבים.... לדעתי יש בזה פוטנציאל לבאגים...

קוד:
// C
if (test(x))
f1();
f2();

// C 
if (test(x))
{
f1();
}
f2();

// python
if (test(x)):
  f1();
f2();

// python
if (test(x)):
   f1();
   f2();
 
דווקא בדוגמה שנתת...

דווקא בדוגמה שנתת, הקוד הראשון של שפת C מאוד מטעה: זה מתקמפל בלי בעיה, הסטייטמנט f1 יתבצע עם תלות בתנאי, והבא אחריו, f2, יתבצע תמיד.
אבל בעיניים אנושיות, שני הסטייטמנטס נראים כאילו הם אותו בלוק שמתבצע כתלות בתנאי..
בפייתון תהיה חייב לכתוב סטייטמנט עם אינדנטציה אחרי התנאי (גם pass נחשב לצורך זה). במובן הזה, תהיה לך שגיאת runtime (או ״קומפילציה״ ברמת ה IDE) אם תנסה לכתוב גם את התנאי וגם את f1 באותה אינדנטציה.
כלומר הקוד הבא יעיף שגיאת IndentationError:
קוד:
if foo:
f1()
f2()
 

jellymean

New member
פייתון היא בבחינת נתון.... אבל...

בשפות דמוייות C הסוגריים המסולסלות קובעות באופן ברור איפה מתחיל ואיפה נגמר בלוק של פקודות. זה הסגנון המועדף. אז שני הבלוקים הבאים זהים.
// C
if (test(x)) {f1(); f2();}
if (test(x))
{
f1();
f2();
}
אבל בשפת פייתון, מספיק שימישהו ילחץ בטעות על מקש ספייס או טאב או ימחק את האינדטציה בטעות עם DELETE כדי לשנות את הקוד.
// python
if (test(x)):
f1();
f2();
// mistake
if (test(x)):
f1();
f2(); # mistake press delete

וזה יכול להיות קבור בקוד ולעשות צרות....
 

choo

Active member
זה נראה כאילו אין לך נסיון של ממש בעולם האמיתי

&nbsp
כל אדם שלמד לתכנת בשפות אחרות, ונחשף לראשונה לפייתון, ישר אומר "אבל אם אין סימון ברור לסיום בלוק תהינה הרבה טעויות!". גם אני אמרתי את זה, כשלמדתי פייתון לראשונה.
&nbsp
בפועל, הנסיון מראה שמעבר לשבועות הראשונים, זה לא מייצר יותר באגים, מאשר הבאגים ההפוכים בשפות כמו סי, שבהן נדמה לך שהקוד מכונן כשהוא לא. והבאגים הללו בפייתון הרבה יותר קלים לתפיסה, מאשר הבאגים ההפוכים ב-C.
&nbsp
אתה פשוט בשלב השוק הראשוני כי "מישהו העז להזיז לך את הגבינה הקדושה" - היטב אני מכיר את התחושה הזו. במקרה הזה התחושה אינה מבוססת.
 

jellymean

New member
יש לי הרבה נסיון בעולם העסקי הממשי.... הדברים שלך מוזרים...

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

luis13

New member
אופנה?

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

jellymean

New member
תקרא את השרשור...

אני לא עובד עם פייתון.... אני בסה"כ מסייע לתלמיד (בית ספר לא אוניברסיטה) עם שיעורי הבית. עד כה כתבתי כמה דוגמאות ולא נפלתי עם האינדנטציה. אבל כשרציתי לעטוף בלוק של פקודות עם לולאה זה חייב עריכה ידנית. ייתכן שזה בגלל הסביבה. אני משתמש בסביבת מקוונת (IDE באתר אינטרנט) ואין לי כרגע צורך להתקין פייתון או איזה IDE כדוגמת PYCHARM. לדעתי צריכה להיות אפשרות לפתח בשפת תכנות גם עם NOTEPAD או למשל NOTEPAD++....

ואיך עורך IDE אמור לדעת איפה מתחיל ונגמר בלוק? הוא לא יכול לקרוא מחשבות ולנחש למה התכוון המתכנת.... אבל סימון ברור {} או אחר עדיף.
 

jellymean

New member
הכלי שאני עובד איתו באינטרנט, צועק במצב הבא...

if test(x):
print(x);
y = x;
אין פקודה אחרי התנאי.
אבל אף כלי לא אמור לדעת להחליט במקום המתכנת בין שני המצבים הבאים:

מצב א - בלוק של פקודה אחת
קוד:
if test(x):
    print(x);
x = y;
מצב ב - בלוק עם שתי פקודות
קוד:
if test(x):
    print(x);
    y = x;
 

vinney

Well-known member
לא, אבל הכלי כן יעשה לך אינדנטציה אוטומטית

כשאתה כותב if בלה בלה ":" ולוחץ אנטר - תקבל שורה חדשה עם טאב פנימה. כל שורה תמשיך להיות מיושרת לבלוק עד שתחליט לעשות backspace.
&nbsp
אם זה לא עובד בעורך שלך - תחליף עורך, אבל כל עורך נורמלי אמור לתמוך בזה.
 

luis13

New member
בקיצור

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