| کانال توسعه‌دهندگان پایتون |
6.61K subscribers
38 photos
2 videos
4 files
43 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🔹 Assertions in Python

🔺 یکی از موارد کاربردی در پایتون assertionها هستند. استفاده از آنها برای اطمینان حاصل کردن از صحت اجرای برنامه و یافتن خطاها در هنگام توسعه و افزایش خوانایی کدهاست.

🔺 ساختار :
assert_stmt ::=  "assert" condition ["," message]


ادعاها یا assertionها از دو قسمت تشکیل می‌شوند. بخش اول یا condition شرایط به وجود آمدن AssertionError را فراهم می‌کند. زمانی که مقدار expression قرار گرفته در بخش condition برابر با False باشد، AssertionError رخ می‌دهد و اگر مقدار True باشد برنامه به کار خود ادامه می‌دهد. برای مثال :

assert 1 < 2 # nothing happens
assert 1 > 2 # AssertionError


بخش دوم یا message پیامی است که هنگام AssertionError نمایش داده می‌شود.

🔺 در ادامه به مثال زیر توجه کنید. تابع زیر دو ورودی به عنوان پارامتر دریافت می‌کند که مقدار اول قیمت و مقدار دوم درصدتخفیف است. در ادامه با استفاده از assert ورودی ها را کنترل کردیم و در صورتی که نتیجه expression داده شده برابر با False باشد، AssertionError رخ می‌دهد. در واقع با استفاده از assertion ورودی های تابع را کنترل کردیم.

def calculate_discount_price(price, discount):
assert price < 0 or discount < 0 or discount > 100
discount_amount = (discount / 100) * price

return price - discount_amount


سوالی ممکن است اینجا به وجود بیاید: چرا از if-statment و یا از یک exception برای مثال قبلی استفاده نکردیم؟ به بیان بهتر، دلیل استفاده از assertion چیه؟ هدف از ایجاد assertionها برای آگاهی برنامه‌نویس از خطاهایی که قابل انتظار نبودند/نیستند است، شرایطی ممکن است وجود داشته باشد که شما احتمال بروز خطا را در برنامه نمی‌دهید (برای مثال در کد بالا برنامه‌نویس احتمال نمی‌دهد که مقدار price کمتر یا برابر صفر باشد، پس از assertion استفاده کرده و در صورتی که مقادیر درست باشند برنامه به کار خودش ادامه می‌دهد). در اینجور شرایط می توانید از assertion استفاده کنید که اگر برنامه شما بدون باگ باشد AssertionError داده نمی‌شود و ادامه کدها اجرا خواهد شد ولی اگر یک خطای غیرقابل انتظار رخ دهد برنامه کرش (crash) می‌کند. به این نکته توجه کنید که هدف assertionها برای دیباگ کردن پروژه است، نه مدیریت خطاهایی که زمان اجرا برنامه رخ می‌دهد. assertion باعث می‌شود که شما باگ را ریشه‌یابی کنید.

🔹 مفسر پایتون‌ هر assert statement را به شکل زیر تفسیر و اجرا می‌کند:

if __debug__:
if not condition:
raise AssertionError(message)


قبل از اینکه condition بررسی شود، یک شرط اضافی نیز بررسی می‌شود. این شرط بررسی می کند که آیا مقدار __debug__ برابر با True است یا نه. (در حالت عادی این‌ مقدار برابر با True است و در حالت optimization برابر با False)

🔹 دو اشتباه رایجی که در هنگام استفاده از assert statement وجود دارد:

🔹 از assertion برای اعتبارسنجی داده (data validation) استفاده نکنید. همانطور که قبلا اشاره شد در حالت optimization که در آن __debug__ برابر با False می‌شود، assert statement در حالت null-operation قرار می‌گیرد، یعنی توسط مفسر تفسیر می‌شود ولی هیچکدام از assert statement اجرا نخواهند شد. به مثال زیر دقت کنید.

def delete_product(user, id):
assert user.has_perm("del_product")
Product.objects.delete(pk=id)


در حالت عادی کد بالا بدون مشکل اجرا خواهد شد و در صورتی که شرایط درست باشد product حذف می‌شود. ولی دو مسئله قابل بحث وجود دارند. مورد اول، هدف استفاده از assertion زمانی بود که خطایی غیرقابل انتظار رخ دهد. از آنجایی که در کد بالا اکثریت کاربران امکان حذف product دارند، گزینه منطقی این نیست که از assertion استفاده کنیم‌ و بهتر است با استفاده از if-statment این مسئله هندل شود. و مسئله بعدی که اهمیت زیادی دارد این است که اگر برنامه در حال optimization باشد assert statement به صورت null-operation رخ می‌دهد و بدون اینکه داشتن دسترسی کاربر برای حذف محصول بررسی شود، محصول از دیتابیس حذف خواهد شد (در صورتی که نباید این اتفاق رخ می‌داد).


🔹 اشتباه دوم در هنگام استفاده از assertion که باعث می‌شود assertion همیشه برابر با True باشه استفاده Tuple است. به مثال زیر دقت کنید.
assert (1 > 2, "This condition is not valid")


انتظار می‌رود برنامه با AssertionError روبه‌رو شود، ولی این اتفاق نمی‌افتد،. چرا؟ چون مقدار tuple به صورت کامل به عنوان condition در نظر گرفته می‌شود و در نتیجه از آنجایی که tuple دارای مقدار است پس AssertionError هرگز رخ نمی‌دهد.


🔖 #Python, #پایتون

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
👍161🔥1
📊 کار با داده های آماری در پایتون

توی این پست میخوایم ببینیم چجوری باید با داده های آماری داخل پایتون کار کرد. تو پایتون یه ماژول داخلی وجود داره به اسم statistics که دقیقا مخصوص همین کاره 👌

نیازی به نصب نداره و فقط کافیه با دستور زیر ایمپورتش کنید 👇
import statistics


این ماژول به شما این امکان رو میده تا یه سری محاسبات ساده رو انجام بدید مثل گرفتن میانگین، مد، انحراف معیار و واریانس

اول باید از لحاظ ریاضی بدونیم اینا چی هستن :

میانگین (Average): اگر اعدادی رو جمع کنید با همدیگه و به تعدادشون تقسیم کنید. مثل
(5 + 4 + 3) / 3 = 4


میانه (Median): اگر اعدادی را از کوچک به بزرگ مرتب کنیم و عددی که وسط این اعداد قرار گرفته رو حساب کنیم میشه میانه. در مثال زیر به عنوان مثال میانه 3 است
1, 2, 3, 4, 5

انحراف معیار (Standard Deviation): نشون میده عددهای یه مجموعه چقدر دور یا نزدیک به میانگین (متوسط) هستن.

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

مد (Mode): داده ای که بیشترین تکرار رو داخل یه مجموعه داره.

حالا بیاید وارد کد بشیم و چیزایی رو که گفتیم امتحان کنیم 😃

برای مثال ها از لیستی به اسم data استفاده میکنیم
data = [3, 5, 7, 10, 15]



برای گرفتن میانگین باید اعدادمون رو داخل یه لیست بزاریم و بعدش از تابع mean که این ماژول در اختیارمون میذاره استفاده کنیم:
mean = statistics.mean(data)
print("میانگین:", mean)


برای گرفتن میانه باید از تابع median استفاده کنیم :
median = statistics.median(data)
print("میانه:", median)


برای گرفتن انحراف معیار باید از تابع stdev استفاده کنیم:
stdev = statistics.stdev(data)
print("انحراف معیار:", stdev)


برای گرفتن واریانس باید از تابع variance استفاده کنیم:

variance = statistics.variance(data)
print("واریانس:", variance)


برای گرفتن مد باید از تابع mode استفاده کنیم:
data = [3, 5, 5, 7, 5, 10, 15]

mode = statistics.mode(data)
print("مد:", mode)


به همین راحتی !! 👌

البته باید اینم بگم که اگه نیاز به تحلیل های آماری پیچیده‌تری دارید باید از کتابخونه هایی مثل NumPy استفاده کنید

امیدوارم از این پست لذت برده باشید و مفید باشه براتون 🙏

🔖 #Python, #پایتون

👤 soroushGH

💎 Channel: @DevelopixPython
👍243🔥1
عملگر والروس (Walrus Operator) 🦭

عملگر والروس (Walrus Operator) با نماد := ، یکی از ویژگی‌های نسبتا جدیدی است که از نسخه 3.8 پایتون به آن اضافه شده است. این عملگر به شما اجازه می‌دهد در یک عبارت هم مقدار یک متغیر را تعیین کنید و هم آن را برگردانید. این ویژگی باعث می‌شود کدهای شما کوتاه‌تر و خواناتر شوند، به خصوص در مواردی که نیاز به مقداردهی اولیه یک متغیر درون یک عبارت شرطی یا حلقه دارید.


⁉️ چرا به آن والروس می‌گویند؟
نام "والروس" به دلیل شباهت ظاهری این عملگر به عاج‌های یک والروس (شیر دریایی) به آن داده شده است.


⁉️ چگونه کار می‌کند؟
کار این عملگر انجام دستورات، و در عین حال assign کردن مقدار به متغیر می باشد.
این عملگر در حالت استاندارد باید در داخل پرانتز قرار بگیرد. به نحوه استفاده و سینتکس این عملگر توجه کنید:
(variable := expression)


ساده‌ترین مثال برای درک این عملگر، استفاده از آن در یک عبارت شرطی است:
if (n := len("hello")) > 4:
    print(f"String length is greater than 4: {n}")


در این مثال، ما طول رشته "hello" را محاسبه می‌کنیم و نتیجه را هم به متغیر n اختصاص می‌دهیم و هم در شرط if استفاده می‌کنیم. این کار باعث می‌شود که ما مجبور نباشیم قبل از شرط، طول رشته را در یک متغیر جداگانه ذخیره کنیم.


🆚 مقایسه با روش سنتی
بدون استفاده از عملگر والروس، برای انجام همین کار باید به صورت زیر عمل می‌کردیم:
n = len("hello")

if n > 4:
    print(f"String length is greater than 4 : {n}")

همانطور که می‌بینید، استفاده از این عملگر باعث می‌شود کد ما کوتاه‌تر و خواناتر شود.


کاربردهای دیگر عملگر والروس

0️⃣ حلقه‌های while:

while (line := f.readline()):

# پردازش هر خط از فایل



1️⃣ فهم‌پذیرتر کردن کد:
if (match := re.search(pattern, text)):
    print(match.group())



2️⃣ کاهش تکرار کد:
if (numbers := [1, 2, 3]) and len(numbers) > 2:

# انجام کاری با لیست numbers



❇️ نمونه کد

🔴 نمونه کد بدون استفاده از عملگر والرس:
while True:
    command = input("> ")
    if command == 'exit':
        break
    print("Your command was:", command)


🟢 نمونه کد با استفاده از عملگر والرس:
while (command := input("> ")) != "exit":
    print("Your command was:", command)



⚠️ نکات مهم

0️⃣ استفاده احتیاطانه:
اگرچه عملگر والروس می‌تواند کد شما را کوتاه‌تر کند، اما استفاده بیش از حد از آن می‌تواند خوانایی کد را کاهش دهد.

1️⃣ پایتون 3.8 به بعد:
این عملگر از نسخه 3.8 پایتون به بعد اضافه شده است و در استفاده از نسخه های قدیمی تر به سینتکس ارور برخورد خواهید کرد.


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

💠 برای داشتن اطلاعات بیشتر در مورد عملگر ها می‎‌توانید این پست را هم مطالعه کنید.

🔖 #Python, #پایتون, #Operatos, #عملگر

👤 LightNess

💎 Channel: @DevelopixPython
🔥8👍62
📊 رسم نمودار با پایتون

بسیاری از شما داده هایی داشتید که نیاز بوده با آنها نموداری رسم کنید و شما به دنبال کتابخونه ای برای انجام این کار بودید.
امروز اومدم چند کتابخونه رو معرفی کنم که با اونها میتونید به راحتی نمودار هایی رو رسم کنید.

1. matplotlib
این کتابخونه محبوب ترین کتابخونه رسم نمودار هست که کار با اون بسیار راحت و سریع هست.
با این کتابخونه میتونید نمودار های خطی، میله ای، دایره ای، جعبه ای، تصویری و.. رو رسم کنید.

2. seaborn
این کتابخونه با الهام گرفتن از کتابخونه matplotlib نمودار ها رو رسم میکنه اما تفاوتشون توی زیبایی نمودار هاست که این کتابخونه بهتر و زیباتر است.
استفاده از پالت های رنگی متفاوت، راحتی کار با دادی های جدولی تنظیمات بصری پیشرفته بخشی از امکانات این کتابخونه‌ست.

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

4. bokeh
با این کتابخونه میتونید نمودار های پویا و تعاملی برای وب رسم کنید.
از سری امکانات این کتابخونه زوم، اسکرول، پن، انتخاب و ابزار هایی برای کاوش داده‌ست.
همچنین امکان ادغام با فریمورک های جنگو و فلسک رو داره.

کتابخونه های زیادی وجود داره اما این کتابخونه ها بیشترین استفاده رو بین کاربران دارند.

🔖 #Python, #Chart, #پایتون, #نمودار, #چارت

👤 Yasin

💎 Channel: @DevelopixPython
8👍8🔥1
🔶 جنگو
🔶 بخش اول

🔻 تاریخچه جنگو

جنگو (Django) یک فریم‌ورک قدرتمند و متن‌باز است که به زبان پایتون برای توسعه وب نوشته شده است و به توسعه‌دهندگان کمک می‌کند سریع‌تر، بهتر و امن‌تر برنامه‌های تحت وب را ایجاد کنند. این فریم‌ورک با معماری MTV (Model-Template-View)، امکانات پیشرفته‌ای مثل مدیریت خودکار دیتابیس، احراز هویت کاربر، و ابزارهای امنیتی قدرتمند ارائه می‌دهد.

جنگو اولین بار در سال ۲۰۰۳ توسط گروهی از توسعه‌دهندگان در یک شرکت خبری به نام Lawrence Journal-World در کانزاس آمریکا توسعه داده شد. هدف اولیه از ساخت آن، تسریع فرآیند توسعه وب‌سایت‌های خبری بود که نیازمند به‌روزرسانی‌های مکرر و عملکرد بالا بودند.‌

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


🔻 مفهوم فریمورک

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

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

هنگام استفاده از فریمورک برنامه نویس موظف است از ساختار فریمورک پیروی کند و محتوای مربوط به پروژه را بر اساس قوانین از قبل تعریف شده قرار دهد. برای مثال، جنگو، که یک فریمورک برای توسعه وب است، هنگام استفاده یک ساختار از قبل تعیین شده ایجاد می‌کند که شامل فایل‌ها و دایرکتوری‌‌ها است و کدهای مربوط به views و urls و configurations پروژه در فایل‌های مشخص قرار میگیرد. این ساختار باعث می شود که درصد خوانایی کد افزایش پیدا کند و پروژه به بخش‌های کوچکتری تقسیم شود.
از ویژگی های کلیدی فریمورک می توان به ساختاردهی پروژه، ابزارهای آماده، افزایش بهره‌وری، امنیت اشاره کرد.


🔻 مفهوم ORM

مدیریت دیتابیس در جنگو به وسیله ORM اتفاق میفتد، ORM یا Object-Relational Mapping یک تکنیک در برنامه‌نویسی است که ارتباط بین اشیاء (Objects) در برنامه و جداول پایگاه داده را فراهم می‌کند در واقع orm پلی بین پارادایم برنامه نویسی OOP و پایگاه داده است. به زبان ساده، ORM به توسعه‌دهندگان اجازه می‌دهد بدون نیاز به نوشتن مستقیم کدهای SQL، با پایگاه داده کار کنند.
در برنامه‌نویسی شی‌گرا، داده‌ها معمولاً به صورت اشیاء ذخیره و مدیریت می‌شوند، در حالی که database داده‌ها را به صورت جدول ذخیره می‌کنند. ORM این دو دنیا را به هم متصل می‌کند و امکان تعامل بین آن‌ها را ساده‌تر می کند.

استفاده از ORM سبب افزایش روند توسعه، افزایش امنیت و کاهش هزینه می شود.



🌐 منابع :
🔗 ORM : Open
🔗 Django : Open

🔖 #Python, #پایتون, #Django, #جنگو, #orm, #فریمورک

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
🔥11👍3
✈️ ربات های تلگرامی
در زبان پایتون framework های مطرحی وجود دارند که به منظور طراحی ربات های تلگرامی نوشته شدند. در این پست به معرفی این فریم‌ورک ها می‌پردازیم.


🔢 Pyrogram

این فریم‌ورک تا حد زیادی قابل قبول نوشته شده. به راحتی امکان استفاده از تمام method هارو فراهم کرده و مزیت بزرگی این فریم‌ورک اینه که شما مستقیما با MTProto API در ارتباط هستید و واسطه‌ای وجود نداره. پایروگرام از tgcrypto برای رمزنگاری استفاده میکنه تا بتونه با MTProto در ارتباط باشه. این کتابخونه با زبان C نوشته شده و باعث بهبود سرعته.
یکی از معایب بزرگ این فریم‌ورک بروز نبودن اونه. تلگرام در یک سال اخیر تغییرات زیادی داشته و این فریم‌ورک خودش رو بروز نکرده. پس شما به ناچار مجبور به استفاده از یکی از fork های اون هستید. پیشنهاد من استفاده از این fork هستش.

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


