Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on null in /var/www/tgoop/function.php on line 65
- Telegram Web
Telegram Web
گزارش تصویری کارگاه پرامپت نویسی انجمن کامپیوتر دانشگاه الزهرا
۱۰ و ۱۱ مهر ماه ۱۴۰۴
@pythopiachannel
🔥11🙏2👍1
جادوگر پر سرعت پایتون
AsyncIO


پایتون زبون قدرتمندیه ولی به خاطر قفل سراسری مفسر (GIL) تو سرعت‌های خیلی بالا محدود میشه.
اینجا GIL مثل یه بلیت VIP عمل می‌کنه: فقط یه نخ (thread) می‌تونه در هر لحظه اجرا بشه، حتی اگه CPU ی شما 16 هسته‌ای باشه.

حالا برای سریع‌تر شدن باید بدونیم کارمون CPU-bound هست یا I/O-bound.

کار های CPU-bound مثل پردازش تصویر یا تحلیل داده‌های سنگین نیاز به حساب و کتاب مداوم داره. اینجا باید از Multiprocessing استفاده کنیم چون هر پروسه مفسر خودش رو داره و روی هسته‌های مختلف به‌صورت موازی اجرا میشه، پس محدودیت GIL رو دور می‌زنیم.

عملیات I/O-bound مثل گرفتن داده از چند API یا کار با دیتابیس، بیشتر وقتش صرف انتظار میشه. اینجا AsyncIO بهترین انتخابه چون به جای منتظر موندن، پایتون سراغ کار بعدی میره و از زمان CPU نهایت استفاده می‌کنه.

نتیجه: برای کارهای محاسباتی از Multiprocessing و برای کارهای پر از انتظار مثل درخواست‌های شبکه‌ای از AsyncIO استفاده می‌کنیم.
92👍1
در اپلیکیشن های جنگو، DRF چیه و چرا همه ازش حرف می‌زنن؟

اگه با Django کار کردی، احتمالاً می‌دونی که خودش برای ساخت وب‌سایت‌ها عالیه.
مدل، ویو، تمپلیت، همه‌چی سر جاشه.

اما وقتی بخوای یه اپلیکیشن موبایل یا فرانت‌اند React/Vue به دیتای بک‌اندت وصل بشه چی؟

اینجاست که قهرمان وارد میشه :)

🦸‍♂️ Django REST Framework (یا همون DRF)

یه افزونه‌ی قوی روی جنگوئه که بهت کمک می‌کنه:

داده‌هات رو به‌صورت API برای بقیه منتشر کنی.

به زبان ساده، با DRF می‌تونی از پروژه‌ی Djangoت یه “سرویس داده” یا “backend برای بقیه اپ‌ها” بسازی.
یعنی به‌جای اینکه HTML برگردونی، JSON برمی‌گردونی 📦

《ساده، تمیز و استاندارد》

توی پست بعدی با یه مثال توضیحات کامل تری رو می‌بینیم
🔥8👍2👏1
🧩 یه مثال واقعی
فرض کن یه استارتاپ داری برای سفارش غذا 🍔

تیم فرانت‌اند داره با React وب می‌سازه

تیم موبایل داره با Flutter کار می‌کنه

هر دو تیم باید بتونن:

لیست رستوران‌ها رو بگیرن

سفارش جدید ثبت کنن

وضعیت سفارش رو چک کنن

تو نمی‌خوای براشون HTML بفرستی!
می‌خوای فقط داده بفرستی. مثلاً:

{
"restaurant": "BurgerLand",
"status": "ready",
"price": 180000
}

اینجا DRF مثل یه مترجم بین دیتابیس Django و دنیای JSON و APIها عمل می‌کنه.
API می‌سازه که همه‌جا بشه ازش استفاده کرد: موبایل، وب، حتی سیستم‌های دیگه.

🛠 چه کاربردهایی تو دنیای واقعی داره؟
🔹 اپلیکیشن‌های موبایل:
تقریباً هر اپ موبایل امروزی (مثلاً دیجی‌کالا، اسنپ، تپسی) برای دریافت داده از سرور از API استفاده می‌کنه که توسط DRF تولید میشه.

🔹 پنل‌های ادمین React/Vue:
وقتی بک‌اند Django و فرانت‌اند جدا هستن، DRF پل ارتباطی بینشونه.

🔹 سرویس‌های داخلی (microservices):
در پروژه‌های بزرگ، بخش‌های مختلف از طریق API با هم حرف می‌زنن، DRF استانداردی برای این ارتباطه.

🔹 اتصال با سرویس‌های خارجی:
مثلاً پرداخت آنلاین، نقشه، ارسال نوتیف، یا احراز هویت با گوگل.

🚀 چرا DRF محبوبه؟
ساده و پایتونی، بر پایه Django
🔒 امنیت بالا (Auth، Permissions، Throttling)
⚙️ ساخت خودکار Endpointها و Documentها
🧠 داشتن Serializerها برای تبدیل داده‌ها بین مدل و JSON
🪄دارای Browsable API (یه صفحه‌ی آماده برای تست API با مرورگر)


📌 اگر Django بلدی و می‌خوای وارد ساخت backend برای اپ‌ها و فرانت‌اندهای مدرن بشی،DRF اولین چیزیه که باید یاد بگیری.
13
🔔QUIZ TIME
کدام‌یک از گزینه‌ها یک view کلی در DRF است که متدهای GET/POST/PUT/DELETE را برای یک مجموعه مدیریت می‌کند و معمولاً همراه با Router استفاده می‌شود؟
Anonymous Quiz
30%
APIView
11%
GenericAPIView
37%
ViewSet/ModelViewSet
22%
Function-Based view
9🔥2
🔒🐍 چرا پایتون const ندارد؟

در پایتون، «متغیر» در واقع یک اسم است که به یک شیء وصل می‌شود. وقتی می‌نویسیم x = 2 یعنی «اسم x به شیء ۲ وصل شو».
اگر بعدا از آن بنویسیم x = 3، فقط اتصال اسم عوض می‌شود (rebinding).
ولی اگر بنویسیم lst.append(4)، خود شیء تغییر می‌کند (mutation).

حالا اگر پایتون const داشت، فقط جلوی تعویض اسم را می‌گرفت، نه تغییر محتوای شیء. یعنی هنوز می‌شد شیءهای قابل‌تغییر (مثل list یا dict) را تغییر داد، پس فایدهٔ زیادی نداشت.

در زبان های دیگر:
در بیشتر زبان‌ها مثل JavaScript، Java و C#، وقتی متغیری را با const یا readonly تعریف می‌کنیم، در واقع فقط نام آن متغیر قفل می‌شود؛ یعنی دیگر نمی‌توان آن را به شیء یا مقدار دیگری نسبت داد، اما خود شیء (اگر قابل‌تغییر باشد) همچنان می‌تواند دستکاری شود. در C و ++C این مفهوم کمی پیچیده‌تر است؛ چون const می‌تواند هم به اشاره‌گر (نام) و هم به داده اشاره کند و رفتار آن بستگی دارد به اینکه «کدام بخش» را ثابت کرده باشیم.



در پست بعدی راه های جایگزین مشخص کردن const بودن در پایتون رو بررسی میکنیم.
@pythopiachannel
9🔥3💯2
Pythopia
🔒🐍 چرا پایتون const ندارد؟ در پایتون، «متغیر» در واقع یک اسم است که به یک شیء وصل می‌شود. وقتی می‌نویسیم x = 2 یعنی «اسم x به شیء ۲ وصل شو». اگر بعدا از آن بنویسیم x = 3، فقط اتصال اسم عوض می‌شود (rebinding). ولی اگر بنویسیم lst.append(4)، خود شیء تغییر…
🔒🐍 راه‌های جایگزین برای «ثابت» (const) در پایتون

در پست قبلی دیدیم که پایتون به‌خاطر مدل
«اسم → شیء» و وجود mutation، نیازی به const به سبک زبان‌های دیگر نداره. اما چطور می‌تونیم در عمل «قصد ثابت بودن» رو نشون بدیم یا جلوی تغییر ناخواسته رو بگیریم؟

اینجا چند روش عملی و استاندارد رو بررسی می‌کنیم:


۱. استفاده از `NamedTuple` یا `dataclasses(frozen=True)`
برای ساختارهای داده‌ای غیرقابل‌تغییر (immutable):

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
x: int
y: int

p = Point(2, 3)
p.x = 5 # خطا! FrozenInstanceError


مزیت: کاملاً immutable، حتی فیلدها هم تغییر نمی‌کنن.


۲. ماژول `typing.Final` (برای تایپ‌چکرها)
نشون می‌ده که نباید مقدار عوض بشه (در زمان اجرا چک نمی‌شه، ولی mypy خطا می‌ده):

from typing import Final

API_KEY: Final = "abc123"
API_KEY = "new" # mypy: Cannot assign to final name


فقط در توسعه کمک می‌کنه، در runtime جلوی تغییر رو نمی‌گیره.


۳. قرارداد نام‌گذاری: حروف بزرگ
رایج‌ترین روش در جامعه پایتون:

MAX_RETRIES = 3
PI = 3.14159


همه می‌دونن که نباید تغییرش بدن.
ابزارهایی مثل pylint می‌تونن هشدار بدن اگر تغییر کنه.


۴. ماژول `types` + `SimpleNamespace` (اختیاری)
برای گروه‌بندی ثابت‌ها:
from types import SimpleNamespace

Config = SimpleNamespace(
DEBUG=False,
VERSION="1.0",
MAX_USERS=100
)


خوانا و مرتب تره، ولی همچنان قابل تغییره.


۵. استفاده از `Enum` برای مقادیر ثابت
وقتی چند مقدار ثابت و مرتبط داریم:

from enum import Enum

class Status(Enum):
PENDING = 1
SUCCESS = 2
FAILED = 3


مقادیر کاملاً ثابت و غیرقابل تغییر، با پشتیبانی تایپ.


۶. جلوگیری از mutation در لیست/دیکشنری با `tuple` یا `frozenset`
CONST_LIST = (1, 2, 3)        # tuple → immutable
CONST_SET = frozenset({1, 2}) # frozenset → immutable


نمی‌تونی .append() یا .add() کنی.


۷. ماژول سفارشی `const` (اختیاری، پیشرفته)
می‌تونی خودت بسازی:

class Const:
def __setattr__(self, name, value):
if hasattr(self, name):
raise AttributeError(f"Can't change const.{name}")
super().__setattr__(name, value)

const = Const()
const.PI = 3.14
# const.PI = 3 # خطا!


اگه تجربه ای از شبیه سازی const در پروژه هات داری کامنت کن ✍🏽

@pythopiachannel
7🔥3
🔥🐍 شما بگید، ما بهتون یاد می‌دیم!

محتوای پست های بعدی قراره از درخواست های شما باشه😌

هر موضوعی تو پایتون یا مفاهیم برنامه نویسی که دوست داری عمیق و کاربردی یاد بگیری، همین زیر کامنت کن:

یه ترفند خاص؟
یه ماژول ناشناخته؟
یه پروژه واقعی؟
حل یه باگ سخت؟
مفاهیم پیشرفته مثل metaclass، descriptor یا asyncio؟

با مثال کاربردی و فرمت دلخواه شما

اولین کامنت‌ها اولویت دارن! 🚀

@pythopiachannel
13
این هفته به جای کافه رفتن، پایتون یاد بگیر!

“کارگاه آموزشی پایتون”

📍سرفصل ها:
ساختارهای داده
دستورهای شرطی
حلقه
تابع
ساخت ماژول اختصاصی
کار با فایل

🎖️همراه با ارائه مدرک معتبر از دانشگاه الزهرا

پشتیبانی فوری در تلگرام( گروه اختصاصی + چت خصوصی)

📚دسترسی دائمی به جزوه‌ها و ویدئوی
جلسات

📆زمان برگزاری:
۱۳ و ۱۴ آذر ۱۴۰۴
ساعت ۱۰ الی۱۲

💰شهریه:
عموم دانشجویان: ۳۰۰ هزارتومان
دانشجویان دانشگاه های الزهرا و زنجان:۲۷۸ هزارتومان

شرکت برای عموم آزاد است.

👥ظرفیت: ۲۵ نفر

برای رزرو به آیدی زیر پیام دهید:
@pythopia

❅معاونت فرهنگی و اجتماعی دانشگاه الزهرا (س)❅
https://eitaa.com/farhangialzahraplans
7🔥3
چرا باید تست نوشتن بلد باشیم؟

تو برنامه‌نویسی، اینکه صرفا “کدت کار کنه” فقط نصف ماجراست. نصف مهم‌ترش اینه که همیشه و در هر شرایطی درست کار کنه؛ فارغ از اینکه چه متغیر هایی عوض بشن. دقیقاً همین‌جاست که تست‌نویسی نقش اصلی رو بازی می‌کنه.

چندتا دلیل خیلی ساده ولی مهم:

🔹زودتر می‌فهمی کجای کارت می‌لنگه.

🔹وقتی یه چیزی رو تغییر می‌دی، خیالت راحته که بقیه خراب نمیشه .

🔹تست‌ها مثل دفترچه‌ی راهنمای زنده‌ان؛ می‌گن هر بخش از کد دقیقاً چه انتظاری رو باید برآورده کنه.

تو کار تیمی هم عملاً جون همه رو نجات می‌دن؛ چون هر فرد مطمئنه با یه تغییر کوچیک پروژه رو خراب نمی‌کنه.

خلاصه اینکه: تست‌نویسی هم برای خودت خوبه، هم برای اعصابت، هم برای بقیه آدمای بی‌گناهی که قراره رو کد تو کار کنن 😃

توی پست بعدی با unittest در پایتون آشنا می‌شیم.

@pythopiachannel
11
تست‌نویسی مقدماتی با 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
چطوری یه حلقه‌ی بی‌نهایت داشته باشیم که اعداد رو یکی‌یکی بشماره بدون اینکه دستی یه متغیر 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 باشی.
6
2025/12/12 05:41:43
Back to Top
HTML Embed Code: