Pythopia
549 subscribers
51 photos
8 videos
14 links
آموزش تخصصی برنامه‌نویسی و هوش مصنوعی
از مقدماتی تا پیشرفته | پروژه‌محور
همراه با پشتیبانی، تمرین عملی و مسیر شغلی

ارتباط با ادمین و ثبت‌نام در دوره: @pythopia

چنل یوتیوب:
https://youtube.com/@pythopiatutoring
Download Telegram
تست‌نویسی مقدماتی با unittest

پایتون خودش یه ابزار تست‌نویسی به اسم unittest داره، و خوبی‌ش اینه که برای شروع لازم نیست چیز خاصی بلد باشی.

یه مثال ساده:
import unittest

def add(a, b):
"""
این تابع دو مقدار رو با هم جمع می‌کنه، اما:
- اگر هر کدوم از ورودی‌ها str باشه → خطا بده (TypeError)
- اگر هر کدوم از ورودی‌ها None باشه → خطا بده
- فقط اعداد int یا float رو قبول کنه
"""
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("ورودی‌ها باید عدد باشن!")
if a is None or b is None:
raise ValueError("ورودی نمی‌تونه None باشه!")

return a + b


# ------------ تست‌ها --------------
class TestAddFunction(unittest.TestCase):

# تست‌های موفق (Happy Path)
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3),
5)

def test_add_float_numbers(self):
self.assertEqual(add(2.5, 3.7), 6.2)

def test_add_zero(self):
self.assertEqual(add(10, 0), 10)

# تست‌های خطادار (باید ارور بدن)
def test_add_string_raises_type_error(self):
with self.assertRaises(TypeError):
add("2", 3)

def test_add_none_raises_value_error(self):
with self.assertRaises(ValueError):
add(5, None)



if __name__ == '__main__':
unittest.main(verbosity=2)

کاری که اینجا کردیم:

• یه تابع جمع اعداد نوشتیم که تایپ رو چک میکنه
• یه کلاس تست ساختیم
•در ابتدا چند تا تست که پاس میشن و بعد چند تا تست با ارور های متفاوت گذاشتیم که مطمئن بشیم خروجی تابع درسته.
•با assertEqual چک کردیم که نتیجه دقیقاً همونیه که می‌خوایم

همین! خیلی از پروژه‌های بزرگ دنیا هم از همین ساختار ساده شروع شدن.

🤓چند تا نکته‌ی مهم که از همون اول باید جدی بگیری:

︎هر تست فقط یه چیز رو چک کنه.

︎اسم تست‌هاتو واضح انتخاب کن؛ که بعداً خودت هم بفهمی چی نوشتی.

︎تست‌هات وابسته به محیط و شانس و ساعت سیستم نباشن.

اگر سوالی داشتی تو کامنتا بپرس.

🔥منتظر کوئیز ویژه این بخش باشید.

@pythopiachannel
13
جعبه ابزار «بی‌نهایت» پایتون کدوم کتابخونه‌س؟

اگه از حلقه‌های for تو در تو خسته شدید و کداتون کُند شده، وقتشه با نجات دهنده‌تون آشنا بشید: ماژول itertools

🔧این ماژول شبیه یه آچار فرانسه برای کار با لیست‌ها، تکرارها و ترکیب‌های داده‌ایه. دیگه نیازی نیست ساعت‌ها کد بزنی تا چند تا حالت مختلف رو بچینی.

ماژول itertools برای حل مشکلات زیر طراحی شده است:

🎯سرعت و عملکرد: توابع داخلی این ماژول با کد C نوشته شده‌اند، به همین دلیل خیلی سریع‌تر و بهینه‌تر از حلقه‌های for تو در تو هستند که خودتون می‌نویسید.

مصرف بهینه حافظه (Lazy): این توابع به جای اینکه تمام نتایج ممکن را یک‌باره در حافظه RAM ذخیره کنند، نتایج رو به‌صورت تک به تک و در لحظه نیاز تولید می‌کنند. این یعنی حتی با داده‌های "بی‌نهایت" یا بسیار بزرگ هم می‌توانید بدون مشکل حافظه کار کنید.

🧰کد تمیز و هوشمند: یک خط کد با itertools جایگزین ده‌ها خط کد پیچیده می‌شود و خوانایی پروژه را به شدت بالا می‌بره.

در پست بعدی با پرکاربرد ترین توابع این کتابخونه آشنا می‌شیم.
9
اولین ابزار از جعبه‌ابزار بی‌نهایت: cycle

