به عیعای گفتم فلان فیچر ساده رو ایمپلمنت کن. کرد و گفتم تست کردی؟ گفت آره. تنبلی کردم گفتم بهش اعتماد کنم و بدون تست پوش کردم. بعد دیدم یکسری ارور می ده رو سرور. به عیعای می گم من این ارورها رو می بینم! مگه نگفتی تست کردی؟ چی جواب بده خوبه؟ گفت: آره اتفاقا منم که تست کردم همین ارورها رو می داد (:
🐍 آموزش کار با فایلها (File Handling) در پایتون !
📌 ۱. باز کردن فایل با open()
برای کار با فایلها از تابع "open()" استفاده میکنیم.
file = open("data.txt", "r")
در این مثال، فایل "data.txt" برای خواندن باز میشه.
🔹 ۲. حالتهای مختلف باز کردن فایل
- "r" :
خواندن اطلاعات فایل
- "w" :
نوشتن در فایل؛ محتوای قبلی رو پاک میکنه.
- "a" :
اضافه کردن اطلاعات به انتهای فایل
- "x" :
ساخت فایل جدید؛ اگر فایل از قبل وجود داشته باشه، خطا میده.
🔹 ۳. خواندن محتوای فایل با read()
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
متد "read()"
تمام محتوای فایل رو میخونه و نمایش میده.
استفاده از "with"
باعث میشه فایل بعد از پایان بلوک بهصورت خودکار بسته بشه.
🔹 ۴. نوشتن در فایل با write()
with open("data.txt", "w", encoding="utf-8") as file:
file.write("Hello Python!")
این کد عبارت "Hello Python!" رو داخل فایل مینویسه..
🔹 ۵. اضافه کردن متن به فایل
with open("data.txt", "a", encoding="utf-8") as file:
file.write("\nLearning Python")
در این حالت، متن جدید به انتهای فایل اضافه میشه و محتوای قبلی باقی میمونه.
🎯 تمرین امروز:
برنامهای بنویسید که:
۱. نام کاربر رو دریافت کنه.
۲. نام رو داخل فایلی به نام "users.txt" ذخیره کنه.
۳. در اجرای بعدی، نامهای جدید رو بدون پاک شدن نامهای قبلی به فایل اضافه کنه.
۴. در پایان، تمام نامهای ذخیرهشده رو بخونه و نمایش بده.
با استفاده از این دو دستور میتونیم خطاهای احتمالی رو مدیریت کنیم و اجازه ندیم برنامه بهصورت ناگهانی متوقف بشه.
try:
number = int(input("Enter a number: "))
print(number)
except ValueError:
print("Please enter a valid number!")
📌 این کد چطور کار میکنه؟
- "try":
کدی که ممکنه خطا ایجاد کنه.
- "except":
کدی که هنگام رخ دادن خطای مشخص اجرا میشه.
- "ValueError":
خطایی که مثلاً هنگام تبدیل یک متن نامعتبر به عدد رخ میده.
🔹 ۲. مدیریت تقسیم بر صفر
try:
a = int(input("Enter a: "))
b = int(input("Enter b: "))
print(a / b)
except ZeroDivisionError:
print("Cannot divide by zero!")
اگر کاربر برای "b" عدد صفر وارد کنه، بهجای متوقف شدن برنامه، پیام مناسب نمایش داده میشه.
🔹 ۳. استفاده از چند except
میتونیم خطاهای مختلف رو جداگانه مدیریت کنیم:
try:
a = int(input("Enter a: "))
b = int(input("Enter b: "))
print(a / b)
except ValueError:
print("Invalid number!")
except ZeroDivisionError:
print("Division by zero!")
🔸 ۴. دستور finally
بخش "finally" چه خطایی رخ بده و چه رخ نده، پس از پایان اجرای ساختار "try" اجرا میشه؛ حتی اگر خطا مدیریت شده باشه.
try:
print(10 / 2)
except ZeroDivisionError:
print("Error!")
finally:
print("Program finished.")
📌 خروجی:
5.0
Program finished.
🎯 تمرین شما:
برنامهای بنویسید که دو عدد از کاربر بگیره و حاصل تقسیم اونها رو نمایش بده.
اگر کاربر متن وارد کرد، پیام مناسب نمایش داده بشه و اگر عدد دوم صفر بود، برنامه خطای تقسیم بر صفر رو مدیریت کنه.
✏️RRT?
مخفف Rapidly-exploring Random Tree هستش به فارسی میشه "درختی که شاخه هاش تصادفی و تند رشد میکنن" .
درواقع یک الگوریتم برای مسیر یابی هستش ولی این الگوریتم زمانی استفاده میشه که روش های معمول کم بیارن .
مثلا یک بازوی رباتیک ۶ مفصل رو در نظر بگیرید (البته داخل ویدیو ۲ مفصل هستش) اگر این بازو بخواد با وجود موانع در یک نقطه خاص قرار بگیره باید زاویه هر ۶ مفصل درست باشه و این یعنی تعداد حالت های ممکن که باید تست بشن، یک دفعه میلیون ها برابر بزرگتر میشه .
اینجاست که RRT وارد عمل میشه .✅
🔰این الگوریتم بجای اینکه همه جا رو بگرده فقط همون جاهایی رو میگرده که احتمال داره راهی ازشون بیرون بیاد البته این باعث میشه بهترین مسیر لزوما انتخاب نشه ولی بلاخره راهی پیدا میشه.
🔬روش کارش چطوریه؟
از نقطه شروع یه درخت میسازه و هزاران بار یه تکرار ساده رو انجام میده :
یه نقطه تصادفی از فضای خالی برمیدار ، میگرده ببینه کدوم گره موجود درخت به اون نقطه نزدیک تره و از همون گره یه شاخه کوتاه و با اندازه مشخص به سمتش دراز میکنه ، اگر مسیر این شاخه به مانع نخورده باشه گره جدید رو به درخت اضافه میکنه و اگر به مانع خورده باشه همونجا ولش میکنه و از نقطه قبلی یه شاخه تازه امتحان میکنه. همین چرخه هزاران بار پشت سر هم و با شانس فضا رو پویا میکنه و درخت پیوسته از همهی طرف ها پهن میشه .
✨البته یه ترفند کوچیک هم توی کارشه، حدود ۵ درصد مواقع به جای نقطهی تصادفی مستقیم خود هدف رو نشونه میزنه تا الگوریتم توی مرحله آخر توی فضا سردرگم نمونه .
وقتی یکی از شاخه ها به اندازه کافی به هدف نزدیک شد مسیر رو از روی همون شاخه پیدا میکنه(از گره آخر شروع میکنه و مرحله به مرحله میره سراغ والدش تا به نقطه شروع برسه)
حالا ما مسیر رو داریم و اگر بخوایم بهینه ترش بکنیم از RRT* استفاده میکنیم تا اگر امکان کوتاه تر کردن مسیر وجود داشت این کار رو انجام بدیم
💠باید اضافه کنم این یکی از الگوریتم هایی هست که خودرو های خود ران یا بازو های هوشمند یا مسیر یاب ها و... ازش استفاده میکنن تا بفهمن باید از کدوم میسر حرکت کنن.