مقدمه
در نسخه ۳.۸ پایتون که در اکتبر ۲۰۱۹ منتشر شد، قابلیتی به نام Assignment Expressions با سینتکس := به این زبان اضافه شد. این سینتکس گاهی با نام Walrus Operator (عملگر گراز دریایی) نیز شناخته میشود، چون شکل := تا حدی شبیه یک گراز دریایی با دندانهای بلند است.
Assignment Expressions این امکان را فراهم میکنند که درون یک عبارت بزرگتر، مقداردهی به متغیر انجام شود. هرچند استفاده از این قابلیت برای نوشتن کد صحیح ضروری نیست، اما میتواند کدهای پایتون را کوتاهتر و فشردهتر کند.
برای مثال، با استفاده از := میتوان درون شرطهای if مقداردهی انجام داد و از نوشتن خطوط جداگانه قبل یا بعد از شرط جلوگیری کرد.
در این آموزش، با چند مثال یاد میگیرید چگونه با استفاده از Assignment Expressions کدهای خلاصهتر و خواناتری بنویسید.
پیشنیازها
برای استفاده بهتر از این آموزش، موارد زیر را نیاز دارید:
- پایتون نسخه ۳.۸ یا بالاتر (چون این قابلیت از این نسخه اضافه شده است)
- دسترسی به کنسول تعاملی پایتون برای اجرای مثالها
- آشنایی اولیه با:
- حلقه
while - شرطهای
if - لیست کامپرهنشن (List Comprehension)
- توابع در پایتون
(البته این موارد الزامی نیستند)
- حلقه
استفاده از Assignment Expressions در شرط if
ابتدا یک مثال ساده را بررسی میکنیم:
some_list = [1, 2, 3]
if (list_length := len(some_list)) > 2:
print("List length of", list_length, "is too long")
خروجی:
List length of 3 is too long
در این مثال:
- یک لیست به نام
some_listتعریف شده است. - در شرط
if، مقدار طول لیست باlen(some_list)محاسبه و همزمان در متغیرlist_lengthذخیره میشود. - چون مقدار طول لیست بیشتر از ۲ است، شرط برقرار شده و پیام چاپ میشود.
بدون استفاده از Assignment Expressions:
some_list = [1, 2, 3]
list_length = len(some_list)
if list_length > 2:
print("List length of", list_length, "is too long")
در این حالت، یک خط اضافه برای مقداردهی نیاز داریم.
یا حتی حالت زیر:
some_list = [1, 2, 3]
if len(some_list) > 2:
print("List length of", len(some_list), "is too long")
در اینجا مقدار طول لیست دوبار محاسبه میشود.
نتیجه:
Assignment Expressions باعث میشود:
- خط اضافی حذف شود
- از محاسبه تکراری جلوگیری شود
نکته: این قابلیت مفید است، اما همیشه لازم نیست. فقط زمانی از آن استفاده کنید که باعث خواناتر شدن کد شود.
استفاده در حلقه while
Assignment Expressions در حلقههای while هم بسیار کاربردی هستند:
while (directive := input("Enter text: ")) != "stop":
print("Received directive", directive)
در این مثال:
- از کاربر ورودی گرفته میشود
- مقدار ورودی در متغیر
directiveذخیره میشود - تا زمانی که مقدار “stop” وارد نشود، حلقه ادامه دارد
نمونه اجرا:
Enter text: hello
Received directive hello
Enter text: example
Received directive example
Enter text: stop
بدون استفاده از Assignment Expressions:
directive = input("Enter text: ")
while directive != "stop":
print("Received directive", directive)
directive = input("Enter text: ")
در این حالت:
- کد طولانیتر است
- تابع
inputتکرار شده است
نسخه walrus هم کوتاهتر است هم خواناتر.
استفاده در List Comprehension
میتوان از Assignment Expressions در لیست کامپرهنشن هم استفاده کرد.
مثال:
def slow_calculation(x):
print("Multiplying", x, "*", x)
return x * x
[result for i in range(3) if (result := slow_calculation(i)) > 0]
خروجی:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 2 * 2
[1, 4]
در این مثال:
- تابع
slow_calculationعدد را در خودش ضرب میکند - در لیست کامپرهنشن، مقدار محاسبهشده در
resultذخیره میشود - فقط مقادیری که بزرگتر از صفر هستند به لیست اضافه میشوند
بدون Assignment Expressions:
[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]
خروجی:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 1 * 1
Multiplying 2 * 2
Multiplying 2 * 2
[1, 4]
در این حالت:
- تابع چند بار اجرا میشود
- کارایی کاهش پیدا میکند
مزیت walrus:
- هر مقدار فقط یکبار محاسبه میشود
- کد بهینهتر و سریعتر است
جمعبندی
در این آموزش دیدید که Assignment Expressions (:=) چگونه میتوانند:
- مقداردهی را داخل شرطها انجام دهند
- کد را کوتاهتر کنند
- از محاسبات تکراری جلوگیری کنند
- خوانایی و کارایی کد را بهبود دهند
در عین حال:
استفاده بیشازحد از این قابلیت میتواند خوانایی کد را کاهش دهد، پس با دقت از آن استفاده کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران