جنگولرن
3.81K subscribers
287 photos
74 videos
31 files
556 links
آموزش Django و بستگان
Download Telegram
Media is too big
VIEW IN TELEGRAM
شی گرایی چیست؟

بخشی از آپدیت جدید دوره فروشگاه اینترنتی با جنگو
✔️این قسمت مفهوم شی گرایی رو خیلی ساده توضیح دادم.
✔️اگه میخوای جنگو رو بهتر یاد بگیری لازمه شی گرایی بلد باشی.

هر انتقاد یا پیشنهادی به این قسمت دارید به @miladhzz پیام بدید.
تشکر
👍5👏1
Forwarded from Django Expert (Amir Motahari)
کلاس های انتزاعی پایه یا Abstract Base Classes در پایتون(در ۶ دقیقه)

زمان ویدیو اینقدر کم هست که لازم نباشه اینجا خلاصه شو بگم، برید ببینید :)

لینک ویدیو:
https://youtu.be/oD45P7RdqWs


@DjangoIR
〰️〰️〰️〰️〰️〰️
© @DjangoEx | @mthri_tips
🔥5👎2👍1
یادگیری شی و کلاس با Clash of Clans

در جلسه پنجاه و ششم از دوره رایگان زبان پایتون، به معرفی شی (object) و کلاس (class) با استفاده از بازی کلش آو کلنز پرداختیم.
مدرس: احمد احمدی

لینک آپارات:
https://www.aparat.com/v/4TwKO

لینک دوره در کامنت
👍53👏1
Forwarded from Pythonism
به جمع برخی از ویژگی‌های جذاب دیتابیس در پایتون خوش اومدین!!🤩

در زیر چند مثال طریقه استفاده از دیتابیس در پایتون رو براتون آوردم:

1. استفاده از SQLite با کتابخانه sqlite3:
python
import sqlite3

# ایجاد ارتباط با پایگاه داده SQLite
conn = sqlite3.connect('mydatabase.db')

# ایجاد یک cursor
cursor = conn.cursor()

# ایجاد جدول
cursor.execute('''CREATE TABLE employees
(id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL)''')

# افزودن رکوردها
cursor.execute("INSERT INTO employees (id, name, age) VALUES (1, 'John Doe', 30)")
cursor.execute("INSERT INTO employees (id, name, age) VALUES (2, 'Jane Doe', 25)")

# ذخیره تغییرات
conn.commit()

# دریافت و نمایش رکوردها
cursor.execute("SELECT * FROM employees")
rows = cursor.fetchall()
for row in rows:
print(row)

# بستن ارتباط
conn.close()


2. استفاده از MySQL با کتابخانه mysql-connector-python:
python
import mysql.connector

# ایجاد ارتباط با سرور MySQL
conn = mysql.connector.connect(
host='localhost',
user='username',
password='password',
database='mydatabase'
)

# ایجاد یک cursor
cursor = conn.cursor()

# افزودن رکوردها
cursor.execute("INSERT INTO employees (id, name, age) VALUES (1, 'John Doe', 30)")
cursor.execute("INSERT INTO employees (id, name, age) VALUES (2, 'Jane Doe', 25)")

# ذخیره تغییرات
conn.commit()

# دریافت و نمایش رکوردها
cursor.execute("SELECT * FROM employees")
rows = cursor.fetchall()
for row in rows:
print(row)

# بستن ارتباط
conn.close()


3. استفاده از MongoDB با کتابخانه pymongo:
python
from pymongo import MongoClient

# ایجاد ارتباط با سرور MongoDB
client = MongoClient('mongodb://localhost:27017/')

# انتخاب دیتابیس
db = client['mydatabase']

# انتخاب یک کلکشن (جدول)
collection = db['employees']

# افزودن رکوردها
collection.insert_one({"id": 1, "name": "John Doe", "age": 30})
collection.insert_one({"id": 2, "name": "Jane Doe", "age": 25})

# دریافت و نمایش رکوردها
documents = collection.find()
for document in documents:
print(document)

# بستن ارتباط
client.close()



#FXL
👍12🔥4
پستی با مسما از کانال Sadra
آدرس کانال https://t.me/lnxpylnxpy

یه جمله خیلی بامسما در کتاب Clean Code in Python هست که میگه:

Having maintainable software is not about anticipating future requirements (do not do futurology!)

ترجمه: داشتن یه نرم‌افزار قابل‌نگهداری به معنی پیش‌بینی نیازمندی‌های آینده نیست. (آینده‌پژوهی نکنید!)

اینجا "پیش‌بینی" به معنی تخصیص انرژی و زمان واسه ساخت یه بستر برای توسعه ساده‌تر در آینده با توجه به نیازمندی‌هایی هست که بعدها ممکنه بوجود بیان.

منظور اینه که بجای اینکه بیایم ذهنیت، معماری و دیزاین رو محدود به آینده کنیم، سعی کنیم نیازمندی‌های فعلی رو برطرف کنیم.

یه مثال کاربردی می‌زنم تا درک این قضیه ساده‌تر شه. فرض کنید شما یه Shop طراحی کردید و فقط یه متد پرداخت دارید و اونم PayPal هست. درحالی که دارید کلاس PayPal رو طراحی می‌کنید، این فکر به ذهنتون خطور می‌کنه که شاید بعدها متد پرداخت Stripe هم به سیستم اضافه شد. اونوقت من باید یه کلاس عین PayPal واسه Stripe درست کنم.. چرا از همین الان یه Base Class درست نکنم و PayPal و Stripe از اون بیس‌کلس ارثبری نکنن؟

موضوع اینه که هنوز نه به باره.. نه به داره.. استرایپ کو؟! داری عملا از دیزاین‌پترنی استفاده می‌کنی که اصلا نیازی بهش نداری. بله. درسته. این یه دیزاین OOP پرفکت هست و بهتره که همچین حرکتی رو بزنی ولی آیا الان؟!

اینجاست که Over-engineering کار دست آدم می‌ده. بنظرم این دو موضوع Overengineering و Overthinking در کنار هم میان. تمرکزتون رو بذارید روی نیازمندی‌های فعلی و سعی کنید سلوشن خوب برای الان بدید.. بعدا با تغییر نیازمندی‌ها، می‌تونید سراغ دیزاین‌پترن‌ها و متدلوژی‌ها و معماری‌های پیچیده‌تر هم برید!
🔥8👍2
از قدیم گفتن کد حرفه ای هارو نگاه کن

فروشگاه اوپن سورس Saleor که با جنگو نوشته شده، نمونه خوبی هست برای یادگیری
ازش میشه یاد گرفت چه اپ هایی داشته باشیم
ارث بری مدل ها چطوری باشه
مقادیر ثابت و Enum و... رو چطوری هندل کنیم
کد تخفیف، قیمت مختلف بر حسب ویژگی های متفاوت و خیلی نکات دیگه برای یادگیری داره
لینک (فورک شده):
https://github.com/miladhzz/saleor
👍18🔥4
Forwarded from Golem Course
دستیاران آموزشی‌ام در درس تحلیل و طراحی سیستم‌ها در این ترم زحمت زیادی کشیدند و مجموعه‌ای از ویدیوهای آموزشی را برای دانشجویان آماده کردند.
باور دارم این محتوا برای اعضای این کانال هم بسیار مفید است.

کارگاه کافکا (تهیه شده توسط محمدطه جهانی‌نژاد):

https://drive.google.com/file/d/1k3zZRXYdKaF7ew5-doyRzZ6Mp204j-Bb/view?usp=sharing

کارگاه داکر (تهیه شده توسط حسین سمیعی):

https://drive.google.com/drive/folders/16rwbD6hs_n-Gx2_rbHjDMre34ReenB7m?usp=sharing

کارگاه CI/CD (تهیه شده توسط محمدصادق مجیدی یزدی):

https://drive.google.com/drive/folders/1FczGY_qJ8LYSS9qJuiJk-0s-Oa46Ko_s?usp=sharing

کارگاه مانیتورینگ (تهیه شده توسط کمیل یحیی‌زاده):

https://drive.google.com/drive/folders/1eu8ftc6LfD5Xb6C_C-bny7BHQu3EXP9E?usp=sharing

@golemcourse
👍62🔥2👏1
در ویدیو جدید بابی در نقش یک آتش نشان فداکار به سراغ مبحث تست نویسی در مهندسی نرم افزار میره و راجع به Smoke Test (تست دود) صحبت میکنه. همچنین یک نمونه Smoke Test با استفاده از سلنیوم در پایتون روی وبسایت LeetCode پیاده سازی میکنیم.
🔥 تست دود نوعی تست نرم افزار هست که پس از انجام تغییرات در نرم افزار انجام میشود تا اطمینان حاصل شود که ویژگی های اصلی نرم افزار به درستی عمل میکنند.

🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/Mog3OaiSidE?si=Sgyo6udH4wQHWZNg

〰️〰️〰️〰️〰️〰️
@BobyDotCloud
2🔥1
سری مهندسی نرم‌افزار: پست 3
از لینکدین Saeed Shahrivari Joghan
لینک پست در کامنت

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

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

https://vrgl.ir/jl1SF
👍9
پست سوالی از لینکدین Hesam Attari در مورد مایکروسرویس (یا میکروسرویس)
کامنت های پستش رو بخونید. نکات خوبی داره. (لینک)

از مایکروسرویس چه میخواهید؟ چه مشکلی در پروژه یافته اید و یا چه مشکلی را در پروژه میخواهید حل کنید که به سراغ مایکروسرویس کردن می روید؟
برخی فکر می کنند چون پروژه بزرگ میشود باید سراغ مایکروسرویس کردن پروژه رفت. اصلن میدانید مثلا هنگام پابلیش کردن چه مسائلی ممکن است به وجود بیاید؟
حالا فرض کنیم مشکل را پیدا کردید چاره ای هم ندارید و میخواهید سراغ مایکروسرویس کردن بروید. چرا از همان اول api gateway میگذارید؟ با تمام مزایایش میدانید چه پیچیدگی هایی به وجود می آید؟
قریب به اتفاق پروژه ها فرآیندهای مهندسی نرم افزار ندارند یا کامل رعایت نمیکنند. همین مهندسی را در پروژه ها رعایت کنید بسیاری از مشکلات شما حل می شود. کافیست که r&d کنید. همین را در دانشگاه میتوانید تمرین کنید و یا نکردید هم می توانید موضوعات را جستجو کنید.
#softwareengineering
👍3
رشد ارگانیک کانال جنگولرن
امیدوارم که مطالب کانال برای دوستان مفید باشه 😊
البته گاهی اوقات پیش اومده که پستی رو فوروارد میکنم برای گروه django2
👍13🔥4
Forwarded from Microfrontend.ir
آموزش جامع داکر
** در این پلی لیست میخوام داکر رو از بیخ یاد بگیریم. یعنی قبل از داکر خودمون یه چیزی شبیه داکر اما خیلی ساده تر با پایتون بنویسم بعد بریم سراغ خود داکر که هم داکر رو یاد بگیریم و هم بدونیم پشت صحنه چه اتفاقاتی می افته!

در این ویدیو از آموزش جامع Docker به بررسی تاریخچه مجازی سازی و روش های مختلف آن پرداختیم. روش VM-Based برای مجازی سازی کامل یک ماشین و روش Container Based برای اجرای ایزوله فرایندها و پروسس ها مطرح کردیم. سپس مولفه های لازم برای ساخت کانتینر در سیستم عامل لینوکس را بررسی کردیم و در نهایت Docker و podman و rtk را به عنوان مهمترین Container runtime های حال حاضر معرفی کردیم و در نهایت مفهوم Container Orchestration و ضرورت آن را شرح دادیم.


Link: https://youtu.be/Z8olH4UzeA0

Playlsit: https://www.youtube.com/playlist?list=PLJ9zDGwhhsBzLTI3VNE8Vp4JpXNn_yRR7

〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
9👍3
Media is too big
VIEW IN TELEGRAM
ویدئوی معرفی تکنیک خم هیلبرت (Hilbert Curve) که Google Maps و Tinder برای مدل‌سازی موقعیت مکانی ازش استفاده می کنند.

مدرس: دکتر علیرضا آقامحمدی @golemcourse
کلاس درس تحلیل و طراحی سیستم‌ها
توی این لینک (ویدئوی کاملش) میتونید توضیحات چند تکنیک مهم دیگه رو هم ببینید که شرکت‌هایی مثل گوگل، تیندر، لیفت، اسنپ و تسپی ازشون استفاده می کنند:
-تکنیک Geohashing که شرکت‌هایی نظیر ‌Bing Maps و Lyft از آن استفاده می‌کنند.
-داده ساختار Quadtree که شرکت Yext آن را به کار می‌گیرد.
-خم هیلبرت (Hilbert Curve) که Google Maps و Tinder از آن بهره می‌برند.
🔥5
Forwarded from CodeCrafters (Mojtaba)
دستور GROUP BY در SQL

دستور GROUP BY در SQL برای گروه‌بندی رکوردها بر اساس مقادیر یک یا چند ستون استفاده می‌شود. با استفاده از این دستور می‌توانید رکوردها را بر اساس مقادیر مشترک در ستون‌های مورد نظر گروه‌بندی کرده و نتایج را بر اساس گروه‌ها تجمیع کنید.

ساختار دستور GROUP BY به صورت زیر است:

SELECT column1, column2, ..., aggregate_function(column)
FROM table
GROUP BY column1, column2, ...

در این دستور، شما ابتدا ستون‌هایی که می‌خواهید نتایج را بر اساس آن‌ها گروه‌بندی کنید، را در قسمت GROUP BY مشخص می‌کنید. سپس با استفاده از توابع تجمیعی مانند SUM، COUNT، AVG، MIN و MAX، می‌توانید مقادیر ستون‌های دیگر را برای هر گروه محاسبه کنید.

به عنوان مثال، فرض کنید یک جدول به نام "employees" داریم که شامل ستون‌های "name"، "department" و "salary" است. می‌خواهیم مجموع حقوق هر بخش را محاسبه کنیم. برای این کار از دستور GROUP BY استفاده می‌کنیم. دستور زیر نتیجه مورد نظر را به ما می‌دهد:

SELECT department, SUM(salary)
FROM employees
GROUP BY department

نتیجه این دستور شامل دو ستون "department" و "SUM(salary)" است. ستون "department" حاوی نام بخش‌ها است و ستون "SUM(salary)" حاوی مجموع حقوق برای هر بخش است.

مثال دیگر، می‌توانیم تعداد کارمندان هر بخش را محاسبه کنیم:

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department

همچنین، می‌توانیم میانگین حقوق کارمندان هر بخش را محاسبه کنیم:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
#SQL
@Code_Crafters
👍8
تکلیف پایتون | Arithmetic Operations
از احمد احمدی

یک ایمیل از محسن (برنامه‌ریز مالی) دریافت کردیم.
در این ایمیل از ما خواسته‌ شده تا یک‌سری محاسبات مالی را با استفاده از پایتون و اُپراتورهای ریاضیاتیش انجام دهیم. طبق متن ایمیلِ اِرسالی از محسن، قرار هست که موارد زیر را با استفاده از پایتون کُدنویسی کنیم:
✔️سودناخالصِ حاصل از فروش یک جفت کفش سیاه
✔️نسبت سودحاشیه ای از فروش یک جفت کفش سیاه
✔️قیمت موردنیاز برای رسیدن به سود حاشیه‌ای %60
✔️مقدار مالیات برای یک جفت کفش سیاه
✔️مقدار سرمایه نهایی که به آن میرسیم اگر سودناخالص حاصل از فروش 100 جفت کفش سیاه را سرمایه گذاری کنیم

لینک ویدئو

توی این ویدئو فقط سر سوال رو مطرح کرده
👍1🔥1
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
* تست رگرسیون چیست؟

بر خلاف اسم قلمبه‌ش خیلی چیز ساده‌ایه،
ما یسری تست داریم به اسم یونیت-تستینگ،
Unit Testing
که میایم واحدهای درون برنامه رو جدا جدا تست میکنیم، بخونید ماژولهای مختلفش رو...
یه تست یکپارچگی داریم،
Integrity Testing
که ببینیم آیا این واحدها در کنار هم به درستی کار میکنن،
و یه تست کلی
System Testing
داریم که معلومه چیه...
یه تست پذیرش هم داریم، که قبلا ازش حرف زدم:
توی مهندسی نرم‌افزار ما یک نوع آزمون نرم‌افزار داریم به اسم آزمون پذیرش
Acceptance Testing
هدفش اینه که تست کنه این نرم‌افزار مورد پذیرش کاربر هست یا نه.
این آزمون پذیرش خودش دو نوع داره :
1-آلفا تستینگ
2-بتا تستینگ
و....
▪️نسخه آلفا و نسخه بتا چیست؟
و همهٔ اون خزعبلات...
=+=+=+=+=+=+=+=+=+=+=+=+=+