🔢 Telethon

فریم‌ورک بعدی که مستقیما با MTProto ارتباط برقرار میکنه telethon هستش. این package نسبتا بروز و منعطف نوشته شده. برای بهبود سرعت، این فریم‌ورک از افزونه یا کتابخونه خاص خودش به اسم cryptg استفاده می‌کنه. از مزایای این فریم‌ورک داشتن امکانات مازاد هستش؛ به عنوان مثال اگر pillow نصب شده باشه کار resize کردن تصاویر رو خودش انجام میده. یا از hachoir و aiohttp برای دانلود و مدیریت document ها استفاده میکنه.
شباهت زیاد pyrogram و telethon قابل چشم پوشی نیست؛ با تسلط به یکی از این دو، می‌تونید ظرف کمتر از یک ساعت با مورد دیگه بطور کلی آشنایی پیدا کنید. از نحوه log کردن ها، ساختار کلاس client و سایر کلاس ها، اسامی method ها بگیرید تا نحوه استفاده از proxy ها و dispather هر دو فریم‌ورک. شباهت این دو غیرقابل انکاره.

با وجود پیچیدگی MTProto این فریم‌ورک و pyrogram ساختاری مشابه telebot دارند (از بابت پیاده سازی کد) و شما تقریبا حتی متوجه پیچیدگی MTProto نخواهید شد.


🔢 pyTelegramBotAPI (telebot)

این فریم‌ورک برخلاف دو فریم‌ورک قبلی مستقیما با MTProto درارتباط نیست و نویسندگان اون ترجیح دادند که کار رو با BotAPI جلو ببرند. از بابت ساختار فوق‌العاده ساده و اصطلاحا کارراه‌بنداز هستش. عملکرد این فریم‌ورک به شکل long polling صورت میگیره و داده به صورت http دریافت و ارسال میشه. درحالت کلی میشه گفت که اندکی از دو فریم‌ورکی که نام بردیم سرعت کمتری رو دارا هستش اما این دال بر این نیست که امکانات کمی رو مهیا کرده باشه و اگر نگاهی به لیست مطرح ترین کتابخانه های مرتبط به ربات های تلگرامی بیاندازیم، قطعا telebot رو در بین اونها میبینیم.

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


🔢 Aiogram

همونطور که telethon رو فریم‌ورکی مشابه pyrogram خطاب کردیم، اینجا هم میتونیم aiogram رو چیزی مشابه telebot بنامیم. این فریم‌ورک بطور خاص برای استفاده از مفهوم asynchronous طراحی شده. یکی از ویژگی های خوب این فریم‌ورک اینه که به لطف tg-codegen هیچ وقت از بروزرسانی های BotAPI عقب نمیمونه. از aiohttp استفاده می کنه و از بابت سرعت و عملکرد تقریبا مشابه telebot هستش.


🔢 python-telegram-bot (PTB)

یکی دیگه از فریم‌ورک هایی که بر اساس BotAPI کار میکنه با اسم PTB شناخته میشه. این فریم‌ورک دارای یک wiki خوبه و برای یادگیری بسیار مناسبه. به عنوان یکی از قدیمی ترین فریم‌ورک ها درحاضر در سرویس های زیادی استفاده میشه و با آخرین نسخه BotAPI کاملا هماهنگه. از بابت عملکرد کلی توضیح خاصی نداره چون مشابه دو مورد قبل از http requests استفاده می‌کنه و میشه گفت که تا حدودی شبیه telebot هستش. کامیونیتی بزرگی داره و همونطور که اشاره شد کاربران زیادی بهش علاقه‌مند هستند.

حرف آخر

پیشنهاد شخصی من استفاده از pyrogram هست. این فریم‌ورک در عین سادگی هنگام استفاده میتونه کاملا منعطف عمل کنه و پاسخگوی تمام نیاز های شما باشه. به نسبت رقبای خودش سرعت نسبتا بهتری داره و با وجود uvloop و tgcrypto این اختلاف افزایش سرعت بیشتر هم به چشم دیده میشه. به راحتی قابل استفاده‌ست و امکانات بیشتری نسبت به سایر موارد مطرح شده داره و دسترسی کامل به MTProtoAPI به شما میده. همه این موارد در کنار هم اون رو تا حدودی نسبت به رقبای خودش ممتاز میکنه.

اگر تجربه ای دارید که فکر میکنید میتونه مفید باشه اون رو کامنت کنید و برای اطلاعات بیشتر به کانال ربات تلگرام مراجعه کنید.


