ارزشیابی میانترم
این جلسه، جلسه آزمون است و مطلب تازهای ندارد. این فصل فقط برای مرور نوشته شده است: خلاصه فصل ۲۱ تا ۲۸، یک چکلیست آمادگی، و یک نمونه آزمون کامل که میتوانید خودتان را با آن بسنجید.
۱. چه چیزهایی ارزشیابی میشود
| فصل | موضوع | وزن تقریبی |
|---|---|---|
| ۲۱ | کلاس، شیء، سازنده، self | زیاد |
| ۲۲ | کپسولهسازی، property، dataclass | زیاد |
| ۲۳ | وراثت، چندریختی، کلاس انتزاعی | زیاد |
| ۲۴ | متدهای جادویی، استثنای سفارشی | متوسط |
| ۲۵ | درک لیستی، enumerate، zip، unpacking | زیاد |
| ۲۶ | lambda، دکوراتور، مولد | متوسط |
| ۲۷ | CSV و JSON | متوسط |
| ۲۸ | pip، requests، XML | کم |
۲. مرور شیءگرایی
چهار ستون شیءگرایی و اینکه هر کدام در کدام فصل بودند:
| ستون | یعنی | ابزار پایتون |
|---|---|---|
| انتزاع | نمایش سادگی، پنهان کردن پیچیدگی | کلاس، متد، ABC |
| کپسولهسازی | محافظت از داده | _x، @property |
| وراثت | استفاده دوباره از یک کلاس | class B(A)، super() |
| چندریختی | یک پیام، رفتارهای متفاوت | بازنویسی متد، تایپ اردکی |
و پرسشهایی که باید بتوانید فوری جوابشان را بدهید:
selfچیست و چرا در تعریف نوشته میشود ولی موقع صدا زدن نه.- فرق صفت کلاس و صفت نمونه، و چرا لیست در بدنه کلاس خطرناک است.
- فرق
@staticmethod،@classmethodو متد عادی. - فرق «است» و «دارد»، یعنی وراثت در برابر ترکیب.
- فرق
__str__و__repr__. - چرا بعد از تعریف
__eq__باید__hash__هم بنویسید. - چرا کلاس انتزاعی به درد میخورد و چه چیزی را ممکن نمیکند.
۳. مرور کد پایتونی
| به جای این | این را بنویسید | فصل |
|---|---|---|
for i in range(len(x)) | enumerate(x) | ۲۵ |
| حلقه روی اندیس دو لیست | zip(a, b) | ۲۵ |
حلقه با append | درک لیستی | ۲۵ |
if len(x) == 0: | if not x: | ۲۵ |
| حلقه با پرچم بولی | any() یا all() | ۲۵ |
| کپی و تکرار کد قبل و بعد تابع | دکوراتور | ۲۶ |
| ساختن لیست بزرگ در حافظه | مولد با yield | ۲۶ |
| محاسبه تکراری در بازگشت | @lru_cache | ۲۶ |
۴. مرور داده و اینترنت
- هنگام باز کردن CSV،
newline=''اجباری است. - هر چیزی که از CSV میخوانید متن است.
DictReaderبهتر ازreaderاست، چون به نام ستون تکیه میکند نه به جایگاهش.- در JSON، حرف
sیعنی رشته:loadفایل،loadsرشته. - برای فارسی،
ensure_ascii=False. برای خوانایی،indent=2. - هر درخواست وب باید
timeoutداشته باشد. findدر XML ممکن استNoneبدهد؛ همیشه باis not Noneبررسی کنید.
۵. چکلیست آمادگی
- یک کلاس با سازنده، دو صفت و یک متد.
- همان کلاس با
@propertyکه مقدار نامعتبر را رد کند. - همان کلاس به شکل
@dataclass. - یک کلاس والد و دو فرزند که یک متد را بازنویسی میکنند، و حلقهای که روی هر دو کار کند.
- یک کلاس انتزاعی با یک متد انتزاعی.
__str__و__eq__و__len__برای یک کلاس دلخواه.- یک استثنای سفارشی و صدا زدنش با
try. - درک لیستی با فیلتر و با عملگر شرطی.
- درک دیکشنری از روی دو لیست.
- یک دکوراتور ساده با
@wraps. - یک مولد با
yield. - خواندن CSV و تبدیلش به لیستی از دیکشنری.
- نوشتن یک دیکشنری در فایل 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: |
۷. نمونه آزمون تشریحی
بخش اول: مفهومی، هر سؤال یک نمره
- فرق کلاس و شیء را در یک جمله بگویید.
selfاز کجا مقدار میگیرد؟- چرا نوشتن
items = []در بدنه کلاس خطرناک است؟ - فرق
@staticmethodو@classmethodچیست؟ - سه چیزی که
@dataclassرایگان میسازد را نام ببرید. - در چه صورتی وراثت به کار میرود و در چه صورتی ترکیب؟
- MRO چیست و چطور میشود دیدش؟
- تایپ اردکی یعنی چه؟
- فرق
__str__و__repr__چیست؟ اگر فقط یکی را بنویسیم، کدام؟ - چرا
except:خالی بد است؟ - خروجی این کد چیست و چرا:
[x for x in range(5) if x % 2] - فرق درک لیستی و عبارت مولد در مصرف حافظه چیست؟
- دکوراتور چیست و
@wrapsچه مشکلی را حل میکند؟ - چرا مولد را نمیشود دو بار پیمایش کرد؟
- چرا هنگام باز کردن فایل CSV باید
newline=''نوشت؟ - چرا مجموعه را نمیشود مستقیم در JSON ذخیره کرد؟
- محیط مجازی چه مشکلی را حل میکند؟
- سه کد وضعیت HTTP را با معنایشان بنویسید.
بخش دوم: خروجی کد را بنویسید
-
class A: x = 0 a = A() b = A() a.x = 5 A.x = 9 print(a.x, b.x) -
class Base: def hello(self): print('Base') class Child(Base): def hello(self): print('Child') super().hello() Child().hello() -
def gen(): yield 1 yield 2 g = gen() print(list(g)) print(list(g)) -
def f(items=[]): items.append(1) return items print(f()) print(f())
۸. نمونه آزمون عملی
سؤال یک: کتابخانه (۶ نمره)
یک برنامه بنویسید که این ساختار را داشته باشد:
- کلاس
Bookبا صفتهایtitleوauthorوyearوisbn. - property به نام
ageکه سن کتاب را حساب کند. - متد
__str__و__eq__بر اساس شابک. - کلاس
Libraryکه لیستی از کتابها را دارد، با متدهایaddوremoveوfind_by_author. - استثنای سفارشی
BookNotFoundکه وقتی کتاب پیدا نشد انداخته شود. - متدی که همه کتابها را در فایل 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 با ستونهای نام، شهر و سه نمره
داده شده است. برنامهای بنویسید که:
- فایل را با
DictReaderبخواند و ستونهای عددی را تبدیل کند. - میانگین هر دانشجو را حساب کند.
- دانشجویان را بر اساس شهر گروهبندی کند.
- نام سه دانشجوی برتر را پیدا کند.
- نتیجه را در فایل JSON با پشتیبانی فارسی ذخیره کند.
هر جا ممکن است از درک لیستی و از توابع آماده استفاده کنید.
سؤال چهار: دکوراتور (۳ نمره)
دکوراتور @log_errors بنویسید که اگر تابع خطایی
انداخت، نام تابع و نوع خطا را چاپ کند و بعد همان خطا را دوباره
بالا بفرستد. حتماً از @wraps استفاده کنید.
سؤال پنج: مولد (۲ نمره)
مولدی بنویسید که یک فایل متنی را بخواند و فقط خطهایی را بدهد که بلندتر از ۱۰ کاراکترند. بعد با آن، تعداد چنین خطهایی را بشمارید بدون اینکه کل فایل در حافظه بیاید.
۹. پاسخ کوتاه سؤالهای مفهومی
این بخش را فقط بعد از اینکه سؤالهای بالا را جواب دادید بخوانید. خواندن جواب پیش از تلاش، هیچ چیزی یاد نمیدهد.
| سؤال | پاسخ کوتاه |
|---|---|
| ۱۹ | 5 9. صفت نمونه a صفت کلاس را پنهان کرده، ولی b هنوز به کلاس نگاه میکند. |
| ۲۰ | Child سپس Base. |
| ۲۱ | [1, 2] سپس []. مولد یکبار مصرف است. |
| ۲۲ | [1] سپس [1, 1]. دام پیشفرض تغییرپذیر. |
| ۱۱ | [1, 3]. عدد ناصفر درست حساب میشود، پس شرط یعنی فرد بودن. |
پوشه S29-evaluation فقط یک README.md
دارد و هیچ فایل تمرینی ندارد، چون این جلسه، جلسه آزمون است. برای
تمرین، به پوشههای S21 تا S28 برگردید.