سوالات مصاحبه برنامه نویسی پایتون با جواب — راهنمای استخدام
پایتون (Python) یکی از پرکاربردترین و بهترین زبانهای برنامه نویسی به حساب میآید و به دلیل سادگی و نزدیک بودن آن به زبان انسان، انعطافپذیری بالایی دارد. همچنین یک زبان رایگان و متن باز (Open Source) است که ساختار نحوی (Syntax) بسیار ساده و تمیزی دارد. این امر یادگیری پایتون را برای توسعه دهندگان ساده میکند. همچنین، پایتون یک زبان برنامه نویسی شی گرا (Object Oriented Programming | OOP) و همه منظوره به حساب میآید. به دلیل قابلیت دستیابی به چندین عملکرد در خطهای کد کمتر، محبوبیت پایتون به شدت در حال افزایش است. با وجود اهمیتهای فراوان این زبان برنامه نویسی در مسیر شغلی حوزه کامپیوتر، در مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به بررسی برخی از سوالات مهم استخدامی آن پرداخته میشود.
پایتون در حوزههای گوناگونی از جمله یادگیری ماشین (Machine Learning)، هوش مصنوعی (Artificial Intelligence)، برنامه نویسی وب (Web Development) و سایر موارد به دلیل قابلیت آن در پشتیبانی از محاسبات پیچیده با استفاده از کتابخانههای قدرتمند کاربرد دارد. با توجه به مسائلی که ارائه شد به این نتیجه میرسیم که تقاضای شرکتها برای استخدام برنامه نویس پایتون بسیار زیاد است و توسعه دهندگان با یادگیری این زبان میتوانند به سرعت وارد بازار کار شوند. بنابراین در این مقاله، سوالات مصاحبه برنامه نویسی پایتون با جواب برای برنامه نویسان پایتونی که جویای کار هستند بر اساس درجه سختی از سطح مبتدی تا پیشرفته دستهبندی شدهاند. در ابتدای این مطلب به سوالاتی پرداخته میشود که نیاز است برنامه نویسان مبتدی و تازهکار آنها را بدانند.
سوالات مصاحبه برنامه نویسی پایتون برای افراد تازه کار
در این بخش از مقاله، ابتدا به سوالات مصاحبه برنامه نویسی پایتون برای افراد تازهکار و مبتدی پرداخته شده است. اشخاص مبتدی در حوزه برنامه نویسی میتوانند به واسطه آشنایی با این سوالات، سطح مهارتهای خود را در این زمینه افزایش دهند. اگر شخصی در زمینه برنامه نویسی پایتون در ابتدای مسیر است و قصد استخدام شدن به عنوان یک برنامه نویس تازهکار را دارد، میتواند از سوالات مصاحبه برنامه نویسی پایتون ارائه شده در این بخش برای به دست آوردن آمادگی لازم جهت شرکت در جلسه مصاحبه استفاده کند. سوالات مصاحبه برنامه نویسی پایتون در این بخش از ابتداییترین موضوع شروع و به مرور پیشرفتهتر میشوند.
پایتون چیست و مزایای آن چه هستند؟
پایتون یک زبان برنامه نویسی سطح بالا (High Level Programming)، مفسری (Interpreted) و همه منظوره به حساب میآید. همچنین، چون پایتون یک زبان همه منظوره است، میتوان از آن تقریباً برای ساخت هر نوع برنامهای با ابزارها و کتابخانههای گوناگون استفاده کرد. علاوه بر این، زبان پایتون از موارد زیر پشتیبانی میکند و این موارد به مدلسازی مسائل دنیای واقعی و ساخت برنامههای کاربردی برای حل این مسائل کمک میکنند.
- اشیا (Object)
- ماژولها (Module) در پایتون
- نخها (Thread)
- مدیریت استثناها (Exception Handling) در پایتون
- مدیریت حافظه خودکار (Automatic Memory Management)
برخی از مزایای استفاده از پایتون در ادامه ارائه شدهاند:
- از آنجایی که پایتون یک زبان برنامه نویسی همه منظوره به حساب میآید، بنابراین دارای ساختار نوشتاری ساده و آسان برای یادگیری است که بر افزایش خوانایی کدها تأثیر بسیاری دارد. همچنین این قابلیتها باعث میشوند که هزینه نگهداری کدها به میزان زیادی کمتر شود.
- با استفاده از زبان پایتون میتوان اسکریپتنویسی هم انجام داد. پایتون کاملاً متن باز است و از بستههای شخص ثالث (Third Party Package) پشتیبانی میکند. به علاوه، این بستهها باعث میشوند که کدها قابلیت پیمانهای (Modularity) داشته باشند و همچنین بتوان از کدها در برنامههای دیگر هم استفاده کرد و در واقع قابلیت «استفاده مجدد» (Code Reuse) کدها وجود داشته باشد.
- وجود ساختمان دادههای سطح بالا در پایتون همراه با نوعدهی پویا (Dynamic Typing) و مقیدسازی پویا (Dynamic Binding)، جامعه عظیمی از توسعه دهندگان را برای توسعه برنامههای سریع به خود جذب کردهاند.
زبان نوع پویا چیست؟
قبل از اینکه به این سوال پاسخ داده شود، باید چیستی «Typing» مورد بررسی قرار بگیرد. Typing به بررسی نوع (Type Checking) در زبانهای برنامه نویسی اشاره دارد. در یک زبان با «بررسی نوع پویای قوی» (Strongly Typed) مثل پایتون، عبارت زیر باعث ایجاد خطا در هنگام بررسی نوع میشود:
"1" + 2
یعنی نمیتوان یک عدد صحیح را با یک عدد از نوع رشتهای جمع کرد. زیرا این زبانها اجبار نوع (Type Coercion) دارند و تبدیل ضمنی انواع دادهها (Data Type) در آنها انجام نمیشود. از سوی دیگر، یک زبان با «بررسی نوع پویای ضعیف» (Loose Type) مانند جاوا اسکریپت (Java Script) در مثال ارائه شده، مقدار “12” (عدد ۱۲ از نوع رشتهای) را در خروجی چاپ میکند. بررسی نوع با استفاده از دو روش زیر انجام میشود:
- ایستا (Static): انواع دادهها قبل از اجرا بررسی میشوند.
- پویا (Dynamic): انواع دادهها در حین اجرا مورد بررسی قرار میگیرند (نوع پویا هم دارای دو نوع قوی و ضعیف است).
پایتون یک زبان برنامه نویسی مفسری به حساب میآید و هر عبارت را خط به خط اجرا میکند و بنابراین بررسی نوع آن در حین اجرا انجام میشود. از این رو، میتوان گفت که پایتون یک زبان با بررسی نوع پویا (قوی) است.
زبان مفسری چیست؟
زبانهای مفسری (Interpreted Language) کدهای برنامه را به صورت خط به خط بررسی و پیادهسازی میکنند. زبانهایی مانند پایتون، جاوا اسکریپت، R، روبی (Ruby) و PHP، مثالهایی برای زبانهای برنامه نویسی مفسری هستند. پیادهسازی برنامههایی که با زبان مفسری نوشته میشوند به طور مستقیم از کد منبع انجام میگیرد و هیچ مرحله کامپایل میانی (Intermediary Compilation) ندارند.
PEP 8 در زبان پایتون چیست و به چه دلیلی حائز اهمیت است؟
PEP مخفف عبارت «Python Enhancement Proposal» به معنی «پیشنهادات و اصولی برای بهبود کیفیت پایتون» به حساب میآید. PEP یک سند طراحی رسمی است که اطلاعاتی را به جامعه پایتون ارائه میدهد یا ویژگی جدیدی را برای پایتون و پردازشهای آن تعریف میکند. PEP 8 به این دلیل اهمیت دارد که اسناد نوشتن کدهای پایتون را ارائه میدهد. همچنین به دلیل وجود مشارکت بالا در جامعه برنامه نویسی پایتون، نیاز است که این اسناد برای دنبال شدن سبک خاصی از برنامه نویسی وجود داشته باشند.
منظور از Scope در زبان برنامه نویسی پایتون چیست؟
Scope یا همان دامنه متغیرها در پایتون، بلوکی از کدها است که اشیا مرتبط به بلوک در آن محدوده باقی میمانند. هر شی در پایتون فقط در یک دامنه یا همان Scope مخصوص به خودش عمل میکند. فضاهای نام (Namespace) در پایتون به طور منحصر به فرد، همه اشیا داخل برنامهها را شناسایی میکنند. با این حال، برای فضاهای نام نیز یک محدوده تعریف شده است که میتوان از اشیا آنها بدون هیچ پیشوندی استفاده کرد. چند مثال از Scopeهای ایجاد شده در هنگام اجرای کدها در برنامههای پایتون در ادامه ارائه شدهاند:
- یک محدوده محلی (Local Scope)، اشیا محلی موجود در تابع فعلی را نشان میدهد.
- یک محدوده سراسری (Global Scope) به اشیا موجود در سرتاسر کدهای برنامه موجود اشاره دارد.
- محدوده سطح ماژول (Module Level Scope) به اشیا سراسری ماژولی اشاره دارد که در برنامه فعلی قابل دسترسی است.
- بیرونیترین محدوده (OutermostScope) همه نامهای داخلی (Built-In) قابل فراخوانی در برنامه را نشان میدهد. این محدوده، آخرین محدودهای است که برای یافتن اشیا، جستجو در آن انجام میشود.
باید به این نکته توجه داشت که اشیا محدوده محلی را با استفاده از اشیا محدوده سراسری به وسیله کلمه کلیدی «global» نیز میتوان همگامسازی کرد.
لیست و تاپل در زبان پایتون چیست؟
لیستها (List) و تاپلها (Tuple) در پایتون انواع دادههای دنبالهای (Sequence Data Type) هستند که مجموعهای از اشیا را در برنامههای پایتون ذخیره میکنند. اشیا ذخیره شده در هر دو نوع دنباله میتوانند انواع دادههای گوناگونی داشته باشند. لیستها در پایتون با کروشه یا قلاب برای مثال به صورت [sara’, 6, 0.19′] نشان داده میشوند، در حالی که تاپلها با پرانتز مانند (ansh’, 5, 0.97′) مشخص شدهاند. در سوال بعدی به تفاوت اصلی میان لیست و تاپل در زبان پایتون پرداخته شده است.
تفاوت بین لیست و تاپل در پایتون چیست؟
تفاوت اصلی بین لیست و تاپل در این است که لیستها اشیای قابل تغییر را دریافت میکنند. اما در سویی دیگر، تاپلها دارای اشیای تغییرناپذیر هستند. یعنی لیستها را میتوان در حین برنامه تغییر داد و چیزی به آنها اضافه کرد یا اشیا آنها را تقسیم کرد. در صورتی که تاپلها در برنامه ثابت میمانند و به هیچ وجه نمیتوان تغییری در آنها انجام داد. برای مشاهده تفاوت میان این دو نوع داده، میتوان کدهای زیر را در یک ویرایشگر کد پایتون پیادهسازی کرد. خروجی هر کدام از خطهای برنامه زیر در مقابل آن نشان داده شده است.
my_tuple = ('sara', 6, 5, 0.97)
my_list = ['sara', 6, 5, 0.97]
print(my_tuple[0]) # output => 'sara'
print(my_list[0]) # output => 'sara'
my_tuple[0] = 'ansh' # modifying tuple => throws an error
my_list[0] = 'ansh' # modifying list => list modified
print(my_tuple[0]) # output => 'sara'
print(my_list[0]) # output => 'ansh'
انواع داده های داخلی رایج در پایتون کدامند؟
زبان برنامه نویسی پایتون دارای چندین نوع داده داخلی (Internal Types) است. اگرچه، پایتون نیازی به تعریف صریح نوع داده در زمان اعلان متغیرها ندارد، ولی اگر به نوع دادهها و سازگاری آنها با یکدیگر توجهی نشود، احتمالاً خطاهای مرتبط با نوع در برنامه رخ خواهند داد. پایتون از توابع ()type و ()ininstance برای بررسی نوع متغیرها استفاده میکند. دادههای داخلی پایتون را میتوان به گروههای زیر دستهبندی کرد:
- نوع داده None Type در پایتون: کلمه کلیدی «None» مقادیر تهی را در پایتون نشان میدهد. عملیات برابری بولی (Boolean Equality Operation) را میتوان با استفاده از اشیا با نوع دادهای None Type انجام داد. جدول زیر به طور خلاصه این نوع دادهای را توصیف میکند.
توصیف | نام کلاس |
نشان دهنده مقادیر تهی در زبان پایتون | NoneType |
- نوع داده عددی (Numeric Type) در پایتون: در این نوع داده، سه نوع عددی متمایز یعنی اعداد صحیح (Integer)، اعداد اعشاری (ممیز شناور| Floating Point) و اعداد مختلط (Complex) وجود دارند. همچنین نوع دادهای بولی زیر نوعی (Sub Type) از اعداد صحیح هستند. جدول زیر به طور خلاصه انواع دادهای این بخش را توصیف میکند.
توصیف | نام کلاس |
این نوع داده شامل اعداد صحیح از جمله هگزادسیمال (مبنای ۱۶| Hexadecimal)، هشتهشتی یا اُکتال (مبنای ۸| Octal) و دودویی یا باینری (Binary) است. | int |
این نوع داده شامل اعداد اعشاری میشود. | float |
در این نوع داده اعداد مختلط به شکل (A + Bj) ذخیره میشوند و دارای ویژگیهای واقعی (real) و تصویری (imag) هستند. | complex |
این نوع داده مقدار بولی (True یا False) را ذخیره میکند. | bool |
- نوع داده دنبالهای (Sequence Types) در پایتون: طبق اسناد اصلی پایتون، سه نوع داده دنباله پایه یعنی لیست، تاپل و دامنه (Range) وجود دارند. انواع توالیها دارای عملگرهای in و not in هستند که برای استفاده از عناصر آنها تعریف شدهاند. در ادامه به صورت خلاصه انواع دادههای این بخش توصیف شدهاند:
توصیف | نام کلاس |
این نوع داده دنبالههای قابل تغییر برای ذخیره مجموعهای از آیتمها را نگهداری میکنند. | list |
این نوع داده دنبالههای تغییرناپذیر برای ذخیره مجموعهای از دادهها را نشان میدهد. | ruple |
این نوع داده دنبالهای تغییرناپذیر از اعداد تولید شده در طول اجرا را نشان میدهد. | range |
این نوع داده دنباله تغییرناپذیر یونیکد (Unicode) برای ذخیره دادههای متنی را نشان میدهد. | str |
به این نکته نیز باید توجه داشت که کتابخانه استاندارد پایتون شامل انواع داده دیگری برای پردازش از جمله دو مورد زیر است:
-
- نوع داده Binary data: این نوع داده پایتون شامل Bytearray Bytes و Memoryview میشود.
- نوع داده رشتههای متنی (Text strings): این نوع داده پایتون رشتههای متنی را نشان میدهد و با Str مشخص شده است.
- نوع داده نگاشت (Mapping) در پایتون: یک شی با نوع دادهای نگاشت میتواند مقادیر قابل هش را به اشیا تصادفی در پایتون نگاشت کند. اشیا نوع دادهای نگاشت قابل تغییر هستند و در حال حاضر فقط یک نوع داده استاندارد نگاشت وجود دارد و آن هم دیکشنری (Dictionary) است. این نوع دادهای به صورت خلاصه در ادامه توصیف میشود.
توصیف | نام کلاس |
این نوع داده دارای لیستی از عناصر کلیدی است که با ویرگول از هم جدا شدهاند. | dict |
- نوع دادهای مجموعه (Set): در حال حاضر، زبان پایتون دارای 2 نوع دادهای مجموعه با نامهای Set و Frozenset است. نوع دادهای Set قابلیت تغییر دارد و از متدهای ()add و ()remove پشتیبانی میکند. نوع دادهای Frozenset غیر قابل تغییر است و بعد از ایجاد، امکان ویرایش و تغییر برای آن وجود ندارد. در جدول زیر به طور خلاصه این انواع دادهای بررسی میشوند.
توصیف | نام کلاس |
این نوع داده یک مجموعه نامرتب قابل تغییر از اشیا قابل هش (Hashable) متمایز را نشان میدهد. | set |
این نوع داده مجموعه غیر قابل تغییر از اشیای قابل هش متمایز را نشان میدهد. | frozenset |
- نوع دادهای ماژول (Module): ماژول یک نوع داخلی افزوده است که توسط مفسر پایتون پشتیبانی میشود. این نوع دادهای از یک عملیات خاص پشتیبانی میکند.
- انواع دادهای قابل فراخوانی (Callable): این نوع از انواع دادهها، نوعی است که فراخوانی تابع را میتوان به آن واگذار کرد. آنها میتوانند توابع تعریف شده توسط کاربر (User Defined Function)، متدهای نمونه (Instance Method)، توابع مولد (Generator Function) و برخی توابع داخلی دیگر، متدها و کلاسها باشند.
دستور Pass در پایتون چیست؟
دستور Pass یا همان «رد کردن» در پایتون نشان دهنده عملیات تهی است. این دستور با استفاده از کلمه کلیدی pass در برنامهها استفاده میشود. هدف از این دستور معمولاً پر کردن بلوکهای خالی کدها به حساب میآید که ممکن است در زمان اجرا پیادهسازی شوند اما هنوز کدهای آنها به صورت کامل نوشته نشدهاند. برای مثال بدون دستور pass در کدهای زیر، امکان دارد که در هنگام اجرای کدها خطاهایی رخ دهند.
def myEmptyFunc():
# do nothing
pass
myEmptyFunc() # nothing happens
## Without the pass keyword
# File "", line 3
# IndentationError: expected an indented block
ماژول و پکیج در پایتون چه هستند؟
ماژولها (Module) و بستهها (Package) در پایتون دو مکانیسمی هستند که امکان برنامه نویسی ماژولار (Modular Programming) را در پایتون فراهم میکنند. ماژولار کردن دارای مزایای بسیاری است که برخی از آنها در ادامه بررسی میشوند:
- سادگی (Simplicity): کار بر روی یک ماژول به برنامه نویس کمک میکند تا روی مشکلات و مسائل کدهای برنامه تمرکز بهتری داشته باشد. این موضوع باعث میشود که توسعه برنامه آسانتر شود و کمتر در معرض خطا قرار بگیرد.
- قابلیت نگهداری (Maintainability): اگر ماژولها به گونهای نوشته شده باشند که وابستگی متقابل در آنها کاهش پیدا کند، احتمال کمتری وجود دارد که تغییرات روی یک ماژول بر سایر بخشهای برنامه تأثیر بگذارد.
- قابلیت استفاده مجدد (Reusability): توابعی که در یک ماژول تعریف میشوند به راحتی میتوانند در بخشهای دیگر برنامه مورد استفاده قرار بگیرند.
- محدوده (Scoping): معمولاً در ماژولها یک محدوده یا فضای نام جداگانه تعریف میشود تا به جلوگیری از سردرگمی بین شناسههای سایر بخشهای برنامه کمک شود.
به طور کلی ماژولها مانند فایلهای دیگر پایتون دارای پسوند py. هستند و میتوانند مجموعهای از توابع، کلاسها یا متغیرها را تعریف و پیادهسازی کنند. آنها را میتوان یک بار در هر برنامهای با استفاده از دستور «import» وارد و مقداردهی اولیه کرد. در صورتی که فقط به یک عملکرد جزئی از ماژول برای برنامه نیاز باشد میتوان کلاسها و توابع مورد نیاز را با استفاده از دستور «from foo import bar» وارد برنامه و مقداردهی اولیه کرد. بستههای (پکیج) پایتون امکان ساختار سلسله مراتبی فضای نام ماژول را با استفاده از نماد نقطه (Dot Notation) میدهند.
همانطور که ماژولها از برخورد نام متغیرهای سراسری جلوگیری میکنند، به صورت مشابه بستهها از برخورد نام ماژولها جلوگیری انجام میدهند. ایجاد یک بسته آسان است زیرا از ساختار ایجاد فایل طبیعی و عادی در سیستم برای آن استفاده میشود. بنابراین فقط ماژولها در یک پوشه قرار میگیرند و نام پوشه به عنوان نام بسته در نظر گرفته میشود. برای وارد کردن یک ماژول یا محتویات آن از بستهای به برنامه، نام بسته به عنوان پیشوند با نام ماژول به وسیله یک نقطه متصل میشود.
ویژگی های سراسری، محافظت شده و خصوصی در پایتون کدامند؟
متغیرهای سراسری (Global Variable)، متغیرهای عمومی هستند که در محدوده سرتاسر برنامه تعریف میشوند. زمانی که از یک متغیر سراسری در داخل یک تابع استفاده میشود، نیاز است که کلمه کلیدی «global» همراه با آن مورد استفاده قرار بگیرد. برای تعریف ویژگیهای محافظت شده (Protected Attribute) از یک خط زیرین پیشوندی (Underscore Prefixed) جهت شناسایی این ویژگیها استفاده میشود. برای مثال sara_ به این صورت نوشته شده است.
همچنین، میتوان خارج از کلاسی که این ویژگیها در آن تعریف شدهاند به آنها دسترسی داشت و آنها را ویرایش کرد، اما توسعه دهندگان خبره از این روش استفاده نمیکنند. تعریف ویژگیهای خصوصی (Private Attribute) بسیار شبیه به ویژگیهای محافظت شده است با این تفاوت که در تعریف آنها از دو خط زیرین پیشوندی استفاده میشود. به عنوان مثال میتوان ویژگی ansh__ را در نظر گرفت. نمیتوان مستقیماً از خارج از کلاسی که ویژگیهای خصوصی در آن تعریف شدهاند به آنها دسترسی داشت و روی آنها ویرایش انجام داد. همچنین در صورت انجام چنین کاری در برنامه خطای «AttributeError» ایجاد میشود.
کاربرد Self در پایتون چیست؟
Self در زبان برنامه نویسی پایتون برای نمایش نمونه (Instance) کلاس استفاده میشود. با استفاده از Self میتوان به ویژگیها و متدهای کلاس دسترسی داشت. Self ویژگیها را با آرگومانهای دریافت شده پیوند میدهد. همچنین، Self در مکانهای گوناگونی مورد استفاده قرار میگیرد و اغلب تصور میشود که یک کلمه کلیدی است. اما در زبان پایتون Self یک کلمه کلیدی نیست. با اینکه در زبانهای دیگری مانند ++C کلمه کلیدی به حساب میآید.
__init__ در زبان پایتون چیست؟
__init__ یک متد (Method) سازنده (Constructor) در پایتون به حساب میآید. زمانی که در این زبان برنامه نویسی یک شی یا نمونه ایجاد میشود، __init__ به طور خودکار برای تخصیص حافظه (Allocate Memory) فراخوانی خواهد شد. در پایتون همه کلاسها دارای یک متد __init__ مرتبط با کلاس هستند. این سازنده به تشخیص متدها و ویژگیهای یک کلاس از متغیرهای محلی کمک میکند. برای درک بهتر این متد مثالی در ادامه ارائه شده است.
# class definition
class Student:
def __init__(self, fname, lname, age, section):
self.firstname = fname
self.lastname = lname
self.age = age
self.section = section
# creating a new object
stu1 = Student("Sara", "Ansh", 22, "A2")
اصطلاحات Continue، Break و Pass در پایتون به چه معنا هستند؟
زمانی که در یک حلقه برنامه پایتون از دستور «Break» استفاده میشود، بلافاصله حلقه خاتمه پیدا میکند و اجرای برنامه از خط بعد از بدنه حلقه مییابد. دستور «Continue» تکرار فعلی حلقه برنامه را خاتمه میدهد و بقیه کدها را در همان تکرار رد میکند، سپس کنترل برنامه را به تکرار بعدی حلقه میدهد.
همانطور که در یکی از سوالات قبلی توضیح داده شد، دستور «Pass» در پایتون برای پر کردن بلوکهای خالی استفاده میشود و شبیه یک عبارت خالی است که در زبانهایی مانند جاوا (Java)، ++C، جاوا اسکریپت و برخی زبانهای دیگر با یک سمی کالن (Semi Colon) نمایش داده شده است. برای مثال تکه کد کوچکی از یک برنامه پایتون در ادامه نشان داده میشود.
pat = [1, 3, 2, 1, 2, 3, 1, 0, 1, 3]
for p in pat:
pass
if (p == 0):
current = p
break
elif (p % 2 == 0):
continue
print(p) # output => 1 3 1 3 1
print(current) # output => 0
تست واحد در زبان پایتون یعنی چه؟
تست واحد یا همان تست یونیت (Unit Test) یکی از رویکردهای مهم برنامه نویسی با زبان پایتون به حساب میآید و به صورت مرحله به مرحله در ادامه توضیح داده شده است:
- یونیت تست یک فریمورک تست واحد در زبان برنامه نویسی پایتون به حساب میآید.
- تست واحد به معنی تست کردن مولفههای گوناگون نرم افزار به صورت جداگانه است. سوالی که در این بخش ایجاد میشود این است که چرا استفاده از تست واحد مهم در نظر گرفته میشود؟ برای پاسخ به این سوال یک سناریو وجود دارد. در این سناریو نرم افزاری در حال ساخت است که از سه جزء B ،A و C تشکیل میشود. حال فرض میشود که این نرم افزار در یک زمان خراب شود. در این شرایط امکان دارد که فقط یکی از اجزای نرم افزار خراب شده باشد. برای مثال فقط جز A دارای مشکل و ایراد است. بنابراین با استفاده از تست واحد هر کدام از بخشها تست میشوند و بخشی که دچار مشکل شده است با استفاده از این روش پیدا خواهد شد.
- به همین دلیل باید تک تک اجزای نرم افزار به درستی تست شوند تا عامل اصلی خرابی آن را بتوان پیدا کرد.
Docstring در پایتون چیست؟
رشتهای برای مستندات پایتون یا همان «Docstring»، یک رشته چند خطی است که برای مستندسازی بخشی خاص از کدها استفاده میشود. هدف این رشته توضیح عملکرد توابع و متدها در یک برنامه پایتون به حساب میآید.
Slicing در پایتون به چه معناست؟
«Slicing» همانطور که از نامش پیداست به معنی برش زدن و بخش بخش کردن چیزی است، در ادامه به صورت گام به گام مفهوم شرح داده میشود:
- ساختار نوشتاری (سینتکس) Slicing در پایتون به صورت [start : stop : step] است که هر کدام از این بخشها در ادامه بررسی میشوند:
- start: اندیس (Index) شروع برای بخشی از لیست (List)، تاپل (Tuple) یا سایر موارد به حساب میآید که برش زده شده است.
- stop: اندیس پایانی لیست، تاپل یا جایی که قرار است برش بخش به اتمام برسد را نشان میدهد.
- step: این اندیس تعداد پرشها در هر مرحله را برای یک لیست یا تاپل نشان میدهد.
- مقادیر پیش فرض برای اندیس start صفر، برای stop تعداد آیتمهای لیست یا تاپل و برای step یک است.
- برش زدن یا همان Slicing میتواند روی رشتهها (String)، آرایهها (Array)، لیستها و تاپلها انجام شود.
در ادامه، مثالی برای درک بهتر مفهوم برش زدن ارائه شده است.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[1 : : 2]) #output : [2, 4, 6, 8, 10]
چگونه می توان یک اسکریپت پایتون را در یونیکس قابل اجرا کرد؟
برای پیادهسازی یک اسکریپت پایتون در یونیکس (Unix)، معمولاً میتوان با شروع فایل به صورت زیر آن را قابل اجرا کرد: usr/bin/env python/#
تفاوت بین آرایههای پایتون و لیست در پایتون چیست؟
آرایهها در پایتون فقط میتوانند شامل عناصری از انواع دادههای مشابه باشند؛ یعنی نوع دادههای آرایه باید همگن (Homogeneous) باشند. آرایه حافظه کمتری نسبت به لیستها مصرف میکند. لیستها در پایتون میتوانند حاوی عناصری از انواع دادههای گوناگون باشند؛ یعنی، نوع دادههای لیست میتوانند به صورت ناهمگن (Heterogeneous) تعریف شوند. از معایب لیستها میتوان به مصرف بالای حافظه در آن اشاره کرد. در ادامه، مثالی برای درک بهتر مفهوم آرایه و لیست در پایتون ارائه شده است.
import array
a = array.array('i', [1, 2, 3])
for i in a:
print(i, end=' ') #OUTPUT: 1 2 3
a = array.array('i', [1, 2, 'string']) #OUTPUT: TypeError: an integer is required (got type str)
a = [1, 2, 'string']
for i in a:
print(i, end=' ') #OUTPUT: 1 2 string
در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به بررسی برخی از سوالات جهت آمادگی برای شرکت در مصاحبه افرادی پرداخته شد که با زبان پایتون در سطح مبتدی آشنا هستند. اکنون در ادامه پیش از پرداختن به سوالات مصاحبه برنامه نویسی پایتون در سطح پیشرفته تعدادی از دورههای آموزش برنامه نویسی پایتون تم آف معرفی میشوند.
فیلم های آموزش برنامه نویسی پایتون
دورههای آموزشی در مجموعه تم آف بر اساس موضوع در قالب مجموعههای آموزشی گوناگون دستهبندی میشوند. یکی از این مجموعهها مربوط به آموزش زبان پایتون در سطحهای مقدماتی تا پیشرفته است با توجه به اینکه یادگیری برنامه نویسی پایتون برای استخدام در شرکتهای برنامه نویسی مختلف از اهمیت زیادی برخوردار است، این بخش به مجموعه آموزشهای ویدیویی پایتون برای یادگیری بیشتر این زبان در کاربردهای گوناگون اختصاص دارد. در زمان تدوین این مقاله، مجموعه دورههای برنامه نویسی پایتون تم آف حاوی ۲۵۱ ساعت محتوای ویدیویی است و شامل ۴۴ دوره میشود. در ادامه برخی از دورههای این مجموعه آموزشی به طور خلاصه معرفی شدهاند:
- فیلم آموزش برنامه نویسی پایتون Python – مقدماتی (طول مدت: ۱۹ ساعت و ۵۳ دقیقه، مدرس: پژمان اقبالی شمس آبادی): در این دوره آموزشی زبان برنامه نویسی پایتون از پایه تدریس میشود و برای دانشجویان و علاقهمندان به پایتون مناسب است. برای مشاهده فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + کلیک کنید.
- فیلم آموزش برنامه نویسی پایتون + مثال های عملی در Python (طول مدت: ۱۳ ساعت و ۲۰ دقیقه، مدرس: دکتر فرشید شیرافکن): با استفاده از یادگیری این تم آف، آموزندگان میتوانند با زبان پایتون برنامه نویسی کنند. مفاهیم این آموزش با تشریح مبانی نظری و سپس با پیادهسازی مثالهای عملی، آموزش داده میشود. برای مشاهده فیلم آموزش برنامه نویسی پایتون + مثال های عملی در Python + کلیک کنید.
- فیلم آموزش برنامه نویسی شی گرا در پایتون Python (طول مدت: ۷ ساعت و ۲۹ دقیقه، مدرس: دکتر فرشید شیرافکن): در این تم آف مفاهیم شی گرایی (Object Oriented) در پایتون با سادهترین روش و همراه با ذکر مثال آموزش داده شده است. برای مشاهده فیلم آموزش برنامه نویسی شی گرا در پایتون Python + کلیک کنید.
- فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون (طول مدت: ۴ ساعت و ۴۶ دقیقه، مدرس: میترا تجربه کار): این دوره آموزشی برای تکمیل و بهینهسازی مباحث موجود در پایتون مقدماتی ارائه شده است. همچنین آشنایی با کتابخانه NumPy، بخش جدیدی از برنامه نویسی پایتون را در این دوره به دانشجویان و علاقهمندان نشان میدهد. برای مشاهده فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون + کلیک کنید.
- فیلم آموزش پایتون گرافیکی – رابط های گرافیکی پایتون (طول مدت: ۵ ساعت و ۳ دقیقه، مدرس: سید رضا دهقان): برای برنامه نویسان پایتون، یادگیری حداقل یک واسط گرافیکی (Graphical User Interface | GUI) این زبان برنامه نویسی از اهمیت بالایی برخوردار است. به همین دلیل، در این دوره آموزشی به بررسی واسطهای گرافیکی پایتون پرداخته میشود. برای مشاهده فیلم آموزش پایتون گرافیکی – رابطهای گرافیکی پایتون + کلیک کنید.
- فیلم آموزش پروژه محور Python پایتون – ساخت نرم افزار برای ویندوز و لینوکس در Python (طول مدت: ۹ ساعت و ۳۴ دقیقه، مدرس: محمد حسینی): ابزار توسعه در این تم آف بر مبنای پای کیوت (PyQt) است. با استفاده از این تم آف، علاقهمندان با نحوه تولید نرم افزار آشنا میشوند و میتوانند برای هر زمینهای نرم افزار مورد نیازشان را ایجاد کنند. برای مشاهده فیلم آموزش پروژه محور Python پایتون – ساخت نرم افزار برای ویندوز و لینوکس در Python + کلیک کنید.
اکنون پس از معرفی برخی از فیلمهای آموزش زبان برنامه نویسی پایتون به سوالات مصاحبه برنامه نویسی پایتون در سطح پیشرفته پرداخته شده است.
سوالات مصاحبه برنامه نویسی پایتون در سطح پیشرفته
در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به سوالات مصاحبه پایتون در سطح پیشرفته برای افراد با تجربه و خبره در این زبان برنامه نویسی پرداخته میشود.
حافظه در پایتون چگونه مدیریت می شود؟
مدیریت حافظه در برنامههای پایتون توسط «مدیر حافظه پایتون» (Python Memory Manager) انجام میشود. حافظه اختصاص داده شده به برنامه توسط مدیر حافظه پایتون به شکل یک فضای خصوصی و اختصاصی «Heap» برای پایتون در نظر گرفته شده است. همه اشیا پایتون در این Heap ذخیره میشوند و به دلیل خصوصی بودن مدیر حافظه پایتون، برای برنامه نویس غیر قابل دسترسی هستند. اگرچه پایتون دارای برخی توابع API اصلی (Core API Function) است که کار بر روی فضای Heap خصوصی را فراهم میکنند. علاوه بر این، پایتون یک مجموعه بازیافت حافظه داخلی (In Built Garbage Collection) جهت بازیافت حافظههای استفاده نشده برای فضای Heap خصوصی نیز دارد.
در پایتون فضای نام چیست و چرا از آن استفاده می شود؟
فضای نام (Namespace) در پایتون تضمین میکند که نام اشیا در برنامهها منحصر به فرد هستند و میتوانند بدون هیچ مغایرت و مشکلی مورد استفاده قرار بگیرند. پایتون این فضاهای نام را به عنوان دیکشنری با «نام به جای کلید» نگاشت شده به «شی به جای مقدار» مربوطه پیادهسازی میکند. این رویکرد امکان این را به پایتون میدهد تا چندین فضای نام از یک نام استفاده و آن را به یک شی جداگانه نگاشت کنند. چند مثال برای فضای نام در ادامه ارائه شده است:
- فضای نام محلی (Local Namespace): این فضای نام شامل نامهای محلی داخل توابع میشود. فضای نام محلی به طور موقت برای فراخوانی تابع ایجاد شده است و با برگرداندن تابع حذف خواهد شد.
- فضای نام سراسری (Global Namespace): این نوع از فضاهای نام شامل بستهها (Package) و ماژولهای گوناگون وارد شده به برنامه هستند که در کدهای برنامه فعلی مورد استفاده قرار میگیرند. فضای نام سراسری زمانی ایجاد میشود که بسته در اسکریپت وارد شده است و تا انتهای اجرای اسکریپت ادامه پیدا میکند.
- فضای نام داخلی (Built-in Namespace): این فضای نام شامل توابع داخلی هسته پایتون و نامهای داخلی برای انواع مختلف استثناها (Exception) در پایتون است.
چرخه حیات یک فضای نام بستگی به دامنه اشیایی دارد که به آنها نگاشت میشوند. اگر دامنه یک شی به پایان برسد، چرخه حیات آن فضای نام نیز تمام میشود. بنابراین، دسترسی به اشیا فضای نام داخلی توسط فضاهای نام خارجی امکانپذیر نیست.
در زبان برنامه نویسی پایتون Scope Resolution به چه معناست؟
گاهی اوقات در یک برنامه پایتون، اشیا در یک محدوده یکسان نام مشابهی دارند اما عملکرد آنها متفاوت است. در چنین مواردی وضوح دامنه یا همان «Scope Resolution» به طور خودکار در برنامه پایتون فعال میشود. برخی از مثالهایی که برای این رویکرد وجود دارند، جهت درک بهتر Scope Resolution در ادامه ارائه شدهاند:
- ماژولهای پایتون مانند «Math» و «Cmath» توابع زیادی دارند که در هر دوی آنها مشترک هستند. ()log10() ،acos() ،exp و سایر موارد برخی از این پایتونها به حساب میآیند. برای رفع ابهام و مشخص شدن هر کدام از این توابع نیاز است که آنها را با ماژول مربوطه خود به صورت پیشوندی مانند ()math.exp و ()cmath.exp ادغام کرد.
- برای مثال کدهای زیر در نظر گرفته شدهاند. در این مثال شی temp به صورت سراسری با عدد ۱۰ مقداردهی اولیه و همچنین در داخل تابع با عدد ۲۰ مقداردهی اولیه شده است. با این حال فراخوانی تابع، مقدار این شی را به صورت سراسری در نظر نمیگیرد. در این مثال به وضوح میتوان مشاهده کرد که پایتون یک خط واضح بین متغیرهای سراسری و محلی ترسیم میکند و فضای نام آنها را به عنوان هویتهای جداگانه در نظر میگیرد.
temp = 10 # global-scope variable
def func():
temp = 20 # local-scope variable
print(temp)
print(temp) # output => 10
func() # output => 20
print(temp) # output => 10
همانطور که در مثال زیر نشان داده شده است، میتوان با استفاده از کلمه کلیدی «global» در داخل تابع، این رفتار را رونویسی (Overridden) کرد:
temp = 10 # global-scope variable
def func():
global temp
temp = 20 # local-scope variable
print(temp)
print(temp) # output => 10
func() # output => 20
print(temp) # output => 20
در پایتون، Decorator چیست؟
دکوراتورها یا همان Decoratorها در پایتون، توابعی هستند که عملکردی را به یک تابع موجود در پایتون بدون تغییر ساختار خود تابع اضافه میکنند. این توابع با نام decorator_name@ نمایش داده میشوند و فراخوانی تابع دکوراتور به صورت پایین به بالا (Bottom Up) انجام میگیرد. برای مثال کدهای زیر ارائه شدهاند:
# decorator function to convert to lowercase
def lowercase_decorator(function):
def wrapper():
func = function()
string_lowercase = func.lower()
return string_lowercase
return wrapper
# decorator function to split words
def splitter_decorator(function):
def wrapper():
func = function()
string_split = func.split()
return string_split
return wrapper
@splitter_decorator # this is executed next
@lowercase_decorator # this is executed first
def hello():
return 'Hello World'
hello() # output => [ 'hello' , 'world' ]
جذابیت توابع دکوراتور در این موضوع است که علاوه بر افزودن عملکرد به خروجی متد، میتوانند آرگومانهایی را برای تابع بپذیرند (Accept Argument) و آنها را قبل از ارسال به خود تابع اصلاح کنند. در اینجا تابع تو در تو درونی (Inner Nested Function) از جمله تابع «Wrapper» نقش مهمی را ایفا میکند. این رویکردها برای انجام کپسوله سازی و همچنین پنهان نگه داشتن خود از دامنه سراسری پیادهسازی شدهاند. در ادامه برای درک بهتر این موضوع، مثالی ارائه شده است:
# decorator function to capitalize names
def names_decorator(function):
def wrapper(arg1, arg2):
arg1 = arg1.capitalize()
arg2 = arg2.capitalize()
string_hello = function(arg1, arg2)
return string_hello
return wrapper
@names_decorator
def say_hello(name1, name2):
return 'Hello ' + name1 + '! Hello ' + name2 + '!'
say_hello('sara', 'ansh') # output => 'Hello Sara! Hello Ansh!'
منظور از درک Dict و List در پایتون چیست؟
اصطلاحات درک در پایتون (Python Comprehension)، مانند توابع دکوراتور، ساختارهای «Syntactic Sugar» هستند که به ساخت لیستها، دیکشنریها یا مجموعههای تغییر یافته و فیلتر شده از یک لیست، دیکشنری یا مجموعه کمک میکنند. Syntactic Sugar به کدها یا اصطلاحاتی گفته میشود که خوانایی و استفاده از کدهای دیگر را ساده میکنند. استفاده از «Comprehension» باعث صرفهجویی در زمان و کدهایی میشود که ممکن است به طور قابل توجهی طولانیتر باشند یعنی خطوط کد بیشتری دارند. در ادامه چند مثال از کدهایی ارائه میشود که Comprehension برای آنها مفید بوده است.
- انجام عملیات ریاضی روی کل لیست ارائه شده در برنامه با استفاده از درک Dict و List به صورت زیر انجام میشود:
my_list = [2, 3, 5, 7, 11]
squared_list = [x**2 for x in my_list] # list comprehension
# output => [4 , 9 , 25 , 49 , 121]
squared_dict = {x:x**2 for x in my_list} # dict comprehension
# output => {11: 121, 2: 4 , 3: 9 , 5: 25 , 7: 49}
- عملیات فیلتر شرطی در کل لیست با استفاده از Comprehension به صورت زیر انجام شده است:
my_list = [2, 3, 5, 7, 11]
squared_list = [x**2 for x in my_list if x%2 != 0] # list comprehension
# output => [9 , 25 , 49 , 121]
squared_dict = {x:x**2 for x in my_list if x%2 != 0} # dict comprehension
# output => {11: 121, 3: 9 , 5: 25 , 7: 49}
- ترکیب چند لیست در یک لیست با استفاده از درک لیست انجام میشود. Comprehension در لیست یا دیکشنری امکان پیمایشگر چندگانه (Multiple Iterator) را فراهم میکند و به همین دلیل، میتوان از آنها برای ترکیب چندین لیست در یک لیست استفاده کرد. در ادامه مثال این موضوع ارائه شده است:
a = [1, 2, 3]
b = [7, 8, 9]
[(x + y) for (x,y) in zip(a,b)] # parallel iterators
# output => [8, 10, 12]
[(x,y) for x in a for y in b] # nested iterators
# output => [(1, 7), (1, 8), (1, 9), (2, 7), (2, 8), (2, 9), (3, 7), (3, 8), (3, 9)]
- مسطح (Flatte) کردن یک لیست چند بعدی با استفاده از Comprehension در لیست یا دیکشنری انجام میشود. رویکرد مشابهی از جمله پیمایشگرهای تو در تو مانند مثالی که در ابتدای این بخش ارائه شد را میتوان برای مسطح کردن یک لیست چند بعدی یا کار بر روی عناصر درونی آن اعمال کرد. در ادامه مثالی در این باره ارائه شده است:
my_list = [[10,20,30],[40,50,60],[70,80,90]]
flattened = [x for temp in my_list for x in temp]
# output => [10, 20, 30, 40, 50, 60, 70, 80, 90]
نکته قابل توجه این است که درک لیست تأثیری مانند متد نقشه (Map) در زبانهای برنامه نویسی دیگر دارد. این متدها به جای نقشه و توابع فیلتر در پایتون از سازندههای مجموعه ریاضی استفاده میکنند.
تابع Lambda در پایتون چیست و چرا از آن استفاده می شود؟
Lambda یا همان لامبدا یک تابع ناشناس (Anonymous) در پایتون به حساب میآید که میتواند هر تعداد آرگومانی را بپذیرد، اما باید فقط یک عبارت داشته باشد. به طور کلی این تابع زمانی استفاده میشود که در برنامه به یک تابع ناشناس برای یک دوره زمانی کوتاه نیاز باشد. تابع لامبدا را میتوان با استفاده از دو روش زیر در برنامهها استفاده کرد:
- تخصیص توابع لامبدا به یک متغیر در برنامه به صورت زیر انجام میشود:
mul = lambda a, b : a * b
print(mul(2, 5)) # output => 10
- قرار دادن تابع لامبدا در یک تابع دیگر در برنامه با استفاده از روش زیر انجام میگیرد:
def myWrapper(n):
return lambda a : a * n
mulFive = myWrapper(5)
print(mulFive(2)) # output => 10
چطور می توان در پایتون یک شی را کپی کرد؟
در زبان برنامه نویسی پایتون عملگر مساوی (=) اشیا را کپی نمیکند. در عوض با استفاده از این عملگر، یک اتصال بین شی موجود و نام متغیر هدف ایجاد میشود. برای ایجاد کپی از اشیا در پایتون ماژول «Copy» مورد استفاده قرار میگیرد. علاوه بر این، دو رویکرد برای ایجاد کپی از شی داده شده با استفاده از ماژول Copy وجود دارد که در ادامه بررسی میشوند:
- کپی کم عمق (Shallow Copy): این رویکرد یک کپی کمی (Bit-Wise Copy) از شی است. شی کپی شده، یک کپی دقیق از مقادیر موجود در شی اصلی دارد. اگر هر یک از مقادیر ارجاع به اشیا دیگر باشد، فقط آدرسهای مرجع آنها کپی میشوند.
- کپی عمیق (Deep Copy): این نوع کپی کردن، همه مقادیر را به صورت بازگشتی از منبع به شی هدف کپی میکند، یعنی حتی اشیا ارجاع شده توسط شی منبع نیز کپی شدهاند.
در ادامه مثالی برای درک بهتر مفهوم کپی کردن به صورت کم عمق و عمیق در پایتون ارائه شده است.
from copy import copy, deepcopy
list_1 = [1, 2, [3, 5], 4]
## shallow copy
list_2 = copy(list_1)
list_2[3] = 7
list_2[2].append(6)
list_2 # output => [1, 2, [3, 5, 6], 7]
list_1 # output => [1, 2, [3, 5, 6], 4]
## deep copy
list_3 = deepcopy(list_1)
list_3[3] = 8
list_3[2].append(7)
list_3 # output => [1, 2, [3, 5, 6, 7], 8]
list_1 # output => [1, 2, [3, 5, 6], 4]
تفاوت بین Xrange و Range در زبان برنامه نویسی پایتون چیست؟
()xrange و ()range از نظر عملکرد کاملاً مشابه با یکدیگر هستند. هر دوی این توابع دنبالهای از اعداد صحیح را تولید میکنند. تنها تفاوت آنها این است که ()range یک لیست پایتون را برمیگرداند، در حالی که ()xrange یک شی Xrange را برمیگرداند. ()xrang یک لیست ثابت تولید نمیکند و مقدار آن در حال اجرای برنامه ایجاد میشود. این روش معمولاً با یک تولیدکننده (Generator) از نوع شی استفاده شده است و «Yielding» یا همان واگذار کردن نامیده میشود.
Yielding در برنامههایی که محدودیت حافظه دارند از اهمیت بالایی برخوردار است. ایجاد لیست ثابت یا استاتیک مانند لیستهای ایجاد شده با ()range میتواند منجر به خطای حافظه (Memory Error) در چنین شرایطی شود. در حالی که میتوان با استفاده از ()xrange و به وسیله اختصاص حافظه کافی به تولید کننده، میزان قابل توجهی استفاده از حافظه را به طور بهینه مدیریت کرد. در ادامه مثالی از این توابع ارائه شده است:
for i in xrange(10): # numbers from o to 9
print i # output => 0 1 2 3 4 5 6 7 8 9
for i in xrange(1,10): # numbers from 1 to 9
print i # output => 1 2 3 4 5 6 7 8 9
for i in xrange(1, 10, 2): # skip by two for next
print i # output => 1 3 5 7 9
باید به این مسئله توجه داشت که Xrange از نسخه سوم پایتون حذف و منسوخ شده است. اکنون Range در این نسخه دقیقاً همان کاری را انجام میدهد که Xrange در نسخه دوم پایتون انجام میداد، زیرا استفاده از تابع ()xrange بسیار بهتر از ()range اصلی در نسخه دوم پایتون بود.
ماژول های Pickling و Unpickling در پایتون چه هستند؟
یکی از ویژگیهایی که کتابخانههای پایتون ارائه میدهند، سریال سازی یا دنباله سازی (Serialization) خارج از جعبه (Out Of The Box) به حساب میآید. سریال سازی اشیا به تبدیل شی به صورت قالبی قابل ذخیره اشاره دارد تا بتوان بعداً آن را از حالت سریال سازی شده خارج کرد و شی اصلی را از آن به دست آورد. برای این کار از ماژول Pickle استفاده میشود. این ماژول دارای دو رویکرد است که ادامه شرح داده میشوند. ابتدا به بررسی ماژول Pickling در پایتون پرداخته شده است.
ماژول Pickling در پایتون
Pickling نامی برای فرآیند سریال سازی در زبان پایتون به حساب میآید. هر شی در پایتون را میتوان در یک جریان بایت (Byte Stream) سریال سازی و به عنوان یک فایل در حافظه نگهداری کرد. فرآیند Pickling یک فرآیند فشرده سازی به حساب میآید، با این حال اشیای Pickle را میتوان حتی بیشتر فشرده کرد. علاوه بر این، ماژول Pickle اشیا سریال سازی شده را ردیابی میکند و این اشیا در همه نسخهها قابل ردیابی هستند. تابعی که برای این فرآیندها مورد استفاده قرار میگیرد به صورت ()pickle.dump نوشته میشود. در ادامه این بخش به شرح فرآیند Unpickling پرداخته شده است.
ماژول Unpickling در پایتون
فرآیندی که ماژول Unpickling انجام میدهد، دقیقاً معکوس فرآیندی است که ماژول Pickling انجام میداد. این ماژول جریانهای بایت را از حالت سریال سازی شده خارج میکند تا اشیا ذخیره شده در فایل را دوباره ایجاد کند و شی را در حافظه بارگذاری میکند. تابعی که برای این فرآیند مورد استفاده قرار میگیرد به صورت ()pickle.load نوشته میشود. به این نکته نیز باید توجه داشت که پایتون یک ماژول سریال سازی دیگر به نام «Marshall» دارد که برای پشتیبانی از فایلهای pyc. مورد استفاده قرار میگیرد. همچنین این ماژول به طور قابل توجهی با Pickle تفاوت دارد.
در پایتون Generator چیست؟
Generator یا همان تولیدکنندهها توابعی هستند که مجموعهای تکرار پذیر از آیتمها را به صورت یکی پس از دیگری برمیگردانند. به طور کلی Generatorها برای ایجاد Iteratorها (پیمایشگرها) با رویکردی متفاوت استفاده میشوند. در این توابع از کلمه کلیدی «yield» به جای «return» برای برگرداندن یک شی مولد (Generator Object) استفاده شده است. در ادامه مثالی جهت ساخت یک Generator برای اعداد سری فیبوناچی (Fibonacci) ارائه شده میشود.
## generate fibonacci numbers upto n
def fib(n):
p, q = 0, 1
while(p 0
x.__next__() # output => 1
x.__next__() # output => 1
x.__next__() # output => 2
x.__next__() # output => 3
x.__next__() # output => 5
x.__next__() # output => 8
x.__next__() # error
## iterating using loop
for i in fib(10):
print(i) # output => 0 1 1 2 3 5 8
PYTHONPATH چیست؟
PYTHONPATH یک متغیر محیطی به حساب میآید که با استفاده از آن میتوان روی برنامه، دایرکتوریهای اضافی تنظیم کرد. پایتون به وسیله این متغیر از ماژولها و بستههای جدیدی استفاده میکند. متغیر PYTHONPATH در نگهداری کتابخانههای پایتونی مفید است که برنامه نویس قصد ندارد آنها را به صورت پیشفرض و سراسری در برنامه نصب کند.
توابع ()help و ()dir در پایتون چه کاربردی دارند؟
تابع ()help در پایتون برای نمایش مستندات ماژولها، کلاسها، توابع، کلمات کلیدی و سایر موارد استفاده میشود. اگر هیچ پارامتری به تابع ()help ارسال نشود، یک ابزار سودمند تعاملی بر روی کنسول برنامه راهاندازی خواهد شد. تابع ()dir در پایتون سعی میکند فهرست معتبری (Valid List) از ویژگیها و متدهای اشیا را برگرداند که فراخوانی میشوند. رفتار این تابع با اشیا گوناگون، متفاوت است؛ زیرا هدف تابع ()dir تولید مرتبطترین دادهها برای اشیا به جای اطلاعات کامل است. دادههایی که این تابع تولید میکنند در ادامه شرح داده میشوند:
- تابع ()dir برای اشیا ماژولها یا کتابخانهها در پایتون، فهرستی از همه ویژگیهای موجود در آن ماژول یا کتابخانه را برمیگرداند.
- این تابع برای اشیا کلاسها، فهرستی از تمام صفات معتبر و ویژگیهای پایه را برمیگرداند.
- اگر تابع ()dir آرگومانی دریافت نکند، فهرستی از ویژگیها را در محدوده فعلی برنامه برمیگرداند.
فایلهای py. و pyc. در پایتون چه تفاوتی با هم دارند؟
در پایتون فایلهای py. حاوی کدهای منبع (Source Code) یک برنامه هستند. در حالی که فایل pyc. حاوی بایت کد (Bytecode) برنامه است. بایت کدها پس از کامپایل فایل py. یعنی همان کد منبع برنامه دریافت میشوند. فایلهای pyc. برای همه فایلهای ایجاد شده پیادهسازی نمیشوند، این فایلها فقط برای فایلهای وارد شده در برنامه ایجاد شدهاند. قبل از اجرای برنامه پایتون مفسر (Interpreter) آن فایلهای کامپایل شده را بررسی میکند.
اگر فایل موجود باشد، ماشین مجازی (Virtual Machine) پیادهسازی آن را انجام میدهد. اگر فایل یافت نشود، فایل py. بررسی میشود. زمانی که فایل py. پیدا شود، در فایل pyc. کامپایل خواهد شد و در نهایت ماشین مجازی پایتون آن را پیادهسازی میکند. همچنین، وجود فایل pyc. باعث صرفهجویی در زمان کامپایل میشود.
زبان پایتون چگونه تفسیر میشود؟
پایتون به عنوان یک زبان، تفسیر یا کامپایل نمیشود. تفسیر یا کامپایل شدن از ویژگیهای پیادهسازی زبانهای برنامه نویسی به حساب میآیند. پایتون یک بایت کد است که به طور کلی تفسیر میشود. بایت کد مجموعهای از دستورالعملهای قابل خواندن مفسر است. پایتون کدهای منبع را در مجموعهای از دستورالعملها برای ماشین مجازی کامپایل میکند.
مفسر پایتون به معنی پیادهسازی آن در ماشین مجازی است و همانطور که گفته شد این فرمت میانی بایت کد نامیده میشود. ابتدا کد منبع py. برای به دست آوردن pyc. کامپایل میشود که همان بایت کد است. سپس این بایت کد میتواند توسط «CPython» رسمی یا کامپایلر درجا (Just in Time compiler | JIT) تفسیر شود که با PyPy کامپایل شده است.
پیمایشگر یا Iterator در پایتون چیست؟
پیمایشگر یا همان Iterator یک نوع شی در پایتون به حساب میآید. این شی وضعیت خود را همیشه در حین تکرارها و پیمایش به یاد دارد. برای درک بهتر این موضوع کدهای زیر ارائه شدهاند. متد ()__iter__ مقداردهی اولیه پیمایشگر را انجام میدهد. همچنین این شی دارای متد ()__next__ است که آیتم بعدی را به صورت تکراری برمیگرداند و به عنصر بعدی اشاره میکند. پس از رسیدن به انتهای شی، باید متد پیمایشگر ()__next__ استثنا StopIteration را برگرداند. به طور کلی پیمایشگرها اشیایی هستند که به وسیله آنها میتوان روی اشیا تکرار شونده مانند لیستها، رشتهها و سایر موارد پیمایش کرد.
class ArrayList:
def __init__(self, number_list):
self.numbers = number_list
def __iter__(self):
self.pos = 0
return self
def __next__(self):
if(self.pos
چطور می توان فایلی را در پایتون حذف کرد؟
برای حذف فایل در پایتون از دستور os.remove(file_name) استفاده میشود. مثالی در رابطه با استفاده از این دستور در ادامه ارائه شده است.
import os
os.remove("ChangedFile.csv")
print("File Removed!")
توابع ()split و ()join در پایتون چه کاربردی دارند؟
در زبان برنامه نویسی پایتون از تابع ()split برای تقسیم یک رشته بر اساس یک جدا کننده (Delimiter) به لیستی از رشتهها استفاده میشود. همچنین، از تابع ()join برای ادغام لیستی از رشتهها با استفاده از یک جدا کننده برای به دست آوردن یک رشته استفاده شده است. در ادامه مثالی برای شرح بیشتر این توابع ارائه میشود.
string = "This is a string."
string_list = string.split(' ') #delimiter is ‘space’ character or ‘ ‘
print(string_list) #output: ['This', 'is', 'a', 'string.']
print(' '.join(string_list)) #output: This is a string.
در پایتون اندیس منفی چیست و چه کاربردی دارد؟
اندیسهای منفی در پایتون، اندیسهایی هستند که انتهای لیست، تاپل یا رشته را نشان میدهند. برای مثال Arr[-1] آخرین عنصر از آرایه []Arr را مشخص میکند. کدهای زیر برای نشان دادن بهتر این موضوع ارائه شدهاند.
arr = [1, 2, 3, 4, 5, 6]
#get the last element
print(arr[-1]) #output 6
#get the second last element
print(arr[-2]) #output 5
در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به بررسی و شرح سوالات مصاحبه جهت آمادگی برای شرکت در مصاحبه افرادی پرداخته شد که با زبان پایتون در سطح پیشرفته آشنا هستند. سعی شد تا حد امکان سوالات به صورت واضح و ساده بیان شوند و همراه با مثال باشند. ادامه این مقاله به بررسی سوالات مصاحبه برنامه نویسی شی گرا (Object Oriented Programming | OOP) در پایتون اختصاص داده میشود.
سوالات مصاحبه برنامه نویسی شی گرا در پایتون
از آنجایی که پایتون یک زبان برنامه نویسی شی گرا به حساب میآید و شی گرایی در زبانهای برنامه نویسی امری بسیار مهم و کاربردی تلقی میشود، در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به سوالات مصاحبه برنامه نویسی شی گرا در پایتون پرداخته شده است.
چگونه می توان یک کلاس در پایتون ایجاد کرد؟
برای ایجاد کلاس در پایتون که یکی از اصول اولیه شی گرایی است، از کلمه کلیدی «class» مانند مثال زیر استفاده میشود.
class FaraDarsEmployee:
def __init__(self, emp_name):
self.emp_name = emp_name
همچنین برای نمونه سازی یا ایجاد یک شی از کلاس در کلاس فوق، به صورت زیر عمل میشود:
emp_1=FaraDarsEmployee("Mr. Employee")
در مثال فوق، برای دسترسی به ویژگی (Attribute) name، با استفاده از عملگر نقطه مانند کدهای زیر، ویژگی فراخوانی میشود:
print(emp_1.name)
# Prints Mr. Employee
برای ایجاد متدها در داخل کلاس، متدها در دامنه کلاس مانند مثال زیر قرار میگیرند:
class FaraDarsEmployee:
def __init__(self, emp_name):
self.emp_name = emp_name
def introduce(self):
print("Hello I am " + self.emp_name)
در کدهای فوق، پارامتر self در تابع init و introduce نشان دهنده ارجاع به نمونه کلاس فعلی است که برای دسترسی به ویژگیها و متدهای آن کلاس مورد استفاده قرار میگیرد. پارامتر self باید اولین پارامتر هر متد تعریف شده در کلاس باشد. متد کلاس FaraDarsEmployee به وسیله کدهای زیر قابل دسترسی است:
emp_1.introduce()
کل مثالی که برای شرح کلاس در پایتون ارائه شد به صورت زیر نوشته میشود:
class FaraDarsEmployee:
def __init__(self, emp_name):
self.emp_name = emp_name
def introduce(self):
print("Hello I am " + self.emp_name)
# create an object of FaraDarsEmployee class
emp_1 = FaraDarsEmployee("Mr Employee")
print(emp_1.emp_name) #print employee name
emp_1.introduce() #introduce the employee
وراثت در پایتون چگونه عمل می کند؟ همراه با مثال
وراثت یا ارث بری (Inheritance) در پایتون این قابلیت را به یک کلاس میدهد تا به تمام ویژگیها و متدهای کلاس دیگر دسترسی داشته باشد. این رویکرد، قابلیت استفاده مجدد از کدها (Reusability) را به برنامه میافزاید و به توسعه دهنده کمک میکند تا برنامهها را بدون کدهای اضافی (Redundant Code) نگهداری کند.
کلاسی که از کلاس دیگری ارث بری میکند، کلاس فرزند (Child Class) یا مشتقپذیر (Derived Class) نامیده میشود و همچنین به کلاسی که کلاس فرزند از آن ارث میبرد، کلاس والد (Parent Class) یا سوپر کلاس (Superclass) میگویند. پایتون از انواع گوناگون ارث بری پشتیبانی میکند که در ادامه شرح داده میشوند. در ابتدا به بررسی وراثت منفرد پرداخته شده است.
وراثت منفرد در پایتون چیست؟
وراثت منفرد (Single Inheritance) در پایتون به نوعی از وراثت گفته میشود که کلاس فرزند از یک کلاس والد مانند تصویر زیر ارث بری میکند.
کدهای زیر برای درک بهتر وراثت منفرد مثالی از این نوع وراثت را ارائه کردهاند:
# Parent class
class ParentClass:
def par_func(self):
print("I am parent class function")
# Child class
class ChildClass(ParentClass):
def child_func(self):
print("I am child class function")
# Driver code
obj1 = ChildClass()
obj1.par_func()
obj1.child_func()
وراثت چند سطحی در پایتون
در وراثت چند سطحی (Multi-level Inheritance) اعضای کلاس والد A توسط کلاس فرزندی به ارث برده میشوند و سپس کلاس فرزند دیگری از این کلاس B ارث بری میکند. اکثر ویژگیهای کلاس والد یا پایه (Base Class) A و کلاس فرزند B در کلاس فرزند جدید C به ارث برده شدهاند. در این مثال، A کلاس پدر بزرگ کلاس C به حساب میآید. در تصویر زیر این مثال شرح داده شده است و سپس کدهای آن در ادامه ارائه شدهاند.
کدهای مثال وراثت چند سطحی در پایتون در ادامه مشاهده میشوند:
# Parent class
class A:
def __init__(self, a_name):
self.a_name = a_name
# Intermediate class
class B(A):
def __init__(self, b_name, a_name):
self.b_name = b_name
# invoke constructor of class A
A.__init__(self, a_name)
# Child class
class C(B):
def __init__(self,c_name, b_name, a_name):
self.c_name = c_name
# invoke constructor of class B
B.__init__(self, b_name, a_name)
def display_names(self):
print("A name : ", self.a_name)
print("B name : ", self.b_name)
print("C name : ", self.c_name)
# Driver code
obj1 = C('child', 'intermediate', 'parent')
print(obj1.a_name)
obj1.display_names()
وراثت چندگانه در پایتون چیست؟
وراثت چندگانه (Multiple Inheritance) در پایتون زمانی حاصل میشود که یک کلاس فرزند از چند کلاس والد ارث بری کند. تمام ویژگیهای کلاسهای والدین میتوانند در کلاس فرزند به ارث برسند. تصویر زیر مثالی برای این نوع وراثت است.
کدهای زیر مثال وراثت چندگانه در پایتون را نشان میدهند.
# Parent class1
class Parent1:
def parent1_func(self):
print("Hi I am first Parent")
# Parent class2
class Parent2:
def parent2_func(self):
print("Hi I am second Parent")
# Child class
class Child(Parent1, Parent2):
def child_func(self):
self.parent1_func()
self.parent2_func()
# Driver's code
obj1 = Child()
obj1.child_func()
وراثت سلسله مراتبی در پایتون
وراثت سلسله مراتبی (Hierarchical Inheritance) زمانی اتفاق میافتد که چندین کلاس فرزند از یک کلاس والد ارث بری کنند. در ادامه تصویری برای درک بهتر این نوع از وراثت ارائه شده است.
کدهای زیر نشان دهنده مثالی برای وراثت سلسله مراتبی در پایتون هستند.
# Base class
class A:
def a_func(self):
print("I am from the parent class.")
# 1st Derived class
class B(A):
def b_func(self):
print("I am from the first child.")
# 2nd Derived class
class C(A):
def c_func(self):
print("I am from the second child.")
# Driver's code
obj1 = B()
obj2 = C()
obj1.a_func()
obj1.b_func() #child 1 method
obj2.a_func()
obj2.c_func() #child 2 method
در پایتون چگونه می توان به اعضای کلاس والد در داخل کلاس فرزند دسترسی داشت؟
در این بخش، برای پاسخ به این سوال روشهایی ارائه شده است که در ادامه مورد بررسی قرار میگیرند:
- با استفاده از نام کلاس والد میتوان به اعضای کلاس والد در کلاس فرزند دسترسی داشت. همانطور که در مثال زیر نشان داده شده است میتوان از نام کلاس والد برای دسترسی به ویژگیهای آن استفاده کرد:
class Parent(object):
# Constructor
def __init__(self, name):
self.name = name
class Child(Parent):
# Constructor
def __init__(self, name, age):
Parent.name = name
self.age = age
def display(self):
print(Parent.name, self.age)
# Driver Code
obj = Child("FaraDars", 6)
obj.display()
- با استفاده از متد ()super در پایتون میتوان به اعضای کلاس والد در کلاس فرزند دسترسی پیدا کرد. اعضای کلاس والد در کلاس فرزند با استفاده از کلمه کلیدی «super» قابل دسترسی هستند. در مثال زیر روش استفاده از این کلمه کلیدی نشان داده شده است.
class Parent(object):
# Constructor
def __init__(self, name):
self.name = name
class Child(Parent):
# Constructor
def __init__(self, name, age):
'''
In Python 3.x, we can also use super().__init__(name)
'''
super(Child, self).__init__(name)
self.age = age
def display(self):
# Note that Parent.name cant be used
# here since super() is used in the constructor
print(self.name, self.age)
# Driver Code
obj = Child("FaraDars", 6)
obj.display()
آیا از مشخص کننده های دسترسی در پایتون استفاده می شود؟
زبان برنامه نویسی پایتون از مشخص کنندههای دسترسی (Access Specifier) از جمله انواع خصوصی، عمومی، محافظت شده و سایر موارد آنها استفاده نمیکند. با این حال، پایتون از هیچ متغیری مشتق نمیشود. مفهوم تقلید رفتار متغیرها (Imitating The Behaviour Of Variable) با استفاده از اضافه کردن یک خط زیرین به نام متغیر برای مفاهیم محافظت شده و دو خط زیرین برای مفاهیم خصوصی انجام میشود. همچنین به طور پیشفرض متغیرهایی که نامشان بدون زیر خط پیشوندی هستند عمومی در نظر گرفته شدهاند. کدهای زیر مثالی برای انواع دسترسی به متغیرها در زبان پایتون به حساب میآیند.
# to demonstrate access specifiers
class FaraDarsEmployee:
# protected members
_emp_name = None
_age = None
# private members
__branch = None
# constructor
def __init__(self, emp_name, age, branch):
self._emp_name = emp_name
self._age = age
self.__branch = branch
#public member
def display():
print(self._emp_name +" "+self._age+" "+self.__branch)
آیا می توان کلاس والد را بدون ایجاد نمونه برای آن در پایتون فراخوانی کرد؟
بله؛ اگر کلاس والد توسط کلاسهای فرزند نمونه سازی یا کلاس والد یک متد استاتیک باشد، میتوان کلاس والد را بدون ایجاد نمونه برای آن در پایتون فراخوانی کرد.
یک کلاس خالی چگونه در پایتون ایجاد می شود؟
در یک کلاس خالی هیچ عضوی تعریف نمیشود. کلاس خالی در پایتون با استفاده از کلمه کلیدی «pass» ایجاد شده است. دستور pass هیچ کاری در پایتون انجام نمیدهد. میتوان برای این کلاس در خارج از آن اشیایی ایجاد کرد. برای مثال کدهای زیر ارائه شدهاند:
class EmptyClassDemo:
pass
obj=EmptyClassDemo()
obj.name="FaraDars"
print("Name created= ",obj.name)
خروجی کدهای فوق عبارت روبهرو است: Name created = FaraDars
تفاوت بین اصلاح کننده های جدید و Override چیست؟
اصلاح کننده (Modifier) جدید در پایتون برای دستور دادن به کامپایلر جهت استفاده از پیادهسازی جدید وجود دارد. این اصلاح کننده در تابع کلاس والد استفاده نمیشود. اصلاح کننده Override یا همان رونویسی شده برای رونویسی تابع کلاس والد در کلاس فرزند مورد استفاده قرار میگیرد.
در پایتون چرا از متد Finalize استفاده می شود؟
متد Finalize برای آزاد کردن منابع استفاده نشده و پاکسازی قبل از فراخوانی متد بازیافت حافظه (Garbage Collection Method) مورد استفاده قرار میگیرد. این متد به انجام وظایف مدیریت حافظه کمک میکند.
متد init در پایتون چیست؟
متد init در پایتون شبیه به سازندهها در جاوا عمل میکند. این متد به محض اینکه نمونه سازی یک شی انجام گیرد، پیادهسازی میشود. متد init برای مقداردهی اولیه هر ویژگی یا رفتار پیشفرض شی در هنگام نمونه سازی آن مفید است. در ادامه برای درک بهتر استفاده از متد init در پایتون مثالی ارائه میشود.
class FaraDarsEmployee:
# init method / constructor
def __init__(self, emp_name):
self.emp_name = emp_name
# introduce method
def introduce(self):
print('Hello, I am ', self.emp_name)
emp = FaraDarsEmployee('Mr Employee') # __init__ method is called here and initializes the object name with "Mr Employee"
emp.introduce()
در پایتون چگونه بررسی میشود که یک کلاس، فرزند کلاس دیگری است؟
در پایتون بررسی اینکه یک کلاس، فرزند کلاس دیگری با استفاده از متدی به نام ()issubclass انجام میشود. این متد با برگرداندن True یا False اعلام میکند که یک کلاس فرزند کلاس دیگری در پایتون است یا فرزند کلاسی نیست. در ادامه برای نشان دادن روش استفاده از متد ()issubclass مثال زیر ارائه شده است.
class Parent(object):
pass
class Child(Parent):
pass
# Driver Code
print(issubclass(Child, Parent)) #True
print(issubclass(Parent, Child)) #False
همچنین میتوان با استفاده از متد ()isinstance در پایتون بررسی کرد که یک شی نمونهای از کلاسی است یا نمونهای از کلاس مورد نظر نیست. در ادامه مثالی برای مشاهده روش استفاده از این متد ارائه شده است:
obj1 = Child()
obj2 = Parent()
print(isinstance(obj2, Child)) #False
print(isinstance(obj2, Parent)) #True
- مقاله پیشنهادی: تفاوت بین type و isinstance در پایتون — به زبان ساده
در این بخش از مقاله، برخی از سوالات مصاحبه برنامه نویسی شی گرا پایتون برای آمادگی جهت حضور در مصاحبه برنامه نویسی پایتون همراه با مثال ارائه شدند. در ادامه مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به بررسی سوالات مصاحبه یکی از کتابخانههای بسیار محبوب و پرکاربرد پایتون یعنی «Pandas» پرداخته شده است.
سوالات مصاحبه برنامه نویسی پایتون برای کتابخانه Pandas
پایتون یکی از زبانهای برنامه نویسی به حساب میآید که دارای تعداد بسیاری کتابخانه برای سهولت در کدنویسی است. وجود این کتابخانههای گوناگون یکی از دلایل محبوبیت و همه منظوره بودن این زبان برنامه نویسی به شمار میرود. در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به سوالات کتابخانه محبوب و پر کاربرد Pandas پایتون پرداخته شده است.
کتابخانه Pandas چیست؟
Pandas یک کتابخانه متن باز (Open Source) و مبتنی بر پایتون است که در برنامههایی مورد استفاده قرار میگیرد که با دادهها سر و کار دارند و باید کارایی بالایی داشته باشند. نام این کتابخانه از عبارت «Panel Data» یعنی پنل اطلاعات گرفته شده است و دارای دادههای چند بعدی (Multidimensional Data) است. کتابخانه Pandas در سال 1387 شمسی (2008 میلادی) توسط «Wes McKinney» برای تجزیه و تحلیل دادهها (Data Analysis) توسعه یافت. این کتابخانه در پنج مرحله اصلی تجزیه و تحلیل دادهها بسیار مفید است و این مراحل شامل موارد زیر هستند:
- بارگذاری دادهها
- پاکسازی و دستکاری دادهها
- آمادهسازی دادهها
- مدلسازی دادهها
- تجزیه و تحلیل دادهها
Dataframe کتابخانه Pandas چیست؟
دیتافریم یا همان Dataframe کتابخانه Pandas یک ساختار دو بعدی تغییرپذیر و جدولی برای نمایش دادههای برچسبگذاری شده (Labelled) با محورها، سطرها و ستونها است. ساختار نحوی که برای ایجاد Dataframe کتابخانه Pandas انجام میشود در ادامه نشان داده شده است:
import pandas as pd
dataframe = pd.DataFrame( data, index, columns, dtype)
در ادامه توضیح کوتاهی درباره مولفههای کدهای فوق ارائه شده است:
- data در مثال فوق، نشان دهنده انواع گوناگون سری (Series)، نقشه (Map)، ndarray، لیست، دیکشنری (Dict) و سایر موارد است.
- index کدهای فوق، آرگومان اختیاری است که اندیسی را برای برچسبهای ردیف نشان میدهد.
- columns در مثال فوق، نشان دهنده آرگومانی اختیاری برای برچسبهای ستونها است.
- Dtype در کدهای فوق، آرگومان اختیاری برای نشان دادن نوع داده هر ستون ارائه میدهد.
چگونه می توان دیتافریم های مختلف کتابخانه Pandas با هم ترکیب کرد؟
برای ترکیب دیتافریمهای کتابخانه Pandas پایتون چند رویکرد گوناگون وجود دارد که در ادامه شرح داده میشوند:
- متد ()append: این متد برای قرار دادن دیتافریمها به صورت افقی استفاده میشود. ساختار نحوی و نوشتاری این متد به صورت زیر است:
df1.append(df2)
- متد ()concat: این متد برای ایجاد دیتافریمها به صورت عمودی استفاده شده است. بهترین زمانی که میتوان از این متد استفاده کرد هنگامی است که دیتافریمها دارای ستونهای یکسان و فیلدهای مشابه باشند. در ادامه ساختار نحوی این متد ارائه شده است:
pd.concat([df1, df2])
- متد ()join: از این متد برای استخراج دادهها از دیتافریمهای گوناگون همراه با یک یا چند ستون مشترک استفاده میشود. ساختار نحوی روش استفاده از این متد در ادامه ارائه شده است:
df1.join(df2)
آیا می توان یک سری از شی دیکشنری در کتابخانه Pandas ایجاد کرد؟
آرایه تک بعدی (One Dimensional Array) سری نامیده میشود که قادر به ذخیره انواع دادههای مختلف باشد. همانطور که در مثال زیر نشان داده شده است میتوان سری کتابخانه Pandas را از یک شی دیکشنری ایجاد کرد:
import pandas as pd
dict_info = {'key1' : 2.0, 'key2' : 3.1, 'key3' : 2.2}
series_obj = pd.Series(dict_info)
print (series_obj)
Output:
x 2.0
y 3.1
z 2.2
dtype: float64
اگر اندیسی در متد ورودی مشخص نشده باشد، کلیدهای دیکشنری برای ساخت اندیس به صورت صعودی مرتب میشوند. در صورت تشخیص اندیسها، مقادیر برچسبهای اندیسها از دیکشنری استخراج خواهند شد.
چگونه مقادیر از دست رفته در یک دیتافریم شناسایی و بررسی می شوند؟
میتوان با استفاده از متدهای ()isnull و ()isna تشخیص داد که دیتافریمها دارای مقادیر از دست رفته در برنامه هستند یا هیچ مقداری از آنها از دست نرفته است. شبه کد استفاده از این متدها در ادامه ارائه میشود.
missing_data_count=df.isnull().sum()
میتوان مقادیر از دست رفته را به وسیله جایگزین کردن مقادیر موجود در ستونها با استفاده از عدد صفر به صورت زیر مدیریت کرد:
df[‘column_name’].fillna(0)
همچنین میتوان این مقادیر از دست رفته را به وسیله جایگزین کردن آنها با مقدار میانگین ستون به صورت زیر مدیریت کرد:
df[‘column_name’] = df[‘column_name’].fillna((df[‘column_name’].mean()))
شاخص گذاری مجدد در کتابخانه Pandas چیست؟
شاخص گذاری مجدد (Reindexing) فرآیند تطبیق یک دیتافریم با اندیسی جدید به وسیله منطق پر کردن اختیاری است. اگر مقادیر در اندیس قبلی وجود نداشته باشند، NaN یا NA در محل آنها قرار میگیرد. همچنین، یک شی جدید برگردانده میشود مگر اینکه اندیس جدیدی تولید شود که معادل اندیس فعلی است. مقدار کپی روی False تنظیم میشود. شاخص گذاری مجدد برای تغییر اندیس سطرها و ستونها در دیتافریم نیز استفاده شده است.
چطور می توان به دیتافریم کتابخانه Pandas ستون جدید اضافه کرد؟
یک ستون جدید را میتوان به صورت زیر به دیتافریم کتابخانه Pandas افزود:
import pandas as pd
data_info = {'first' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'second' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data_info)
#To add new column third
df['third']=pd.Series([10,20,30],index=['a','b','c'])
print (df)
#To add new column fourth
df['fourth']=df['first']+info['third']
print (df)
در کتابخانه Pandas چگونه مواردی به دست میآیند که در سریهای A و B مشترک نیستند؟
در کتابخانه Pandas، میتوان با انجام اجتماع روی هر دو سری و سپس ادغام بخشهای به دست آمده، مواردی را دریافت کرد که در سریهای A و B مشترک نیستند. سپس این مواردی که در بخشهای اجتماع وجود دارند و در بخش اشتراکی دو سری ناموجودند، برای هدف مورد نظر دنبال میشوند. تصویر زیر برای درک بهتر توضیحات این بخش ارائه شده است.
کدهای زیر مثالی برای تصویر و توضیحات به دست آوردن اجتماع دو سری فوق هستند:
import pandas as pd
import numpy as np
df1 = pd.Series([2, 4, 5, 8, 10])
df2 = pd.Series([8, 10, 13, 15, 17])
p_union = pd.Series(np.union1d(df1, df2)) # union of series
p_intersect = pd.Series(np.intersect1d(df1, df2)) # intersection of series
unique_elements = p_union[~p_union.isin(p_intersect)]
print(unique_elements)
"""
Output:
0 2
1 4
2 5
5 13
6 15
7 17
dtype: int64
"""
آیا کتابخانه Pandas هنگام وارد کردن داده ها از منابع مختلف، می تواند تاریخ آن ها را تشخیص دهد؟
بله؛ کتابخانه Pandas هنگام وارد کردن دادهها به برنامه از منابع مختلف، میتواند تاریخ آنها را تشخیص دهد و فقط نیاز به کمک آرگومانهای مخصوص به خود دارد. برای این منظور نیاز است که آرگومان parse_dates در حین خواندن دادهها از منابع خود به برنامه اضافه شود. برای مثال میتوان در نظر گرفت، زمانی که دادهها از فایل CSV خوانده میشوند، ممکن است دارای فرمتهای زمان و تاریخ گوناگونی باشند که توسط کتابخانه Pandas قابل خواندن نیستند. در این صورت، کتابخانه Pandas با استفاده از ساخت تجزیه کننده تاریخ (Date Parser) سفارشی با کمک توابع لامبدا، انعطافپذیری را برای دریافت تاریخ اطلاعات وارد شده به برنامه فراهم میکند. در ادامه کدهای مرتبط با این مثال ارائه شدهاند.
import pandas as pd
from datetime import datetime
dateparser = lambda date_val: datetime.strptime(date_val, '%Y-%m-%d %H:%M:%S')
df = pd.read_csv("some_file.csv", parse_dates=['datetime_column'], date_parser=dateparser)
در این بخش از مقاله، برخی از سوالات مصاحبه کتابخانه Pandas پایتون با مثال ارائه شدند. ادامه مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» به بررسی سوالات مصاحبه یکی دیگر از کتابخانههای بسیار مشهور پایتون یعنی «Numpy» اختصاص دارد.
سوالات مصاحبه برنامه نویسی پایتون برای کتابخانه Numpy
Numpy یکی از کتابخانههای بسیار محبوب زبان پایتون به حساب میآید که در حوزههای گوناگونی مورد استفاده قرار میگیرد. به دلیل پر کاربرد بودن این کتابخانه، احتمال مطرح شدن سوال در مصاحبه پایتون درباره آن بالا است. در این بخش به چند سوال در مورد کتابخانه Numpy پرداخته میشود.
کتابخانه NumPy چیست؟
NumPy یکی از محبوبترین و سادهترین کتابخانههای پایتون به حساب میآید. این کتابخانه همهکاره، متن باز، مبتنی بر پایتون و دارای بستههای همه منظوره است که برای پردازش آرایهها استفاده میشوند. NumPy مخفف عبارت «NUMerical PYthon» به حساب میآید. این کتابخانه به دلیل داشتن ابزارهای بسیار بهینه برای کار روی آرایههای پیچیده بسیار مشهور است و همچنین منجر به عملکرد بالا همراه با ویژگیهای قدرتمند پردازش آرایه چند بعدی میشود.
کتابخانه NumPy به دلیل محبوبیت، کارایی بالا و انعطافپذیری آن برای انجام عملیاتهای گوناگون از جمله عملیات مثلثاتی (Trigonometric Operation)، محاسبات جبری (Algebraic) و آماری (Statistical) بیشترین کاربرد را در محاسبات علمی و عملکردهای دیگر آنها دارد. تصویر زیر برخی از کاربردهای کتابخانه NumPy پایتون را نشان میدهد.
- مقالههای پیشنهادی:
- ۲۷ عملیات NumPy برای افراد تازه کار — راهنمای مقدماتی
- آمار توصیفی در پایتون با کتابخانه Numpy و Pandas — راهنمای کاربردی
چرا آرایه های NumPy نسبت به لیست های پایتون برتری دارند؟
ساختمان داده لیست در پایتون دارای کارایی بالایی است و قابلیت انجام وظایف گوناگونی را دارد. اما این ساختمان داده در هنگام انجام عملیات برداری دچار محدودیتهای شدیدی میشود، برخی از این عملیات شامل ضرب و جمع مولفهها هستند. همچنین، لیستها در پایتون به اطلاعات مربوط به نوع هر مولفه نیاز دارند که منجر به سربار (Overhead) میشود، زیرا هر بار که عملیاتی روی مولفهای انجام شده است، کدها پیادهسازی میشوند. آرایههای NumPy این محدودیتها را ندارند و همه محدودیتهای لیستهای پایتون را مدیریت میکنند.
علاوه بر این، همراه با افزایش اندازه آرایههای NumPy؛ این آرایه حدود ۳۰ برابر سریعتر از ساختمان داده لیست در پایتون عملیات را انجام میدهد. به این دلیل این اتفاق میافتد که در آرایههای NumPy با وجود ویژگی فشردهسازی و همگن بودن آن، سرعت آزادسازی حافظه سریعتر انجام میشود.
مراحل ایجاد آرایه های یک بعدی، دو بعدی و سه بعدی با استفاده از NumPy چیست؟
یکی از کاربردهای مهم کتابخانه Numpy پایتون، ایجاد آرایه های یک بعدی، دو بعدی و سه بعدی است. برای پاسخ به این سوال با استفاده از کدهای زیر این مراحل مورد بررسی قرار میگیرند.
- کدهای زیر روش ایجاد آرایههای یک بعدی را نمایش میدهند:
import numpy as np
one_dimensional_list = [1,2,4]
one_dimensional_arr = np.array(one_dimensional_list)
print("1D array is : ",one_dimensional_arr)
- با استفاده از کدهای زیر میتوان آرایههایی دو بعدی ساخت:
import numpy as np
two_dimensional_list=[[1,2,3],[4,5,6]]
two_dimensional_arr = np.array(two_dimensional_list)
print("2D array is : ",two_dimensional_arr)
- کدهای زیر روش ایجاد آرایههای سه بعدی را نشان میدهند:
import numpy as np
three_dimensional_list=[[[1,2,3],[4,5,6],[7,8,9]]]
three_dimensional_arr = np.array(three_dimensional_list)
print("3D array is : ",three_dimensional_arr)
- به طور کلی میتوان با دادن ویژگیهای ndmin به کدهای زیر، آرایههای چند بعدی ایجاد کرد. برای مثال کدهای زیر نشان دهنده یک آرایه شش بعدی است.
import numpy as np
ndArray = np.array([1, 2, 3, 4], ndmin=6)
print(ndArray)
print('Dimensions of array:', ndArray.ndim)
- مقاله پیشنهادی: کتابخانه NumPy معرفی کتابخانه NumPy ها ساخت آرایه
اگر یک آرایه Numpy و یک ستون جدید به عنوان ورودی به برنامه نویس داده شوند، چگونه می توان ستون دوم را حذف و این ستون را با مقدار ستون جدید جایگزین کرد؟
آرایه Numpy و مقادیر ستون جدید زیر برای جایگزینی با ستون دوم برنامهای به برنامه نویس داده شدهاند. ابتدا آرایه زیر ارائه شده است:
[[35 53 63]
[72 12 22]
[43 84 56]]
در ادامه مقادیر ستون جدید ارائه شدهاند:
[
20
30
40
]
راه حلی که برای حذف ستون دوم و جایگزینی آن با مقدار ستون جدید ارائه شده است، در ادامه مشاهده میشود:
import numpy as np
#inputs
inputArray = np.array([[35,53,63],[72,12,22],[43,84,56]])
new_col = np.array([[20,30,40]])
# delete 2nd column
arr = np.delete(inputArray , 1, axis = 1)
#insert new_col to array
arr = np.insert(arr , 1, new_col, axis = 1)
print (arr)
در یک برنامه پایتون با استفاده از کتابخانه Numpy، چگونه داده ها از یک فایل متنی بارگذاری می شوند؟
با استفاده از کتابخانه Numpy پایتون میتوان دادهها را از فایلهای متنی (Text File) خواند. برای انجام این کار متد «()numpy.loadtxt» پیشنهاد میشود. این متد به صورت خودکار همه بخشهای فایل را از جمله خطهای بالای صفحه (Header)، پاورقی (Footer) و نظرات را میخواند. متد ()numpy.loadtxt از کارایی بالایی برخوردار است و به راحتی این عملیات را انجام میدهد. حتی اگر کارایی این روش کم به نظر برسد، فایل دادهها باید تغییر کنند و به فرمتی با کارایی بالاتر مانند CSV یا موارد دیگر تبدیل شوند. نسبت به نسخه استفاده شده از کتابخانه NumPy میتوان جایگزینهای مختلفی برای این متد در نظر گرفت. در ادامه، فرمت فایلهایی ارائه شده است که در این کتابخانه پشتیبانی میشوند:
- فایلهای متنی: به طور کلی این فایلها سرعت بسیار پایینی دارند و اندازه آنها بزرگ است. اما قابل حمل و خواندن برای انسانها هستند.
- فایلهای باینری خام (Raw Binary): این فایلها هیچ گونه فرادادهای (Metadata) ندارند و قابل حمل نیز نیستند. اما سرعت آنها بسیار بالا است.
- فایلهای Pickle: این نوع از فایلها کمی آهسته و همچنین قابل حمل هستند، اما رفتار آنها به نسخه پایتونی بستگی دارد که در حال استفاده در برنامه است.
- فایلهای HDF5: این فایلها به عنوان فرمت قدرتمند «Kitchen Sink» شناخته میشوند و از دو فرمت PyTables و h5py پشتیبانی میکنند.
- فایلهای npy.: این فرمت فایل یکی از فرمتهای باینری اصلی کتابخانه Numpy به حساب میآید که بسیار ساده است، همچنین کارایی بالا دارد و قابل حمل است.
چطور می توان داده های CSV را در آرایه ای از Numpy خواند؟
دادههای CSV را میتوان با استفاده از متد «()genfromtxt» در برنامه پایتون خواند و برای جدا کردن آنها از ویرگول به عنوان جدا کننده استفاده کرد. قالب کدهای استفاده این متد در ادامه ارائه شده است:
from numpy import genfromtxt
csv_data = genfromtxt('sample_file.csv', delimiter=',')
چگونه می توان با استفاده از کتابخانه Numpy آرایه ها را بر اساس Nامین ستون مرتب کرد؟
در برنامههای پایتون آرایهها میتوانند بر اساس Nامین ستون مرتب شوند. برای مثال آرایه arr زیر در نظر گرفته میشود:
arr = np.array([[8, 3, 2],
[3, 6, 5],
[6, 1, 4]])
در آرایه زیر سعی شده است که ردیفها بر اساس ستون دوم مرتب شوند:
[[6, 1, 4],
[8, 3, 2],
[3, 6, 5]]
عملیات مرتبسازی را میتوان با استفاده از متد ()sort در کتابخانه Numpy به صورت زیر انجام داد:
import numpy as np
arr = np.array([[8, 3, 2],
[3, 6, 5],
[6, 1, 4]])
#sort the array using np.sort
arr = np.sort(arr.view('i8,i8,i8'),
order=['f1'],
axis=0).view(np.int)
عملیات مرتبسازی آرایهها بر اساس Nامین ستون مثال فوق با استفاده از کدهای زیر انجام میشود:
arr.view('i8,i8,i8').sort(order=['f1'], axis=0)
چگونه می توان نزدیک ترین مقدار را در یک آرایه Numpy یافت؟
برای پیدا کردن نزدیکترین مقدار در یک آرایه Numpy، همانطور که در کدهای زیر نشان داده شده است، میتوان از متد «()argmin» استفاده کرد:
import numpy as np
def find_nearest_value(arr, value):
arr = np.asarray(arr)
idx = (np.abs(arr - value)).argmin()
return arr[idx]
#Driver code
arr = np.array([ 0.21169, 0.61391, 0.6341, 0.0131, 0.16541, 0.5645, 0.5742])
value = 0.52
print(find_nearest_value(arr, value)) # Prints 0.5645
چگونه میتوان آرایه Numpy را با استفاده از یک خط کد معکوس کرد؟
برای معکوس کردن آرایه Numpy با استفاده از یک خط کد میتوان از دستورات زیر استفاده کرد:
reversed_array = arr[::-1]
در کدهای فوق arr آرایه اصلی است که قصد معکوس کردن آن وجود دارد و reverse_array آرایهای به حساب میآید که همه مولفههای آن معکوس شده است.
چگونه میتوان شکل آرایه Numpy را یافت؟
برای یافتن شکل (Shape) آرایه میتوان از ویژگی «Shape» کتابخانه Numpy استفاده کرد. این ویژگی شکل آرایه را بر حسب تعداد ردیف و ستون آرایه برمیگرداند. در ادامه مثالی از ویژگی Shape پایتون ارائه شده است.
import numpy as np
arr_two_dim = np.array([("x1","x2", "x3","x4"),
("x5","x6", "x7","x8" )])
arr_one_dim = np.array([3,2,4,5,6])
# find and print shape
print("2-D Array Shape: ", arr_two_dim.shape)
print("1-D Array Shape: ", arr_one_dim.shape)
"""
Output:
2-D Array Shape: (2, 4)
1-D Array Shape: (5,)
"""
در این بخش از مقاله به برخی سوالات مصاحبه برنامه نویسی پایتون در مورد کتابخانه محبوب و پرکاربرد Numpy پرداخته شد، همچنین در بخش قبلی مقاله، سوالاتی درباره کتابخانه Pandas پایتون ارائه شده بود. حال بخش بعدی مقاله به سوالاتی در رابطه با موضوع ماژولها و کتابخانهها در برنامه نویسی پایتون و سایر موارد مرتبط به آنها اختصاص داده میشود.
سوالات مصاحبه برنامه نویسی پایتون پیرامون ماژول ها
داشتن اطلاعاتی درباره ماژولها و سایر موارد مرتبط با آنها برای برنامه نویسان پایتون اهمیت بالایی دارد. بنابراین، در این بخش از مقاله به بررسی برخی از سوالات مصاحبه برنامه نویسی ماژولها و کتابخانههای پایتون جهت آمادگی حضور در مصاحبه برنامه نویسی پایتون پرداخته شده است.
برخی از متداول ترین ماژول های داخلی در پایتون کدامند؟
ماژولهای پایتون فایلهایی با کدهای پایتون هستند که میتوانند دارای توابع، متغیرها و کلاسها باشند. ماژولها پسوند py. دارند. متداولترین ماژولهای داخلی موجود در پایتون عبارتند از:
- os
- math
- sys
- random
- re یا Regex
- datetime
- JSON
چگونه می توان در برنامه های پایتون اعداد تصادفی تولید کرد؟
برای تولید اعداد تصادفی در پایتون دارای ماژولی به نام Random است که میتوان این کار را با استفاده از آن انجام داد. در ادامه دو رویکرد برای ایجاد اعداد تصادفی ارائه شده است:
- ابتدا ماژول random با استفاده از import در ابتدای برنامه مورد نظر وارد میشود و سپس متد «()random» مانند کدهای زیر در برنامه فراخوانی شده است. متد ()random مقادیر اعشاری بین اعداد صفر و یک را به طور تصادفی تولید میکند.
import random
print(random.random())
- برای تولید اعداد تصادفی سفارشی در محدوده مورد نظر، برنامه نویس میتواند از متد «()randrange» ماژول random به با ساختار نحوی زیر استفاده کند:
randrange(beginning, end, step)
در این متد beginning ابتدای محدوده و end انتهای محدوده مورد نظر برای ایجاد اعداد تصادفی را نشان میدهند. همچنین از step برای مشخص شدن تعداد پرشها بین اعداد محدوده استفاده میشود. مثال زیر برای این نشان دادن متد ارائه شده است:
import random
print(random.randrange(5,100,2))
- مقاله پیشنهادی: ماژول های پایتون (Python Modules) — به زبان ساده
چگونه می توان در پایتون بررسی کرد که همه کاراکترهای یک رشته حروف و عدد هستند؟
با استفاده از متد ()isalnum پایتون به راحتی میتوان بررسی کرد که همه کاراکترهای یک رشته پایتون حروف و عدد (Alphanumeric) هستند. زمانی که کاراکترها در یک رشته فقط حروف و عدد باشند این متد کلمه True را در خروجی برمیگرداند و زمانی که رشته به جز حروف و عدد دارای کاراکتر دیگری نیز باشد متد ()isalnum کلمه False را در خروجی نشان میدهد. مثالی برای درک بهتر این موضوع در ادامه ارائه شده است.
"abdc1321".isalnum() #Output: True
"xyz@123$".isalnum() #Output: False
روش دیگری نیز برای بررسی این موضوع وجود دارد و آن هم استفاده از متد ()match است. ()match یکی از متدهای ماژول re پایتون به حساب میآید. در ادامه مثالی برای استفاده از این متد ارائه شده است.
import re
print(bool(re.match('[A-Za-z0-9]+$','abdc1321'))) # Output: True
print(bool(re.match('[A-Za-z0-9]+$','xyz@123$'))) # Output: False
در پایتون، GIL یا Global Interpreter Lock چیست؟
GIL مخفف عبارت «Global Interpreter Lock» یا همان «قفل مفسر سراسری» است. GIL الگوریتمی با ویژگی انحصار متقابل (Mutual Exclusion | Mutex) به حساب میآید که برای محدود کردن دسترسی به اشیا پایتون مورد استفاده قرار میگیرد و با اجتناب از بنبستها (Deadlock) به همگامسازی کارآمد نخها (Thread) کمک میکند. همچنین GIL در دستیابی به عملکردهای چند وظیفهای (Multitasking) نیز کاربرد دارد که با هم موازی نیستند. تصویر زیر روش کار قفل مفسر سراسری را نشان میدهد.
در نمودار فوق سه Thread وجود دارد. Thread اول GIL را میگیرد و اجرای I/O را آغاز میکند. هنگامی که عملیات I/O این Thread انجام شد، Thread اول GIL را آزاد میکند و سپس این GIL توسط Thread دوم گرفته میشود. این فرآیند در برنامه تکرار خواهد شد و GIL توسط Threadهای گوناگون به طور متناوب استفاده میشود تا زمانی که Threadها اجرای خود را به اتمام برسانند. Threadهایی که قفل GIL ندارند به حالت انتظار میروند و فقط هنگامی که قفل را به دست آورند، مجدداً اجرا را آغاز میکنند.
PIP در پایتون چیست؟
«PIP» مخفف عبارت «Python Installer Package» به معنی «نصب کننده بسته پایتون» است. همانطور که از نام آن پیداست، از PIP برای نصب انواع برنامهها، ماژولها و کتابخانههای گوناگون استفاده میشود. PIP یک ابزار خط فرمان به حساب میآید و رابط یکپارچهای (Seamless Interface) برای نصب ماژولهای مختلف پایتون ارائه میدهد. این ابزار بستهها را از طریق اینترنت جستجو و بدون نیاز به تعامل با کاربر، آنها را برای بخش مورد نظر نصب میکند. ساختار نحوی استفاده از این ابزار در خط فرمان به صورت زیر است:
pip install
- مقاله پیشنهادی: نصب PIP پایتون بر روی ویندوز، مک و لینوکس — از صفر تا صد
آیا ابزاری برای شناسایی خطاها و انجام آنالیزهای ثابت در پایتون وجود دارد؟
بله؛ ابزارهایی از جمله «PyChecker» و «Pylint» در پایتون وجود دارند که به ترتیب به عنوان تجزیه و تحلیل کننده ثابت و چک کردن کدها برای خطاهای (Bug) احتمالی یا همان «Linting» مورد استفاده قرار میگیرند. ابزار PyChecker به یافتن خطاها در فایلهای کدهای منبع پایتون کمک میکند و هشدارهایی را برای مشکلات کدها و پیچیدگی آنها به برنامه نویس اعلام خواهد کرد. ابزار Pylint استانداردهای کدگذاری ماژول را مورد بررسی قرار میدهد و از افزونههای (Plugin) مختلف پشتیبانی میکند تا ویژگیهای سفارشی را برای برآورده کردن نیازهای برنامه فعال کند.
تابع اصلی در پایتون چیست؟
در دنیای اکثر زبانهای برنامه نویسی، تابع اصلی یا همان Main یکی از مهمترین موارد برای شروع برنامه نویسی در نظر گرفته میشود. اما در پایتون مفسر کدها را به صورت خط به خط بررسی و پیادهسازی میکند. این موضوع به این معنی است که پایتون تقریباً به تابع ()main احتیاج زیادی ندارد. ولی این بدان معنا نیست که نمیتوان اجرای تابع ()main را شبیه سازی کرد. این کار را میتوان با استفاده از تعریف تابع ()main توسط کاربر (User-Defined) به وسیله ویژگی __name__ فایلهای پایتون انجام داد. __name__ متغیری داخلی و خاص است که به نام ماژول فعلی برنامه اشاره میکند. ساخت این تابع اصلی با استفاده از کدهای زیر امکانپذیر میشود.
def main():
print("Hi FaraDars!")
if __name__=="__main__":
main()
پس از به اتمام رسیدن آخرین بخش از سوالات مصاحبه برنامه نویسی پایتون، در بخش بعدی مثالهایی از کدهای این زبان برنامه نویسی ارائه شده است.
نمونه برنامه های مهم در سوالات مصاحبه برنامه نویسی پایتون
در این بخش از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» نمونه برنامههای رایجی ارائه شدهاند که معمولاً در مصاحبههای برنامه نویسی پایتون مطرح میشوند.
چگونه می توان تابع پایتونی نوشت که تعداد گوناگونی از آرگومان ها را دریافت کند؟
در زبان پایتون به تابعی که آرگومانهای گوناگونی را دریافت میکند پیش نمونه (Prototype) گفته میشود و ساختار نحوی آن به صورت زیر است:
def function_name(*arg_list)
برای مثال تابع Prototype، کدهای زیر ارائه شدهاند:
def func(*var):
for i in var:
print(i)
func(1)
func(20,1,6)
آرگومان ستاره (*) در تابع فوق، نشان دهنده آرگومانهای متغیر تابع است.
برنامه ای بنویسید که دنباله ای از اعداد را دریافت و منحصر به فرد بودن آنها را بررسی کند.
میتوان با استفاده از تبدیل لیست به مجموعه (Set) با استفاده از متد «()set» و مقایسه طول این مجموعه با طول لیست اصلی، منحصر به فرد بودن دنبالهای از اعداد را بررسی کرد. اگر برابر بودند، True در خروجی برگردانده میشود. مثالی از استفاده این متد در ادامه ارائه شده است.
def check_distinct(data_list):
if len(data_list) == len(set(data_list)):
return True
else:
return False;
print(check_distinct([1,6,5,8])) #Prints True
print(check_distinct([2,2,5,5,7,8])) #Prints False
چگونه می توان برنامه ای با زبان پایتون نوشت که تعداد کاراکترهای یک فایل متنی را بشمارد؟
برای شمردن تعداد کاراکتر فایلهای متنی در برنامه پایتون، بهتر است که از ماژولهای مجموعهها (collection) و چاپ کردن (Print) همانطور استفاده شود که در مثال زیر نمایش داده شده است:
import collections
import pprint
with open("sample_file.txt", 'r') as data:
count_data = collections.Counter(data.read().upper())
count_value = pprint.pformat(count_data)
print(count_value)
چگونه می توان در برنامه ای دو عدد صحیح بزرگتر از صفر را بدون استفاده از عملگر بعلاوه (+) با هم جمع کرد؟
برای اضافه کردن دو عدد صحیح بزرگتر از صفر به برنامه پایتون میتوان از عملگرهای بیتی (Bitwise Operator) استفاده کرد. در ادامه مثالی از روش استفاده این عملگرها ارائه شده است.
def add_nums(num1, num2):
while num2 != 0:
data = num1 & num2
num1 = num1 ^ num2
num2 = data
- مقاله پیشنهادی: عملگرها در پایتون (Operators) — به زبان ساده
چگونه می توان برنامه ای نوشت که با فرض ثابت بودن متغیرهای a ،b ،c ،m ،n ،o، معادله زیر را حل کند؟
معادله زیر با فرض اینکه متغیرهای a ،b ،c ،m ،n ،o ثابت هستند، نیاز است که حل شود.
$$ax + by = c$$
$$mx + ny = o$$
برای حل معادله فوق از کدهای زیر استفاده میشود.
a, b, c, m, n, o = 5, 9, 4, 7, 9, 4
temp = a*n - b*m
if n != 0:
x = (c*n - b*o) / temp
y = (a*o - m*c) / temp
print(str(x), str(y))
چطور می توان با زبان پایتون برنامه ای نوشت که فرمت تاریخ را از yyyy-mm-dd به dd-mm-yyyy تغییر دهد؟
برای تغییر فرمت رشته تاریخ از yyyy-mm-dd به dd-mm-yyyy از ماژول re استفاده میشود. کدهای این مثال به صورت زیر نمایش داده شدهاند.
import re
def transform_date_format(date):
return re.sub(r'(d{4})-(d{1,2})-(d{1,2})', '\3-\2-\1', date)
date_input = "2021-08-01"
print(transform_date_format(date_input))
همچنین برای نوشتن برنامه فوق، میتوان از ماژول datetime پایتون نیز به صورت زیر استفاده کرد:
from datetime import datetime
new_date = datetime.strptime("2021-08-01", "%Y-%m-%d").strftime("%d:%m:%Y")
print(new_data)
چگونه می توان برنامه ای نوشت که دو دیکشنری را با هم ترکیب کند و در خروجی نشان دهد؟
با استفاده از کدهای زیر میتوان دو دیکشنری را با هم ترکیب کرد. فرض بر این است که اگر کلیدهای یکسانی یافت شدند، مقادیر آنها با هم ترکیب شوند. در این مثال متد «Counter» ماژول « Collection» مورد استفاده قرار میگیرد.
from collections import Counter
d1 = {'key1': 50, 'key2': 100, 'key3':200}
d2 = {'key1': 200, 'key2': 100, 'key4':300}
new_dict = Counter(d1) + Counter(d2)
print(new_dict)
چگونه می توان در یک برنامه به مجموعه داده اشتراک گذاشته شده عمومی با فرمت CSV در Google Drive دسترسی داشت؟
برای استفاده از مجموعه داده به اشتراک گذاشته شده عمومی با فرمت CSV در Google Drive میتوان از ماژول «StringIO» که زیر مجموعه ماژول «io» است برای خواندن مجموعه داده از لینک Google Drive استفاده کرد. سپس به وسیله کتابخانه Pandas از دادههای به دست آمده این مجموعه داده استفاده میشود. کدهای ارائه شده برای این مثال در ادامه مشاهده میشوند.
from io import StringIO
import pandas
csv_link = "https://docs.google.com/spreadsheets/d/..."
data_source = StringIO.StringIO(requests.get(csv_link).content))
dataframe = pd.read_csv(data_source)
print(dataframe.head())
به این ترتیب، در این مقاله سعی شد تا حد امکان به طور جامع سوالات مصاحبه برنامه نویسی پایتون از سطوح مبتدی تا پیشرفته مورد بررسی قرار گیرند. اکنون در بخش پایانی این مقاله، برای آشنایی جامعتر و داشتن آمادگی بیشتر با زبان پایتون جهت شرکت در مصاحبه، آن دسته از دورههای تم آف که بیشترین ارتباط را با این زبان برنامه نویسی دارند به علاقهمندان معرفی شدهاند.
فیلم های آموزش برنامه نویسی پایتون
در این بخش انتهایی از مقاله «سوالات مصاحبه برنامه نویسی پایتون با جواب» تعدادی از دورههای کاربردی آموزش پایتون تم آف معرفی شدهاند. با استفاده از این دورههای آموزشی جامع میتوان مهارت خود را در زمینه برنامه نویسی پایتون هر چه بیشتر ارتقا داد و آمادگی لازم را برای پاسخگویی به سوالات مصاحبه برنامه نویسی پایتون به دست آورد.
فیلم آموزش برنامه نویسی پایتون Python – مقدماتی
در این دوره آموزشی همه مفاهیم و موضوعات مقدماتی و پایه زبان برنامه نویسی پایتون آموزش داده شده است. این زبان برنامه نویسی یکی از محبوبترین و برترین زبانها در سطح دنیا به حساب میآید. پایتون کاربردهای بسیاری دارد و با یادگیری آن میتوان در حوزههای مختلف علوم کامپیوتر فعالیت داشت. این دوره آموزشی به علاقهمندان و افراد تازه کاری پیشنهاد میشود که قصد شروع یادگیری پایتون را دارند.
طول مدت این دوره آموزشی حدود ۲۰ ساعت و مدرس آن مهندس پژمان اقبالی شمس آبادی است. همچنین، این تم آف پنج درس را شامل میشود. از جمله سرفصلهای این دوره میتوان به آشنایی با Python (پایتون)، توابع و ماژولها، خواندن و نوشتن فایلها و سایر موارد اشاره کرد.
- برای مشاهده فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + اینجا کلیک کنید.
فیلم آموزش مقدماتی کار با پایگاه های داده در پایتون Python
در دنیای دیجیتال امروز توسعه دهندگان بسیاری قصد یادگیری زبان برنامه نویسی پایتون (Python) را دارند و برای ساخت برنامههای گوناگون نیاز به اتصال به پایگاه داده خواهند داشت. به همین دلیل، یادگیری نحوه کار با پایگاه داده برای هر برنامه نویسی ضروری است. امروزه سیستمهای بانک اطلاعاتی گوناگونی از جمله MySQL, SQLite, Access و سایر موارد وجود دارند که هر کدام ویژگیهای خاصی دارند.
در این دوره آموزشی نحوه اتصال به برخی از پایگاه دادههای مهم از طریق زبان برنامه نویسی پایتون بررسی میشود. طول مدت این دوره نزدیک به یک ساعت و مدرس آن محمد جباری است. این دوره چهار درس را شامل میشود. سرفصلهای این تم آف شامل کار با پایگاه داده MySQL، کار با پایگاه داده SQLite، کار با پایگاه داده Access و موارد استفاده هر پایگاه داده میشوند.
- برای مشاهده فیلم آموزش مقدماتی کار با پایگاه های داده در پایتون Python + اینجا کلیک کنید.
فیلم آموزش فریم ورک کیوی در پایتون – توسعه اپلیکیشن های دسکتاپ با Kivy و Python
در این دوره آموزشی، فریم ورک قدرتمند کیوی (Kivy) زبان پایتون معرفی و آموزش داده میشود. کیوی فریم ورکی چند سکویی (Multi Platform) برای توسعه اپلیکیشنهای موبایل چند لمسی، کاربر پسند و همچنین توسعه اپلیکیشنهای دسکتاپ به حساب میآید. برای یادگیری این فریمورک، باید در ابتدا به زبان پایتون مسلط شد.
مسیر یادگیری در این تم آف به این صورت است که آموزندگان ابتدا با ابزارکها و لایوتها آشنا میشوند و سپس اپلیکیشنهای دسکتاپی را به کمک فریم ورک کیوی در این دوره آموزشی ایجاد میکنند. این تم آف توسط مهندس علی دژبرد تدریس شده است و شامل شش ساعت محتوای ویدیویی در ۱۳ فصل میشود. برخی از سرفصلهای مهم این دوره آموزشی معرفی فریمورک Kivy، معماری Kivy، چیدمانها، معرفی Propertyها، رسم اشکال هندسی، پروژه و سایر موارد هستند.
- برای مشاهده فیلم آموزش فریم ورک کیوی در پایتون – توسعه اپلیکیشن های دسکتاپ با Kivy و Python + اینجا کلیک کنید.
فیلم آموزش پایتون Python ویژه نوجوانان
زبان پایتون به دلیل سادگی و پرکاربرد بودن آن یکی از مناسبترین زبانها برای شروع برنامه نویسی به شمار میرود. در این دوره آموزشی فرض بر این است که مخاطب هیچ آشنایی با مفاهیم برنامه نویسی ندارد. بنابراین در ابتدا با مفاهیم الگوریتم، فلوچارت و سپس به تدریج با مفاهیم برنامه نویسی آشنا میشود و در انتها قادر خواهد بود در حد قابل قبولی برنامه نویسی کند.
طول مدت این دوره حدود هفت ساعت است و دکتر فرشید شیرافکن آن را تدریس میکند. این دوره هشت درس را شامل میشود. از سرفصلهای مهم این تم آف میتوان دادهها – عملگرها، رشته، انواع دستورات شرطی، تاپل (Tuple)، مجموعه و دیکشنری، ماژول و سایر موارد را نام برد.
- برای مشاهده فیلم آموزش پایتون Python ویژه نوجوانان + اینجا کلیک کنید.
فیلم آموزش برنامه نویسی شی گرا در پایتون Python
در این تم آف مفاهیم شی گرایی در پایتون از جمله کلاس، ارث بری (Inheritance)، پلی مورفیسم (Polymorphism)، سر بارگذاری و سایر موارد با ساده ترین روش و همراه با ذکر مثال آموزش داده میشوند. هدف این دوره آموزشی یادگیری مهارتهای عملی لازم برای پیادهسازی شی گرایی در پایتون است.
در این تم آف نکاتی مطرح میشود که رعایت آنها تأثیر بسیار زیادی بر روی کیفیت برنامه نویسی آموزندگان خواهد داشت. این دوره آموزشی توسط دکتر فرشید شیرافکن آموزش داده میشود و شامل حدود هفت ساعت محتوای ویدیویی است. این تم آف هشت فصل دارد که برخی از سرفصلهای مهم آن شامل مروری به پایتون، مفاهیم اولیه شی گرایی، متدهای Dunder – سربارگذاری، کلاس های متد و استاتیک – کلاس انتزاعی و سایر موارد هستند.
- برای مشاهده فیلم آموزش برنامه نویسی شی گرا در پایتون Python + اینجا کلیک کنید.
فیلم آموزش پردازش زبان های طبیعی NLP در پایتون Python با پلتفرم NLTK
پردازش زبانهای طبیعی به یک ابزار یا میتوان گفت به یک زبان برنامه نویسی نیاز دارد. بنابراین با توجه به سهولت کدنویسی و همچنین وجود بستههای نرم افزاری زیاد در زبان برنامه نویسی پایتون و داشتن ابزار پردازش زبانهای طبیعی NLTK، این زبان بیشترین استفاده را در این زمینه دارد. در این دوره آموزشی این مبحث بسیار مهم که یکی از دروس دانشگاهی در مقطع کارشناسی ارشد برخی از دانشگاهها نیز به حساب میآید به طور کامل آموزش داده میشود.
این تم آف توسط مهندس احسان یزدانی تدریس شده است و شامل حدود هفت ساعت محتوای آموزشی میشود. این دوره آموزشی دارای ۱۴ فصل است که به عنوان برخی از سرفصلهای مهم آن میتوان به آشنایی اولیه با پایتون (Python)، آشنایی با پردازش زبان های طبیعی، فاصله ویرایشی و تصحیح خطاهای املایی، پردازش احساسات (Sentiment analysis) و سایر موارد اشاره کرد.
- برای مشاهده فیلم آموزش پردازش زبان های طبیعی NLP در پایتون Python با پلتفرم NLTK + اینجا کلیک کنید.
جمع بندی
پایتون یکی از زبانهای برنامه نویسی سطح بالا و ساده به حساب میآید که بستهها و ابزارهای قدرتمندی را فراهم میکند و استانداردهای چشمگیر مورد نیاز برای توسعه برنامهها در زمینههای بسیاری از جمله برنامه نویسی وب، هوش مصنوعی، یادگیری ماشین، تجزیه و تحلیل دادهها، شبکههای کامپیوتری (Computer Networks) و سایر موارد را دارا است.
ساختار نوشتاری ساده و ویژگیهای از پیش ساخته شده در پایتون باعث ایجاد ثباتی میشوند که دلیل اصلی استفاده روز افزون از این زبان برنامه نویسی هستند. با توجه به بازار کار امروزی، مشخص است که برنامه نویسی پایتون یکی از مشاغل محبوب در دنیای برنامه نویسی به حساب میآید. در این مقاله به تعدادی از مهمترین سوالات مصاحبه برنامه نویسی پایتون پرداخته شد. این سوالات به طور اختصاصی برای برنامه نویسان پایتون در سطوح مختلف از مبتدی تا پیشرفته دستهبندی شدهاند.
با مطالعه این مقاله آشنایی لازم با سوالات مصاحبه برنامه نویسی پایتون حاصل میشود و میتوان آمادگی مناسبی را برای حضور در مصاحبههای کاری به دست آورد و احتمال پذیرفته شدن در موقعیتهای شغلی مناسب برنامه نویسی پایتون حاصل خواهد شد. به همین دلیل، این مقاله به عنوان یک راهنمای کاربردی به منظور آمادگی و ورود هر چه سریعتر به بازار کار برنامه نویسی پایتون به حساب میآید.