برنامه‌نویسی پایتون فهرست مطالب
فصل ۲۹

ارزشیابی میان‌ترم

این جلسه، جلسه آزمون است و مطلب تازه‌ای ندارد. این فصل فقط برای مرور نوشته شده است: خلاصه فصل ۲۱ تا ۲۸، یک چک‌لیست آمادگی، و یک نمونه آزمون کامل که می‌توانید خودتان را با آن بسنجید.

در این فصل می‌خوانید
  1. چه چیزهایی ارزشیابی می‌شود
  2. مرور شیءگرایی
  3. مرور کد پایتونی
  4. مرور داده و اینترنت
  5. چک‌لیست آمادگی
  6. اشتباه‌های پرتکرار
  7. نمونه آزمون تشریحی
  8. نمونه آزمون عملی
  9. پاسخ کوتاه سؤال‌های مفهومی

۱. چه چیزهایی ارزشیابی می‌شود

فصلموضوعوزن تقریبی
۲۱کلاس، شیء، سازنده، selfزیاد
۲۲کپسوله‌سازی، property، dataclassزیاد
۲۳وراثت، چندریختی، کلاس انتزاعیزیاد
۲۴متدهای جادویی، استثنای سفارشیمتوسط
۲۵درک لیستی، enumerate، zip، unpackingزیاد
۲۶lambda، دکوراتور، مولدمتوسط
۲۷CSV و JSONمتوسط
۲۸pip، requests، XMLکم

۲. مرور شیءگرایی

چهار ستون شیءگرایی و اینکه هر کدام در کدام فصل بودند:

ستونیعنیابزار پایتون
انتزاعنمایش سادگی، پنهان کردن پیچیدگیکلاس، متد، ABC
کپسوله‌سازیمحافظت از داده_x، @property
وراثتاستفاده دوباره از یک کلاسclass B(A)، super()
چندریختییک پیام، رفتارهای متفاوتبازنویسی متد، تایپ اردکی

و پرسش‌هایی که باید بتوانید فوری جوابشان را بدهید:

۳. مرور کد پایتونی

به جای ایناین را بنویسیدفصل
for i in range(len(x))enumerate(x)۲۵
حلقه روی اندیس دو لیستzip(a, b)۲۵
حلقه با appendدرک لیستی۲۵
if len(x) == 0:if not x:۲۵
حلقه با پرچم بولیany() یا all()۲۵
کپی و تکرار کد قبل و بعد تابعدکوراتور۲۶
ساختن لیست بزرگ در حافظهمولد با yield۲۶
محاسبه تکراری در بازگشت@lru_cache۲۶

۴. مرور داده و اینترنت

۵. چک‌لیست آمادگی

اگر بتوانید این موارد را بدون نگاه کردن به کتاب بنویسید، آماده‌اید
  1. یک کلاس با سازنده، دو صفت و یک متد.
  2. همان کلاس با @property که مقدار نامعتبر را رد کند.
  3. همان کلاس به شکل @dataclass.
  4. یک کلاس والد و دو فرزند که یک متد را بازنویسی می‌کنند، و حلقه‌ای که روی هر دو کار کند.
  5. یک کلاس انتزاعی با یک متد انتزاعی.
  6. __str__ و __eq__ و __len__ برای یک کلاس دلخواه.
  7. یک استثنای سفارشی و صدا زدنش با try.
  8. درک لیستی با فیلتر و با عملگر شرطی.
  9. درک دیکشنری از روی دو لیست.
  10. یک دکوراتور ساده با @wraps.
  11. یک مولد با yield.
  12. خواندن CSV و تبدیلش به لیستی از دیکشنری.
  13. نوشتن یک دیکشنری در فایل JSON با پشتیبانی فارسی.

۶. اشتباه‌های پرتکرار

اشتباهنتیجهدرست
فراموش کردن self. داخل متدمتغیر محلی به جای صفتself.x = ...
لیست در بدنه کلاسمشترک بین همه اشیاءداخل __init__
فراموش کردن super().__init__()صفت‌های والد ساخته نمی‌شونداول سازنده فرزند
__add__ که چاپ می‌کندنتیجه None می‌شودreturn شیء تازه
دکوراتوری که نتیجه را برنمی‌گرداندتابع همیشه None می‌دهدreturn func(...)
except: خالیباگ نامرئی می‌شودنوع خطا را بنویسید
باز کردن CSV بدون newline=''خط خالی بین سطرهاهمیشه بنویسیدش
مقایسه رشته‌ای عددهای CSVنتیجه غلط بدون خطاint() بزنید
درخواست وب بدون timeoutبرنامه تا ابد منتظر می‌ماندtimeout=10
if element: روی عنصر XMLعنصر بدون فرزند نادرست حساب می‌شودif element is not None:

۷. نمونه آزمون تشریحی

