راه
۴ کیو· سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

فروشگاه آنلاین

کلاس‌های User، Product و Comment (همان models.py) بالای کدت آماده است و from models import User, Product, Comment هم کار می‌کند. هر نظر هنگام ساخته شدن به user.comments و product.comments اضافه می‌شود.

می‌خواهیم یک فروشگاه آنلاین را پیاده‌سازی کنیم که در آن کالاهایی را برای فروش بگذاریم و کاربران آن‌ها را خریداری کنند و نظرات خود را راجع‌به کالا‌ها بگذارند. بخشی از کد فروشگاه توسط فردی زده شده‌است و در حال حاضر در دسترس نیست. شما باید به آن امکاناتی اضافه کنید.

داخل پروژه، دو فایل پایتون با نام‌های models.py و store.py قرار دارد. شما باید توابع ناقص فایل store.py را تکمیل کنید. تغییرات شما در فایل models.py نادیده گرفته خواهند شد.


🏪 کلاس Store

🔹 init(self)

  • products: دیکشنری با کلید Product و مقدار int (موجودی)
  • users: لیست از اشیاء User

این تابع از پیش پیاده‌سازی شده‌است و نیازی به اعمال تغییر در آن نیست.

🔹 remove_product(self, product, amount=1)

موجودی کالا را به اندازه‌ی amount کاهش می‌دهد.

خطا: "Not Enough Products" (اگر موجودی کافی نباشد)

اگر موجودی به صفر رسید، کالا از دیکشنری حذف می‌شود.

🔹 add_user(self, username)

کاربر جدید را به لیست کاربران اضافه می‌کند.

موفقیت: نام کاربری را برمی‌گرداند

توجه: اگر نام کاربری تکراری باشد، None برمی‌گرداند

🔹 get_total_asset(self)

مجموع قیمت کالاهای موجود در فروشگاه را برمی‌گرداند.

💡 قیمت هر کالا در product.price ذخیره شده است.

🔹 get_total_profit(self)

مجموع قیمت کالاهای فروخته‌شده را برمی‌گرداند.

💡 کالاهای خریداری‌شده در user.bought_products ذخیره شده‌اند.

🔹 get_comments_by_user(self, user)

لیست متن نظرات نوشته‌شده توسط کاربر را برمی‌گرداند.

💡 نظرات کاربر در user.comments ذخیره شده‌اند.

🔹 get_inflation_affected_product_names(self)

لیست نام کالاهایی که تورم روی آن‌ها تأثیر گذاشته است را برمی‌گرداند.

💡 کالایی تحت تأثیر تورم است که کالای هم‌نام با قیمت کمتر در فروشگاه وجود داشته باشد.

🔹 clean_old_comments(self, date)

تمام نظراتی که قبل از تاریخ date ثبت شده‌اند را حذف می‌کند.

🔹 clean_comments_by_bought_users(self, product)

لیست متن نظرات کالای ورودی را که کاربر نویسنده، خریدار آن نیز بوده است، برمی‌گرداند.

💡 بررسی کنید که کاربر کالا را در bought_products خود داشته باشد.


✅ پاسخ نهایی

python
from models import User, Product, Comment

class Store:
    def __init__(self):
        self.products = {}
        self.users = []

    def remove_product(self, product, amount=1):
        if product not in self.products or self.products[product] < amount:
            raise ValueError("Not Enough Products")

        self.products[product] -= amount
        if self.products[product] == 0:
            del self.products[product]

    def add_user(self, username):
        for user in self.users:
            if user.username == username:
                return None

        new_user = User(username)
        self.users.append(new_user)
        return username

    def get_total_asset(self):
        total = 0
        for product, quantity in self.products.items():
            total += product.price * quantity
        return total

    def get_total_profit(self):
        total = 0
        for user in self.users:
            for product in user.bought_products:
                total += product.price
        return total

    def get_comments_by_user(self, user):
        return [comment.text for comment in user.comments]

    def get_inflation_affected_product_names(self):
        result = set()
        products_list = list(self.products.keys())

        for i in range(len(products_list)):
            for j in range(i + 1, len(products_list)):
                p1 = products_list[i]
                p2 = products_list[j]
                if p1.name == p2.name and p1.price != p2.price:
                    result.add(p1.name)

        return list(result)

    def clean_old_comments(self, date):
        for user in self.users:
            user.comments = [
                comment for comment in user.comments
                if comment.date >= date
            ]

        for product in self.products:
            product.comments = [
                comment for comment in product.comments
                if comment.date >= date
            ]

    def clean_comments_by_bought_users(self, product):
        result = []

        for comment in product.comments:
            if comment.user in self.users and product in comment.user.bought_products:
                result.append(comment.text)

        return result