بعد از معرفی itertools، وقتشه یکی از پرکاربرد ترین ابزارهاشو ببینیم:
تابع cycle، هر چیزی بدی بهش، بی‌نهایت تکرارش می‌کنه.
و این تکرار می‌تونه برنامه‌ت رو هوشمند تر کنه

🎮 مثال :

فرض کن داری یک بازی ساده می‌سازی و می‌خوای دشمن‌ها یکی‌درمیون از سه مسیر مختلف وارد صفحه بشن:
from itertools import cycle

paths = cycle(["left", "center", "right"])

for _ in range(9):
print("Enemy spawned from:", next(paths))


خروجی:
left
center
right
left
center
right
left
center
right


با cycle منطق چرخشی رو بدون نیاز به شرط‌های تکراری یا مدیریت دستی اندیس‌ها پیاده می‌کنیم.
نه تنها یه الگوی بی‌نقص و قابل اتکا بهمون میده، بلکه یه چرخه‌ی پایدار می‌سازه که توی هر بار فراخوانی، عنصر بعدی رو دقیق و منظم تحویل می‌ده و کدت رو تمیز، خوانا و حرفه‌ای نگه می‌داره.

در پست بعدی، می‌ریم سراغ یکی دیگه از ابزارهای فوق‌العاده itertools.⌛️
4👏3
سلام وقت همگی بخیر 🌱 دوستانی که در کارگاه پایتون ۱۳ و ۱۴ آذر شرکت کرده‌اند، لینک کلاس برایشان ارسال شد. اگر کسی ثبت‌نام کرده اما لینک را دریافت نکرده، لطفاً به پشتیبانی پیام بدهد.
ممنون از همراهی شما 🙏
7
🔔QUIZ TIME
🔥1
چطوری یه حلقه‌ی بی‌نهایت داشته باشیم که اعداد رو یکی‌یکی بشماره بدون اینکه دستی یه متغیر i بسازیم و هر بار i += 1 کنیم؟

از itertools.count() استفاده کن😃

تابع count یه شمارشگر بی‌نهایت و lazy می‌ده که هر بار next بگیری، عدد بعدی رو تحویل می‌ده.

🎮 مثال واقعی:
فرض کن داری یه بازی می‌سازی و می‌خوای به هر موج از دشمن‌ها یه شماره بدی و همزمان سختی بازی و تعداد دشمن ها رو بر اساس شماره‌ی موج افزایش بدی:
from itertools import count

wave_number = count(start=1, step=1) # از 1 شروع کن، هر بار 1 اضافه کن

for _ in range(10): # فقط برای نمایش 10 موج اول
current_wave = next(wave_number)
enemy_speed = 2 + current_wave * 0.5
enemy_count = 5 + current_wave * 2
print(f"موج {current_wave}: سرعت = {enemy_speed}, تعداد دشمن = {enemy_count}")

خروجی:
موج 1: سرعت = 2.5, تعداد دشمن 7
موج 2: سرعت = 3.0, تعداد دشمن = 9
موج 3: سرعت = 3.5, تعداد دشمن = 11
موج 4: سرعت = 4.0, تعداد دشمن = 13


🥈نکته‌های نقره‌ای:

1️⃣می‌تونی start و step دلخواه بدی
[مثلاً count(10, -1) برای شمارش معکوس]

2️⃣مثل همه generator ها کاملاً lazy عه یعنی تا وقتی next نزنی هیچ عددی تولید نمی‌کنه و حافظه نمی‌خوره، همچنین می‌تونی با zip ترکیبش کنی تا یه حلقه‌ی محدود بسازی:

for i, enemy in zip(count(1), list_of_enemies):
print(f"دشمن {i}: {enemy}")


با count دیگه لازم نیست یه متغیر شمارشگر دستی بسازی و نگران فراموش کردن i += 1 باشی.
8
وقتی دیتا زیاده، چطوری جلوی کند شدن اجرای کد در پایتون رو بگیریم؟

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

اگر دنبال یک راه مدرن و کوتاهید، قطعا Numba بهترین گزینه است؛ Numba یک کامپایلر JIT (Just-In-Time) برای پایتونه که برنامه نویس های دیتا عاشقشن.

وظیفه‌اش اینه: کدهای عددی و توابع NumPy پایتون شما رو می‌گیره و با استفاده از موتور LLVM، مستقیماً به کد ماشین فوق سریع تبدیل می‌کنه که انگار با C++ نوشتید!

برای استفاده‌ش نیاز به یادگیری زبان جدید نداری، لازم نیست کل الگوریتمت رو عوض کنی یا از توزیع های پایین تر استفاده کنی و فقط کافیه بالای تابعت یک خط decorator اضافه کنی!




from numba import njit #وارد کردن کامپایلر

@njit #اعمال دکوریتور
def calc_heavy_duty():
s = 0
# فرض کنید اینجا ۱۰ میلیون عملیات دارید
for i in range(10_000_000):
s += i
return s

همین کار ساده باعث می‌شه که کدهای سنگین شما معمولاً ۲۰ تا ۱۰۰ برابر سریع‌تر اجرا بشن!

نظراتتون رو توی کامنت ها برامون بنویسید
🔥62👏1
چه فرمت پست آموزشی براتون جذاب تر و مفید تره؟
Anonymous Poll
55%
متن همراه نمونه کد
12%
ویس همراه نمونه کد
33%
ویدیو
6
Pythopia
متاکلاس در پایتون دقیقاً چیه؟
متاکلاس در پایتون

توی پایتون یه جمله معروف هست که می‌گه: Everything is an object (همه چیز یه آبجکته)
ولی خب اگه کلاسی مثل dict یه آبجکت باشه، پس خودش باید از روی یه «قالب» ساخته شده باشه دیگه، که اون قالب، اسمش متاکلاسه.


👶🏼به بیان ساده تر:
کلاس: قالبی برای ساختن «آبجکت» (مثل قالبِ شیرینی‌پزی).

متاکلاس: قالبی برای ساختنِ خودِ «کلاس» (مثل کارخونه‌ای که اون قالب‌های شیرینی‌پزی رو تولید می‌کنه!).


📍 متاکلاس پیش‌فرض پایتون چیه؟ همه کلاس‌هایی که ما می‌نویسیم، به‌صورت پیش‌فرض توسط type ساخته می‌شن.
بله، همون type که باهاش نوع متغیرها رو چک می‌کنی، خودش لیدرِ متاکلاس‌های پایتونه!

🚀 چرا باید از متاکلاس استفاده کنیم؟
متاکلاس‌ها بهت اجازه می‌دن موقع «تولد» یک کلاس، توی ساختارش دست ببری. مثلاً:

1⃣اجبار به رعایت استانداردهای خاص: مثلاً اگه کلاسی متد save نداشت، کلاً اجازه ساخته شدن بهش نده.

2⃣تغییر خودکار فیلدها: مثلاً تمام ویژگی‌های کلاس رو خودکار به حروف بزرگ تبدیل کن.

3⃣ثبت‌نام خودکار (Registration): کلاس رو به محض ساخته شدن، توی یه لیستِ مرکزی ثبت کن.

توی پست بعدی یه متاکلاس می‌سازیم🏗
5🔥1👏1
Pythopia
متاکلاس در پایتون توی پایتون یه جمله معروف هست که می‌گه: Everything is an object (همه چیز یه آبجکته) ولی خب اگه کلاسی مثل dict یه آبجکت باشه، پس خودش باید از روی یه «قالب» ساخته شده باشه دیگه، که اون قالب، اسمش متاکلاسه. 👶🏼به بیان ساده تر: کلاس: قالبی…
💡 یک مثال از متاکلاس در دنیای واقعی

تا حالا فکر کردی چطور وقتی توی جنگو می‌نویسی

name = models.CharField(...)


این فیلد ساده تبدیل به یک ستون در SQL می‌شه؟ اینجا در پشت صحنه، متاکلاسی به اسم ModelBase هست. اون کدِ تو رو قبل از اینکه اجرا بشه، به یک ساختارداده تبدیل می‌کنه که به SQL ترجمه بشه.

توی این پست می‌خوایم یک «ناظرِ کیفیت» بسازیم! فرض کن سرپرست یک تیم برنامه‌نویسی هستی و می‌خوای همه‌ی اعضای تیم رو مجبور کنی که استانداردها رو رعایت کنن. مثلاً هیچ کلاسی نباید بدون «توضیحات» (Docstring) رها بشه. به جای اینکه دستی چک کنی، یک متاکلاس می‌سازی که نقش ناظر رو بازی کنه:

class DocumentationRequiredMeta(type):
def init(cls, name, bases, attrs):
# چک می‌کنیم که آیا کلاس نوشته شده توضیح (Docstring) دارد یا خیر
if not cls.doc or len(cls.doc.strip()) < 10:
raise TypeError(
f" خطا در کلاس '{name}': نوشتن مستندات (Docstring) اجباری است!"
)
super().init(name, bases, attrs)

