روش های کاهش استفاده از حلقه for در پایتون — به زبان ساده

۲۲۴ بازدید
آخرین به‌روزرسانی: ۰۴ مهر ۱۴۰۲
زمان مطالعه: ۳ دقیقه
روش های کاهش استفاده از حلقه for در پایتون — به زبان ساده

پایتون سبک‌های کدنویسی مختلفی دارد و به نوعی می‌توان گفت پذیرای همه سبک‌ها است. هر کس می‌تواند با سابقه یادگیری هر نوع زبان برنامه‌نویسی دیگر از پایتون استفاده کند. اما باید توجه داشت که یادگیری یک زبان برنامه‌نویسی و آموختن آن به روش بهینه دو موضوع متفاوت هستند. در این مقاله با روش‌های کاهش استفاده از حلقه for در پایتون آشنا می‌شویم.

فهرست مطالب این نوشته

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

در واقع سه روش برای انجام این کار وجود دارند که همه آن‌ها را بررسی می‌کنیم و انتخاب هر کدام از آن‌ها بر عهده شما است.

1x = [1,3,5,7,9]
2sum_squared = 0
3for i in range(len(x)):
4    sum_squared+=x[i]**2

هر زمان که کد فوق را در یک کدبیس پایتون می‌بینید، بدانید که فردی با پیش‌زمینه C یا جاوا از پایتون استفاده کرده است. روش پایتونی‌تر برای نوشتن کد فوق به صورت زیر است:

1x = [1,3,5,7,9]
2sum_squared = 0
3for y in x:
4    sum_squared+=y**2

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

1x = [1,3,5,7,9]
2sum_squared = sum([y**2 for y in x])

این رویکرد به نام «خلاصه‌سازی لیست» (List Comprehension) نامیده می‌شود و شاید یکی از بهترین دلایل توجیه علاقه افراد به پایتون محسوب می‌شود. می‌توان از if نیز در خلاصه‌سازی لیست استفاده کرد. فرض کنید می‌خواهیم فهرستی از اعداد مربع را صرفاً برای اعداد زوج محاسبه کنیم.

1x = [1,2,3,4,5,6,7,8,9]
2even_squared = [y**2 for y in x if y%2==0]
3--------------------------------------------
4[4,16,36,64]

If-else

اینک اگر بخواهیم اعداد زوج مربع و اعداد فرد مکعب شوند چه کار باید بکنیم؟

1x = [1,2,3,4,5,6,7,8,9]
2squared_cubed = [y**2 if y%2==0 else y**3 for y in x]
3--------------------------------------------
4[1, 4, 27, 16, 125, 36, 343, 64, 729]

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

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

Enumerate چیست؟

برخی اوقات ما هم به اندیس در یک آرایه نیاز داریم و هم مقدار یک آرایه را می‌خواهیم. در چنین مواردی بهتر است به جای اندیس کردن لیست از enumerate استفاده کنیم.

1L = ['blue', 'yellow', 'orange']
2for i, val in enumerate(L):
3    print("index is %d and value is %s" % (i, val))
4---------------------------------------------------------------
5index is 0 and value is blue
6index is 1 and value is yellow
7index is 2 and value is orange

قاعده کار چنین است:

  • هرگز در صورتی که می‌توانید لیستی را اندیس نکنید، آن را اندیس نکنید.
  • از خلاصه‌سازی دیکشنری استفاده کنید.
  • می‌توان از «خلاصه‌سازی دیکشنری» (Dictionary Comprehension) نیز استفاده کرد که مفهوم نسبتاً جدیدی در پایتون محسوب می‌شود. ساختار آن کاملاً مشابه خلاصه‌سازی لیست است.

آن را با یک مثال توضیح می‌دهیم. ما می‌خواهیم یک دیکشنری داشته باشیم که کلید آن برای هر مقدار x مربع آن مقدار است.

1x = [1,2,3,4,5,6,7,8,9]
2{k:k**2 for k in x}
3---------------------------------------------------------
4{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

اگر بخواهیم یک دیکشنری صرفاً برای مقادیر زوج داشته باشیم چطور؟

1x = [1,2,3,4,5,6,7,8,9]
2{k:k**2 for k in x if x%2==0}
3---------------------------------------------------------
4{2: 4, 4: 16, 6: 36, 8: 64}

اگر بخواهیم کلید ما برای مقادیر زوج، مربع آن مقدار و برای مقادیر فرد برابر با مکعب آن مقدار باشد چگونه باید عمل کنیم؟

1x = [1,2,3,4,5,6,7,8,9]
2{k:k**2 if k%2==0 else k**3 for k in x}
3---------------------------------------------------------
4{1: 1, 2: 4, 3: 27, 4: 16, 5: 125, 6: 36, 7: 343, 8: 64, 9: 729}

سخن پایانی

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

بنابراین در زمان نیاز به حلقه for باید از خلاصه‌سازی لیست و خلاصه‌سازی دیکشنری استفاده کنید. اگر به اندیس‌گذاری آرایه نیاز دارید از enumerate استفاده کنید. اما هر کاری می‌کنید همواره به خاطر داشته باشید که باید در حد امکان از حلقه‌های for احتراز کنید. بدین ترتیب کد شما خوانایی بیشتری خواهد داشت و قابلیت نگهداری آن نیز در بلندمدت افزایش می‌یابد.

اگر این مطلب برای شما مفید بوده است آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

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

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