۸ خطای رایج پایتون که هر مبتدی میبیند (و راه رفع آنها)
نویسنده: آموزشگاه فنی حرفهای آزاد آراهوش
اولین باری که پایتون با متن قرمز و چند خط انگلیسی جوابتان را میدهد، حس میکنید چیزی را خراب کردهاید. اما خطا در پایتون پیام است، نه تنبیه: دقیقاً میگوید کدام خط و چه نوع مشکلی دارد. مستندات رسمی پایتون خطاها را به دو دسته تقسیم میکند: خطای نحوی (Syntax Error) که قبل از اجرا گرفته میشود، و استثنا (Exception) که وسط اجرای برنامه پیش میآید. در این مقاله هشت خطایی را بررسی میکنیم که تقریباً هر مبتدی در هفتههای اول میبیند: کد خراب، پیام واقعی، معنی پیام و راه رفع. همه مثالها را با پایتون ۳٫۱۲ اجرا کردهایم و پیامها از همان اجراها برداشته شدهاند. در نسخههای دیگر ممکن است متن پیام کمی فرق کند، اما نوع خطا همان است. مقاله برای هنرجوها و خانوادههای درچه اصفهان هم نوشته شده است، پس به چند اشتباه مخصوص کیبورد فارسی هم میپردازیم.
خلاصه: هشت خطا در یک نگاه
- SyntaxError: نوشتار کد غلط است (دونقطه یا پرانتز جا افتاده، یا نویسه نامعتبر)
- IndentationError: تورفتگی خطها درست نیست
- NameError: اسمی را بهکار بردهاید که پایتون نمیشناسد
- TypeError: دو نوع دادهای را با هم ترکیب کردهاید که به هم نمیخورند
- ValueError: نوع داده درست است، ولی مقدارش قابل تبدیل نیست
- IndexError: به خانهای از لیست اشاره کردهاید که وجود ندارد
- KeyError: کلیدی را از دیکشنری خواستهاید که در آن نیست
- FileNotFoundError: فایلی را باز کردهاید که پایتون در آن مسیر پیدا نمیکند
قبل از هر چیز: پیام خطا را چطور بخوانیم؟
فرض کنید فایلی به نام main.py دارید:
numbers = [10, 20, 30] print(numbers[3])
اجرایش این خروجی را میدهد:
Traceback (most recent call last):
File "/tmp/main.py", line 2, in <module>
print(numbers[3])
~~~~~~~^^^
IndexError: list index out of rangeراه درست خواندنش از پایین شروع میشود. آخرین خط نوع خطا و توضیح آن را میدهد (IndexError: list index out of range). خط بالاتر نشان میدهد کدام تکه از کد مشکل دارد، و خط File شماره خطی را میگوید که مشکل همانجا رخ داده است. علامتهای ~ و ^ هم محل دقیق مشکل را نشان میدهند. وقتی برنامه از چند تابع تشکیل شده باشد، چند بلوک File میبینید؛ آخرین بلوک نزدیکترین نقطه به محل خطاست و عبارت «most recent call last» همین را میگوید. نشانی فایل و شکل علامتها روی سیستم شما فرق میکند، اما ساختارش همین است.
۱. SyntaxError؛ کد درست نوشته نشده
دو نمونه رایج:
print("hello"SyntaxError: '(' was never closedیعنی پرانتز باز کردهاید و نبستهاید. نمونه دوم، دونقطه جاافتاده بعد از if:
name = "Ali"
if name == "Ali"
print("hi")SyntaxError: expected ':'
راه رفع ساده است: پرانتز را ببندید یا بعد از شرط دونقطه بگذارید.
دو مورد مخصوص فارسیزبانها
گاهی خطای SyntaxError میبینید و کد کاملاً درست به نظر میرسد. دلیلش معمولاً یک نویسه غیرمجاز است:
x = ۵
SyntaxError: invalid character '۵' (U+06F5)
رقم فارسی را نمیتوان مستقیم داخل کد نوشت. همین مشکل با گیومههای هوشمند هم پیش میآید، مثلاً وقتی کد را از ورد یا یک پیامرسان کپی کردهاید:
print(“hello”)
SyntaxError: invalid character '“' (U+201C)
راه رفع: زبان کیبورد را هنگام نوشتن کد انگلیسی کنید، و گیومهها را با علامت ساده " یا ' عوض کنید. نکته جالب این است که پایتون ورودی کاربر را اگر ارقام فارسی داشته باشد، خوب میفهمد؛ در بخش ValueError میبینید.
۲. IndentationError؛ تورفتگی درست نیست
پایتون با تورفتگی تشخیص میدهد کدام خطها داخل بلوک هستند. دو پیام رایج:
if True:
print("a")IndentationError: expected an indented block after 'if' statement on line 1
یعنی بعد از if باید خط بعدی با فاصله شروع شود. و:
x = 1
y = 2IndentationError: unexpected indent
یعنی بیدلیل فاصله گذاشتهاید. قاعده: هر بلوک چهار فاصله (یا یک Tab) تورفتگی دارد و در یک فایل نباید Tab و فاصله را قاطی کنید. ویرایشگرهای کد معمولاً این را خودکار انجام میدهند.
۳. NameError؛ اسمی که پایتون نمیشناسد
name = "Ali" print(nam)
NameError: name 'nam' is not defined. Did you mean: 'name'?
پایتون در نسخههای جدید حتی حدس میزند منظورتان چه بوده است. علتهای رایج: غلط تایپی، اشتباه بین حروف بزرگ و کوچک (name و Name دو اسم متفاوتاند)، یا استفاده از متغیر قبل از ساختنش. راه رفع: اسم را با دقت بنویسید و مطمئن شوید قبل از استفاده، مقدارش را دادهاید.
۴. TypeError؛ نوع دادهها به هم نمیخورند
print("Age: " + 15)TypeError: can only concatenate str (not "int") to str
نمیشود متن را به عدد چسباند. سه راه رفع:
age = 15
print("Age: " + str(age))
print("Age:", age)
print(f"Age: {age}")هر سه خروجی Age: 15 را میدهند. همین خطا اغلب با input هم پیش میآید، چون هرچه از کاربر بگیرید متن است، حتی اگر عدد تایپ کند. پس برای جمع کردن باید آن را به عدد تبدیل کنید:
age = int(input("Age: "))
print(age + 1)۵. ValueError؛ مقدار قابل تبدیل نیست
print(int("abc"))ValueError: invalid literal for int() with base 10: 'abc'
نوع داده درست است (متن)، اما محتوایش را نمیشود به عدد صحیح تبدیل کرد. یک مورد مشابه: int("3.5") هم همین خطا را میدهد، چون متن اعشاری را باید اول با float بخوانید. دو نکته:
- اگر کاربر رقم فارسی بنویسد، int آن را میفهمد. در آزمایش ما int("۱۵") عدد ۱۵ را برگرداند و برنامهای مثل int(input(...)) با ورودی فارسی هم کار کرد.
- وقتی ورودی از کاربر میآید، بهتر است خطا را مدیریت کنید:
text = input("عدد: ")
try:
n = int(text)
print(n * 2)
except ValueError:
print("لطفاً فقط عدد وارد کنید")با ورودی abc این برنامه بهجای کرش کردن، پیام «لطفاً فقط عدد وارد کنید» را چاپ میکند. بلوک try و except در آموزش رسمی پایتون هم همینطور تعریف شده است.
۶. IndexError؛ خانهای که وجود ندارد
a = [10, 20, 30] print(a[3])
IndexError: list index out of range
لیست سه عضو دارد، اما شمارهگذاری از صفر شروع میشود؛ پس شمارههای مجاز ۰، ۱ و ۲ هستند. برای دسترسی به آخرین عضو:
print(a[len(a) - 1]) print(a[-1])
هر دو ۳۰ را چاپ میکنند. اگر میخواهید همه اعضا را ببینید، حلقه for مطمئنتر از شمارهگذاری دستی است:
for item in a:
print(item)۷. KeyError؛ کلید در دیکشنری نیست
d = {"name": "Ali"}
print(d["age"])KeyError: 'age'
دیکشنری فقط کلید name دارد. اگر مطمئن نیستید کلید هست یا نه، از get استفاده کنید که بهجای خطا، مقدار پیشفرض را میدهد:
print(d.get("age", "ثبت نشده"))خروجی این کد «ثبت نشده» است. دقت کنید get هر مشکلی را حل نمیکند؛ گاهی نبودن کلید واقعاً یعنی دادهتان ناقص است و باید بفهمید چرا.
۸. FileNotFoundError؛ فایل پیدا نشد
open("nofile.txt")FileNotFoundError: [Errno 2] No such file or directory: 'nofile.txt'
دلیلهای معمول: اسم فایل را غلط نوشتهاید، پسوند را جا انداختهاید، یا فایل در پوشهای است که برنامه از آن اجرا نمیشود. اگر فقط نام فایل را بدهید، پایتون آن را در پوشه جاری جستوجو میکند. برای اینکه قبل از باز کردن مطمئن شوید فایل هست:
from pathlib import Path
p = Path("nofile.txt")
print(p.exists())خروجی این کد False است. میتوانید با if، فقط وقتی فایل هست آن را باز کنید.
دو خطای دیگر که زود میبینید
- ZeroDivisionError: division by zero وقتی عددی را بر صفر تقسیم کنید (مثلاً 5 / 0).
- AttributeError: 'str' object has no attribute 'append' وقتی روی یک نوع داده کاری کنید که برایش تعریف نشده (مثلاً append را روی متن بزنید، در حالی که append مخصوص لیست است).
وقتی خطا نمیدهد ولی جواب غلط است
بدترین خطاها آنهایی هستند که پیام ندارند. مثال:
def f(n):
if n > 0:
return "positive"
print(f(-1))این برنامه خطا نمیدهد، اما None چاپ میکند، چون برای n کوچکتر از صفر هیچ return اجرا نمیشود. اینجا باید خودتان با print کردن مقدارها یا با چند آزمایش کوچک، رفتار برنامه را بررسی کنید.
پنج عادت برای اشکالزدایی بهتر
- پیام را کامل بخوانید. نوع خطا و شماره خط را بنویسید، سپس سراغ کد بروید.
- همیشه خط بالاتر را هم نگاه کنید. گاهی پرانتز بستهنشده در خط قبل باعث میشود خطا به خط بعد نسبت داده شود.
- با print مقدارها را ببینید. قبل از اینکه حدس بزنید، ببینید متغیر واقعاً چه چیزی دارد.
- مسئله را کوچک کنید. تکه مشکلدار را در یک فایل جدا و کوتاه بنویسید و آزمایش کنید.
- یک بار یک تغییر. اگر چند چیز را با هم عوض کنید، نمیفهمید کدام درست بود.
برای جستوجو هم پیام اصلی را (به انگلیسی) همانطور که هست جستوجو کنید، بدون اسم متغیرهای خودتان.
اشتباههایی که هنگام رفع خطا مرتکب میشویم
- بستن دهان خطا با except خالی. نوشتن try و except بدون نام خطا و بیکار گذاشتنش، مشکل را پنهان میکند، نه حل.
- کپی کردن کد از جایی که گیومه یا فاصله را عوض میکند. همان خطای نویسه نامعتبر که بالاتر دیدید.
- حدسهای پشت سر هم. چند تغییر بدون خواندن پیام، فقط پیچیدگی اضافه میکند.
- نادیده گرفتن خطای اول. وقتی چند خطا میبینید، معمولاً اولی را درست کنید؛ بقیه اغلب نتیجه همان است.
یادگیری پایتون و رفع خطا در درچه
اگر تازه شروع کردهاید، مقاله آموزش پایتون از صفر برای مبتدیها نقشه راه کاملتری دارد. برای کودکان و نوجوانان مقدمه آموزش اسکرچ چیست؟ مسیر نرمتری است. و اگر میخواهید بدانید برنامهنویسی در کل شغل و مسیر شما را کجا میبرد، نقشه راه ورود به دنیای IT و کامپیوتر را بخوانید. اگر موبایل هدف شماست، برنامهنویسی اندروید چیست؟ را ببینید.
آموزشگاه فنی حرفهای آزاد آراهوش در درچه با مجوز رسمی سازمان آموزش فنی و حرفهای کشور فعالیت میکند و دورههایش همراه با گواهینامه رسمی فنی و حرفهای است. کلاسهای پایتون را میتوانید در دورههای آموزش کامپیوتر آراهوش ببینید، درباره آکادمی آراهوش بخوانید و برای رفتن به آموزشگاه آدرس آموزشگاه کامپیوتر آراهوش در اصفهان را باز کنید. مقالات دیگر ما در مقالات آموزشی آراهوش هستند.
- آدرس: اصفهان، درچه، خیابان آیتالله درچهای، قبل از کوچه ۶، آموزشگاه آراهوش
- تلفن: ۳۳۷۶۳۳۷۷
- موبایل: ۰۹۹۱۳۰۵۹۲۴۲
- تلگرام، اینستاگرام و ایتا: @arahoosh
برای اطلاع از زمان و هزینه دورهها با ما تماس بگیرید.
سؤالات متداول
چرا پیام خطای من با مقاله فرق دارد؟ پیامها بین نسخههای پایتون کمی فرق میکنند؛ ما مثالها را با پایتون ۳٫۱۲ اجرا کردیم. نوع خطا (مثلاً IndexError) معمولاً همان است و معنی پیام هم تغییری نمیکند.
فرق خطای نحوی و استثنا چیست؟ خطای نحوی یعنی کد درست نوشته نشده و پایتون اصلاً نمیتواند آن را بخواند. استثنا یعنی کد درست خوانده شد و وسط اجرا مشکلی پیش آمد، مثل تقسیم بر صفر.
باید همه خطاها را حفظ کنم؟ نه. مهم این است که بتوانید پیام را بخوانید، شماره خط را پیدا کنید و حدس بزنید کدام قسمت کار را خراب کرده است. باقی را با تمرین یاد میگیرید.
آیا try و except را همهجا بگذارم؟ نه. فقط جایی که میدانید ممکن است خطای مشخصی پیش بیاید و میتوانید کاری دربارهاش بکنید، مثل ورودی غلط کاربر. اگر همه خطاها را بیصدا بگیرید، پیدا کردن اشتباههای خودتان سخت میشود.
چرا ورودی فارسی گاهی کار میکند و گاهی نه؟ در آزمایش ما int("۱۵") درست کار کرد، اما نوشتن رقم فارسی مستقیم داخل کد (مثل x = ۵) خطای SyntaxError داد. پس ارقام فارسی را در کد ننویسید و فقط برای ورودی کاربر انتظار داشته باشید که تبدیل میشوند؛ سیستم شما را هم آزمایش کنید.
آیا ابزارهای هوش مصنوعی میتوانند خطا را حل کنند؟ میتوانند توضیح بدهند، اما اول خودتان پیام را بخوانید و بفهمید خطا در کدام خط است. بدون این مهارت نمیتوانید راهحل پیشنهادی را بسنجید.
در درچه برای یادگیری پایتون کجا بروم؟ آموزشگاه آراهوش در درچه کلاس پایتون دارد. از صفحه دورهها شروع کنید یا تماس بگیرید.
اگر در خطایی گیر کردم از کجا کمک بگیرم؟ پیام کامل خطا و چند خط کد اطراف آن را بنویسید و از مدرس یا یک آشنای برنامهنویس بپرسید. در درچه میتوانید برای ثبتنام و هماهنگی کلاس با آراهوش تماس بگیرید.
جمعبندی
بیشتر خطاهای مبتدیها در همین هشت دسته میگنجند: نوشتار غلط، تورفتگی، اسم اشتباه، نوع و مقدار ناسازگار، شماره یا کلید نامعتبر، و فایل گمشده. هر کدام پیام روشنی دارد که اگر از پایین و با دقت بخوانید، معمولاً شما را به همان خط میرساند. به یاد داشته باشید که خطا بخشی طبیعی از یادگیری است، نه نشانه ناتوانی. برای هماهنگی کلاس پایتون در درچه با آراهوش تماس بگیرید: ۳۳۷۶۳۳۷۷ یا ۰۹۹۱۳۰۵۹۲۴۲.
منابع
- مستندات رسمی پایتون: Errors and Exceptions: تفاوت خطای نحوی و استثنا، و ساختار try و except.
- مثالهای کد و پیامهای خطا در این مقاله را با پایتون ۳٫۱۲ خودمان اجرا کردهایم؛ نسخه شما ممکن است متن را کمی متفاوت نشان دهد.