پس شد چهارتا تست:
Unit Testing
Integrity Testing
System Testing
Acceptance Testing

تست رگرسیون میگه که:
اگر تغییری توی نرم‌افزار اعمال کردی باید 3 تا تست اول لیست رو دوباره انجام بدی:)
همین....

یعنی از اونجایی که تغییرات جدید نرم‌افزار ممکنه روی قسمتهای قبلی که قبلا تست شدن و درست بودن اثر بذارن، بایـــــد 3 تست اول رو دوباره انجام بدی....
مثال کوچیکش توی پروژه‌های من و شما میشه که مثلا من یه جایی کد دیتابیسم رو تغییر میدم، یهو یه ماژولی که مربوط بوده به لاگین از کار میفته... چون APIیی رو کال میکرده که ایشون متدی رو صدا میزده که الان اسمش عوض شده:)

حالا اینجا توی یه سیستم کلاس جهانی میبینین یارو با کلاه کابوییش میاد میگه دکتر تو بخاطر حمله خونریزی قلبی پیلود رو عوض کردی، قبول، اما من یونیت/رگرسیون تست میکنم که مطمئن بشیم این تغییر به چیزی آسیب نمیزنه...

واسه همینه که پـــــچ کردن یه باگ گاها تا 90 روز طول میکشه....
یهو نمیتونن ساختار کل پروژه رو به هم بریزن...!
و واسه همینه که باگ ریپورت کردن عـــــــــرف و اصول داره...
که توضیح میدم...
میدونم طولانی شده ولی اهمیتی نمیدم🙃
=+=+=+=+=+=+=+=+=+=+=+=+=+
راستش من یخورده شیطنت کردم (🫣) این اسم "رگرسیون" رو از قصد آوردم که بتونیم بعدا بهانه‌ای داشته باشیم که از "رگرسیون خطی" حرف بزنیم...

مفهومی ریاضیاتی که یکی از پایــــــه‌های اصلی یادگیری ماشین توی حوزه هوش مصنوعی هست...
خیلی چیز جذابیه... با یه لینیار رگرشن ساده، ماشین شما یاد میگیره چجوری تحلیل کنه و کلاس یه داده رو پیشبینی کنه...
میتونه از روی یه فاکتور از رفتار یه کاربر یه برازش بزنه روی نمودار و آینده رو پیشبینی کنه...
خیــــلی جذابه🫣💦...
واضحه که ازش در آینده حرف میزنیم(از اون قولها...)
🔥5👍2
جنگولرن
پیاده سازی Django Soft Delete از کانال @microfrontend_ir چندی پیش خبری منتشر شد که در توییتر حذف داده‌ها به درستی انجام نمی‌شود. واقعیت این است که در اغلب نرم‌افزارهای مدرن داده‌ها به صورت فیزیکی حذف نمی‌شوند و صرفا برچسپ حذف شده می‌گیرند. در این ویدیو…
مشکل soft delete برای relation ها

اگه این ویدئو رو از کانال @microfrontend_ir دیده باشید. تقریبا همه حالت هارو برای Soft delete هندل کرده.
برای اینکه حذف واقعی اتفاق نیافته، متد delete مدل رو override می کنیم و میگیم جای حذف، رکورد رو آپدیت کن و...

ولی وقتی با اکشن پیشفرض delete ع ادمین، یک یا چند رکورد رو حذف کنیم، حذف واقعی اتفاق می افته.
✔️که Hêmn از default_manager_name استفاده کرد و این مورد هم هندل کرد.
✔️البته داکیومنت جنگو گفته میتونید متد delete_queryset رو override کنید یا اکشن کاستوم خودتون رو بنویسید. (راه های رسیدن به خدا زیاده)

