List Comprehension در پایتون چیست و چه زمانی باید از آن استفاده کنیم؟

۲۰۷۶ بازدید
آخرین به‌روزرسانی: ۱۶ اسفند ۱۴۰۲
زمان مطالعه: ۴ دقیقه
List Comprehension در پایتون چیست و چه زمانی باید از آن استفاده کنیم؟

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

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

خلاصه لیست در پایتون چیست؟

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

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

چگونه از خلاصه لیست‌ها در پایتون استفاده کنیم؟

در این نوشته چند نمونه از متدهای لیست در پایتون ارائه شده‌اند که مربوط به زبان پایتون 3 هستند. اگر در مورد تفاوت‌های بین پایتون 3 و 2 مطمئن نیستید، به مستندات این زبان مراجعه کنید تا اختلاف‌های آن‌ها را متوجه شوید.

به قطعه کد زیر که یک آرایه را کپی کرده و همه حرف را به حالت بزرگ در می‌آورد توجه کنید. این کار از طریق اجرای یک حلقه بر روی هر یک از آیتم‌ها در آرایه انجام می‌گیرد:

letters = ['a', 'b', 'c', 'd']
print(letters)

upper_letters = []
for letter in letters:
   result = letter.upper()
   upper_letters.append(result)

print(upper_letters)

در قطعه کد زیر دقیقاً همان منطق را مشاهده می‌کنیم؛ به جز این که این کار تنها در یک خط با استفاده از خلاصه لیست مقدماتی پایتون صورت می‌گیرد:

letters = ['a', 'b', 'c', 'd']
rint(letters)

upper_letters = [x.upper() for x in letters]

print(upper_letters)

توضیح بیشتر با مثال

در مثال فوق لیستی به نام Letters ایجاد می‌شود. این لیست حروف کوچک «a»، «b»، «c» و «d» را در خود جای داده است. فرض کنید می‌خواهید همه این حروف را به حالت بزرگ تبدیل کنید. بدون وجود خلاصه لیست باید یک لیست جدید ایجاد کنید تا نتیجه را ذخیره نمایید، این لیست را Upper_letters می‌نامیم، سپس حلقه‌ای تعریف می‌کنیم تا همه عناصر موجود در آرایه letters را بررسی کرده و آن‌ها را به حروف بزرگ تبدیل کند و در لیست result ذخیره کند. البته این ذخیره‌سازی اختیاری است؛ اما بهتر است که بدین ترتیب عمل شود. سپس حروف بزرگ را به لیست جدید الحاق (append) می‌کنیم. می‌بینید که کار زیادی برای انجام دادن وجود دارد.

خلاصه لیست تقریباً همان کار معادل حلقه را انجام می‌دهد. در واقع خلاصه لیست همه حروف در لیست letters را انتخاب کرده، آن‌ها را به حروف بزرگ تبدیل می‌کند و نتیجه را به صورت یک لیست جدید باز می‌گرداند.

بخش‌های مختلف خلاصه لیست

خلاصه لیست تنها بر روی لیست‌ها کارمی کند و باید یک لیست جدید بازگرداند. دستور خلاصه لیست سه بخش دارد. خلاصه لیست درون یک براکت ([]) نوشته می‌شود. این در تعریف آن وجود دارد و پایتون بدین ترتیب می‌فهمد که شما مشغول کار با یک لیست هستید.

درون براکت ابتدا کار را با نتیجه آغاز می‌کنیم، یعنی کاری که می‌خواهیم این تابع با تک‌تک اجزای لیست انجام دهد را ذکر می‌کنیم.

در مثال فوق کد زیر هر یک از عناصر لیست را که با متغیر x بیان می‌شوند، با استفاده از متد upper() به حروف بزرگ تبدیل می‌کند. این متد بخشی از کتابخانه اصلی پایتون است.

[x.upper() # will not run, only half the comprehension at this point

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

for x in letters

هر زمان که حلقه به انتهای لیست می‌رسد مقدار x به عنصر کنونی لیست تغییر می‌یابد. ابتدا با «a» کار خود را آغاز می‌کند، بعد «b» و همین‌طور تا آخر.

در انتهای کار کافی است همه این عناصر را در یک جا جمع کرده و به متغیری به نام upper_letters نسبت دهیم:

upper_letters = [x.upper() for x in letters]

اینک لیست upeer_letters حاوی لیستی از حروف بزرگ است که از A آغاز شده و با B و همین‌طور تا آخر ادامه می‌یابد.

بخش سوم خلاصه لیست در پایتون

زمانی که دو بخش اول دستور خلاص لیست را نوشتید می‌توانید یک بخش سوم اختیاری نیز برای آن تعیین کنید. این وضعیت شبیه نوشتن دستور if است که بیان می‌کنیم: «یک لیست جدید برای من تهیه کن که مبتنی بر لیست قدیمی باشد و همه عناصری که شرط خاصی را دارند در آن بگنجان». کد آن چنین است:

ages = [1, 34, 5, 7, 3, 57, 356]
print(ages)

old_ages = [x for x in ages if x > 10]
print(old_ages)

در این مثال از یک لیست جدید به نام ages استفاده شده است. لیست old_ages با استفاده از خلاصه لیست ایجاد شده است. شرط if در انتها بدین معنی است که تنها عناصری که معیار خاصی را دارند در این لیست جدید درج می‌شوند. در این مثال هر سنی بالاتر از ده مجاز است.

چه زمانی نباید از خلاصه لیست استفاده کنیم؟

خلاصه لیست زمانی که به طور کامل با آن آشنا شوید، کاملاً مفید خواهد بود؛ اما استفاده از آن در هر موقعیتی توصیه نمی‌شود. برای مثال در مواردی که بیش از یک شرط مورد نیاز است استفاده از آن مناسب نیست:

old_ages = [x for x in ages if x > 10 and x < 100 and x is not None]

کد بالا کار می‌کند؛ اما طولانی و سردرگم کننده است. به طور مشابه هر چیزی که بیش از یک وظیفه منفرد انجام می‌دهد ممکن است کار نکند. در مثال زیر با یک خطا مواجه می‌شویم:

letters = ['a', 'b', 'c', 'd', 2]
print(letters)

upper_letters = [x.upper() for x in letters]
print(upper_letters)

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

letters = ['a', 'b', 'c', 'd', 1]
print(letters)

upper_letters = []

for letter in letters:
   try:
      result = letter.upper()
      upper_letters.append(result)
   except AttributeError:
      pass # do nothing

print(upper_letters)

سخن پایانی

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

اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد می‌کنیم موارد زیر را نیز ملاحظه نمایید:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
makeuseof
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *