خطاهای پایتون در واقع پیامهای سیستم برای هشدار دادن درباره بخشی از کد هستند که منطق یا نحو (Syntax) صحیحی ندارد.
رایجترین خطاها شامل SyntaxError (زمانی که قوانین نوشتن زبان پایتون را رعایت نکردهاید)،
TypeError (زمانی که عملیاتی را روی نوع داده اشتباه انجام میدهید) و ValueError (وقتی مقدار داده برای تابع معتبر نیست) هستند.
به عنوان مثال، اگر سعی کنید یک رشته (string) را با یک عدد (int) جمع کنید، با خطای TypeError روبرو میشوید:
# مثال: ایجاد خطای TypeError age = 25 message = "I am " + age + " years old" # خروجی: TypeError: can only concatenate str (not "int") to str
ماژول os در پایتون یک ابزار قدرتمند برای تعامل با سیستمعامل است و کارهای زیادی را میتوان با آن انجام داد.
مشکل: فرض کنید میخواهید لیست تمام فایلها و پوشههای موجود در یک دایرکتوری خاص را بدانید، یا شاید یک پوشه جدید بسازید و بعد به آن دایرکتوری تغییر مسیر دهید. انجام این کارها به صورت دستی و از طریق خط فرمان میتواند وقتگیر و مستعد خطا باشد، مخصوصاً اگر در حال نوشتن اسکریپتی باشید که باید این عملیات را به صورت خودکار انجام دهد.
راهحل: ماژول os این کار را برای شما آسان میکند. با استفاده از توابع این ماژول، میتوانید مستقیماً از درون کد پایتون خود با فایلها و پوشهها تعامل داشته باشید
import os # گرفتن لیست تمام فایلها و پوشهها در دایرکتوری فعلی print("محتویات دایرکتوری فعلی:", os.listdir('.')) # ساختن یک پوشه جدید (اگر وجود نداشته باشد) folder_name = "my_new_folder" if not os.path.exists(folder_name): os.makedirs(folder_name) print(f"پوشه '{folder_name}' ساخته شد.") # تغییر دایرکتوری کاری به پوشه جدید os.chdir(folder_name) print("دایرکتوری کاری فعلی:", os.getcwd()) # بازگشت به دایرکتوری قبلی (اختیاری) # os.chdir('..')
دستورات مهم
os.mkdir("dir/") os.makedirs("dir/dir2") os.rmdir("dir") os.path.exists("dir") os.path.getsize("dir") os.listdir(".")
*args و **kwargsمشکل: تابعی دارید که قرار است مجموع اعداد را حساب کند، اما نمیدانید کاربر ۲ عدد میدهد یا ۱۰۰ عدد! نوشتن توابع جداگانه برای هر تعداد ورودی غیرممکن است.
راهحل:
*args: به تابع اجازه میدهد هر تعداد ورودی (به صورت لیست) بپذیرد.
**kwargs: به تابع اجازه میدهد ورودیهای کلیدی (نامدار) را به صورت دیکشنری دریافت کند. با اینها، تابع شما در برابر تغییرات ورودیها بسیار منعطف میشود.
def get_sum(*args): cnt = 0 for i in args: cnt += i return cnt print(get_sum(1,2,3,4)) print(get_sum(1,2,3,4,5,6,7,8,9))
مشکل: میخواهید زمان اجرای چندین تابع مختلف را اندازهگیری کنید یا بررسی کنید آیا کاربر اجازه دسترسی به آن تابع را دارد یا نه. آیا باید داخل تکتک آنها کد تکراری بنویسید؟
راهحل: دکوراتورها مثل “بستهبندی هدیه” هستند. شما یک تابع خاص میسازید که دور توابع اصلی شما میپیچد و ویژگیهای جدیدی (مثل لاگگیری یا کنترل دسترسی) به آنها اضافه میکند، بدون اینکه کد اصلی تغییر کند.
import time def calculate_time(func): def inner(n): # wrapper function print("Function starts") start = time.time() result = func(n) end = time.time() print(f"Ends in {end - start}") return result return inner @calculate_time def sum_values(n): return sum(list(range(n))) @calculate_time def sum_sq_values(n): return sum([n**2 for n in list(range(n))])
مشکل: میخواهید دادههای بسیار بزرگی (مثلاً ۱ میلیون رکورد) را پردازش کنید. اگر همه آنها را یکباره در حافظه (RAM) بارگذاری کنید، کامپیوتر شما هنگ میکند!
راهحل: ژنراتورها به جای ساختن کل لیست در حافظه، دادهها را “تولید” میکنند. هر بار که نیاز دارید، فقط یکی از آنها را به شما میدهند. این کار باعث میشود برنامه شما با کمترین میزان حافظه، با دادههای حجیم کار کند.
def gen_num(n): for i in range(n): yield i my_gen = gen_num(10) # save generator function print(next(my_gen)) # call it print(next(my_gen)) print(next(my_gen))