برنامهنویسی برای امتحان: جوابهای Python که نمره میگیرند
نحوه نوشتن کد Python در امتحانات که واقعاً نمره کامل میگیرد — ساختار، حالتهای خاص، و مدیریت زمان تحت فشار.
تصحیحکنندگان امتحان کد شما را بیست دقیقه از طریق debugger اجرا نمیکنند. آن را یک بار میخوانند، شاید دو بار، و آن را در مقابل rubric بررسی میکنند. یک راهحل کارکردی که rubric را نادیده میگیرد هنوز هم میتواند امتیاز از دست بدهد، درحالیکه یکی کمی خامتر که هر نقطه کنترلی را برآورده کند میتواند نمره بالاتری کسب کند. نوشتن Python برای امتحان مهارتی متفاوت از نوشتن Python برای یک پروژه واقعی است و شایسته تمرین جداگانه است.
Rubric را قبل از خواندن دوباره مسئله بخوانید
اکثر امتحانات برنامهنویسی — سؤالات free-response سبک AP CS A، امتحانات میانی دانشگاهی، ارزیابیهای bootcamp کدنویسی — قوانین partial-credit را منتشر میکنند. یک خط rubric معمولی به این شکل است: "1 امتیاز برای ساختار حلقه صحیح، 1 امتیاز برای مقدار بازگشتی صحیح، 1 امتیاز برای رسیدگی به حالت فهرست خالی." اگر یک one-liner متراکم بنویسید که جواب درست را میدهد اما یک حلقه صریح را رد میکند، برخی تصحیحکنندگان امتیاز از شما کسر میکنند حتی اگر خروجی صحیح باشد.
قبل از تایپ کردن چیزی، قطعاتای را که تصحیحکننده احتمالاً جداگانه بررسی خواهد کرد مشخص کنید:
- سیگنچر تابع دقیقاً با آنچه خواسته شد مطابقت دارد (نام، ترتیب پارامتر، نوع بازگشتی)
- Base case و recursive case، اگر recursion انتظار میرود
- حدود حلقه (off-by-one error رایجترین دلیل از دست رفتن امتیاز است)
- حالتهای خاص: ورودی خالی، ورودی تکعنصری، اعداد منفی، تکرار
ابتدا این موارد را به عنوان comment بنویسید. # handle empty list، # base case: n == 0. این ده ثانیه طول میکشد و تضمین میدهد که موردی را که تصحیحکننده بهطور خاص به دنبال آن است فراموش نخواهید.
کد را طوری ساختار دهید که partial credit نمایان باشد
دو جواب برای «تابعی بنویسید که دومین عدد بزرگ در یک فهرست را برگرداند» را مقایسه کنید:
def second_largest(nums):
return sorted(nums)[-2]
def second_largest(nums):
if len(nums) < 2:
return None
largest = second = float('-inf')
for n in nums:
if n > largest:
second = largest
largest = n
elif n > second and n != largest:
second = n
return second
اولی برای ورودی خوبساخت درست است اما در فهرستی با کمتر از دو عنصر crash میکند و در تکرارهایی مانند [5, 5, 3] جواب غلط میدهد (5 را برمیگرداند، احتمالاً غلط بسته به spec). دومی طولانیتر است اما هر خط rubric — حالت خاص، منطق صحیح، بازگشت صحیح — صریح است و خط جداگانهای دارد که تصحیحکننده میتواند آن را تأیید کند. در یک امتحان محدود زمانی، نسخه دوم تقریباً همیشه نمره بالاتری میگیرد، حتی اگر تایپ کردنش زمان بیشتری ببرد.
زود بهینهسازی نکنید، bug های آشکار را هم نگذارید
سؤالات امتحان به ندرت دانش Big-O را تست میکنند مگر اینکه صریحاً بگویند. اگر prompt بگوید «تابعی بنویسید که duplicates را پیدا کند،» یک حلقه تو در تو با O(n²) درست است مگر اینکه prompt ورودی بزرگ را مشخص کند یا راهحل کارآمد را بخواهد. وقتی امتحان صرف تبدیل به روش set-based O(n) میشود که آن را نخواستهاند، زمانی است که دوباره برنمیگیرید.
گفتنی است که برخی خطاها همیشه به شما امتیاز کاهش میدهند صرفنظر از rubric:
- استفاده از
==به جایisبهطور نامنسجم که باعث logic bug میشود (در امتحانات Python نادر است اما در سؤالات مقایسهپر ظاهر میشود) - mutation فهرست در حین iteration —
for x in lst: lst.remove(x)یک تله امتحان کلاسیک است که خروجی بیصدای غلط تولید میکند - فراموش کردن
returnو جای آن print کردن — بسیاری autograders مقادیر بازگشتی را بررسی میکنند، نه stdout - off-by-one در
range()—range(len(nums))در مقابلrange(len(nums) - 1)شایسته بررسی دوبارهای هر بار است که آن را مینویسید
کد خود را با دست trace کنید قبل از submit کردن
در امتحانات کاغذی و اکثر امتحانات کدنویسی در مرورگر، نمیتوانید کد را اجرا کنید. یک مثال کوچک انتخاب کنید و آن را خط به خط trace کنید، مقادیر متغیر را در حین رفتن یادداشت کنید. این شاید 80% logic error را در کمتر از دو دقیقه میگیرد، و این بالاترینارزش چیزی است که میتوانید با بقیه زمان انجام دهید.
برای توابع recursive بهطور خاص، حداقل دو سطح عمیق trace کنید و صریحاً base case برخورد را یادداشت کنید. تصحیحکنندگان اغلب فقط برای نشان دادن اینکه base case بهدرستی پایان مییابد یک امتیاز میدهند، جداگانه از امتیاز برای اینکه recursive case درست باشد.
ساعت را مانند یک منبع مدیریت کنید، نه یک عقبافتاده
اگر بخش free-response 9 امتیاز در سه زیرسؤال دارد، تقریباً زمان مساوی را بودجه کنید و اگر فراتر از آن بودجه گیر کردید جلو بروید — یک قسمت نیمهنوشتهشده اما تقریباً صحیح (b) امتیاز خام بیشتری دارد نسبت به یک قسمت کامل (a) و یک قسمت خالی (c). حتی اگر نتوانید منطق را تمام کنید تابع stub با سیگنچر درست و pass یا یک حدس بنویسید؛ یک سیگنچر درست به تنهایی گاهیاوقات شایسته یک امتیاز rubric است.
برای اطلاعات بیشتر درباره نوشتن Python تمیز و قابلآزمایش بیرون اتاق امتحان، و درباره data structures که دائماً در این سؤالات ظاهر میشوند، بخشهای مرتبط Python و Computer Science را در Korra Studio بررسی کنید.
با کمک هوش مصنوعی نوشتهشده، بازبینی و منتشرشده توسط Michal Pilch (CISSP)، Korra Studio.
این یکی از یادداشتهای پایگاه دانش Korra Studio است — پلتفرم هر موضوع را با مربی یکبهیک جفت میکند.
شروع رایگانarrow_forward