یکی از مهم ترین بخش های برنامه نویسی پایتون، نوشتن کدی قابل فهم و در حد ممکن کوتاه است. به کدی با این ویژگی کد پایتونیک (Pythonic) میگویند.
اما همه ما گاهی اوقات اسیر عادات بد میشویم و هنگامی که با عجله کار میکنیم، کدمان یک کمی شلوغ میشود. در اینجا به 10 روش بازنویسی کد در پایتون میپردازیم که کدتان را به کدی قابل فهم تر و پاتونیتک تر تبدیل میکند که کار کردن با آن آسان تر است.
استفاده بیش از حد از توابع تودرتو میتواند به خوانایی و فهم کد ضربه بزند؛ به ویژه آنکه در پایتون از کروشه برای تمایز میان سطوح مختلف تودرتویی استفاده نمیشود. ما میتوانیم سطوح تودرتویی را با ترکیب دو یا چند شرط if با هم کاهش دهیم.
if a: if b: return c
مثال بالا می تواند به کد پایین تبدیل شود:
if a and b: return c
ما باید از به وجود آمدن کد تکراری اجتناب کنیم و یکی از مواردی که کد تکراری بسیار در آن دیده میشود، عبارات شرطی هستند. اگر کدی در دو یا همه ی شاخه های یک عبارت شرطی، تکرار شده باشد، در هر شرایطی اجرا خواهد شد. پس ما میتوانیم آن را تنها یکبار بنویسیم:
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}'
معمولا هنگامی که میخواهیم شرایطی را روی تک تک عناصر یک مجموعه بررسی کنیم از حلقه استفاده میکنیم:
found = False for thing in things: if thing == other_thing: found = True break
این کد کارمان را راه میاندازد اما یک راه بسیار کوتاه تر نیز وجود دارد! پایتون دارای دو تابع داخلی any() و all() است که میتواند به راحتی شرطی را در مورد عنصر یا عناصر یک مجموعه بررسی کند. پس میتوانیم کد بالا را به شکل زیر بازنویسی کنیم:
found = any(thing == other_thing for thing in things)
فهمیدن و دنبال کردن حلقه ها به خودی خود کاری پیچیده است. اضافه کردن اطلاعات غیرضروری به آن ها، آن را پیچیده تر نیز میکند. پس میتوانیم با قرار دادن آن اطلاعات خارج از حلقه، خوانایی کدمان را افزایش دهیم.
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)
یکی دیگر از کارهایی که هنگام برنامه نویسی انجام میدهیم، ایجاد مجموعه از مقادیر است. در بسیاری از زبان ها میتوانیم به شکل زیر عمل کنیم:
cubes = [] for i in range(20): cubes.append(i ** 3)
ابتدا یک لیست خالی cubes ایجاد کرده و سپس آن را به طور تکرارشونده با مقادیر مورد نظرمان مقدار دهی میکنیم. این کار در پایتون اشتباه نیست اما میتوان با استفاده از (قابلیت) دریافت داخلی پایتون، آن را بسیار راحت تر انجام داد. این دریافت ها به ما امکان نوشتن کد بالا را در یک خط، بدون نیاز به تعریف یک لیست خالی، میدهند:
cubes = [i ** 3 for i in range(20)]
تبدیل سه خط به یک خط واقعا عالی است! علاوه بر این، وقتی به سینتکس دریافت لیست عادت کنید، فهمیدن کد نیز برایتان آسانتر میشود.
هر زمان که نیاز به بروزرسانی محتوای یک متغیر داشته باشیم، میتوانیم عبارتمان را ساده سازی کنیم. به طور مثال به جای کد:
count = count + other_value
میتوانیم بنویسیم:
count += other_value
درست است که این تغییرِ چشمگیری نیست اما کدمان کوتاه تر میشود! علاوه بر این، فقط یکبار در مورد متغیر count فکر خواهیم کرد. همچنین می توانیم این ساده سازی را در قبال دیگر عملگرها نیز انجام دهیم. مانند *= , /= , -=, **=
این مورد هنگامی استفاده میشود که میخواهیم متغیری را با یکی از دو مقادیر انتخابی، مقداردهی کنیم. به طور مثال:
if condition: x = 1 else: x = 2
با استفاده از عبارت if میتوانیم چهار خط را به یک خط تبدیل کنیم!
x = 1 if condition else 2
این بازنویسی تا حدودی اختیاری است زیرا بعضی برنامه نویس ها اظهار if را بیشتر میپسندند و آن را خوانا تر میپندارند. اما نظر شخصی من این است که تبدیل یک عبارت شرطی چند خطی به یک خط، به طور قطع پیشرفت محسوب میشود. البته شما آزادید که در این مورد با من هم نظر نباشید.
معمولا هنگام مرور یک لیست، از یک شمارنده استفاده میکنیم تا شماره عنصر فعلی را بدانیم. معمولا این کد ها به شکل زیر نوشته میشوند:
i = 0 for currency in currencies: print(i, currency) i += 1
اما پایتون دارای تابعی داخلی به نام enumerate است که شماره عنصر فعلی را به طور خودکار میسازد و کد ما را دو خط کوتاه تر میکند:
for i, currency in enumerate(currencies): print(i, currency)
خیلی از مواقع نیاز داریم مجموع عناصر یک لیست را بدست آوریم. برای اینکار می توانیم از تابع داخلی sum() استفاده کنیم. بنابراین، به جای:
total = 0 for hat in hats: total += hat.price
به راحتی میتوانیم کد یک خطی پایین را بنویسیم:
total = sum(hat.price for hat in hats)
این کار نه تنها کد ما را کوتاه تر میکند، بلکه توضیح بیشتری در مورد آن نیز به ما میدهد. – که در این مورد پیدا کردن مجموع قیمت کلاه ها است.
معمولا قبل از آنکه عملی را روی یک دنباله یا لیست اعمال کنیم، از خالی نبودن لیست اطمینان حاصل میکنیم. یکی از راه های انجام این کار، بررسی شرط بزرگتر بودن طول لیست از صفر است:
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 پایتون نیز پیشنهاد شده است.
برای آموزشهای پیشرفته پایتونی به وبسایت زیر سر بزنید: