۱۰ اشتباهی که اغلب برنامه‌نویسان مبتدی پایتون مرتکب می‌شوند
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 8 دقیقه

۱۰ اشتباهی که اغلب برنامه‌نویسان مبتدی پایتون مرتکب می‌شوند

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

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

اشتباه اول: تورفتگی‌های اشتباه

همانطور که می‌دانید در پایتون شیوه درست کردن بلوک‌های کد با دیگر زبان‌های برنامه‌نویسی تفاوت دارد. در پایتون برای تعیین دامنه یک تابع یا کلاس و... از حالت تورفتگی یا Indentation استفاده می‌کنند. به صورت رسمی و مطابق با PEP 8 پایتون پیشنهاد می‌کند که برای تورفتگی‌ها از ۴ فاصله استفاده کنید. این کار را می‌توان با چهار Space و یا یک Tab انجام دهید. در هر حال پایتون یک هدف را دنبال می‌کند و یک چیز را از شما می‌خواهد و آن این است که شما در تمام طول کدنویسی‌تان «ثابت قدم» رفتار کرده و مراقب تعداد فاصله‌هایی که برای تورفتگی‌ها تعیین می‌کنید باشید. برای حل کردن مشکلات مربوط به Indentation می‌توانید دو کار انجام دهید:

  • تکلیف‌تان را با چهار Space یا یک Tab مشخص کنید: این دو مورد را با همدیگر ترکیب نکرده و از ابتدا تا انتهای کدنویسی‌تان از یکی از آن‌ها استفاده کنید. استفاده از یک کد ادیتور مناسب که بتواند زبان پایتون را شناسایی کرده و خود در صورت لزوم قطعه کدها را شناسایی کرده و Indentation را بصورت خودکار اعمال کند نیز روش مناسبی است.
  • در صورتی که از Space استفاده می‌کنید مقدار آن را ثابت نگه‌دارید: اگر گاهی از اوقات ۴ Space و گاهی اوقات ۳ Space را قرار می‌دهید پس بهتر است کلا استفاده از Space را فراموش کرده و به استفاده از Tab فکر کنید.

اشتباه دوم: استفاده از نام‌های مشابه برای ماژول‌ها

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

اشتباه سوم: استفاده از آرگومان پیشفرض تغییرپذیر

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

def some_func(default_arg=[]):
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())

خروجی قطعه کد بالا به صورت زیر خواهد بود:

['some_string']
['some_string', 'some_string']
['some_string']
['some_string', 'some_string', 'some_string']

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

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

def some_func(default_arg=None):
    if default_arg is None:
        default_arg = []
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())

اشتباه چهارم: فراموش کردن علامت دو نقطه

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

اشتباه پنجم: استفاده اشتباه از علامت پرانتز و براکت

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

اشتباه ششم: استفاده اشتباه از تابع init

Init یک سازنده یا Constractor است که معمولا در تعریف کلاس‌ها و تعیین Objectهای هر کلاس استفاده می‌شود. یکی از اشتباهات اغلب برنامه‌نویسان این است که از این تابع برای برگشت یک مقدار داده‌ای خاص استفاده می‌کنند. برای حل این مشکل نیاز است که به خوبی با برنامه‌نویسی شئ‌گرا آشنایی پیدا کرده و متوجه شوید که init تنها یک سازنده یا Constractor است و قرار نیست که مقداری را return کند.

اشتباه هفتم: ارجاع ندادن به نام کلاس در زمان تغییر مقدار متغیر

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

اشتباه هشتم: درک اشتباه از Scopeها در پایتون

اگر تا به حال با خطای UnboundLocalError روبرو شده باشید مطمئنا قاعده Scoping در پایتون را فراموش کرده‌اید. پایتون در فرایند اسکوپینگ از قاعده LEGB استفاده می‌کند. LEGB اختصاری‌ست برای چهار کلمه Local، Enclosing، Global و Built-in که نشانه‌ای از اولیت‌دهی به مقداردهی برای داده‌ها و متغیرهاست. برای مثال زمانی که شما یک مقدار را به یک متغیر نسبت می‌دهید پایتون در ابتدا فکر می‌کند که این مقدار متعلق به Scope محلی یا Local است و در صورتی که اینگونه نباشد سراغ حالت‌های دیگر می‌رود. زمانی که شما از این قاعده پیروی نکنید با خطا مواجه خواهید شد.

این موضوع اغلب زمانی که قصد assign کردن مقداری به یک متغیر را دارید اتفاق می‌افتد. برای مثال در قطعه کد زیر شما با مشکلی مواجه نخواهید شد:

x = 10
def bar():
    print(x)
bar()

اما زمانیکه در درون تابع قصد تغییر مقدار x را داشته باشید با خطا روبرو خواهید شد:

x = 10
def foo():
    x += 1
    return x    
foo()

برای اینکه این مشکل را حل کنید باید در ابتدا مراقب Scopeها باشید و در صورتی که بسیار موضوع الزامی بود می‌توانید بصورت دستی x را به صورت global دربیاورید. برای مثال:

x = 10
def foobar():
    global x
    x += 1
    print(x)
foobar()

اشتباه نهم: درک نکردن شیوه کار کردن closureها در پایتون

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

اشتباه دهم: استفاده از Iterator و Generatorها بدون در نظر گرفتن ملاحظات

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

در پایان

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

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
5 از 4 رای

/@arastoo
ارسطو عباسی
برنامه‌نویس و توسعه‌دهنده نرم‌افزار - نویسنده و کپی‌رایتر - #پایتون - #جنگو - #لینوکس

برنامه‌نویس تمام وقت پایتون و مدیر بخش تولید محتوا وبسایت راکت - وبلاگ شخصی: https://arastoo.dev

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

برنامه‌نویس و توسعه‌دهنده نرم‌افزار - نویسنده و کپی‌رایتر - #پایتون - #جنگو - #لینوکس