פונקציות

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

הנה מה שנלמד בשיעור הזה:

  1. הגדרת פונקציות ושימוש בהן (Defining and Calling Functions): איך להגדיר פונקציה ואיך לקרוא לה כדי להפעיל אותה.
  2. פרמטרים וערכי החזרה (Parameters and Return Values): איך לשלוח מידע לפונקציה ולקבל ממנה תוצאה.
  3. תחום משתנים (Scope) ומשתנים גלובליים (Global Variables): איך משתנים עובדים בתוך ומחוץ לפונקציות.

פונקציות יוצרות תחום משתנים (Scope) מוגבל, שבו משתנים שמוגדרים בתוך הפונקציה נקראים משתנים מקומיים.
משתנים שמוגדרים מחוץ לפונקציה נקראים משתנים גלובליים, והם קיימים בכל התוכנית.

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

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

דוגמת קוד

# Defining and calling functions
def greet(name):  # A function with a parameter
    print("Hello,", name)

greet("Alice")  # Calling the function with an argument

# Function with return value
def add_numbers(a, b):
    return a + b  # Return the sum of a and b

result = add_numbers(5, 3)  # Call the function and store the result
print("The result is:", result)

# Global variable
x = 10  # This variable is in the global scope

def modify_variable():
    x = 5  # Local variable with the same name as the global variable
    print("Inside function, local x =", x)

# Calling the function
modify_variable()

# Print the global variable after the function call
print("Outside function, global x =", x)

הסבר על הקוד

הגדרת פונקציות ושימוש בהן:

  • השורה def greet(name): מגדירה פונקציה בשם greet עם פרמטר name.
    • פרמטר הוא משתנה שמשמש את הפונקציה.
  • בתוך הפונקציה, אנו מדפיסים הודעת ברכה.
  • השורה greet("Alice") מפעילה את הפונקציה ושולחת את המחרוזת "Alice" כערך לפרמטר name.

פונקציה עם ערך החזרה:

  • השורה def add_numbers(a, b): מגדירה פונקציה בשם add_numbers עם שני פרמטרים: a ו-b.
  • השורה return a + b מחזירה את סכום שני הערכים.
  • השורה result = add_numbers(5, 3) מפעילה את הפונקציה ושומרת את התוצאה במשתנה result.

תחום הגדרה של משתנים:

משתנה גלובלי:
המשתנה x = 10 מוגדר מחוץ לפונקציה ולכן הוא גלובלי וזמין בכל חלקי התוכנית.

משתנה מקומי:
בתוך הפונקציה modify_variable, יצרנו משתנה חדש בשם x שמקבל את הערך 5.

  • זהו משתנה מקומי שנמצא ב-scope של הפונקציה בלבד.
  • הוא לא משנה את הערך של המשתנה הגלובלי x.

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

תרגילים

תרגיל 1:
כתבו פונקציה שמדפיסה ברכה מותאמת אישית, למשל: "שלום [שם]!".

תרגיל 2:
כתבו פונקציה שמקבלת שני מספרים ומחזירה את הסכום שלהם.

תרגיל 3:
צרו פונקציה שמבקשת מהמשתמש מספר, מכפילה אותו ב-2 ומחזירה את התוצאה.

תרגיל 4:
כתבו פונקציה שמשתמשת במשתנה גלובלי ומוסיפה לו ערך חדש.

תרגיל 5:
אתגר: צרו פונקציה שמחשבת את הממוצע של רשימה של מספרים.

הפרויקט הגדול: משחק הטריוויה

שלב הזה, נהפוך חלק מהקוד לפונקציות כדי להפוך את המשחק ליותר מסודר וקל לניהול.

# Quiz Game - Using functions
def welcome_player():
    """Display the welcome message and get the player's name."""
    print("Welcome to the Quiz Game!")
    name = input("What is your name? ")
    print("Hello,", name, "let's start!")
    return name

def ask_question(question, correct_answer):
    """Ask a question and check the player's answer."""
    print("\n" + question)
    answer = input("Your answer: ")
    if str(answer).lower() == str(correct_answer).lower():
        print("Correct!")
        return True
    else:
        print("Wrong! The correct answer was:", correct_answer)
        return False

def play_quiz():
    """Main function to play the quiz game."""
    player_name = welcome_player()  # Call the welcome function
    score = 0  # Initialize score

    # List of questions and answers
    questions = [
        {"question": "What is 2 + 2?", "answer": 4},
        {"question": "What is the capital of France?", "answer": "Paris"},
        {"question": "What is 5 * 6?", "answer": 30}
    ]

    # Loop through the questions
    for q in questions:
        if ask_question(q["question"], q["answer"]):
            score += 1
        else:
            break  # End the game if the answer is wrong

    print("\nGame over!")
    print(player_name, "your final score is:", score)

# Start the game
play_quiz()

הסבר:

  1. התוכנית שלנו מתחילה עם קריאה לפונקציה play_quiz. לפני זה יש לנו רק הגדרות של פונקציות. הגדרה של פונקציה לא "מפעילה" אותה, היא לא גורמת לה לרוץ. היא רק מכינה אותה לשימוש עתידי.
  2. יצרנו פונקציה welcome_player שמטפלת בהודעת הפתיחה ובקבלת שם השחקן. הפונקציה play_quiz קוראת לפונקציה welcome_player.
  3. פונקציה ask_question אחראית לשאול שאלות ולבדוק את התשובה. היא מקבלת בקריאה שלה שאלה ותשובה מתוך המאגר, מוציאה לשחקן שורה שבה הוא עונה על השאלה ובודקת את התשובה.
    • היא מחזירה True אם התשובה נכונה, או False אם התשובה שגויה.
  4. הפונקציה הראשית play_quiz מחברת את כל החלקים, מנהלת את ניקוד השחקן, ומציגה את התוצאה הסופית.