13 مورد از سوالات مصاحبه برنامه نویسی پایتون براساس سطح و حوزه

163
13 مورد از سوالات مصاحبه برنامه نویسی پایتون

امروزه استخدام برنامه نویس به‌خصوص در زمینه‌های هوش مصنوعی، تحلیل داده، توسعه‌دهنده وب‌سایت و دیگر حوزه‌ها، با رشد بسیار زیادی روبه‌رو است؛ حوزه‌هایی که توسط زبان قدرت‌مند و همه‌کاره پایتون، قابل اجرا و توسعه هستند. از این رو شرکت در مصاحبه برنامه نویسی پایتون باید با آمادگی کامل صورت گیرد؛ به این معنا که متقاضی با تسلط بر سوال‌ها و پاسخ‌ها، در جلسه مصاحبه حاضر شود. 

در این مقاله از بلاگ کوئرا، به بررسی 13 مورد از سوالات مصاحبه برنامه نویسی پایتون به‌همراه پاسخ هریک می‌رویم؛ سوالاتی که شما را آماده حل چالش‌های ساده و پیچیده پایتونی می‌کنند. ما این سوالات را در چهار دسته پایه، پیشرفته، علوم داده و کدنویسی در پایتون قرار دادیم تا پیمایش و مطالعه را برای شما راحت‌تر کنیم.

4 سوال مصاحبه برنامه نویسی پایتون در سطح پایه

در این بخش، چهار سوال اساسی را به‌همراه پاسخ‌شان مورد ارزیابی قرار دادیم؛ سوالاتی که ممکن است در طول مصاحبه پایتون سطح ابتدایی با آن‌ها روبه‌رو شوید.

1. آیا می‌توانید تفاوت بین List و Tuple را توضیح دهید؟

لیست‌ها و تاپل‌ها ساختارهای داده در پایتون هستند. لیست پویا است؛ اما تاپل ویژگی‌های ثابتی دارد. درعین‌حال، هر دو مزایا و کاربردهای متفاوتی دارند.

لیست

لیست نوع داده‌ای‌ قابل تغییر است، حافظه بیشتری مصرف می‌کند و برای درج و حذف عناصر، انتخاب بهتری است. علاوه‌براین، چندین عملکرد سلسله‌مراتبی دارد.

مثال:

a_list = ["Data", "Camp", "Tutorial"]

Tuple

تاپل یک نوع داده‌ای تغییرناپذیر است و عموما برای دسترسی به عناصر استفاده می‌شود. سرعت بیشتری نسبت‌به لیست دارد و حافظه کمتری هم مصرف می‌کند.

مثال:

a_tuple = ("Data", "Camp", "Tutorial")

2. ()__init__ در پایتون چیست؟

این متد در اصطلاح OOP و به‌عنوان سازنده (Constructor) شناخته می‌شود. هنگامی که یک شی جدید ایجاد می‌کنیم، ()__init__ برای شروع یک حالت استفاده می‌شود. به‌عنوان مثال، می‌توانیم مقادیری را به ویژگی‌های شی اختصاص دهیم یا عملیاتی را که هنگام ایجاد شی ضروری هستند، اجرا کنیم.

بیشتر بخوانید: بهترین کتابخانه های پایتون که باید بشناسید – فهرست ۲۶ کتابخانه ضروری برای Python

متد ()__init__ برای کلاس‌های پایتون رزرو شده است و زمانی که یک شی جدید ایجاد می‌کنیم، به‌طور خودکار فراخوانی می‌شود.

مثال:

ما یک کلاس «book_shop» ایجاد و constructor و تابع ‘()book’ را به آن اضافه کردیم. constructor نام کتاب را ذخیره و تابع `()book` نام کتاب را چاپ می‌کند.

برای آزمایش کد خود، شی “b” را با “quera” مقداردهی و تابع “()book” را اجرا کردیم.

class book_shop:

    # constructor
    def __init__(self, title):
        self.title = title

    # Sample method
    def book(self):
        print('The tile of the book is', self.title)
b = book_shop('Quera')
b.book()
# The tile of the book is Quera

3. تفاوت بین نوع داده قابل تغییر و نوع داده غیرقابل تغییر در پایتون چیست؟