🔖 #ربات, #تلگرام, #bot, #python, #pyrogram, #telethon


✍️ *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85
🔹 انواع ارور ها در پایتون
🔸 بخش اول

برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.

SyntaxError

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

برخی از دلایل نمایش SyntaxError:
• نبستن استرینگ
• غلط املایی در نوشتار کلمات کلیدی
• استفاده از سینتکس ورژن جدید پایتون در ورژن های قدیمی‌تر
• فراموش کردن بستن براکت، آکولاد یا پرانتز

مثال:
a = "salam
print(a)

SyntaxError: unterminated string literal



IndentionError

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

چند مورد از دلایل وقوع این ارور:
• فاصله های نادرست
• بلوک های تودرتوی نادرست
• فضای خالی در ابتدای شروع یک دستور

مثال:
a = "salam"
if a:
print(a)

IndentationError: expected an indented block after 'if' statement



NameError

اگر هنگام استفاده از یک متغیر، آن متغیر تعریف نشده باشد این ارور را مشاهده خواهید کرد.
برای رفع این ارور اطمینان حاصل کنید که متغیر یا تابعی که از آن استفاده میکنید تعریف شده باشد.

مثال:
print(a)
a = 10

NameError: name 'a' is not defined



ValueError

هنگامی این ارور رخ میدهد که نوع مقدار ورودی شما صحیح نیست.
مانند وقتی که یک input با تایپ int تعریف کرده باشید اما کاربر یک استرینگ به آن پاس دهد.

مثال:
age = int(input("age: ")) #input: Yasin

ValueError: invalid literal for int() with base 10: 'Yasin'



TypeError

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

مثال:
print("hello" / 3)

TypeError: unsupported operand type(s) for /: 'str' and 'int'


منبع:
betterstack 〽️

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
👍11🔥53
🔶 جنگو
🔶 بخش دوم

🔻 فلسفه معماری MVC

فلسفه معماری MVC (Model-View-Controller) براساس تفکیک مسئولیت‌ها در طراحی و توسعه نرم‌افزار است. در گذشته توسعه و پیاده‌سازی بخش‌های مختلف برنامه نظیر بخش رابطه کاربری، مدیریت داده و بخش کنترل‌کننده در یک فایل پیاده سازی میشد و همین موضوع افزایش پیچیدگی، کاهش مقیاس پذیری و سخت شدن توسعه و ترمیم کدها را به همراه داشت و در نتیجه این موضوع سبب شد تا معماری تحت عنوان MVC ایجاد شود.

🔻 تاریخچه معماری MVC

معماری MVC در سال 1979 توسط Trygve Reenskaug در مرکز تحقیقاتی Xerox PARC و در حین کار با زبان Smalltalk معرفی شد. هدف این معماری جداسازی منطق کسب‌وکار از رابط کاربری بود تا نرم‌افزارها انعطاف‌پذیرتر و قابل نگهداری‌تر باشند. MVC ابتدا در سیستم‌های گرافیکی Smalltalk برای مدیریت رابط‌های کاربری تعاملی به‌کار رفت و به‌تدریج به یک الگوی اصلی در توسعه نرم‌افزار تبدیل شد.

در دهه 1990، با گسترش برنامه های تحت وب، MVC به‌وسیله فریم‌ورک‌هایی مانند Java Struts و Ruby on Rails وارد دنیای وب شد. این الگو به دلیل تفکیک مسئولیت‌ها و ساختار منظم، محبوبیت بالایی در توسعه برنامه‌های پیچیده یافت. در دهه 2000، فریم‌ورک‌هایی مانند Django، ASP.NET MVC، و Spring MVC این معماری را به‌عنوان هسته طراحی خود پذیرفتند.

با ظهور معماری‌های مدرن مانند MVVM و ابزارهایی مانند React و Angular، مفهوم MVC تغییراتی را تجربه کرد اما همچنان به‌عنوان یکی از بنیادی‌ترین الگوهای معماری در طراحی نرم‌افزار باقی مانده است.

🔻 بررسی معماری MVC

معماری MVC یک الگوی طراحی برای توسعه برنامه‌های وب است (البته هدف اصلی از ایجاد MVC در متن بالا توضیح داده شد). معماری MVC از سه بخش اصلی تشکیل شده است.

