اشتباهات رایج در پایتون - ۴ مورد پرتکرار

اشتباهات رایج در پایتون - ۴ مورد پر تکرار
07 بهمن 1401

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

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

در این مقاله قصد داریم به ۴ مورد از اشتباهات رایج در پایتون که برنامه نویسان تازه انجام می‌دهند را برایتان شرح دهم. یادگیری این چهار مورد به خود من در مراحل ابتدایی یادگیری کمک شایانی کرد و امیدوارم برای شما نیز چنین تاثیری داشته باشد.

شروط boolean (درست و غلط) کلاسیک python

این مورد اشتباهی متدوال بین تازه واردهای دنیای برنامه نویسی است. البته این اشتباه از سمت برنامه نویسان با تجربه‌تر هم که پس زمینه‌ی آکادمیک برنامه‌ نویسی کمی دارند، رخ می‌دهد؛ مثل دانشمندان داده (data scientists) که از کد مثل یک ابزار استفاده می‌کنند.

عبارات شرطی در python بسیار کاربردی هستند ولی همیشه نباید از آن‌ها استفاده کرد؛ خصوصا در مواردی که شما در حال چک کردن مقداری هستید که نوع آن boolean (true یا false) است.

بگذارید با یک مثال ساده این موضوع را بیان کنم. فرض کنید می‌خواهید کدی بنویسید که نمایان‌گر این باشد که یک مجموعه داده پاک شده است یا خیر. کد زیر را می‌بینید که شامل یک متغیر به نام is_data_clean است که این نشان‌گر این مورد است. تنها کاری که باید بکنید این است که این مقدار را چک کنید و آن‌ را برگردانید (return کنید).

برای اولین بار ممکن است همچین کدی برای این مشکل بنویسید:

def a_function():
    if is_data_clean == True:
        return True
    else:
        return False 

این کد بدون هیچ مشکلی کار خواهد کرد ولی کمی پیچیده‌تر از حد نیاز است. آیا می‌توانید مشکل را حدس بزنید؟

متغیر is_data_clean به خودی خود یک بولین است؛ بنابراین شما مقدار booleanی که نیاز به return کردن آن هست را دارید! کد بالا مقدار این متغیر را چک میکند و اگر برابر با true بود، مقدار true را بر می‌گرداند و در غیر این صورت مقدار false را باز می‌گرداند. پس در این‌جا مقدار قابل توجی کد اضافی داریم.

کد زیر ساده‌تر شده‌ی کد بالاست که همان کارایی را دارد:

def a_function():
    return is_data_clean

عملگرهای موجود داخلی پایتون (built-in) مانند sum, mean

یکی دیگر از اشتباهات رایج در پایتون استفاده نکردن از توابع built-in می باشد. پایتون توابع فراوان built-inی دارد که برای بسیاری از افراد ناشناس است. تعداد افرادی که همچنان برای محاسبه‌ی مجموع اعداد یک لیست از حلقه‌ استفاده می‌کنند بسیار زیاد است.

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

total = 0
for num in numbers_list:
    total += num

می‌توان از طریق تابع sum به سادگی کد زیر را نوشت:

total = sum(numbers_list)

برای یافتن کمترین مقدار (min) یا بیشترین (max) هم می‌توانید از کد زیر استفاده کنید:

import math
minimum = math.inf # start at highest possible value
for number in numbers_list:
    if number < minimum:
        minimum = number

اینجا کلاس آموزش مقدمات علوم کامپیوتر نیست و ما راجع به دنیای واقعی برنامه نویسی صحبت می‌کنیم؛ نیاز نیست که چرخ را از ابتدا اختراع کنیم و می‌توانیم از توابع built-in زبان برنامه نویسی پایتون استفاده کنیم:

minimum = min(numbers_list)
maximum = max(numbers_list)

برای دیدن لیست کامل توابع built-in زبان پایتون می‌توانید از به این لینک مراجعه کنید.

برخی توابع نیز جزو توابع built-in نیستند ولی می‌توانید با کمی جستجو آنها را پیدا کنید.

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

# Snippet 1: Don't do this!
total = 0
for num in numbers_list:
    total += num
avg = total / len(numbers_list)

Snippet 2: Do this!

import numpy as np avg = np.mean(numbers_list)