انواع داده‌های قابل تغییر در پایتون را می‌توان تغییر داد؛ حتی این تغییر را می‌توان در زمان اجرا هم اعمال کرد. به‌عنوان مثال، List، Dictionary و Set از انواع داده‌های قابل تغییر هستند.

انواع داده‌های غیرقابل تغییر در پایتون را نمی‌توان تغییر داد یا اصلاح کرد و در طول زمان اجرا بدون تغییر باقی می‌مانند. عدد، رشته و تاپل از انواع داده‌های غیر قابل تغییر هستند.

4. با یک مثال List، Dictionary و Tuple را توضیح دهید.

List

هنگام ساخت یک لیست جدید، نوع داده‌ای List سینتکس یک خطی را براساس مقادیر لیست موجود ارائه می‌دهد. با این مقدار، می‌توانیم از حلقه for برای تکرار یک چیز استفاده کنیم؛ اما در این حالت، پایتون از ما می‌خواهد که چندین خط بنویسیم. در بیشتر مواقع این کدهای اضافی، پیچیدگی دستور را بیشتر می‌کنند.

بیشتر بخوانید: برگه تقلب مصاحبه: از اولین تماس تلفنی تا استخدام

نمونه‌ای از لیست در تکه کد زیر نمایش داده شده است:

my_list = [i for i in range(1, 10)]
my_list
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

Dictionary

مشابه لیست، می‌توانیم یک Dictionary را براساس جدول موجود و فقط با یک خط کد بسازیم. برای ساخت دیکشنری، باید محدوده کد را با ‘{}’ مشخص کنیم.

my_dict = {i for i in range(1, 10)}
my_dict
# {1, 2, 3, 4, 5, 6, 7, 8, 9}

Tuple

برای ایجاد تاپل، ماجرا کمی متفاوت می‌شود. می‌توانیم با استفاده از براکت‌های ‘()’ تاپل ایجاد کنیم؛ اما این براکت یک شی مولد را برمی‌گرداند، نه داده تاپلی را. بنابراین از حلقه for استفاده می‌کنیم تا عناصر یا تبدیل آن‌ها به لیست را اجرا کنیم.

my_tuple = (i for i in range(1, 10))
my_tuple
# <generator object <genexpr> at 0x7fb91b151430>

3 سوال مصاحبه برنامه نویسی پایتون در سطح پیشرفته

در این بخش، سه مورد از سوالات مصاحبه برنامه نویسی پایتون در سطح پیشرفته را توضیح دادیم. سوالاتی که پاسخ به آن‌ها نیاز به تجربه و تبحر برنامه‌نویس دارد.

1. Monkey Patching در پایتون چیست؟

Monkey Patching در پایتون یک تکنیک پویا است که می‌تواند رفتار کد را در زمان اجرا تغییر دهد. به‌طور خلاصه، با این تکنیک می‌توانیم کلاس یا ماژول را در زمان اجرا تغییر دهیم.

بیشتر بخوانید: سخت‌ترین سؤالات مصاحبه‌‌های کدنویسی FAANG

مثال:

  • ما یک کلاس “monkey” با تابع “()patch” ایجاد کردیم. همچنین تابع ‘monk_p’ را در خارج از کلاس ساختیم؛
  • اکنون با اختصاص دادن “monkey.patch” به “monk_p»، “patch» را با تابع «monk_p» جایگزین می‌کنیم؛
  •  در پایان، اصلاح را با ایجاد شی با استفاده از کلاس “monkey” و اجرای تابع “()patch” آزمایش خواهیم کرد.

تابع نوشته‌شده به‌جای نمایش “patch() is being calling”، “monk_p() is being calling را نمایش داده است.

class monkey:
	def patch(self):
      	print ("patch() is being called")

def monk_p(self):
	print ("monk_p() is being called")

# replacing address of "patch" with "monk_p"
monkey.patch = monk_p

obj = monkey()

obj.patch()
# monk_p() is being called

2. دستور “with” در پایتون برای چه هدفی طراحی شده است؟

دستور “with” برای مدیریت استثنا استفاده می‌شود تا کد تمیزتر و ساده‌تری بنویسیم. به‌طور کلی، برای مدیریت منابع رایج مانند ایجاد، ویرایش و ذخیره یک فایل، از این دستور استفاده می‌کنیم.