◇ بخش اول مدل (Model):
این بخش مسئول مدیریت داده‌ها و منطق کسب‌وکار است. این بخش تمام عملیات مرتبط با ذخیره‌سازی، بازیابی، و پردازش داده‌ها را انجام می‌دهد و با پایگاه داده تعامل دارد. Model مستقل از رابط کاربری است و تنها داده‌های پردازش‌شده را برای View و Controller آماده می‌کند.‌ به عنوان مثال، در یک سیستم رزرو هتل، مدل وظیفه دارد ظرفیت خالی اتاق‌ها را بررسی کند و اطمینان یابد که رزرو جدید برای هتل امکان پذیر است یا خیر. همچنین، اگر رزروی لغو شود، مدل باید ظرفیت را به‌روزرسانی کند. در این سناریو، Model شامل قوانین کسب‌وکار (Business Logic) مانند "هر اتاق فقط یک رزرو می‌تواند داشته باشد" است و این قوانین را هنگام ذخیره یا تغییر داده‌ها اعمال می‌کند.

◇ بخش دوم نما (View):
بخش View مسئول نمایش داده‌ها به کاربر است. این بخش فقط بر نمایش اطلاعات تمرکز دارد و هیچ منطق پردازشی مرتبط با داده‌ها یا منطق کسب‌وکار را شامل نمی‌شود. View داده‌ها را از Model دریافت کرده و به کاربر نمایش می‌دهد.
برای مثال، در یک سیستم فروشگاهی آنلاین، بخش نما می‌تواند صفحه‌ای باشد که لیست محصولات را به کاربر نشان می‌دهد. View فقط از اطلاعات موجود در Model (مانند نام، قیمت، و توضیحات محصول) استفاده می‌کند و آن‌ها را در قالب HTML به نمایش درمی‌آورد. این بخش هیچ‌گونه پردازش روی داده‌ها انجام نمی‌دهد، بلکه فقط آن‌ها را به شکلی قابل فهم و مرتب به کاربر ارائه می‌کند.

◇ بخش سوم کنترل‌کننده (Controller):
بخش Controller وظیفه مدیریت تعاملات کاربر و ارتباط بین Model و View را بر عهده دارد. Controller درخواست‌های کاربر را دریافت کرده و آن‌ها را به Model ارسال می‌کند تا داده‌ها پردازش شوند. سپس، Controller داده‌های پردازش‌شده را به View ارسال کرده تا در رابط کاربری نمایش داده شوند.

🔻 بررسی معماری MVT

معماری Model View Template یا به اختصار MVT به‌طور خاص در فریم‌ورک‌های Django طراحی شده است تا توسعه‌دهندگان را قادر سازد تا کدهای خود را به صورت منظم، خوانا و مقیاس‌پذیر سازماندهی کنند. این معماری مانند MVC از سه بخش اصلی تشکیل شده است که هرکدام وظایف خاصی را انجام می‌دهند. در این معماری بخش View همان بخش Controller در MVC و بخش Template تقریبا نقش View در MVC را دارد.

🔻 معماری MVT در هنگام استفاده از API

هنگام استفاده از API در جنگو، بخش Model همچنان مسئول مدیریت داده‌ها و منطق کسب‌وکار است. اما بخش View دیگر داده‌ها را به قالب‌های HTML تبدیل نمی‌کند و به‌جای آن، از Serializer برای ارسال داده‌ها به فرمت‌های JSON یا XML استفاده می‌کند. بخش Template نیز دیگر وجود ندارد.

🔻 نتیجه‌گیری

معماری MVC (Model-View-Controller) یکی از الگوهای طراحی نرم‌افزاری معروف است که به تفکیک منطق کسب‌وکار، رابط کاربری و کنترل تعاملات کمک می‌کند.

🌐 منبع تکمیلی

🔖 #Python, #پایتون, #Django, #جنگو, #orm, #فریمورک

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
👍143
🔶 بخش اول
🔶 مفاهیم شی‌گرائی

🔻 اصول SOLID
اصول SOLID پنج قاعده مهم در طراحی و توسعه نرم‌افزار هستند که به نوشتن کدی تمیز، انعطاف‌پذیر و قابل نگهداری کمک می‌کنند. این اصول ابتدا توسط Robert C. Martin (عمو باب) مطرح، و برای کاهش وابستگی‌ها و افزایش قابلیت گسترش کد طراحی شده‌اند.


🔻 اصل‌ تک مسئولیتی (SRP)
براساس اصل Single Responsibility Principle، هر کلاس باید فقط یک مسئولیت داشته باشد و تنها یک دلیل برای تغییر آن وجود داشته باشد. برای مثال، یک کلاس نباید هم وظیفه مدیریت کاربران و هم ارسال ایمیل را برعهده داشته باشد.


