سطح مقدماتی (Beginner Level)
عملگر والروس (Walrus Operator) که با نماد := شناخته میشود، یکی از ویژگیهای جذابی است که در پایتون ۳.۸ معرفی شد. نام این عملگر به دلیل شباهت ظاهری آن به چشمان و دندانهای شیر دریایی (Walrus) انتخاب شده است.
کار اصلی این عملگر "انتساب درونِ عبارت" (Assignment Expression) است. یعنی به شما اجازه میدهد همزمان که یک مقدار را به یک متغیر اختصاص میدهید، از آن متغیر در همان خط استفاده کنید.
۱. حل مشکل تکرار کد
در حالت سنتی، ما اغلب مجبوریم ابتدا یک متغیر را مقداردهی کنیم و سپس در خط بعد، آن را چک کنیم. عملگر والروس این دو مرحله را ترکیب میکند.
مثال اول: استفاده در شرطها
فرض کنید میخواهیم طول یک لیست را چک کنیم و اگر بزرگتر از ۳ بود، آن را چاپ کنیم.
روش قدیمی (بدون والروس):
روش جدید (با والروس):
در اینجا n همزمان مقداردهی میشود و هم با ۳ مقایسه میشود.
۲. بهینهسازی حلقههای While
یکی از بهترین کاربردهای والروس در حلقههای while است، جایی که میخواهیم یک عملیات را تکرار کنیم تا زمانی که شرطی برقرار نباشد (مثلاً دریافت ورودی از کاربر یا خواندن فایل).
مثال دوم: دریافت ورودی
بدون والروس، معمولاً مجبوریم یکبار قبل از حلقه و یکبار داخل حلقه input بگیریم.
مثال سوم: خواندن فایل (Chunking)
این الگو در خواندن فایلها به صورت تکهتکه (Chunk) بسیار رایج است.
# Static Snippet (File reading logic)
# This reads 1024 bytes at a time until empty
with open('data.txt', 'r') as f:
while (chunk := f.read(1024)) != '':
process(chunk)
سطح پیشرفته (Professional Level)
در سطح حرفهای، استفاده از := فقط برای کوتاهکردن کد نیست، بلکه برای بهینهسازی پرفورمنس (جلوگیری از فراخوانی تکراری توابع سنگین) و مدیریت اسکوپ (Scope) است. اما باید با احتیاط استفاده شود تا خوانایی کد (Readability) فدا نشود.
۱. استفاده در List Comprehensions
یکی از قدرتمندترین کاربردهای والروس، جلوگیری از محاسبه تکراری یک تابع سنگین در Comprehensionها است.
مثال اول: جلوگیری از محاسبه تکراری
فرض کنید تابعی داریم که هزینه محاسباتی بالایی دارد. میخواهیم نتایج آن را فیلتر کنیم.
مثال دوم: ساختار دادههای پیچیده
استفاده از والروس برای ساخت دیکشنری یا لیستهایی که نیاز به پردازش میانی دارند.
۲. نکات مهم درباره Scope (محدوده متغیر)
برخلاف متغیرهای حلقه در List Comprehension (که به بیرون نشت نمیکنند)، متغیر تعریف شده با عملگر والروس در اسکوپِ دربرگیرنده باقی میماند.
مثال سوم: نشت متغیر (Scope Leakage)
۳. اولویت عملگرها (Precedence)
عملگر والروس اولویت پایینی دارد. به همین دلیل تقریباً همیشه باید آن را در پرانتز () قرار دهید تا از خطاهای منطقی جلوگیری شود.
# Static: Precedence Logic
# Wrong!
# if x := len(a) > 5:
# تفسیر پایتون: x := (len(a) > 5) -> x مقدار بولی True/False میگیرد!
# Correct
# if (x := len(a)) > 5:
# تفسیر پایتون: اول x برابر len(a) میشود، سپس x با 5 مقایسه میشود.
def check_length(a):
if (n := len(a)) > 5:
return f"Long list: {n}"
return "Short list"
۴. چه زمانی استفاده نکنیم؟
هرچند والروس کد را کوتاه میکند، اما در برخی موارد (مثل عبارات شرطی پیچیده) باعث گیج شدن خواننده میشود. قانون کلی: اگر مجبورید برای فهمیدن کد مکث کنید، از روش قدیمی استفاده کنید.