مثال:

به‌جای نوشتن چندین خط باز، می‌توانیم با استفاده از عبارت “with” یک فایل متنی بسازیم. انجام این کار با دستور with آسان است.

# using with statement
with open('myfile.txt', 'w') as file:
	file.write('DataCamp Black Friday Sale!!!')

3. چرا در ساخت try/except در پایتون از else استفاده می‌کنیم؟

“:try” و “:except” معمولا برای مدیریت استثناها در پایتون به‌کار می‌روند. در این میان، از “:else” زمانی استفاده می‌کنیم که استثنایی مطرح نشود.

مثال:

  • در اولین try، عدد 2 را به‌عنوان صورت و “d” را به‌عنوان مخرج وارد کردیم. این حالت نادرست است و پایتون مقدار “Invalid input!” را برمی‌گرداند. بنابراین “:except” فعال می‌شود.
  •  در try دوم، مقدار 2 را به‌عنوان صورت و 1 را به‌عنوان مخرج وارد کردیم و نتیجه 2 را گرفتیم. هیچ استثنایی مطرح نشد، بنابراین “:else” فعال شد و پیام «تقسیم موفقیت‌آمیز است.» را نشان داد.
try:
	num1 = int(input('Enter Numerator: '))
	num2 = int(input('Enter Denominator: '))
	division = num1/num2
	print(f'Result is: {division}')
except:
	print('Invalid input!')
else:
	print('Division is successful.')

## Try 1 ##
# Enter Numerator: 2
# Enter Denominator: d
# Invalid input!

## Try 2 ##
# Enter Numerator: 2
# Enter Denominator: 1
# Result is: 2.0
# Division is successful.

3 سوال مصاحبه برنامه نویسی پایتون برای علوم داده (Data Science)

در این قسمت، سه سوال مصاحبه برنامه نویسی پایتون را آوردیم که روی کاربردهای علم داده یا Data Science تمرکز دارند.

1. مزایای NumPy نسبت به لیست‌های معمولی در پایتون چیست؟

حافظه

آرایه‌های NumPy حافظه کمتری مصرف می‌کنند. به‌عنوان مثال، اگر یک لیست و یک آرایه NumPy از هزار عنصر ایجاد کنیم، لیست 48K بایت و آرایه NumPy 8k بایت حافظه مصرف می‌کند.

سرعت

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

مثلا اگر دو لیست و دو آرایه NumPy از یک میلیون عنصر را با هم ضرب کنیم، 0.15 ثانیه برای لیست و 0.0059 ثانیه برای عملکرد آرایه زمان صرف می‌شود.

تطبیق‌پذیری

NumPy از آرایه‌های ساده چندگانه، افزودن عنصر به آرایه و عملکردهای داخلی بسیار بیشتری پشتیبانی می‌کند؛ درحالی‌که لیست‌های پایتون قادر به اجرای عملیات اساسی این‌چنینی نیستند.

بیشتر بخوانید: 12 توصیه‌ برای پیدا کردن شغل برنامه نویسی + بهینه‌سازی لینکدین

2. تفاوت بین merge، join و concatenate چیست؟

Merge

اگر بخواهیم با استفاده از شناسه ستون منحصربه‌فرد (Unique Column ID)، دو شیء به‌نام DataFrame را ادغام کنیم، نیاز به دو DataFrame، یک ستون مشترک در هر دو DataFrame و “how” خواهیم داشت.

در این حالت می‌توانیم دو DataFrame را به left، right، outer، inner و cross متصل کنیم. به‌طور پیش‌فرض، برای Merge اتصال از نوع inner درنظر گرفته می‌شود.

pd.merge(df1, df2, how='outer', on='Id')

Join

با این تابع، می‌توانیم به‌وسیله یک ایندکس یکتا (Unique Index)، DataFrames را به یکدیگر متصل کنیم. برای انجام این کار، به آرگومان اختیاری “on” نیاز داریم که می‌تواند یک یا چند نام ستون باشد. به‌طور پیش‌فرض، تابع join یک اتصال left را اجرا می‌کند.

df1.join(df2)

Concatenate

توسط Concatenate، می‌توانیم دو یا چند DataFrame را در امتداد یک محور خاص (ردیف یا ستون) به هم پیوند بزنیم. این تابع به آرگومان “on” نیاز ندارد.

pd.concat(df1,df2)

پس:

  • ()join: دو DataFrame را با شناسه (ID) ترکیب می‌کند؛
  • ()merge: دو DataFrame را توسط یک ستون یا ستون‌هایی که ما مشخص می‌کنیم ترکیب می‌کند؛
  • ()concat: دو یا چند DataFrame را به‌صورت عمودی یا افقی ترکیب می‌کند.

3. چگونه مقادیر (Values) گمشده را شناسایی و با آن‌ها برخورد می‌کنید؟

شناسایی مقادیر گمشده

ما می‌توانیم مقادیر گمشده در DataFrame را با استفاده از تابع “()isnull” و سپس اعمال “()sum” شناسایی کنیم. “()Isnull” مقادیر boolean را برمی‌گرداند و مجموع تعداد مقادیر گم‌شده در هر ستون را نمایش می‌دهد.

در مثال پایین، ما یک Dictionary از لیست‌ها ایجاد و آن را به pandas DataFrame تبدیل کردیم. پس از آن، با ()isnull.()sum توانستیم تعداد مقادیر گمشده در هر ستون را بیابیم.

import pandas as pd
import NumPy as np

# dictionary of lists
dict = {'id':[1, 4, np.nan, 9],
    	'Age': [30, 45, np.nan, np.nan],
    	'Score':[np.nan, 140, 180, 198]}

# creating a DataFrame
df = pd.DataFrame(dict)

df.isnull().sum()
# id   	1
# Age  	2
# Score	1

3 مورد از سوالات مصاحبه برنامه نویسی پایتون در دسته‌بندی کدنویسی

اگر مصاحبه‌ای برای کدنویسی پایتون دارید، آمادگی برای پاسخ دادن به سوالاتی مشابه لیست زیر می‌تواند به شما کمک کند تا مصاحبه‌کننده را تحت تاثیر قرار دهید.

1. چگونه می‌توانید فضای رشته را با یک کاراکتر در پایتون جایگزین کنید؟

برای حل این چالش، کافیست رشته را دست‌کاری کنیم. پس باید فضای رشته را با یک کاراکتر خاص جایگزین کنیم.

مثال 1 

یک کاربر رشته “l vey u” و کاراکتر “o” را وارد کرده است و خروجی “loveyou” خواهد بود.

مثال 2

کاربری رشته “D t C mpBl ckFrid yS le” و کاراکتر “a” را در کادر ورودی می‌نویسد و خروجی “DataCampBlackFridaySale” را خواهد دید.

در تابع `()str_replace` روی هر حرف از رشته حلقه می‌زنیم و بررسی می‌کنیم که آیا فاصله‌ای در این میان است یا خیر. اگر فضای خالی وجود داشته باشد، آن را با کاراکتر خاص ارائه‌شده توسط کاربر جایگزین می‌کنیم. درنهایت، رشته اصلاح‌شده را برمی‌گردانیم.

def str_replace(text,ch):
	result = ''
	for i in text:
        	if i == ' ':
            	i = ch  
        	result += i
	return result

text = "D t C mpBl ckFrid yS le"
ch = "a"

str_replace(text,ch)
# 'DataCampBlackFridaySale'

2. با یک عدد مثبت از نوع integer، تابعی بنویسید که اگر num یک مربع کامل باشد، مقدار True و در غیر این صورت، مقدار False را برگرداند.

ابتدا باید کامل بودن جذر عدد را به شیوه زیر بررسی کنیم:

  • جذر دوم عدد را پیدا و آن را به یک عدد از نوع integer تبدیل می‌کنیم؛
  • حال مربع بودن آن را بررسی می‌کنیم تا متوجه شویم یک جذر کامل است یا خیر؛
  • در مرحله آخر، نتیجه را به‌شکل یک مقدار boolean بازمی‌گردانیم.
def valid_square(num):
	square = int(num**0.5)
	check = square**2==num
	return check

valid_square(10)
# False
valid_square(36)
# True

3. یک عدد با نام n  و نوع integer به برنامه بدهید. سپس تعداد صفرهای انتهایی را به‌شکل n factorial n برگردانید.

