Skip to content

python mini project #500

Description

Q1 — Student Result Analyzer

The required function is analyze_result(name, roll, marks), including total, average, grade, and subjects below 40.

def analyze_result(name, roll, marks):
total = sum(marks)
average = total / len(marks)

if average >= 90:
    grade = "A"
elif average >= 75:
    grade = "B"
elif average >= 60:
    grade = "C"
elif average >= 40:
    grade = "D"
else:
    grade = "Fail"


below_40 = []


for i in range(len(marks)):
    if marks[i] < 40:
        below_40.append(f"Subject {i + 1}")


print(f"Student: {name} (Roll: {roll})")
print(f"Total: {total}, Average: {average}")
print(f"Grade: {grade}")


if below_40:
    print("Subjects below 40:", ", ".join(below_40))
else:
    print("Subjects below 40: None")

name = "Aarav"
roll = 101
marks = [88.5, 35.0, 76.0, 92.5, 48.0]

analyze_result(name, roll, marks)

Output:

Student: Aarav (Roll: 101)
Total: 340.0, Average: 68.0
Grade: C
Subjects below 40: Subject 2
Q2 — Library Book Management System

This question specifically requires a dictionary, tuple, list, set, and the five functions listed in the file.

def add_book(catalog, book_id, title, author, year):
catalog[book_id] = (title, author, year)

def borrow_book(catalog, borrowed_books, book_id):
if book_id not in catalog:
print("Book does not exist.")
elif book_id in borrowed_books:
print("Book is already borrowed.")
else:
borrowed_books.append(book_id)
print("Book borrowed successfully.")

def return_book(borrowed_books, book_id):
if book_id in borrowed_books:
borrowed_books.remove(book_id)
print("Book returned successfully.")
else:
print("Book was not borrowed.")

def register_member(members, member_id):
members.add(member_id)

def show_available(catalog, borrowed_books):
print("\nAvailable Books:")

for book_id, details in catalog.items():
    if book_id not in borrowed_books:
        title, author, year = details
        print(book_id, "-", title, "-", author, "-", year)

def main():

catalog = {}
borrowed_books = []
members = set()


# Adding 4 books
add_book(catalog, 101, "Python Basics", "John Smith", 2022)
add_book(catalog, 102, "Data Science", "Alice Brown", 2023)
add_book(catalog, 103, "Machine Learning", "David Lee", 2021)
add_book(catalog, 104, "Web Development", "Robert King", 2024)


# Registering members
register_member(members, 1)
register_member(members, 2)
register_member(members, 3)
register_member(members, 1)   # Duplicate ignored


print("Members:", members)


# Borrow 2 books
borrow_book(catalog, borrowed_books, 101)
borrow_book(catalog, borrowed_books, 103)


print("Borrowed Books:", borrowed_books)


# Return 1 book
return_book(borrowed_books, 101)


print("Borrowed Books:", borrowed_books)


# Display available books
show_available(catalog, borrowed_books)

main()

The file explains the reason for the structures: dictionary for fast book lookup, tuple for immutable book details, list for ordered borrowed books, and set for unique members.

Q3 — Shopping Cart

The important concept here is that cart=[] as a default argument is dangerous because the same list can be reused between function calls.

Part A - Spot the Bug

def add_item(item, cart=[]):
cart.append(item)
return cart

print(add_item("apple"))
print(add_item("banana"))
print(add_item("milk", cart=["bread"]))
print(add_item("eggs"))

Output:

['apple']
['apple', 'banana']
['bread', 'milk']
['apple', 'banana', 'eggs']

The first and second calls share the same default list.

Part B — Correct Version
def add_item(item, cart=None):
if cart is None:
cart = []

cart.append(item)
return cart

print(add_item("apple"))
print(add_item("banana"))
print(add_item("milk"))
Part C — Complete Shopping Cart
def create_cart(owner, discount=0):
return {
"owner": owner,
"items": [],
"discount": discount
}

def add_to_cart(cart, name, price, qty=1):
cart["items"].append({
"name": name,
"price": price,
"qty": qty
})

def update_price(price_tuple, new_price):
try:
price_tuple[1] = new_price
except TypeError:
print("TypeError: Tuples are immutable.")

def calculate_total(cart):
total = 0

for item in cart["items"]:
    total += item["price"] * item["qty"]


discount_amount = total * cart["discount"] / 100
final_total = total - discount_amount


return final_total

Customer 1

cart1 = create_cart("Aarav", 10)

add_to_cart(cart1, "Apple", 100, 2)
add_to_cart(cart1, "Milk", 50, 1)

Customer 2

cart2 = create_cart("Bhargavi", 5)

add_to_cart(cart2, "Bread", 40, 2)
add_to_cart(cart2, "Rice", 60, 1)

print("Cart 1:", cart1)
print("Cart 1 Total:", calculate_total(cart1))

print()

print("Cart 2:", cart2)
print("Cart 2 Total:", calculate_total(cart2))

Tuple immutability demonstration

price_tuple = ("Apple", 100)
update_price(price_tuple, 120)

Why is discount=0 safe but cart=[] dangerous?
0 is immutable, so it cannot be changed. A list is mutable, so the same default list can be reused across function calls.
Rebinding vs mutating:
Rebinding means assigning a new object to a variable.
Mutating means changing the existing object.
Mutable and immutable types:
list → Mutable
tuple → Immutable
dict → Mutable
set → Mutable
str → Immutable
int → Immutable
Passing a list to a function:
A list is mutable. If the function modifies the list using methods such as append(), the change can be visible outside the function because both references point to the same list.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions