מודולים וספריות (Modules and Libraries)

מודולים וספריות מאפשרים להרחיב את היכולות של פייתון מבלי לכתוב הכל מאפס.

  • מודולים הם קבצי קוד מוכנים שמכילים פונקציות ושיטות לשימוש חוזר.
  • ספריות פופולריות כמו math, random, ו-os משמשות למגוון רחב של משימות, כגון חישובים מתמטיים, עבודה עם קבצים, ויצירת מספרים אקראיים.

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

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

דוגמת קוד

# Importing and using the math module
import math

print("Math module example:")
radius = 5
area = math.pi * math.pow(radius, 2)  # π * r^2
print(f"Area of a circle with radius {radius}: {area}")

# Importing and using the random module
import random

print("\nRandom module example:")
random_number = random.randint(1, 100)  # Generate a random integer between 1 and 100
print(f"Random number between 1 and 100: {random_number}")

# Importing and using the os module
import os

print("\nOS module example:")
current_directory = os.getcwd()  # Get the current working directory
print(f"Current directory: {current_directory}")

הסבר על הקוד

מודול math:

  • math.pi: קבוע של π (פאי).
  • math.pow(radius, 2): מעלה את radius בריבוע.
  • השתמשנו בקבוע ובפונקציה כדי לחשב את שטח המעגל.

מודול random:

  • random.randint(1, 100): מחזיר מספר אקראי בין 1 ל-100 (כולל).
  • שימושי ליצירת נתונים משתנים בצורה דינמית.

מודול os:

  • os.getcwd(): מחזיר את הנתיב לתיקייה הנוכחית שבה התוכנית רצה.
  • משמש לניהול קבצים וסביבות עבודה.

תרגילים

תרגיל 1:
השתמשו במודול math כדי לחשב את שטח של מעגל עם רדיוס שהמשתמש מזין.

תרגיל 2:
כתבו תוכנית שמשתמשת במודול random ליצירת רשימה של חמישה מספרים אקראיים בין 1 ל-50.

תרגיל 3:
בדקו את התיקייה הנוכחית שלכם בעזרת os.getcwd(), ואז צרו קובץ חדש בתיקייה זו בעזרת os.

תרגיל 4:
אתגר: השתמשו במודול random כדי ליצור מספר אקראי בין 1 ל-10 ושאלו את המשתמש לנחש אותו.

תרגיל 5:
כתבו תוכנית שמשתמשת ב-math.sqrt כדי לחשב את השורש הריבועי של מספר שהמשתמש מזין.

דוגמת קוד

קובץ math_utils.py – קובץ עם פונקציות מתמטיות

# math_utils.py

def circle_area(radius):
    """Calculate the area of a circle given its radius."""
    from math import pi
    return pi * (radius ** 2)

def add_numbers(a, b):
    """Add two numbers."""
    return a + b

קובץ main.py – הקובץ הראשי שמייבא את math_utils

# main.py

import math_utils  # Importing the custom module

print("Using math_utils module:")
radius = 5
print(f"Area of a circle with radius {radius}: {math_utils.circle_area(radius)}")

a, b = 3, 7
print(f"Sum of {a} and {b}: {math_utils.add_numbers(a, b)}")

הסבר על הקוד

  1. קובץ math_utils.py:
    • קובץ זה מכיל שתי פונקציות: circle_area לחישוב שטח מעגל ו-add_numbers לחיבור שני מספרים.
    • פונקציות אלו זמינות לשימוש בכל קובץ אחר שייבא את math_utils.
  2. קובץ main.py:
    • הקובץ הראשי מייבא את math_utils ומשתמש בפונקציות שהוגדרו בו.
    • ניתן לקרוא לפונקציות בצורה math_utils.circle_area כדי לציין את המקור שלהן.

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

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

קובץ quiz_questions.py
# quiz_questions.py
import os

questions_file = "questions.txt"

def load_questions():
    """Load questions from a file."""
    questions = {}
    if not os.path.exists(questions_file):  # Check if the file exists
        print(f"{questions_file} not found. Creating an empty file.")
        with open(questions_file, "w") as file:
            pass  # Create an empty file
    else:
        with open(questions_file, "r") as file:
            for line in file:
                question, answer = line.strip().split("||")  # Split by separator
                questions[question] = answer
    return questions

def save_questions(questions):
    """Save questions to a file."""
    with open(questions_file, "w") as file:
        for question, answer in questions.items():
            file.write(f"{question}||{answer}\n")  # Use "||" as separator

קובץ quiz_game.py

# quiz_game.py
import random
from quiz_questions import load_questions, save_questions

def play_quiz(name, questions):
    """Play the quiz game using the global questions dictionary."""
    score = 0  # Initialize score
    randomized_questions = list(questions.items())
    random.shuffle(randomized_questions)  # Shuffle the list

    # Loop through the questions
    for question, correct_answer in randomized_questions:
        print("\n" + question)
        user_answer = input("Your answer: ").strip()

        if str(user_answer).lower() == str(correct_answer).lower():
            print("Correct!")
            score += 1
        else:
            print("Wrong! The correct answer was:", correct_answer)

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

קובץ main.py

# main.py
from quiz_questions import load_questions, save_questions
from quiz_game import play_quiz

def welcome():
    """Welcome the player and handle user flow."""
    questions = load_questions()
    print("Welcome to the Quiz Game!")
    name = input("What is your name? ").strip()

    if name.lower() == "admin":
        manage_quiz(questions)
    else:
        play_quiz(name, questions)

def manage_quiz(questions):
    """Allow admin to manage questions."""
    while True:
        action = input("Do you want to 'add', 'remove', or 'done'? ").lower().strip()
        if action == "done":
            break
        elif action == "add":
            new_question = input("Enter a new question: ").strip()
            new_answer = input("Enter the correct answer: ").strip()
            questions[new_question] = new_answer
            print("Question added!")
        elif action == "remove":
            question_to_remove = input("Enter the question to remove: ").strip()
            if question_to_remove in questions:
                del questions[question_to_remove]
                print("Question removed!")
            else:
                print("Question not found.")
        else:
            print("Invalid option. Try again.")
    
    save_questions(questions)
    print("\nQuestions saved successfully!")

# Start the program
welcome()

שיפורים שנוספו לפרויקט:

  1. קובץ quiz_questions.py:
    • מכיל פונקציות לטעינת שאלות מקובץ ולשמירת שאלות לקובץ.
  2. קובץ quiz_game.py:
    • אחראי רק על ניהול המשחק (שאלת שאלות, חישוב ניקוד).
  3. קובץ main.py:
    • קובץ ראשי שמנהל את זרימת התוכנית.
  4. מודול random:
    • רשימת השאלות מתערבבת בסדר אקראי באמצעות random.shuffle.
  5. מודול os:
    • פונקציית os.path.exists בודקת אם קובצי השאלות והניקוד קיימים, ויוצרת אותם אם לא.