רשימות Lists and Tuples

רשימות (Lists) וטאפלות (Tuples) הן מבני נתונים בפייתון המאפשרים לנו לאחסן קבוצות של ערכים.

  • רשימות: אוספים הניתנים לשינוי (Mutable), בהם אפשר להוסיף, לשנות, ולהסיר פריטים.
  • Tuples: אוספים שאינם ניתנים לשינוי (Immutable), כלומר, הערכים בהם נשארים קבועים.
  • לערכים ברשימות יש מיקום מספרי. הפריט הראשון ברשימה מקבל את מקום 0, הפריט השני את מקום 1 וכן הלאה….

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

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

  1. איך ליצור, לגשת, ולשנות רשימות ו-Tuples.
  2. איך לעבור על פריטים ברשימה באמצעות לולאה.
  3. איך לעבוד עם רשימות מקוננות (Nested Lists) – רשימות בתוך רשימות.

דוגמת קוד

# Creating and modifying a list
my_list = ["apple", "banana", "cherry"]  # Creating a list
print("Original list:", my_list)

my_list[1] = "blueberry"  # Modifying an element
print("Modified list:", my_list)

# Iterating through a list
print("Iterating through the list:")
for item in my_list:
    print(item)

# Creating and accessing a tuple
my_tuple = ("dog", "cat", "rabbit")  # Creating a tuple
print("\nTuple:", my_tuple)
print("First element in the tuple:", my_tuple[0])

# Nested lists
nested_list = [
    ["Alice", 85],
    ["Bob", 90],
    ["Charlie", 78]
]
print("\nNested list example:")
for student in nested_list:
    print("Name:", student[0], "- Score:", student[1])

הסבר על הקוד

יצירת רשימות ושינויים:

  • השורה my_list = ["apple", "banana", "cherry"] יוצרת רשימה עם שלושה פריטים.
  • כדי לשנות פריט, השתמשנו ב-my_list[1] = "blueberry" ששינה את הערך של הפריט השני ברשימה.

מעבר על רשימה עם לולאה:

  • בלולאת for, עברנו על כל פריט ברשימה עם for item in my_list.
    • כל פריט הודפס בנפרד.

יצירת Tuple וגישה לערכים:

  • השורה my_tuple = ("dog", "cat", "rabbit") יוצרת Tuple עם שלושה פריטים.
    • Tuple היא מבנה נתונים שאי אפשר לשנות לאחר יצירתו.
  • כדי לגשת לפריט הראשון ב-Tuple, השתמשנו ב-my_tuple[0].

רשימות מקוננות:

  • nested_list היא רשימה שבה כל פריט הוא רשימה נוספת.
    • לדוגמה: כל רשימה פנימית מכילה שם של תלמיד ואת הציון שלו.
  • בלולאת for, עברנו על הרשימה החיצונית, ובכל חזרה גישה הייתה לשם התלמיד (student[0]) ולציון (student[1]).

תרגילים

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

תרגיל 2:
שנו את הפריט השני ברשימה שלכם ל"אננס". הדפיסו את הרשימה המעודכנת.

תרגיל 3:
צרו Tuple עם שלושה צבעים והדפיסו את הפריט האחרון Tuple.

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

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

דוגמת קוד

# Adding items to a list
fruits = ["apple", "banana", "cherry"]
print("Original list:", fruits)

fruits.append("orange")  # Adding an item to the end
print("After append:", fruits)

fruits.insert(1, "blueberry")  # Adding an item at a specific position
print("After insert:", fruits)

fruits.extend(["grape", "melon"])  # Adding multiple items
print("After extend:", fruits)

# Removing items from a list
fruits.remove("banana")  # Removing by value
print("After remove:", fruits)

removed_item = fruits.pop(2)  # Removing by index
print("After pop:", fruits)
print("Removed item:", removed_item)

del fruits[0]  # Deleting the first item by index
print("After del:", fruits)