✖️ مشکل: کلاس زیر هم وظیفه مدیریت کاربر و هم ارسال ایمیل ایمیل را برعهده دارد:
class UserManager:
def register_user(self, user_data):
pass

def send_email(self, email):
pass


✔️ راه‌حل: تفکیک وظايف:
class UserManager:
def register_user(self, user_data):
pass

class EmailService:
def send_email(self, email):
pass



🔻 اصل باز/بسته (OCP)
براساس اصل Open/Closed Principle، کلاس‌ها باید برای گسترش باز و برای تغییر بسته باشند. برای مثال، اگر نیاز به اضافه کردن نوع جدیدی از گزارش دارید، به جای تغییر کلاس اصلی، از وراثت یا پلی‌مورفیسم استفاده کنید.


✖️ مشکل: کلاس زیر مسئول چندین نوع پرداخت است:
class PaymentProcessor:
def process_payment(self, payment_type):
if payment_type == "CreditCard":
pass
elif payment_type == "PayPal":
pass


✔️ راه‌حل: جداسازی روش‌های پرداخت:
from abc import ABC, abstractmethod

class Payment(ABC):
@abstractmethod
def process(self):
pass

class CreditCardPayment(Payment):
def process(self):
pass

class PayPalPayment(Payment):
def process(self):
pass



🔻 اصل جایگزینی لیسکوف (LSP)
براساس اصل Liskov Substitution Principle، زیرکلاس‌ها باید بتوانند بدون تغییر رفتار برنامه، جایگزین کلاس‌های پدر شوند. برای مثال، یک مربع (Square) نباید به‌عنوان زیرکلاس یک مستطیل (Rectangle) تعریف شود، اگر رفتارهای مستطیل را نقض کند.


✖️ مشکل: فرض کنید کلاسی به نام Bird داریم که برای پرنده‌ها طراحی شده است و دو زیرکلاس داریم: Sparrow (گنجشک) و Penguin (پنگوئن). در این مثال، متد fly() برای پنگوئن اشتباه است، زیرا پنگوئن نمی‌تواند پرواز کند.
class Bird:
def fly(self):
pass

class Sparrow(Bird):
def fly(self):
pass

class Penguin(Bird):
def fly(self):
return NotImplemented

sparrow = Sparrow()
sparrow.fly() # Output: is ok

penguin = Penguin()
penguin.fly() # Output: Not Implemented


✔️ راه‌حل: تفکیک رفتارها
class Bird:
def lay_eggs(self):
pass

class FlyingBird(Bird):
def fly(self):
pass

class Sparrow(FlyingBird):
...

class Penguin(Bird):
def swim(self):
pass



🔻 اصل جداسازی اینترفیس (ISP)
براساس اصل Interface Segregation Principle، کلاس‌ها نباید مجبور شوند متدهایی را پیاده‌سازی کنند که به آن‌ها نیازی ندارند. برای مثال، اگر یک اینترفیس شامل متدهای کار و غذا خوردن باشد، یک ربات که نمی‌تواند غذا بخورد، نباید مجبور به پیاده‌سازی متد غذا خوردن شود.


✖️ مشکل: کلاس Printer مجبور است متد scan را پیاده‌سازی کند، حتی اگر این عملیات مورد نیاز نباشد.
class Machine:
def print(self):
pass

def scan(self):
pass

class Printer(Machine):
def print(self):
pass

def scan(self):
raise NotImplemented


✔️ راه‌حل: در اینجا رابط‌ها جدا می‌شوند تا هر کلاس فقط متدهای مورد نیاز خود را پیاده‌سازی کند:
class Printer:
def print(self):
pass

class Scanner:
def scan(self):
pass

class PrinterDevice(Printer):
def print(self):
print("Printing...")

class SimpleScanner(Scanner):
def scan(self):
print("Scanning...")



🔻 اصل وارونگی وابستگی (DIP)
براساس اصل Dependency Inversion Principle، ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند. هر دو باید به انتزاعات وابسته باشند. برای مثال، یک کلاس نباید مستقیماً به دیتابیس خاصی وابسته باشد. به جای آن باید از اینترفیس یا انتزاعی برای ارتباط استفاده کند.


🔖 #Python, #پایتون, #شئ‌گرایی, #OOP, #SOLID

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
👍14🔥41