Python Learningاز صفر تا نوشتن پروژه از حفظ
پایان مسیر

آزمون نهایی

۲۰ سؤالقبولی: ۸۰٪

این آزمون دو بخش دارد. بخش اول ۲۰ سؤال از کل دوره است. بخش دوم مهم‌تر است: نوشتن کل برنامه از حفظ در VS Code و تست آن.

بخش ۱: کلاس Shop از حفظ (در مرورگر)

تمرین

کلاس کامل

بدون نگاه کردن، importها، FILE و کلاس کامل Shop را بنویس.

Ctrl + Enter
دیدن راه‌حل (اول خودت تلاش کن)
import json
import os

FILE = 'shop_data.json'  # در VS Code: مسیر کنار برنامه با __file__

class Shop:
    def __init__(self):
        self.products = {}
        self.sales = []
        self.load()

    def save(self):
        with open(FILE, 'w', encoding='utf-8') as f:
            json.dump({'products': self.products, 'sales': self.sales}, f, ensure_ascii=False, indent=2)

    def load(self):
        if os.path.exists(FILE):
            try:
                with open(FILE, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                self.products = data.get('products', {})
                self.sales = data.get('sales', [])
            except (OSError, json.JSONDecodeError, AttributeError):
                self.products, self.sales = {}, []

    def add(self, name, buy, sell, qty):
        if not name or name in self.products:
            raise ValueError('نام خالی یا کالای تکراری است')
        if not all(0 <= x < float('inf') for x in (buy, sell, qty)):
            raise ValueError('عدد منفی یا نامعتبر مجاز نیست')
        self.products[name] = {'buy': buy, 'sell': sell, 'qty': qty}
        self.save()

    def edit(self, name, buy, sell, qty):
        if name not in self.products:
            raise ValueError('کالا پیدا نشد')
        if not all(0 <= x < float('inf') for x in (buy, sell, qty)):
            raise ValueError('عدد منفی یا نامعتبر مجاز نیست')
        self.products[name] = {'buy': buy, 'sell': sell, 'qty': qty}
        self.save()

    def delete(self, name):
        if name not in self.products:
            raise ValueError('کالا پیدا نشد')
        del self.products[name]
        self.save()

    def sell(self, name, qty):
        if name not in self.products:
            raise ValueError('کالا پیدا نشد')
        if qty <= 0:
            raise ValueError('تعداد باید مثبت باشد')
        product = self.products[name]
        if qty > product['qty']:
            raise ValueError('موجودی کافی نیست')
        product['qty'] -= qty
        self.sales.append({'name': name, 'qty': qty, 'total': qty * product['sell']})
        self.save()

    def report(self):
        return sum(s['qty'] for s in self.sales), sum(s['total'] for s in self.sales)

بخش ۲: کل برنامه از حفظ (در VS Code)

یک فایل خالی باز کن، تایمر بگذار و کل برنامه را بدون نگاه بنویس. بعد این‌ها را چک کن:

آزمون نهایی

برای گذراندن این درس حداقل ۸۰٪ جواب درست لازم است. هر چند بار خواستی می‌توانی دوباره امتحان بدهی.

۱. خروجی 7 // 2 و 7 % 2؟
۲. " Pen ".strip().lower()؟
۳. f"{2500000:,.0f}"؟
۴. کدام در شرط نادرست است؟
۵. products.get('x', {}) وقتی x نیست؟
۶. sum(s['qty'] for s in sales) چه می‌کند؟
۷. for row, (key, label) in enumerate(items) — row چیست؟
۸. shop.add(*values()) معادل کدام است؟
۹. چرا lambda a=action: run(a)؟
۱۰. raise ValueError('...') در add توسط چه کسی گرفته می‌شود؟
۱۱. float('nan') >= 0؟
۱۲. self در def sell(self, name, qty) چیست؟
۱۳. product = self.products[name] کپی است یا ارجاع؟
۱۴. حالت 'w' در open؟
۱۵. ensure_ascii=False؟
۱۶. os.path.dirname(os.path.abspath(__file__))؟
۱۷. entry = ttk.Entry(root).grid(...) چرا غلط است؟
۱۸. show='headings' در Treeview؟
۱۹. table.bind('<<TreeviewSelect>>', choose)؟
۲۰. کدام خط باید آخر فایل باشد؟