# --- حالا تست کنیم ---

class Order(metaclass=DocumentationRequiredMeta):
"""این کلاس برای مدیریت سفارشات آجیل یلدا طراحی شده است."""
pass
# بخاطر داشتن docstring تایید شد

class Task(metaclass=DocumentationRequiredMeta):
pass
# متوقف شد! پایتون اجازه نمی‌ده این کلاس به وجود بیاد.


این یعنی Automation در سطح معماری. تو دیگه نگران این نیستی که کسی استانداردها رو یادش بره؛ چون متاکلاس مثل یک فیلترِ هوشمند، اجازه نمی‌ده کدهای غیراستاندارد حتی متولد بشن!

⚠️ یک واقعیت مهم: حقیقتاً اغلب برنامه‌نویس‌ها توی کل دوران کاری‌شون شاید حتی یک بار هم نیاز به نوشتن متاکلاس پیدا نکنن. این ابزار مخصوص اون درصدِ خاصیه که نمی‌خوان فقط مصرف‌کننده باشن، بلکه می‌خوان فریم‌ورک بسازن، کتابخانه‌های سطح بالا طراحی کنن و زیرساخت‌های پیچیده رو مدیریت کنن.

🏗️ متاکلاس‌ها یعنی رفتن به لایه‌ای که تو دیگه صرفاً مصرف کننده نیستی، بلکه طراحِ قوانینِ بازی هستی، جایی که تو تعیین می‌کنی بقیه چطوری باید کد بزنن.
8
متد clean چطور نمی‌ذاره دیتابیسِت به فنا بره؟

تا حالا توجه کردی که دیتابیس‌ها ذاتا «کم‌عقل» اند؟ 🧠🤷🏻‍♀

دیتابیس شاید بفهمه قیمت نباید «متن» باشه، اما عقلش نمی‌رسه که «قیمت فروش نباید از قیمت خرید کمتر باشه!» اینجاست که لایه‌های اعتبارسنجی (مثل همین عکس) میان وسط:

🎨 ۱. لایه فرانت‌اند (Frontend): همون لایه که کاربر می‌بینه. هدفش فقط اینه که کاربر اذیت نشه (UX). مثلاً اگه فیلدی رو خالی گذاشت، همون‌جا قرمز بشه و نذاره دیتای الکی ارسال کنه.

📄 ۲. لایه فرم (Form/Serializer): اینجا چک می‌کنیم که دیتا «فرمتش» درسته یا نه؟ مثلاً ایمیل واقعاً فرمت ایمیل داره؟ یا تاریخ واقعاً تاریخه؟

🧠 ۳. لایه Model Clean (مغز متفکر): اصل جنس اینجاست! متد clean آخرین سنگر دفاعی شماست. اینجا جاییه که «منطق بیزینس» رو چک می‌کنیم. مثلاً: «آیا این کد تخفیف به این محصول خاص می‌خوره؟» در برنامه‌نویسی به این‌ها می‌گیم Invariants؛ یعنی قوانینی که اگه رعایت نشن، اون دیتا کلاً اعتبار نداره و نباید ذخیره بشه.

🔒 ۴. لایه دیتابیس: آخرین لایه محافظت فیزیکی. چک کردن چیزایی مثل تکراری نبودن (Unique) یا روابط بین جدول‌ها.

ادامه در پست بعد
8
Pythopia
متد clean چطور نمی‌ذاره دیتابیسِت به فنا بره؟ تا حالا توجه کردی که دیتابیس‌ها ذاتا «کم‌عقل» اند؟ 🧠🤷🏻‍♀ دیتابیس شاید بفهمه قیمت نباید «متن» باشه، اما عقلش نمی‌رسه که «قیمت فروش نباید از قیمت خرید کمتر باشه!» اینجاست که لایه‌های اعتبارسنجی (مثل همین عکس)…
🛒 سناریو: محافظِ سرمایه

فرض کن تو مسئول بخش فروش و تخفیف‌های یه فروشگاه آنلاین بزرگی و باید این مسئله که کد تخفیف به درستی و برای محصول مرتبط وارد شه رو کنترل کنی‌.

ممکنه ادمین موقع ساخت کد تخفیف، به هر دلیلی مقدارش رو خیلی زیاد وارد کنه مثلا جای 5 بزنه 50.
از طرفی مشتری ها هم به راحتی می‌تونن سواستفاده کنن.

تو نباید بذاری این اطلاعات خراب برسه به دیتابیس! باید یه فیلتر بذاری که قبل از ذخیره‌سازی نهایی، همه‌چی رو چک کنه.

اینجاست که متد clean نیاز می‌شه، این متد دقیقاً لایه محافظه تا جلوی خطاهای مالی و منطقی رو بگیره.

تصور کن یهو یه سفارش بزرگ میاد، اما حواست نیست و یهو یه کد تخفیف بزرگ می‌زنی که از قیمت اصلی هم بیشتره! 💸
دیتابیس ما که عقل نداره ببینه داری محصول رو "با ضرر" میدی، ولی متد clean مثل یه نگهبان وایمیسته و اجازه نمیده این اتفاق بیافته.

📍 بیا روش پیاده سازیشو ببینیم:

from django.core.exceptions import ValidationError
from django.db import models

class Order(models.Model):
# نام محصول
product_name = models.CharField(max_length=100)
# قیمت اصلی محصول
price = models.DecimalField(max_digits=10, decimal_places=2)
# تخفیفی که روش زدیم
discount = models.DecimalField(max_digits=10, decimal_places=2)

# متد clean: جایی که قانون‌های خودمون رو چک می‌کنیم

def clean(self):
super().clean()
errors = {}

# 🚫 قانون ۱: تخفیفی نده که از اصل پول بیشتر باشه
if self.discount > self.price:
errors['discount'] = "تخفیف از قیمت بیشتره، خطر ورشکستگی :)"

# 🚫 قانون ۲: سقف تخفیف
MAX_DISCOUNT_PERCENT = 0.25

if self.discount > (self.price * MAX_DISCOUNT_PERCENT):
errors['discount'] = چه خبره؟! تخفیف تا ۲۵% مجازه."

if errors:
# اگه گند زدیم، سریع دست نگه دار!
raise ValidationError(errors)


🔒چرا این قانون واجبه؟
۱. نجات از فاجعه: اگه یه ادمین گیج، یا یه مشتری کنجکاو بخواد عدد الکی وارد کنه، سیستم همین‌جا مچش رو می‌گیره.
2. سیاست‌های شرکت: اینجا می‌تونی بگی: "پیتزا رو ۳۰٪ تخفیف بده، ولی ساندویچ رو نهایتاً ۱۵٪."
3. دفتر حساب و کتاب: اگه دیتات درست نباشه، آخر ماه می‌فهمی الکی کلی جنس رو ضرر دادی.

💡 متد clean عین فیلتر تصفیه می‌مونه؛ نمی‌ذاره آشغال (دیتای غلط) بره داخل دیتابیس‌.

شما تو پروژه هاتون بدترین اشتباهی که یه کاربر یا خودتون سر وارد کردن دیتا داشتید چی بوده؟ برامون تعریف کنین 👇
7👏1
تو واقعاً پایتون رو بلدی؟ یا فقط داری کد کپی می‌کنی؟

اگه کدت کار می‌کنه ولی سریع نیست، اگه پروژه‌هات با بزرگ شدن می‌پاشه، پس هنوز یک لایه عمیق‌تر از پایتون رو جا انداختی.

این دوره، پایانِ مرحله "کدزن معمولی" و شروع "توسعه دهنده واقعی" شدنه.

دوره پروژه محور پایتون پیشرفته (Advanced Python) | ۲۰ ساعت فشرده

🔍 مباحث اصلی :
Python Internals، Generator، OOP & Design Patterns، Decorator، Profiling، Async/Await و Unit Test

⚠️ پیش‌نیاز:
حداقل ۲ ماه تجربه فعال با پایتون و آشنایی با سینتکس

خروجی نهایی دوره:

کد قابل اعتماد و توسعه‌پذیر

تسلط بر مفاهیم GIL، Memory Model و Design Patterns.

پروژه: ساخت Scalable Task Control Engine


پشتیبانی کامل آنلاین و پاسخ به سوالات

📜 ارائه مدرک رسمی از دانشگاه الزهرا


قیمت اصلی: ۱٫۷۹۰٫۰۰۰ تومان
🔥 تخفیف ویژه دانشجویی: ۹۸۰٫۰۰۰ تومان.

همراه ۱۰ درصد تخفیف ویژه برای ۳ نفر اول

ظرفیت: ۱۵ نفر
شرکت برای عموم آزاد است.

📩 برای دریافت سرفصل کامل و رزرو، به آیدی @pythopia پیام بدهید
5