הסבר על הקוד

הוספת פריטים לרשימה:

  1. append:
    • השורה fruits.append("orange") מוסיפה את הפריט "orange" לסוף הרשימה.
  2. insert:
    • השורה fruits.insert(1, "blueberry") מוסיפה את הפריט "blueberry" למיקום השני ברשימה (אינדקס 1).
  3. extend:
    • השורה fruits.extend(["grape", "melon"]) מוסיפה את הפריטים "grape" ו-"melon" לסוף הרשימה.

הסרת פריטים מרשימה:

  1. remove:
    • השורה fruits.remove("banana") מחפשת את הפריט "banana" ברשימה ומסירה אותו.
    • אם הפריט לא קיים, תופיע שגיאה.
  2. pop:
    • השורה removed_item = fruits.pop(2) מסירה את הפריט במיקום אינדקס 2 ומחזירה אותו למשתנה removed_item.
  3. del:
    • השורה del fruits[0] מסירה את הפריט במיקום הראשון (אינדקס 0) מהרשימה.

תרגילים

תרגיל 1:
צרו רשימה ריקה והוסיפו אליה שלושה שמות בעזרת הפונקציה append. הדפיסו את הרשימה.

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

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

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

תרגיל 5:
אתגר: בקשו מהמשתמש להכניס חמישה מספרים, שמרו אותם ברשימה, ואז בקשו מספר נוסף להסרה. השתמשו ב-remove כדי להסיר אותו מהרשימה והדפיסו את הרשימה המעודכנת.

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

בשלב הזה, נשתמש ברשימה מקוננת כדי לנהל את השאלות והתשובות במשחק בצורה מסודרת יותר. בחלק הזה גם נוסיף הבדל בין שחקן רגיל לבין מנהל המשחק. מנהל המשחק (שחקן בשם admin) יוכל להוסיף שאלות ושחקן יוכל לשחק בלבד.

# Global list of questions
questions = [
    ["What is 2 + 2?", 4],
    ["What is the capital of France?", "Paris"],
    ["What is 5 * 6?", 30]
]

# 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? ")
    
    if name.lower() == "admin":
        print("Hello, Admin! You can add questions to the quiz.")
        add_questions()
    else:
        print(f"Hello, {name}, let's start the game!")
        play_quiz(name)

# Function to add questions to the global list
def add_questions():
    """Allow the admin to add questions to the global quiz list."""
    global questions  # Use the global questions list
    
    while True:
        new_question = input("Enter a new question (or type 'done' to finish): ")
        if new_question.lower() == "done":
            break
        new_answer = input("Enter the correct answer: ")
        questions.append([new_question, new_answer])  # Add to the global list
        print("Question added!")

    print("\nQuestions have been added!")
    play_now = input("Do you want to play the game now? (yes/no): ").lower()
    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 list."""
    global questions  # Use the global questions list
    score = 0  # Initialize score

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

        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)

# Start the program
welcome()

הסבר על הקוד

רשימת שאלות גלובלית:

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

הוספת שאלות:

  • פונקציה add_questions משתמשת במשתנה הגלובלי questions.
  • שאלות חדשות נוספות לרשימה הקיימת באמצעות questions.append([new_question, new_answer]).
  • כך שהשאלות החדשות זמינות גם לשחקנים אחרים וגם למנהל.

שימוש ברשימה הגלובלית במשחק:

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

איך עובד התהליך:

מנהל (admin):

  1. המנהל נכנס ומוסיף שאלות חדשות.
  2. לאחר מכן, השאלות מתווספות לרשימת השאלות הגלובלית.
  3. אם המנהל בוחר לשחק, הוא ישחק עם כל השאלות (החדשות והקיימות).

שחקן רגיל:

  1. נכנס לשחק ומשתמש ברשימת השאלות המלאה, כולל השאלות שהמנהל הוסיף.

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