پوشش دقیق حوزههای آزمون
این مخزن آزمونهای تمرینی دقیقاً به گونهای ساختاریافته است که توزیع فنی مورد انتظار در مصاحبههای سطح بالای پایتون، علوم داده و مهندسی نرمافزار را بازتاب دهد.
مفاهیم اصلی پایتون (۲۰٪): ارزیابی عمیق تایپینگ پویا، محدوده متغیرها (قانون LEGB)، حلقههای پیشرفته، مکانیسمهای جریان کنترل، عملیات ریاضی استاندارد و آرایههای توالی داخلی.
دستکاری دادهها با کتابخانهها (۱۸٪): تمرکز شدید بر ساختارهای داده NumPy و Pandas، ایندکسرهایی مانند iloc و loc، مدیریت مقادیر گمشده، تبدیلات پیچیده groupby و برداریسازی بهینه در حافظه.
الگوریتمها و حل مسئله (۱۵٪): الگوهای بهینهسازی، تغییرات آرایه با append و insert، مکانیسمهای بازگشتی (Recursion)، کلیدهای مرتبسازی سفارشی، تحلیل مصرف حافظه در List Comprehensions و پیچیدگی الگوریتمیک.
تحلیل و بصریسازی دادهها (۱۲٪): تنظیمات بصریسازی آماری با ابزارهای مدرن مانند sns.histplot، ارزیابی روندهای توزیع، روشهای قدرتمند تقسیم داده به آموزش و تست (train_test_split) و استراتژیهای اعتبارسنجی متقابل (Cross-validation).
پایتون برای ETL و خط لولههای داده (۸٪): عملیاتی کردن خط لولههای ETL، ساخت خط لولههای داده خودکار، ارکستراسیون تسکها با Apache Airflow و مدیریت تمیز اتصالات دیتابیس.
برنامهنویسی شیگرا - OOP (۱۰٪): الگوهای ساختاری عمیق شامل کلاسهای سفارشی، چرخه حیات اشیاء، ارثبری چندگانه، Mixins، چندریختی، کپسولهسازی و متدهای جادویی (Dunder methods).
مباحث پیشرفته (۷٪): متایبرنامهنویسی با دکوراتورهای سفارشی، ارزیابی تنبل (Lazy Evaluation) با ژنراتورها، برنامهنویسی تابعی ناشناس از طریق عبارات lambda و مدیریت وضعیتهای اجرا با فریمورکهای همروندی.
علوم داده با پایتون (۱۰٪): جریانهای کاری یکپارچهسازی عملی با استفاده از استک NumPy، Pandas، Matplotlib، Seaborn و Scikit-Learn برای حل چالشهای مدلسازی و پیشبینی.
درباره این دوره
قبولی در مصاحبه فنی برای نقشهای مدرن پایتون به چیزی بیش از مهارتهای ساده در نوشتن اسکریپت نیاز دارد. تیمهای مهندسی تراز اول، بخشهای یادگیری ماشین و گروههای تحلیل داده به دنبال کاندیداهایی هستند که کارایی اجرا، ردپای حافظه و مدلسازی صحیح دادهها را درک کنند. من این مخزن جامع سوالات را برای شبیهسازی دقیق موقعیتهای مهندسی و چالشهای تحلیلی که مصاحبهکنندگان ارشد برای تست متقاضیان به کار میبرند، ساختهام.
با ۵۵۰ سوال بسیار فنی و اورجینال، این منبع از یادآوری ساده سینتکس فاصله گرفته است. در عوض، شما بلوکهای کد واقعی، خط لولههای علوم داده، سبک-سنگین کردنهای الگوریتمیک و خروجیهای غیرمنتظره دیباگ را تحلیل خواهید کرد. هر سوال دارای یک تحلیل فنی جامع است که توضیح میدهد چرا راه حل درست عمل میکند و چرا رویکردهای جایگزین شکست میخورند یا باعث ایجاد گلوگاههای عملکردی در محیط عملیاتی میشوند. چه بخواهید به عنوان دانشمند داده (Data Scientist)، مهندس داده (Data Engineer) یا مهندس نرمافزار Backend استخدام شوید، این تستها تمرین سختگیرانهای را فراهم میکنند که برای تسلط بر منطق پیچیده و قبولی در ارزیابیهای فنی پیش روی شما در اولین تلاش ضروری است.
نمونهای از سوالات تمرینی
برای ارزیابی عمق مهندسی و شفافیت ساختاری تحلیلهای ارائه شده در این بانک سوالات، این سه نمونه سوال با کیفیت بالا را بررسی کنید.
سوال ۱: آرگومانهای پیشفرض تغییرپذیر و تخصیص چرخه حیات شیء
اسکریپت پایتون زیر را که برای مدیریت یک استخر ردیابی پویا طراحی شده است، در نظر بگیرید:
Python
def append_to_pool(element, target_pool=[]):
target_pool.append(element)
return target_pool
first_run = append_to_pool('node_a')
second_run = append_to_pool('node_b')
محتویات ساختاری نهایی متغیر مرجع second_run پس از اجرا چه خواهد بود؟
A) ['node_b']
B) ['node_a', 'node_b']
C) [['node_a'], ['node_b']]
D) AttributeError: 'list' object has no attribute 'append_to_pool'
E) None
F) RuntimeError: local variable referenced before assignment
پاسخ صحیح و توضیح:
پاسخ صحیح: B
چرا درست است: در پایتون، آرگومانهای پیشفرض دقیقاً یک بار هنگام خواندن تعریف تابع ارزیابی میشوند، نه هر بار که تابع فراخوانی میشود. از آنجایی که لیست یک شیء تغییرپذیر (Mutable) است، همان نمونه لیست زیربنایی در تمام فراخوانهای متوالی که آرگومان دوم را نادیده میگیرند، به اشتراک گذاشته میشود. فراخوانی اول 'node_a' را به این لیست مشترک اضافه میکند و فراخوانی دوم 'node_b' را بلافاصله پشت آن قرار میدهد، در نتیجه هر دو متغیر به یک شیء بهروز شده شامل ['node_a', 'node_b'] اشاره میکنند.
چرا گزینههای دیگر غلط هستند:
گزینه A غلط است: این اتفاق تنها در صورتی میافتاد که در هر فراخوانی یک نمونه لیست جدید ایجاد میشد، که روش مدیریت پارامترهای پیشفرض در پایتون اینگونه نیست.
گزینه C غلط است: کد از عملیات append استاندارد لیست یکبعدی استفاده میکند، بنابراین آرایههای تو در تو هرگز ساخته نمیشوند.
گزینه D غلط است: متد append یک متد بومی و معتبر برای نمونههای استاندارد لیست پایتون است.
گزینه E غلط است: تابع صراحتاً شیء لیست target_pool را برمیگرداند، بنابراین مقدار بازگشتی ضمنی None نیست.
گزینه F غلط است: متغیرها در فضای نامهای تمیز نگاشت شدهاند و هیچ تداخلی در مقداردهی اولیه محلی رخ نمیدهد.
سوال ۲: تکرار بهینه در حافظه و حفظ وضعیت در توابع Generator
شما باید یک فایل لاگ حجیم (چند گیگابایتی) را به صورت متوالی پردازش کنید بدون اینکه کل محتوا را در رم سیستم بارگذاری کنید. یک توسعهدهنده پیادهسازی تابعی زیر را پیشنهاد میکند:
Python
def stream_log_records(file_path):
with open(file_path, 'r') as target_file:
for line in target_file:
if 'ERROR' in line:
yield line.strip()
کدام عبارت به طور دقیق رفتار اجرا و کارایی پردازش این الگو را شرح میدهد؟
A) تابع تمام رکوردهای مطابق را مستقیماً در یک لایه ذخیرهسازی Tuple ضمنی در حافظه بارگذاری میکند.
B) فراخوانی این تابع یک شیء iterator تنبل (lazy) برمیگرداند که آیتمها را یکییکی و بر اساس نیاز تحویل میدهد و ردپای حافظه کمی را حفظ میکند.
C) بلوک with بلافاصله بعد از تجزیه اولین آیتم، هندل فایل را میبندد و باعث کرش در تکرار بعدی میشود.
D) کد کامپایل نخواهد شد زیرا کلمه کلیدی yield نمیتواند داخل یک بلوک context فایل تو در تو قرار گیرد.
E) این کد به طور خودکار فرآیند زمان اجرا را به یک اسکنر فایل موازی چندنخی تبدیل میکند.
F) خروجی رشتهای به یک آرایه بایت منجمد تبدیل میشود که توسط اسکریپتهای مصرفکننده قابل خواندن نیست.
پاسخ صحیح و توضیح:
پاسخ صحیح: B
چرا درست است: گنجاندن کلمه کلیدی yield، تابع استاندارد را به یک تابع ژنراتور تبدیل میکند. هنگام فراخوانی، یک شیء ژنراتور ایجاد میکند که از ارزیابی تنبل (Lazy Evaluation) استفاده میکند. اجرا را در عبارت yield متوقف کرده و دادهها را تنها زمانی که توسط متد next() یا یک حلقه صریح درخواست شود، به فراخواننده برمیگرداند و فایلها را خط به خط پردازش میکند در حالی که پروفایل حافظه را در کمترین حالت نگه میدارد.
چرا گزینههای دیگر غلط هستند:
گزینه A غلط است: ژنراتورها دادهها را در لیستهای حافظه یا ساختارهای Tuple از پیش محاسبه شده ذخیره نمیکنند؛ آنها آیتمها را در لحظه محاسبه میکنند.
گزینه C غلط است: بلوک context زنده میماند و موقعیت فعلی اشارهگر فایل را تا زمانی که حلقه ژنراتور در حال دریافت آیتمها باشد، حفظ میکند.
گزینه D غلط است: قرار دادن عبارت yield داخل محیطهای مدیریت فایل کاملاً قانونی است و الگویی توصیه شده برای تجزیه جریانهای داده عظیم است.
گزینه E غلط است: این معماری در یک رشته حلقه اصلی تکنخی اجرا میشود و باعث فعال شدن پردازشهای موازی یا چندپردازشی خودکار نمیشود.
گزینه F غلط است: اسکریپت توالیهای رشتهای استاندارد و فشردهنشده را بر اساس تبدیلهای متنی اعمال شده توسط .strip() برمیگرداند.
سوال ۳: عدم تطبیق تراز ایندکسگذاری در دستکاریهای Pandas Series
یک تحلیلگر داده، یک DataFrame گسترده پانداز را با استفاده از یک ماسک شرطی صریح فیلتر میکند که منجر به ایجاد زیرمجموعهای به نام filtered_df میشود. سپس تحلیلگر سعی میکند با استفاده از ایندکسرهای زیر، دادهها را برش داده و تخصیص دهد:
Python
# System state: filtered_df contains non-sequential index locations [4, 12, 19]
result_x = filtered_df.iloc[0:2]
result_y = filtered_df.loc[0:2]
تفاوت بنیادی در نحوه مکانیابی و بازگرداندن رکوردها توسط این پارامترهای تخصیص چیست؟
A) هر دو متد کوئریهای داده یکسانی را اجرا میکنند و دقیقاً رکوردهای زیر-آرایه مشابهی را خروجی میدهند.
B) متد iloc برچسبها را به طور سختگیرانه تطبیق میدهد، در حالی که loc آفستهای موقعیتی را از مرز بالایی جستجو میکند.
C) متد iloc رکوردها را بر اساس آفستهای موقعیتی مبتنی بر عدد صحیح استخراج میکند، در حالی که loc برچسبهای ایندکس ردیفهای مطابق را جستجو میکند.
D) متد loc ساختارهای چندبعدی را کاملاً تخت میکند، در حالی که iloc ارتقاء اجباری به یک آرایه NumPy را تحمیل میکند.
E) عبارت loc با موفقیت اجرا خواهد شد، اما iloc همیشه یک IndexError غیرقابل دسترس پرتاب میکند.
F) متد iloc به طور خودکار دیتابیس منبع را از ابتدا دوباره ایندکس میکند و ساختارهای ردیف اصلی را برای همیشه پاک میکند.
پاسخ صحیح و توضیح:
پاسخ صحیح: C
چرا درست است: در پانداز، iloc از برش موقعیتی خالص مبتنی بر عدد صحیح استفاده میکند (از موقعیت 0 تا موقعیت 2، بدون احتساب خود 2، و دو ردیف اول را بدون توجه به برچسبهایشان میگیرد). در همین حال، loc آیتمها را با تطبیق برچسبهای واقعی در ستون ایندکس جستجو میکند. از آنجایی که مقادیر 0، 1 یا 2 در ایندکسهای ردیف ([4, 12, 19]) وجود ندارند، برش loc کاملاً متفاوت عمل کرده و مجموعههای خالی را تطبیق داده یا بر اساس نوع ایندکس با خطا مواجه میشود.
چرا گزینههای دیگر غلط هستند:
گزینه A غلط است: آنها از روشهای جستجوی اساساً متفاوتی استفاده میکنند، به این معنی که تنها در صورتی مطابقت دارند که برچسبهای ایندکس دقیقاً با اعداد صحیح متوالی ردیفها همراستا باشند.
گزینه B غلط است: این گزینه دقیقاً عکس نحوه عملکرد واقعی این اپراتورهای ایندکس است.
گزینه D غلط است: هیچ یک از این متدها ابعاد آرایه را تغییر نمیدهند یا تبدیل نوع را در پشت صحنه تحمیل نمیکنند.
گزینه E غلط است: برش موقعیتی با iloc در محدوده قانونی میماند زیرا مکانهای ایندکس را نسبت به اندازه مطلق مجموعه داده بررسی میکند.
گزینه F غلط است: این کوئریهای برش، نماهای فقطخواندنی یا کپیها را بازیابی میکنند؛ آنها هرگز ساختار DataFrame منبع را تغییر نداده یا دوباره ایندکس نمیکنند.
چه انتظاراتی داشته باشید
به آزمونهای سوالات مصاحبه خوش آمدید تا شما را برای ارزیابی سوالات مصاحبه پایتون آماده کنیم
میتوانید آزمونها را هر چند بار که بخواهید تکرار کنید
این یک بانک سوالات عظیم و اورجینال است
در صورت داشتن سوال، از پشتیبانی مدرسان بهرهمند میشوید
هر سوال دارای یک توضیح دقیق است
سازگار با موبایل از طریق اپلیکیشن Udemy
امیدواریم تا الان متقاعد شده باشید! سوالات بسیار بیشتری در داخل دوره وجود دارد.
Interview Questions Tests
مربی در Udemy
نمایش نظرات