اما اگه ما relation داشته باشیم باید چکار کنیم؟ فرض کنید جدول Person رو داریم و جدول Address کلید خارجی از نوع CASCADE داره. در این صورت با Soft delete رکورد person حذف میشه اما address های متصل بهش حذف نمیشن.
✔️اولین راهکاری که به ذهن من میرسه استفاده از Signals هست.

به نظر شما best practice ع این مورد چیه؟

آپدیت:
💬پاسخ Hêmn به سوالم:
در اصطلاح orm به اینها میگن مدیرت ابجکت های orphan و پیاده سازی های مختلف داره، من ترجیحم استفاده از دسکریپتور خود مدله، مدلهای جنگو برای روابطشون یک ریلیتد منیجر دارن که همه روابطشون رو مدیریت میکنه. یعنی شما با استفاده از این ویژگی میتونم همه مدل های مرتبط رو پیدا کنید و لاجیک مدنظرتونو اعمال کنید. اینم بگم بعضی وقتها بد هم نیست کل منطق سافت دیلیت در سطح دیتابیس اتفاق بیافته
2🔥2
😁
😁27
این عکسی از کتاب Fluent Python ع که کلاس دیاگرام کالکشن پایتون رو نشون میده.

زیرش نوشته UML class diagram...
دوستانی که رشته شون نرم افزار هست با UML آشنا هستن.

ویکی پدیا فارسی میگه:
زبان مدل‌سازی یکپارچه (به انگلیسی: Unified Modeling Language) یا «یو ام‌ال»، یک زبان مدلسازی همه منظوره استاندارد در زمینه مهندسی نرم‌افزار است.

✔️چه استفاده هایی داره؟
برای مستند سازی روند تحلیل، حاصل تحلیل، روند طراحی و حاصل طراحی نرم افزار قابل استفاده است. البته فقط مخصوص نرم افزار نیست و رشته های دیگه هم استفاده میکنن. ویکی پدیای فارسی چسبوندش به نرم افزار 😂


✔️لازمه برنامه نویس جنگو یادش بگیره؟
برای پروژه هایی که مستندسازی تحلیل و... ندارن لازم نیست (احتمالا فریلنسرها نیازش نداشته باشن)
👍11
Forwarded from Python Hints
خواستم یکبار دیگه تأکید کنم روی
EAFP ( easier to ask forgiveness than permission )

که هم به خودم یادآوری کرده باشم هم باقی دوستان،
اصولاً توی دنیای واقعی هم همین هست مثال میزنم که جا بیوفته (چون متاسفانه خیلی کم رعایت میشه)

کودکی رو به خاطر بیارید، یک کاری می‌خواستی بکنی که با شک بالا می‌دونستی پدر و مادر اجازه نمی‌دهند.
وقتی می‌رفتی و اجازه می‌گرفتی، درجا نه می‌شنیدی حالا باید تمام جزئیات و ... رو توضیح میدادی تا همه‌ی نگرانی‌ها برطرف بشه
بعد شاید حتی ۱ همراه یا ... هم باهات می‌فرستادند و در اینصورت شما اجازه داشتی کاری که می‌خوای رو انجام بدی، لذتش ۲۰٪ می‌شد.

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

درس ایمنی : اگر ماهیتابه روغن روی گاز آتیش گرفت آب توش نریزید، فقط درش رو بذارید و شعله زیرش رو خاموش کنید 😁

۹۰٪ بچه‌ها اجازه انجام اینکار رو نداشتند، من اولین بار بدون اجازه رفتم اینکارو کردم جلو در خونه خودمون وقتی پدرم دید گفت نباید اینکارو می‌کردی و ...

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

EAFP
هم همین هست، وقتی نسبت بروز Exception خیلی کم هست چرا هر دفعه می‌خوای چک کنی که اجازه انجام اون محاسبه رو داری یا نه ؟!

این همه گفتم، که خواهش کنم این مورد رو توی کدهاتون بیشتر رعایت کنید.

پ.ن : یادم رفت پست‌های قبلی که EAFP رو توضیح دادم reply کنم ‌ولی این اولین مورد بود (سرچ کنید باقیش رو هم می‌تونید بخونید)

https://t.me/pyHints/59
👍71