بخش اول: مفهومی، هر سؤال یک نمره

  1. فرق کلاس و شیء را در یک جمله بگویید.
  2. self از کجا مقدار می‌گیرد؟
  3. چرا نوشتن items = [] در بدنه کلاس خطرناک است؟
  4. فرق @staticmethod و @classmethod چیست؟
  5. سه چیزی که @dataclass رایگان می‌سازد را نام ببرید.
  6. در چه صورتی وراثت به کار می‌رود و در چه صورتی ترکیب؟
  7. MRO چیست و چطور می‌شود دیدش؟
  8. تایپ اردکی یعنی چه؟
  9. فرق __str__ و __repr__ چیست؟ اگر فقط یکی را بنویسیم، کدام؟
  10. چرا except: خالی بد است؟
  11. خروجی این کد چیست و چرا: [x for x in range(5) if x % 2]
  12. فرق درک لیستی و عبارت مولد در مصرف حافظه چیست؟
  13. دکوراتور چیست و @wraps چه مشکلی را حل می‌کند؟
  14. چرا مولد را نمی‌شود دو بار پیمایش کرد؟
  15. چرا هنگام باز کردن فایل CSV باید newline='' نوشت؟
  16. چرا مجموعه را نمی‌شود مستقیم در JSON ذخیره کرد؟
  17. محیط مجازی چه مشکلی را حل می‌کند؟
  18. سه کد وضعیت HTTP را با معنایشان بنویسید.

بخش دوم: خروجی کد را بنویسید

  1. class A:
        x = 0
    
    a = A()
    b = A()
    a.x = 5
    A.x = 9
    print(a.x, b.x)
  2. class Base:
        def hello(self):
            print('Base')
    
    class Child(Base):
        def hello(self):
            print('Child')
            super().hello()
    
    Child().hello()
  3. def gen():
        yield 1
        yield 2
    
    g = gen()
    print(list(g))
    print(list(g))
  4. def f(items=[]):
        items.append(1)
        return items
    
    print(f())
    print(f())

۸. نمونه آزمون عملی

سؤال یک: کتابخانه (۶ نمره)

یک برنامه بنویسید که این ساختار را داشته باشد:

  1. کلاس Book با صفت‌های title و author و year و isbn.
  2. property به نام age که سن کتاب را حساب کند.
  3. متد __str__ و __eq__ بر اساس شابک.
  4. کلاس Library که لیستی از کتاب‌ها را دارد، با متدهای add و remove و find_by_author.
  5. استثنای سفارشی BookNotFound که وقتی کتاب پیدا نشد انداخته شود.
  6. متدی که همه کتاب‌ها را در فایل JSON ذخیره کند و متدی که از همان فایل بخواندشان.

سؤال دو: بازنویسی پایتونی (۴ نمره)

کد زیر را با ابزارهای فصل ۲۵ بازنویسی کنید:

result = []
i = 0
while i < len(names):
    if len(names[i]) > 3:
        result.append(names[i].upper())
    i = i + 1

found = False
for r in result:
    if r.startswith('A'):
        found = True
        break

if len(result) == 0:
    print('empty')

سؤال سه: گزارش‌گیری (۵ نمره)

فایل students.csv با ستون‌های نام، شهر و سه نمره داده شده است. برنامه‌ای بنویسید که:

  1. فایل را با DictReader بخواند و ستون‌های عددی را تبدیل کند.
  2. میانگین هر دانشجو را حساب کند.
  3. دانشجویان را بر اساس شهر گروه‌بندی کند.
  4. نام سه دانشجوی برتر را پیدا کند.
  5. نتیجه را در فایل JSON با پشتیبانی فارسی ذخیره کند.

هر جا ممکن است از درک لیستی و از توابع آماده استفاده کنید.

سؤال چهار: دکوراتور (۳ نمره)

دکوراتور @log_errors بنویسید که اگر تابع خطایی انداخت، نام تابع و نوع خطا را چاپ کند و بعد همان خطا را دوباره بالا بفرستد. حتماً از @wraps استفاده کنید.

سؤال پنج: مولد (۲ نمره)

مولدی بنویسید که یک فایل متنی را بخواند و فقط خط‌هایی را بدهد که بلندتر از ۱۰ کاراکترند. بعد با آن، تعداد چنین خط‌هایی را بشمارید بدون اینکه کل فایل در حافظه بیاید.

۹. پاسخ کوتاه سؤال‌های مفهومی

اول خودتان جواب دهید

این بخش را فقط بعد از اینکه سؤال‌های بالا را جواب دادید بخوانید. خواندن جواب پیش از تلاش، هیچ چیزی یاد نمی‌دهد.

سؤالپاسخ کوتاه
۱۹5 9. صفت نمونه a صفت کلاس را پنهان کرده، ولی b هنوز به کلاس نگاه می‌کند.
۲۰Child سپس Base.
۲۱[1, 2] سپس []. مولد یک‌بار مصرف است.
۲۲[1] سپس [1, 1]. دام پیش‌فرض تغییرپذیر.
۱۱[1, 3]. عدد ناصفر درست حساب می‌شود، پس شرط یعنی فرد بودن.
درباره این جلسه

پوشه S29-evaluation فقط یک README.md دارد و هیچ فایل تمرینی ندارد، چون این جلسه، جلسه آزمون است. برای تمرین، به پوشه‌های S21 تا S28 برگردید.

فصل قبل: بسته‌ها، REST API و XML فصل بعد: پایگاه داده و زبان SQL