Input vs ארגומנטים

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

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

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

לייק 1
  1. כלומר, תיאור כללי של התשובה שלך היא שלא נהוג לשים כארגומנט קריאה לפונקציה (נכון?)

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

אלי, מצטער אבל לא לגמרי הצלחתי להבין את השאלה :slight_smile: אשמח אם תחדדי לי.

מה שהתכוונתי להגיד הוא שעדיף לא לעשות input או print בתוך גוף הפונקציה, ואם צריך לקבל מהמשתמש קלט שישפיע על החישוב שבפונקציה – עדיף לעשות את זה מחוץ לפונקציה.
ניתן להגדיר בפונקציה פרמטר שיקבל את הקלט (התוכנה תשלח לו את הקלט ע"י העברה של הקלט לארגומנט), ואת הפלט של הפונקציה נהוג לשים ב־return במקום ב־print.

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

def my_name():
    return 'eli shami'

def my_random_function(my_name,message):
    name = my_name()
    return ("hello " + name + " " + message)

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

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

אזהרה לקוראים בקורס: זו שאלה מתקדמת, אין צורך להבין את התשובה כרגע

בגדול אם נרצה להעביר פונקציה כארגומנט לפונקציה זה יראה ככה:

def func1():
    return 1

def func2(another_function):
    return another_function() + 1

print(func2(func1))

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

def my_name():
    return 'eli shami'

def my_random_function(func ,message):
    name = func()
    return ("hello " + name + " " + message)

my_random_function(my_name, 'etztrubal')

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

הבנתי, תודה רבה!

אם כבר הזכרת את זה, אשמח להבהרה לגבי מה זה בדיוק ״חתימת הפונקציה״ ובמה זה שונה מ״כותרת הפונקציה״.
שאלתי את זה גם תחת ask us anything, אז תרגיש חופשי לא לענות ולהשאיר את זה לדיון שם :slight_smile:

המונחים באנגלית הם Function signature ו־Function header, ובפייתון הם הרבה פעמים לגמרי interchangeable.

המונחים בעיקר נשאבו משפות אחרות, כאשר Function signature מתייחס לשם הפונקציה, שמות הפרמטרים, הסוג שלהם והמיקום שלהם, ו־Function header מתייחס לכל אלו וגם לסוג המשתנה שחוזר מהפונקציה.

ניתן למצוא התייחסות למונח Function signature בתוך החלטה רשמית מספר 362 של פייתון (PEP 362), ול־Function header פחות.

בגדול – את יכולה להשתמש במה שנוח לך ומתכנתים טובים יבינו אותך. בקטן – בפייתון כנראה עדיף שתתרגלי להשתמש ב־Function signature. בעברית גם ככה לאף אחד לא אכפת :slight_smile:

לייק 1