برای حل این چالش، ابتدا باید n factorial (n!) و سپس تعداد صفرهای ورودی را محاسبه کنیم.

مرحله اول: یافتن فاکتوریل 

ابتدا از یک حلقه “while” برای تکرار روی فاکتوریل n استفاده می‌کنیم. زمانی که n برابر با یک شد، حلقه را متوقف می‌کنیم.

مرحله دوم: محاسبه صفرهای دنباله‌دار

در مرحله دوم صفر انتهایی را محاسبه می‌کنیم، نه کل صفرها را. بین این دو تفاوت زیادی وجود دارد.

7! = 5040

هفت فاکتوریل در مجموع دو صفر و یک صفر انتهایی دارد. بنابراین کد ما باید مقدار یک را برگرداند.

  • حال عدد فاکتوریل را به رشته تبدیل می‌کنیم؛
  • آن را دوباره در فرآیند اجرا قرار می‌دهیم و یک حلقه می‌سازیم؛
  • اگر عدد صفر است، 1+ را به نتیجه اضافه می‌کنیم. در غیر این صورت حلقه را متوقف می‌کنیم؛
  • نتیجه آماده ارائه و نمایش است.
def factorial_trailing_zeros(n):

    fact = n
    while n > 1:
        fact *= n - 1
        n -= 1

    result = 0

    for i in str(fact)[::-1]:
        if i == "0":
            result += 1
        else:
            break

    return result

factorial_trailing_zeros(10)
# 2
factorial_trailing_zeros(18)
# 3

آنچه در 13 مورد از سوالات مصاحبه برنامه نویسی پایتون خواندیم

پایتون دامنه شغلی گسترده‌ای دارد. همین موضوع شانس دریافت پیشنهاد کاری و تقاضای زیاد برای برنامه‌نویسان پایتون را افزایش می‌دهد. بنابراین آمادگی برای جلسه مصاحبه برنامه نویسی پایتون ضروری است؛ زیرا علاوه‌بر شما، کاندیدهای زیادی وجود دارند که می‌توانند موقعیت مناسب را به‌دست آورند. با مرور سوالاتی که در این مقاله بررسی شد، می‌توانید خودتان را برای این جلسه مهم آماده کنید و شانس خود را در دریافت موقعیت شغلی مطلوب بالا ببرید. 

سوالات متداولی که شما می‌پرسید

1. چگونه برای سوالات مصاحبه برنامه نویسی پایتون آماده شوم؟

برای آمادگی، نیاز به مرور سینتکس‌ها، توابع، کلاس‌ها، نوع داده‌ها، الگوریتم‌ها و برخی مباحث مقدماتی و اساسی در پایتون دارید.

2. چگونه شانس موفقیت در مصاحبه شغلی خودم را بالا ببرم؟

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

3. تسلط به کدام سوالات مصاحبه برنامه نویسی پایتون مهم است؟

در اولین جلسه مصاحبه، معمولا مصاحبه‌کننده سوالاتی از دسته‌های عمومی و مفاهیم اولیه پایتون می‌پرسد. در مراحل بعدی، نیاز به تسلط بر مباحث فنی و پیشرفته دارید. بنابراین تسلط به دو دسته «سوالات مقدماتی» و «سوالات پیشرفته» ضروری است.

آموزش برنامه نویسی با کوئرا کالج
نگین فاتحی

از اسفند 99 مشغول گشت‌وگذار در دنیای کلمات هستم؛ با این هدف که خوب بنویسم و این چشم‌انداز که کمک‌های موثری کنم. بعداز گذشت سه‌ سال و مطالعه زیاد در زمینه‌های گوناگون بازاریابی آنلاین ازجمله رفتارشناسی مخاطب آنلاین، حالا تلاش می‌کنم محتوایی بنویسم که شما بخونی، لُب‌کلام رو متوجه بشی، لذت ببری و با دست پر صفحه رو ترک کنی؛ شایدم بقیه نوشته‌هام رو بخونی :)

ممکن است علاقه‌مند باشید
اشتراک در
اطلاع از
guest

0 دیدگاه‌
بازخورد (Feedback) های اینلاین
View all comments