📄 store.py


📖 توضیح کد

  • متد remove_product: موجودی کالا را کاهش می‌دهد. اگر موجودی کافی نباشد، خطای "Not Enough Products" پرتاب می‌شود.
  • متد add_user: با پیمایش لیست کاربران، تکراری بودن را بررسی می‌کند. اگر تکراری نباشد، کاربر جدید ساخته می‌شود.
  • متد get_total_asset: مجموع قیمت تمام کالاهای موجود در فروشگاه را محاسبه می‌کند.
  • متد get_total_profit: مجموع قیمت کالاهای خریداری‌شده توسط همه‌ی کاربران را محاسبه می‌کند.
  • متد get_comments_by_user: با استفاده از لیست user.comments، متن نظرات را استخراج می‌کند.
  • متد get_inflation_affected_product_names: با مقایسه‌ی کالاهای هم‌نام با قیمت‌های متفاوت، نام کالاهای تحت تأثیر تورم را پیدا می‌کند.
  • متد clean_old_comments: نظراتی که تاریخ آن‌ها قبل از تاریخ ورودی است را از کاربران و محصولات حذف می‌کند.
  • متد clean_comments_by_bought_users: نظراتی را برمی‌گرداند که کاربر نویسنده، خود کالا را نیز خریده باشد.
  • در متد remove_product، اگر موجودی به صفر رسید، کالا از دیکشنری حذف می‌شود
  • در متد add_user، اگر نام کاربری تکراری باشد، None برگردانده می‌شود
  • در متد get_inflation_affected_product_names، از set برای جلوگیری از تکرار نام‌ها استفاده شده است
  • در متد clean_old_comments، نظرات هم از کاربران و هم از محصولات حذف می‌شوند

🚀 پس از تکمیل متدها، می‌توانید فروشگاه را با محصولات و کاربران مختلف تست کنید.

نمونه‌ها

ورودی نمونه ۱
s = Store()
pen = Product("pen", 10)
s.products[pen] = 3
s.remove_product(pen, 2)
s.products[pen]
s.remove_product(pen)
pen in s.products
try:
    s.remove_product(pen)
except Exception as error:
    print(error)
خروجی نمونه ۱
1
False
Not Enough Products
ورودی نمونه ۲
s = Store()
[s.add_user("ali"), s.add_user("sara"), s.add_user("ali")]
[u.username for u in s.users]
خروجی نمونه ۲
['ali', 'sara', None]
['ali', 'sara']
ورودی نمونه ۳
s = Store()
s.products[Product("pen", 10)] = 3
s.products[Product("book", 120)] = 2
s.get_total_asset()
s.add_user("ali")
s.add_user("sara")
s.users[0].bought_products += [Product("pen", 10), Product("book", 120)]
s.users[1].bought_products.append(Product("pen", 12))
s.get_total_profit()
خروجی نمونه ۳
270
'ali'
'sara'
142
ورودی نمونه ۴
from datetime import date
s = Store()
s.add_user("ali")
ali = s.users[0]
pen = Product("pen", 10)
s.products[pen] = 1
Comment(ali, pen, "too small", date(2024, 1, 1))
Comment(ali, pen, "writes well", date(2024, 6, 1))
s.get_comments_by_user(ali)
s.clean_old_comments(date(2024, 3, 1))
[s.get_comments_by_user(ali), [c.text for c in pen.comments]]
خروجی نمونه ۴
'ali'
['too small', 'writes well']
[['writes well'], ['writes well']]
ورودی نمونه ۵
s = Store()
for name, price in [("pen", 10), ("pen", 12), ("book", 50), ("book", 50), ("cup", 5), ("cup", 9)]:
    s.products[Product(name, price)] = 1
sorted(s.get_inflation_affected_product_names())
خروجی نمونه ۵
['cup', 'pen']
ورودی نمونه ۶
from datetime import date
s = Store()
s.add_user("buyer")
s.add_user("visitor")
buyer, visitor = s.users
pen = Product("pen", 10)
s.products[pen] = 5
buyer.bought_products.append(pen)
Comment(buyer, pen, "worth it", date(2024, 5, 5))
Comment(visitor, pen, "looks nice", date(2024, 5, 6))
s.clean_comments_by_bought_users(pen)
خروجی نمونه ۶
'buyer'
'visitor'
['worth it']

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود