10 روش برای ریفکتور کردن کدهای پایتونی

July 2021

10 روش برای ریفکتور کردن کدهای پایتونی

یکی از مهم ترین بخش های برنامه نویسی پایتون، نوشتن کدی قابل فهم و در حد ممکن کوتاه است. به کدی با این ویژگی کد پایتونیک (Pythonic) می‌گویند.

 

اما همه ما گاهی اوقات اسیر عادات بد می‌شویم و هنگامی که با عجله کار می‌کنیم، کدمان یک کمی شلوغ می‌شود. در اینجا به 10 روش بازنویسی کد در پایتون می‌پردازیم که کدتان را به کدی قابل فهم تر و پاتونیتک تر تبدیل می‌کند که کار کردن با آن آسان تر است.

 

 


 

1. توابع تو‌در‌تو if را با هم ادغام کنید

استفاده بیش از حد از توابع تو‌در‌تو می‌تواند به خوانایی و فهم کد ضربه بزند؛ به ویژه آنکه در پایتون از کروشه برای تمایز میان سطوح مختلف تودرتویی استفاده نمی‌شود. ما می‌توانیم سطوح تودرتویی را با ترکیب دو یا چند شرط if با هم کاهش دهیم.

 

if a:
  if b:
    return c

مثال بالا می تواند به کد پایین تبدیل شود:

if a and b:
  return c

 

 

 

2. خودتان را تکرار نکنید! کد تکراری را از عبارات شرطیتان حذف کنید

ما باید از به وجود آمدن کد تکراری اجتناب کنیم و یکی از مواردی که کد تکراری بسیار در آن دیده می‌شود، عبارات شرطی هستند. اگر کدی در دو یا همه ی شاخه های یک عبارت شرطی، تکرار شده باشد، در هر شرایطی اجرا خواهد شد. پس ما می‌توانیم آن را تنها یکبار بنویسیم:

if sold > DISCOUNT_AMOUNT:
    total = sold * DISCOUNT_PRICE
    label = f'Total: {total}'
else: 
    total = sold * PRICE
    label = f'Total: {total}'

عبارت label = f'Total: {total}' همیشه اجرا خواهد شد. پس ما می‌توانیم آن را خارج از عبارت شرطی بنویسیم. این کار به ما کمک می‌کند تا هدف اصلی عبارت شرطی را بهتر درک کنیم.

if sold > DISCOUNT_AMOUNT: 
    total = sold * DISCOUNT_PRICE 
else: 
    total = sold * PRICE 
label = f'Total: {total}'

 

 

 

3. از حلقه های کمتری استفاده کنید. به جای آن تابع any() را به کار ببرید.

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

found = False 
for thing in things: 
  if thing == other_thing: 
    found = True 
    break

این کد کارمان را راه می‌اندازد اما یک راه بسیار کوتاه تر نیز وجود دارد! پایتون دارای دو تابع داخلی any() و all() است که می‌تواند به راحتی شرطی را در مورد عنصر یا عناصر یک مجموعه بررسی کند. پس می‌توانیم کد بالا را به شکل زیر بازنویسی کنیم:

found = any(thing == other_thing for thing in things)

 

 

 

4. حلقه های for و while را خلوت کنید!

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

for building in buildings: 
  city = 'London' 
  addresses.append(building.street_address, city)

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

city = 'London' 
for building in buildings: 
  addresses.append(building.street_address, city)

 

 

 

5. از حلقه های کمتری استفاده کنید – بخش دوم. از دریافت list،set و dictionary استفاده کنید.

یکی دیگر از کارهایی که هنگام برنامه نویسی انجام می‌دهیم، ایجاد مجموعه از مقادیر است. در بسیاری از زبان ها می‌توانیم به شکل زیر عمل کنیم:

cubes = [] 
for i in range(20): 
  cubes.append(i ** 3)

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

cubes = [i ** 3 for i in range(20)]

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

 

 

 

6. عبارات افزوده

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

count = count + other_value

میتوانیم بنویسیم:

count += other_value

درست است که این تغییرِ چشمگیری نیست اما کدمان کوتاه تر می‌شود! علاوه بر این، فقط یکبار در مورد متغیر count فکر خواهیم کرد. همچنین می توانیم این ساده سازی را در قبال دیگر عملگرها نیز انجام دهیم. مانند *= , /= , -=, **=

 

 

 

7. عبارات if بجای جملات if

این مورد هنگامی استفاده می‌شود که می‌خواهیم متغیری را با یکی از دو مقادیر انتخابی، مقداردهی کنیم. به طور مثال:

if condition: 
  x = 1 
else: 
  x = 2

با استفاده از عبارت if می‌توانیم چهار خط را به یک خط تبدیل کنیم!

x = 1 if condition else 2

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

 

 

 

8. از یک شمارنده بهتر حلقه استفاده کنید - enumerate

معمولا هنگام مرور یک لیست، از یک شمارنده استفاده می‌کنیم تا شماره عنصر فعلی را بدانیم. معمولا این کد ها به شکل زیر نوشته می‌شوند:

i = 0 
for currency in currencies: 
  print(i, currency) 
  i += 1

اما پایتون دارای تابعی داخلی به نام enumerate است که شماره عنصر فعلی را به طور خودکار می‌سازد و کد ما را دو خط کوتاه تر می‌کند:

for i, currency in enumerate(currencies): 
  print(i, currency)

 

 

 

9. از حلقه های کمتری استفاده کنید – بخش سوم. از sum استفاده کنید.

خیلی از مواقع نیاز داریم مجموع عناصر یک لیست را بدست آوریم. برای اینکار می توانیم از تابع داخلی sum() استفاده کنیم. بنابراین، به جای:

total = 0 
for hat in hats: 
  total += hat.price

به راحتی می‌توانیم کد یک خطی پایین را بنویسیم:

total = sum(hat.price for hat in hats)

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

 

 

 

10. عبارات مقایسه ای را ساده سازی کنید.

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

if len(list_of_hats) > 0: 
    hat_to_wear = choose_hat(list_of_hats)

اما پایتون لیست ها و دنباله ها را به طور خودکار بررسی می‌کند. اگر لیست خالی نبود True و اگر خالی بود False را بر‌می‌گرداند. کد زیر از کد بالا پایتونیک تر است:

if len(list_of_hats): 
    hat_to_wear = choose_hat(list_of_hats)

 

 

با انجام دادن این 10 کار، کدتان را تمیز‌تر و خلوت تر می‌کنید. علاوه بر آن، این نحوه کد نویسی در قرارداد PEP8 guidlines پایتون نیز پیشنهاد شده است.

مقالات مرتبط

اهمیت پیوستگی در کد پایتونی شما

آینده پایتون

GraphQL چیست؟

سوالات حرفه‌ای مصاحبه پایتون