اغلب اوقات پایتون توابع کاربردی که درون ماژول‌ها هستند را ارائه می‌دهد و نیاز به کمی جست‌وجوی بیش‌تر برای یافتن این‌ توابع و import کردن‌شان داریم؛

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

کاری کنید که هیچ‌کاری انجام ندهید

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

مثلا سوال می‌توان این باشد:‌ آیا من باید دانشمند داده (data scientists) شوم؟

سپس الگوریتم می‌تواند از سوالات زیر تشکیل شود که هر کدام از آن‌ها تاثیر مثبت یا منفی بر نتیجه‌ی نهایی خواهد داشت.

  • آیا من علاقه‌مند به استفاده از داده برای کسب بینش نسبت به جهان هستم؟
  • آیا من علاقه‌مند به یادگیری python هستم؟
  • آیا من علاقه‌مند به کار کردن در تیم‌های میان رشته‌ای هستم؟

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

بیش‌تر دانش‌آموزان با کد زیر این مسئله را حل می‌کنند:

# willing_to_learn is some predefined variable based on user input
if willing_to_learn:
    score += 10
else:
    score += 0

این مورد یکی از مثال‌های معروف "کاری کنید که هیچ کاری انجام ندهید". بیایید با جزئیات بررسی کنیم که پایتون وقتی به عبارت score+=0 می‌رسد، چه باید بکند:

  • باید مقدار متغیر score را پیدا کند.
  • باید مقدار ۰ را به آن اضافه کند؛ این مرحله شامل فراخوانی تابع جمع کردن با دو ورودی است و محاسبه کردن مقدار خروجی است.
  • تخصیص مجدد مقدار محاسبه شده به متغیر score

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

راهکار بهتر استفاده از کلید‌واژه‌ی pass در python است که به پایتون می‌گوید که هیچ کاری نکند و فقط ادامه دهد. به نظر میاید که در بالا یک خط کد اضافی نوشته‌ایم اما اگر آن خط را حذف کنیم نیز با خطا مواجه می‌شویم. می‌توان با اضافه کردن یک خط کامنت، به وضوح کد خود کمک کنید:

if willing_to_learn:
    score += 10
else:
    pass # Leave score unchanged

عبارت شرطی یکتا، یکی دیگر از اشتباهات پرتکرار در پایتون

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

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

برنامه نویسان تازه‌وارد زبان پایتون اغلب از یکی از دو روش زیر این مسئله را حل می‌کنند:

# Possibility 1
if response == "Yes":
    # do something
if response == "No":
    # do something
if response == "Maybe":
    # do something

Possibility 2

if response == "Yes": # do something elif response == "No": # do something else: # do something

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

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

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

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

score = 76

print("SNIPPET 1") print()

if score < 100: print('A') elif score < 90: print('B') elif score < 80: print('C') elif score < 70: print('D') else: print('F')

print() print("SNIPPET 2") print()

if score < 100: print('A') if score < 90: print('B') if score < 80: print('C') if score < 70: print('D') if score < 60: print('F')

خروجی کد بالا:

SNIPPET 1

A

SNIPPET 2

A B C

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

باید بدانیم که روش‌هایی برای حل این مسئله با چندین if نیز وجود دارد. برای مثال می‌توان شرط را به گونه‌ای تعریف کرد یک بازه‌ی عددی چک شود. هدف این مثال اثبات شایستگی یک روش بر دیگری نیست اما فقط قصدمان نشان دادن تمایز این دو راه بود.

نتیجه‌گیری

در زیر می‌توان برگه تقلب یا همان cheat sheet پایتونی خود را داشته باشید تا بتوانید از اشتباهات رایج در پایتون دور بمانید:

  • زمانی که می‌توانید خود مقدار boolean را برگردانید، شروط اضافی ناکارآمد را در کدتان قرار ندهید.
  • بهترین دوستان شما فانکشن‌های built-in هستند.
  • اگر می‌خواهید به پایتون بفهمانید که هیچ کاری نباید بکند، از کلید واژه‌ی pass استفاده کنید.
  • مطمئن شوید که عبارات شرطی را به درستی ساختاربندی می‌کنید و مفاهیم if , elif , else را به خوبی متوجه شده‌اید.

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

برای مطالعه محتوای بیشتر در رابطه با python می توانید با تگ پایتون مراجعه کنید.

سافت اسکیل

مجموعه سافت اسکیل

مجموعه آموزشی سافت اسکیل