Table of Contents
فهرست کلی خطاهای رایج
در این پیوست، روی خطاهایی تمرکز میکنیم که تقریبا همهٔ مبتدیها در پایتون با آنها برخورد میکنند و برای هرکدام، نمونهکد و راهحل پیشنهاد میکنیم. توضیح مفصل انواع خطا و try/except قبلا در فصل «خطاها و اشکالزدایی» آمده؛ اینجا بیشتر شبیه یک برگهٔ تقلب برای «اوه باز هم این خطا!» است.
در این فصل این دسته خطاها را میبینید:
- خطاهای نحوی (Syntax)
- خطاهای مربوط به نام و نوع (
NameError،TypeError،ValueError، …) - خطاهای ایندکس و کلید (
IndexError،KeyError) - خطاهای تقسیم و اعداد (
ZeroDivisionError) - خطاهای معمول در ورودی/خروجی و فایلها
- خطاهای رایج در شرطها و حلقهها
- خطاهای رایج در توابع
- چند توصیهٔ کوتاه برای پیدا کردن و رفع سریع خطا
در هر بخش، الگوی «پیام خطا → چرا رخ داده → چگونه درستش کنیم» را دنبال میکنیم.
۱. خطاهای نحوی (SyntaxError و IndentationError)
۱.۱ فراموشکردن دونقطه `:`
خیلی رایج در if, for, while, def, class و غیره.
if x > 10
print("بزرگتر از ۱۰")
پیام معمول: SyntaxError: invalid syntax
راهحل: در انتهای خط دستورهای بلوکی، : بگذارید:
if x > 10:
print("بزرگتر از ۱۰")
همین اشتباه در for, while, def, elif, else, try, except, class هم تکرار میشود.
۱.۲ مشکل تو رفتگی (IndentationError)
یکی از شایعترین خطاها:
if x > 10:
print("بزرگتر از ۱۰")پیامها:
IndentationError: expected an indented block- یا
IndentationError: unexpected indent
نکات و راهحل:
- بعد از
:باید کد تورفته (indent شده) باشد. - در یک فایل، یا فقط از اسپیس استفاده کنید یا فقط از تب؛ قاطیکردنشان مشکل میسازد.
- در اکثر IDEها میتوانید تنظیم کنید که تب به ۴ اسپیس تبدیل شود.
نسخهٔ درست:
if x > 10:
print("بزرگتر از ۱۰")۱.۳ پرانتز، براکت، یا کوتیشن بستهنشده
پرانتز یا براکت ناقص
numbers = [1, 2, 3, 4
print(numbers)
پیام معمول: SyntaxError: '[' was never closed یا شبیه آن.
راهحل: جفت (), [], {} را کامل بررسی کنید:
numbers = [1, 2, 3, 4]
print(numbers)رشتهٔ بستهنشده
text = "سلام دنیا
print(text)راهحل: کوتیشن شروع و پایان هر رشته را چک کنید:
text = "سلام دنیا"
print(text)۱.۴ استفادهٔ اشتباه از `=` و `==`
در شرطها، گاهی بهجای == از = استفاده میشود:
if x = 5:
print("x پنج است")
پیام: SyntaxError: invalid syntax
راهحل: در شرطها برای مقایسه از == استفاده کنید:
if x == 5:
print("x پنج است")
= فقط برای نسبتدادن مقدار به متغیر است.
۲. NameError – استفاده از متغیر تعریفنشده
پیام: NameError: name 'x' is not defined
نمونه:
print(total)
total = 10یا اشتباه تایپی:
total = 10
print(totla)چرا رخ میدهد؟
- از متغیری استفاده کردهاید که هنوز تعریف نشده.
- نام را اشتباه نوشتهاید.
- متغیر داخل تابع محلی بوده و بیرون تابع به آن دسترسی ندارید (محدودهٔ متغیرها).
راهحلها:
- ترتیب خطوط را چک کنید؛ اول تعریف، بعد استفاده:
total = 10
print(total)- املای نام را با دقت بررسی کنید.
- اگر تابع دارید، مطمئن شوید متغیری که بیرون از تابع میخواهید، یا
returnشده یا به شکل درستی سراسری است (برای جزئیات به فصل توابع و محدودهٔ متغیرها مراجعه کنید).
۳. TypeError – نوع داده نامناسب
۳.۱ جمعکردن عدد با رشته
پیام پایه: TypeError: can only concatenate str (not "int") to str
نمونه:
age = 20
print("سن شما: " + age)
چرا؟ در پایتون نمیتوانید مستقیم str و int را با + کنار هم بگذارید.
راهحلها:
- تبدیل عدد به رشته:
age = 20
print("سن شما: " + str(age))- یا استفاده از f-string:
age = 20
print(f"سن شما: {age}")۳.۲ فراخوانی چیزی که قابل فراخوانی نیست
پیام: TypeError: 'int' object is not callable یا مشابه.
نمونهٔ رایج:
x = 5
x()یا:
list = [1, 2, 3]
list()
چرا؟ فقط توابع (و بعضی اشیاء خاص) قابل «فراخوانی» با () هستند. int، list (شیء لیست، نه کلاس list) و … تابع نیستند.
راهحل:
- از
()فقط برای تابعها استفاده کنید. - نام متغیرها را طوری انتخاب نکنید که با نام توابع داخلی تداخل داشته باشند:
numbers = [1, 2, 3] # بهتر از استفاده از نام list
print(len(numbers))۴. ValueError – مقدار نامعتبر
رایجترین نمونه در تبدیل ورودی:
age = int(input("سن را وارد کنید: "))
اگر کاربر وارد کند: بیست → پیام:
ValueError: invalid literal for int() with base 10: 'بیست'
راهحلهای ساده:
- به کاربر توضیح بدهید که باید عدد وارد کند.
- قبل از تبدیل، ورودی را بررسی کنید (جزئیات بیشتر در فصل ورودی/خروجی و خطاها).
نمونهٔ کنترل خیلی ساده:
text = input("یک عدد وارد کنید: ")
if text.isdigit():
number = int(text)
print("عدد شما:", number)
else:
print("لطفاً فقط رقم وارد کنید.")۵. IndexError و KeyError
۵.۱ IndexError – دسترسی خارج از محدودهٔ لیست
پیام: IndexError: list index out of range
نمونه:
numbers = [10, 20, 30]
print(numbers[3])
لیست ۳ عنصر دارد؛ اندیس معتبر: 0, 1, 2. اندیس 3 وجود ندارد.
راهحلها:
- قبل از دسترسی، طول لیست را چک کنید:
idx = 3
if idx < len(numbers):
print(numbers[idx])
else:
print("اندیس نامعتبر است")- در حلقهها، از
for item in listیاfor i in range(len(list))استفاده کنید.
۵.۲ KeyError – کلید ناموجود در دیکشنری
پیام: KeyError: 'age'
نمونه:
person = {"name": "Ali"}
print(person["age"])راهحلهای رایج:
- اول چک کنید کلید وجود دارد:
if "age" in person:
print(person["age"])
else:
print("سن تعریف نشده است.")- یا از
getبا مقدار پیشفرض:
age = person.get("age", "نامشخص")
print(age)۶. ZeroDivisionError – تقسیم بر صفر
پیام: ZeroDivisionError: division by zero
نمونه:
x = 10
y = 0
print(x / y)راهحلهای معمول:
- قبل از تقسیم، مخرج را بررسی کنید:
if y != 0:
print(x / y)
else:
print("نمیتوان بر صفر تقسیم کرد.")- در برنامههای واقعی، ممکن است از
try/exceptبرای مدیریت این حالت استفاده کنید.
۷. خطاهای رایج در ورودی/خروجی و فایلها
۷.۱ FileNotFoundError – فایل پیدا نشد
پیام: FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
نمونه:
f = open("data.txt", "r")
content = f.read()
f.close()دلایل معمول:
- نام فایل یا پسوند را اشتباه نوشتهاید (
data.txtدرحالیکه فایلdata.csvاست). - مسیر فایل اشتباه است؛ فایل در پوشهٔ دیگری است.
- اسکریپت را از مکانی دیگر اجرا میکنید و مسیر نسبی تغییر کرده.
راهحلها:
- نام و مسیر فایل را دقیق چک کنید.
- مطمئن شوید فایل در همان پوشهای است که اسکریپت را اجرا میکنید یا از مسیر کامل (absolute path) استفاده کنید.
- از
withاستفاده کنید (برای مدیریت فایلها در فصل مربوط توضیح داده شده):
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()۷.۲ PermissionError – مجوز ندارید
پیام: PermissionError: [Errno 13] Permission denied: 'file.txt'
نمونههای رایج:
- تلاش برای نوشتن در فایلی که فقط خواندنی است.
- تلاش برای ایجاد فایل در پوشهای که مجوز نوشتن ندارید.
راهحل:
- مطمئن شوید در حالت مناسب باز میکنید (
"w","a","r"). - در سیستمعامل، مجوزهای فایل/پوشه را بررسی کنید.
- اگر نیاز به نوشتن دارید، جای مناسبتری برای ذخیره انتخاب کنید (مثلا پوشهٔ کاربر).
۸. خطاهای رایج در شرطها و حلقهها
۸.۱ حلقهٔ بینهایت ناخواسته
حلقهای که هیچوقت تمام نمیشود:
x = 0
while x < 5:
print(x)
# فراموش کردیم x را تغییر دهیم
برنامه تا ابد 0 چاپ میکند.
راهحل:
- مطمئن شوید متغیر شرط داخل حلقه تغییر میکند:
x = 0
while x < 5:
print(x)
x += 1- اگر برنامه گیر کرده است، معمولا میتوانید با
Ctrl + Cدر ترمینال آن را متوقف کنید.
۸.۲ اشتباه در مقایسهٔ رشتهها و حروف کوچک/بزرگ
نمونه:
answer = input("بله یا خیر؟ ")
if answer == "بله":
print("قبول شد")
اگر کاربر بله را با فاصله یا با حروف مختلف بنویسد، شرط برقرار نمیشود.
راهحلهای ساده:
- حذف فاصلهٔ اضافی و یکسانسازی حروف:
answer = input("بله یا خیر؟ ").strip().lower()
if answer == "بله":
print("قبول شد")- یا چند حالت مختلف را بررسی کنید.
۸.۳ استفادهٔ نادرست از عملگرهای منطقی
اشتباه رایج:
x = 5
if x == 1 or 2 or 3:
print("x در بین ۱، ۲، ۳ است")
این کد تقریبا همیشه True است و اشتباه است.
راهحلهای درست:
- استفاده از
in:
if x in [1, 2, 3]:
print("x در بین ۱، ۲، ۳ است")- یا نوشتن کامل شرطها (کمخواناتر):
if x == 1 or x == 2 or x == 3:
print("x در بین ۱، ۲، ۳ است")۹. خطاهای رایج در توابع
۹.۱ فراموشکردن `return`
نمونه:
def add(a, b):
c = a + b # فراموش کردیم return کنیم
result = add(2, 3)
print(result)
خروجی: None
چرا؟ وقتی تابع return نداشته باشد، بهطور پیشفرض None برمیگرداند.
راهحل:
def add(a, b):
c = a + b
return c
result = add(2, 3)
print(result)۹.۲ تعداد آرگومانهای اشتباه
پیامها:
TypeError: my_func() missing 1 required positional argument: 'x'TypeError: my_func() takes 2 positional arguments but 3 were given
نمونه:
def greet(name):
print("سلام", name)
greet() # آرگومان ندادیم
greet("علی", 2) # آرگومان اضافی دادیمراهحلها:
- تعریف تابع را چک کنید و به همان تعداد پارامتر، آرگومان بدهید.
- اگر بعضی پارامترها اختیاریاند، میتوانید مقدار پیشفرض بگذارید (جزئیات در فصل توابع):
def greet(name="دوست"):
print("سلام", name)
greet()
greet("علی")۱۰. چند نکته برای پیدا کردن و رفع سریع خطاها
در فصل «خطاها و اشکالزدایی» روشها بهتفصیل آمده؛ اینجا چند یادآوری عملی و کوتاه:
- از پیام خطا نترسید. متن خطا را تا آخر بخوانید؛ نوع خطا (
TypeError,NameError, …) معمولا مستقیما میگوید مشکل چه جنسی دارد. - به شمارهٔ خط دقت کنید. در پیام خطا معمولا نوشته میشود خط چندم مشکل داشته؛ از همانجا شروع کنید.
- به چند خط قبل و بعد نگاه کنید. گاهی خطا در خط بعدی ظاهر میشود ولی ریشه در خط قبل دارد (مثلا پرانتز بستهنشده).
- چاپ مقادیر (
print) را فراموش نکنید. اگر نمیدانید یک متغیر چه مقداری دارد، آن را چاپ کنید تا مطمئن شوید آنچه فکر میکنید هست یا نه. - کد را کوچک کنید. اگر برنامهٔ شما بزرگ است، بخشی که خطا میدهد را جدا کنید و در یک اسکریپت کوچک تست کنید. پیدا کردن خطا در کد کوچک آسانتر است.
- از IDE یا ویرایشگر خوب استفاده کنید. بسیاری از خطاهای نحوی (مثل فراموشکردن
:یا پرانتز) قبل از اجرا با رنگ یا علامت نشان داده میشوند. - برای خطاهای تکراری، الگو بشناسید. مثلا اگر چند بار
TypeErrorگرفتهاید که میگویدintوstrنمیشود با هم جمع شوند، بدانید هرجا+بین عدد و متن گذاشتهاید ممکن است همین خطا را ببینید.
این پیوست برای زمانی است که با یک پیام خطای «آشنا ولی اعصابخردکن» مواجه میشوید؛ میتوانید نوع خطا را در این لیست پیدا کنید و الگو و راهحل معمولش را ببینید.