עבודה עם מחרוזות (Strings)

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

  1. שיטות של מחרוזות (String Methods):
    פונקציות שימושיות לעבודה עם טקסטים, כמו חיתוך, חיפוש, ושינוי תווים.
  2. עיצוב מחרוזות (String Formatting):
    איך לשלב נתונים שונים בטקסט בקלות.
  3. ביטויים רגולריים (Regular Expressions):
    כלי חזק לחיפוש והחלפה של דפוסים בטקסט.

דוגמת קוד

# String methods
text = " Hello, Python World! "
print("Original text:", text)

cleaned_text = text.strip()  # Remove whitespace from both ends
print("After strip:", cleaned_text)

uppercase_text = cleaned_text.upper()  # Convert to uppercase
print("Uppercase:", uppercase_text)

contains_python = "Python" in cleaned_text  # Check if 'Python' is in the string
print("Contains 'Python':", contains_python)

# String formatting
name = "Alice"
age = 25
formatted_text = f"My name is {name} and I am {age} years old."  # Using f-strings
print("\nFormatted text:", formatted_text)

# Regular expressions
import re
pattern = r"\d+"  # Regular expression to find digits
string = "My phone number is 12345."
match = re.search(pattern, string)
if match:
    print("\nFound digits:", match.group())

הסבר על הקוד

שיטות מחרוזות (String Methods):

  1. strip:
    • השיטה strip מסירה רווחים מיותרים בתחילת וסוף המחרוזת.
    • לדוגמה: " Hello, Python World! " הופך ל-"Hello, Python World!".
  2. upper:
    • השיטה upper הופכת את כל האותיות במחרוזת לאותיות גדולות.
  3. in:
    • אופרטור in בודק אם מחרוזת מסוימת קיימת בתוך מחרוזת אחרת.

עיצוב מחרוזות (String Formatting):

  • f-strings מאפשרים שילוב של משתנים בתוך מחרוזת בצורה פשוטה ונוחה.
    • לדוגמה: f"My name is {name}" משלב את הערך של המשתנה name במחרוזת.

ביטויים רגולריים (Regular Expressions):

  1. re.search:
    • מחפש דפוס מסוים במחרוזת.
    • בדוגמה שלנו, r"\d+" מחפש רצף של ספרות (\d+).
  2. match.group:
    • מחזיר את התוצאה הראשונה שמצאה התאמה.

Regular Expressions הוא נושא קצת מורכב וכדאי לחקור וללמוד עליו בנפרד.

תרגילים

תרגיל 1:
צרו מחרוזת עם רווחים בתחילתה ובסופה. השתמשו בשיטה strip להסרת הרווחים והדפיסו את התוצאה.

תרגיל 2:
כתבו תוכנית שמשנה מחרוזת לאותיות גדולות עם upper ולאחר מכן מחזירה אותה לאותיות קטנות עם lower.

תרגיל 3:
כתבו תוכנית שבודקת אם מילה מסוימת קיימת בתוך מחרוזת. לדוגמה, בדקו אם המילה "Python" קיימת במחרוזת "I love Python programming.".

תרגיל 4:
צרו מחרוזת עם שם וגיל. השתמשו ב-f-strings כדי להדפיס משפט כמו: "שמי [שם] ואני בן [גיל].".

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

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

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

# Global data structures
questions = {
    "What is 2 + 2?": 4,
    "What is the capital of France?": "Paris",
    "What is 5 * 6?": 30
}
players = set()  # Set to track player names

# Function to welcome the player and handle admin or regular user flow
def welcome():
    """Welcome the player and check if they are admin."""
    print("Welcome to the Quiz Game!")
    name = input("What is your name? ").strip()  # Clean up input with strip
    players.add(name)  # Add the player to the set of players
    
    if name.lower() == "admin":
        print("Hello, Admin! You can manage the quiz.")
        manage_quiz()
    else:
        print(f"Hello, {name}, let's start the game!")
        play_quiz(name)

# Function to validate answers using regular expressions
def validate_answer(answer, correct_answer):
    """Check if the answer matches the correct format."""
    import re
    if isinstance(correct_answer, int):
        pattern = r"^\d+$"  # Regular expression for integers
    else:
        pattern = r"^\w+$"  # Regular expression for words
    if re.fullmatch(pattern, answer):
        return str(answer).lower() == str(correct_answer).lower()
    return False

# Function to add or remove questions
def manage_quiz():
    """Allow the admin to add or remove questions."""
    global questions  # Use the global dictionary
    
    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  # Add to the dictionary
            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]  # Remove from the dictionary
                print("Question removed!")
            else:
                print("Question not found.")
        else:
            print("Invalid option. Try again.")

    print("\nUpdated questions:", questions)
    play_now = input("Do you want to play the game now? (yes/no): ").lower().strip()
    if play_now == "yes":
        play_quiz("Admin")

# Function to play the quiz
def play_quiz(name="Player"):
    """Play the quiz game using the global questions dictionary."""
    global questions  # Use the global dictionary
    score = 0  # Initialize score

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

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

    print("\nGame over!")
    print(name, "your final score is:", score)
    print("Players who have played:", players)

# Start the program
welcome()

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

  1. שימוש ב-strip:
    • כל הקלטים מהמשתמש מנוקים מרווחים מיותרים בתחילה ובסוף.
  2. אימות קלט באמצעות ביטויים רגולריים:
    • הפונקציה validate_answer בודקת אם התשובה מתאימה לסוג הנכון (מספר או מילה).
  3. שימוש בשיטות מחרוזות:
    • כל התשובות מומירות לאותיות קטנות עם lower לצורך השוואה.