• خطاها نباید نادیده گرفته شوند، مگر به صورت صریح و واضح!
خطاهای برنامه نیاز است به صورت صحیح مدیریت شوند. استفاده از pass برای نادیده گرفتن آنها ممکن است به صورت موقت مشکل را پنهان کند، اما در آینده ممکن است باعث بروز خطاهایی شود که یافتن و اصلاح آنها سخت تر و بعضاً جبران ناپذیر باشد.
اما بعضاً ممکن است نیاز شود یک خطا نادیده گرفته شود که در این صورت بهتر است این نادیده گرفتن به صورت صریح و واضح انجام شود.
• در صورت مواجه شدن با ابهام، حدس و گمان را کنار بگذارید
زمانی که با شرایطی مواجه میشوید که موضوعی مبهم است، به جای حدس زدن و تکیه بر راهحلهای موقت، به روشنسازی ابهامات بپردازید تا مشکل بهصورت اساسی حل شود. این کار باعث میشود که از اشتباهات ناشی از حدس و گمان جلوگیری شده و راهحلهای دائمی و کارآمد پیدا شود.
• برای هر کار باید تنها یک راهکار واضح وجود داشته باشد
استفاده از راه حلهای گوناگون برای انجام یک کار، پیچیدگی را افزایش میدهد. برای اینکه کارها به بهترین شکل و کمترین پیچیدگی انجام شوند، بهتر است تنها یک راه حل واضح انتخاب شود. متاسفانه، در برخی از فریمورکها و کتابخانهها، شاهد ارائه چندین راه حل برای یک مسئله خاص هستیم که باعث پیچیدگی بیشتر و کاهش وضوح میشود. (اگه طرفدار راهکار های مختلف برای یک کار هستی بهتره جمع کنی بری Perl 😇)
• ممکن است اولین راهکار، بهترین راهکار نباشد
در برخی موارد، یافتن یک راهکار واضح برای انجام کار، زمان بیشتری میطلبد. این امر میتواند باعث شود که در طول زمان، راهکارهای مختلف برای انجام یک کار پیشنهاد شوند. برای مثال، در پایتون برای فرمت کردن رشته، چندین روش مختلف وجود دارد که اصل قبلی را نقض میکند.
• حال بهتر از هرگز، و هرگز بهتر از همین حالا است!
اقدام کردن و انجام دادن یک کار بهتر از به تعویق انداختن و منتظر ماندن برای زمان کاملاً مناسب است، چون زمان کاملاً مناسب هرگز فرا نمیرسد و این انتظار باعث میشود آن کار هیچوقت انجام نشود. با این حال، این اصل نباید باعث شود کارها بدون برنامهریزی انجام شوند. بهتر است صبر کنیم تا با دقت و برنامهریزی درست دست به انجام آن کار بزنیم؛ در غیر این صورت، انجام کارها با عجله و بیبرنامگی نیز مناسب نیست.
• اگر توضیح و پیاده سازی یک راهکار دشوار باشد، پس راهکار خوبی نیست. اما در صورت آسانی ممکن است که یک راهکار خوبی باشد
اگر یک راهکار هرچند سودمند، اما پیچیده باشد و درک و پیادهسازی آن برای برنامهنویسان سخت و دشوار باشد، آن راهکار یک راهکار خوبی نیست. اما آسان بودن یک راهکار نیز همیشه به معنی درست بودن آن راهکار نیست.
اصول و قوانین ذکر شده، مبانی طراحی زبان برنامهنویسی پایتون را تشکیل میدهند. ممکن است هرشخص تعابیر متفاوتی ازین اصول داشته باشد که توضیحات بالا نیز برداشت شخصی من از این اصول است. به طور خلاصه، این اصول بر زیبایی، وضوح، سادگی، آسانی و خوانایی تأکید دارند. لازم به ذکر است که این اصول به صورت طنزآمیز، شاعرانه و کلی بیان شدهاند و بیشتر به چگونگی طراحی زبان پایتون و دلایل این طراحی اشاره دارند که بر اساس آن میتوانید تشخیص دهید چه روشی پایتونیک چه و روشی غیرپایتونیک است. برای استفاده از زبان پایتون، یک سری قوانین و دستورالعملهای دیگری بنام PEP 8 وجود دارد که با صراحت و جزئیات کامل، چگونگی کدنویسی در این زبان را شرح داده است. در آینده به بررسی این دستورالعملها نیز خواهیم پرداخت.
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
خطاهای برنامه نیاز است به صورت صحیح مدیریت شوند. استفاده از pass برای نادیده گرفتن آنها ممکن است به صورت موقت مشکل را پنهان کند، اما در آینده ممکن است باعث بروز خطاهایی شود که یافتن و اصلاح آنها سخت تر و بعضاً جبران ناپذیر باشد.
# Silent error ❌
try:
result = some_function()
except:
pass # No error handling
# Not silent ✅️
try:
result = some_function()
except Exception as e:
print(f"Error occurred: {e}")
اما بعضاً ممکن است نیاز شود یک خطا نادیده گرفته شود که در این صورت بهتر است این نادیده گرفتن به صورت صریح و واضح انجام شود.
# Not explicit ❌
try:
result = some_function()
except Exception:
pass
# Explicit ✅️
try:
result = some_function()
except SpecificException:
pass # ignore this specific case
• در صورت مواجه شدن با ابهام، حدس و گمان را کنار بگذارید
زمانی که با شرایطی مواجه میشوید که موضوعی مبهم است، به جای حدس زدن و تکیه بر راهحلهای موقت، به روشنسازی ابهامات بپردازید تا مشکل بهصورت اساسی حل شود. این کار باعث میشود که از اشتباهات ناشی از حدس و گمان جلوگیری شده و راهحلهای دائمی و کارآمد پیدا شود.
• برای هر کار باید تنها یک راهکار واضح وجود داشته باشد
استفاده از راه حلهای گوناگون برای انجام یک کار، پیچیدگی را افزایش میدهد. برای اینکه کارها به بهترین شکل و کمترین پیچیدگی انجام شوند، بهتر است تنها یک راه حل واضح انتخاب شود. متاسفانه، در برخی از فریمورکها و کتابخانهها، شاهد ارائه چندین راه حل برای یک مسئله خاص هستیم که باعث پیچیدگی بیشتر و کاهش وضوح میشود. (اگه طرفدار راهکار های مختلف برای یک کار هستی بهتره جمع کنی بری Perl 😇)
# One way ✅️
list.append(item)
# Not obvious alternatives should be avoided
• ممکن است اولین راهکار، بهترین راهکار نباشد
در برخی موارد، یافتن یک راهکار واضح برای انجام کار، زمان بیشتری میطلبد. این امر میتواند باعث شود که در طول زمان، راهکارهای مختلف برای انجام یک کار پیشنهاد شوند. برای مثال، در پایتون برای فرمت کردن رشته، چندین روش مختلف وجود دارد که اصل قبلی را نقض میکند.
age = 33
formatted = f"Age: {age}"
formatted = "Age: {}".format(age)
formatted = "Age: %d" % age
• حال بهتر از هرگز، و هرگز بهتر از همین حالا است!
اقدام کردن و انجام دادن یک کار بهتر از به تعویق انداختن و منتظر ماندن برای زمان کاملاً مناسب است، چون زمان کاملاً مناسب هرگز فرا نمیرسد و این انتظار باعث میشود آن کار هیچوقت انجام نشود. با این حال، این اصل نباید باعث شود کارها بدون برنامهریزی انجام شوند. بهتر است صبر کنیم تا با دقت و برنامهریزی درست دست به انجام آن کار بزنیم؛ در غیر این صورت، انجام کارها با عجله و بیبرنامگی نیز مناسب نیست.
• اگر توضیح و پیاده سازی یک راهکار دشوار باشد، پس راهکار خوبی نیست. اما در صورت آسانی ممکن است که یک راهکار خوبی باشد
اگر یک راهکار هرچند سودمند، اما پیچیده باشد و درک و پیادهسازی آن برای برنامهنویسان سخت و دشوار باشد، آن راهکار یک راهکار خوبی نیست. اما آسان بودن یک راهکار نیز همیشه به معنی درست بودن آن راهکار نیست.
اصول و قوانین ذکر شده، مبانی طراحی زبان برنامهنویسی پایتون را تشکیل میدهند. ممکن است هرشخص تعابیر متفاوتی ازین اصول داشته باشد که توضیحات بالا نیز برداشت شخصی من از این اصول است. به طور خلاصه، این اصول بر زیبایی، وضوح، سادگی، آسانی و خوانایی تأکید دارند. لازم به ذکر است که این اصول به صورت طنزآمیز، شاعرانه و کلی بیان شدهاند و بیشتر به چگونگی طراحی زبان پایتون و دلایل این طراحی اشاره دارند که بر اساس آن میتوانید تشخیص دهید چه روشی پایتونیک چه و روشی غیرپایتونیک است. برای استفاده از زبان پایتون، یک سری قوانین و دستورالعملهای دیگری بنام PEP 8 وجود دارد که با صراحت و جزئیات کامل، چگونگی کدنویسی در این زبان را شرح داده است. در آینده به بررسی این دستورالعملها نیز خواهیم پرداخت.
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
❤11👍6
🔹 Assertions in Python
🔺 یکی از موارد کاربردی در پایتون assertionها هستند. استفاده از آنها برای اطمینان حاصل کردن از صحت اجرای برنامه و یافتن خطاها در هنگام توسعه و افزایش خوانایی کدهاست.
🔺 ساختار :
ادعاها یا assertionها از دو قسمت تشکیل میشوند. بخش اول یا condition شرایط به وجود آمدن AssertionError را فراهم میکند. زمانی که مقدار expression قرار گرفته در بخش condition برابر با False باشد، AssertionError رخ میدهد و اگر مقدار True باشد برنامه به کار خود ادامه میدهد. برای مثال :
بخش دوم یا message پیامی است که هنگام AssertionError نمایش داده میشود.
🔺 در ادامه به مثال زیر توجه کنید. تابع زیر دو ورودی به عنوان پارامتر دریافت میکند که مقدار اول قیمت و مقدار دوم درصدتخفیف است. در ادامه با استفاده از assert ورودی ها را کنترل کردیم و در صورتی که نتیجه expression داده شده برابر با False باشد، AssertionError رخ میدهد. در واقع با استفاده از assertion ورودی های تابع را کنترل کردیم.
سوالی ممکن است اینجا به وجود بیاید: چرا از if-statment و یا از یک exception برای مثال قبلی استفاده نکردیم؟ به بیان بهتر، دلیل استفاده از assertion چیه؟ هدف از ایجاد assertionها برای آگاهی برنامهنویس از خطاهایی که قابل انتظار نبودند/نیستند است، شرایطی ممکن است وجود داشته باشد که شما احتمال بروز خطا را در برنامه نمیدهید (برای مثال در کد بالا برنامهنویس احتمال نمیدهد که مقدار price کمتر یا برابر صفر باشد، پس از assertion استفاده کرده و در صورتی که مقادیر درست باشند برنامه به کار خودش ادامه میدهد). در اینجور شرایط می توانید از assertion استفاده کنید که اگر برنامه شما بدون باگ باشد AssertionError داده نمیشود و ادامه کدها اجرا خواهد شد ولی اگر یک خطای غیرقابل انتظار رخ دهد برنامه کرش (crash) میکند. به این نکته توجه کنید که هدف assertionها برای دیباگ کردن پروژه است، نه مدیریت خطاهایی که زمان اجرا برنامه رخ میدهد. assertion باعث میشود که شما باگ را ریشهیابی کنید.
🔹 مفسر پایتون هر assert statement را به شکل زیر تفسیر و اجرا میکند:
قبل از اینکه condition بررسی شود، یک شرط اضافی نیز بررسی میشود. این شرط بررسی می کند که آیا مقدار
🔹 دو اشتباه رایجی که در هنگام استفاده از assert statement وجود دارد:
🔹 از assertion برای اعتبارسنجی داده (data validation) استفاده نکنید. همانطور که قبلا اشاره شد در حالت optimization که در آن
در حالت عادی کد بالا بدون مشکل اجرا خواهد شد و در صورتی که شرایط درست باشد product حذف میشود. ولی دو مسئله قابل بحث وجود دارند. مورد اول، هدف استفاده از assertion زمانی بود که خطایی غیرقابل انتظار رخ دهد. از آنجایی که در کد بالا اکثریت کاربران امکان حذف product دارند، گزینه منطقی این نیست که از assertion استفاده کنیم و بهتر است با استفاده از if-statment این مسئله هندل شود. و مسئله بعدی که اهمیت زیادی دارد این است که اگر برنامه در حال optimization باشد assert statement به صورت null-operation رخ میدهد و بدون اینکه داشتن دسترسی کاربر برای حذف محصول بررسی شود، محصول از دیتابیس حذف خواهد شد (در صورتی که نباید این اتفاق رخ میداد).
🔹 اشتباه دوم در هنگام استفاده از assertion که باعث میشود assertion همیشه برابر با True باشه استفاده Tuple است. به مثال زیر دقت کنید.
انتظار میرود برنامه با AssertionError روبهرو شود، ولی این اتفاق نمیافتد،. چرا؟ چون مقدار tuple به صورت کامل به عنوان condition در نظر گرفته میشود و در نتیجه از آنجایی که tuple دارای مقدار است پس AssertionError هرگز رخ نمیدهد.
🔖 #Python, #پایتون
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
🔺 یکی از موارد کاربردی در پایتون 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
👍16❤1🔥1
📊 کار با داده های آماری در پایتون
توی این پست میخوایم ببینیم چجوری باید با داده های آماری داخل پایتون کار کرد. تو پایتون یه ماژول داخلی وجود داره به اسم statistics که دقیقا مخصوص همین کاره 👌
نیازی به نصب نداره و فقط کافیه با دستور زیر ایمپورتش کنید 👇
این ماژول به شما این امکان رو میده تا یه سری محاسبات ساده رو انجام بدید مثل گرفتن میانگین، مد، انحراف معیار و واریانس
اول باید از لحاظ ریاضی بدونیم اینا چی هستن :
میانگین (Average): اگر اعدادی رو جمع کنید با همدیگه و به تعدادشون تقسیم کنید. مثل
(5 + 4 + 3) / 3 = 4
میانه (Median): اگر اعدادی را از کوچک به بزرگ مرتب کنیم و عددی که وسط این اعداد قرار گرفته رو حساب کنیم میشه میانه. در مثال زیر به عنوان مثال میانه 3 است
1, 2, 3, 4, 5
انحراف معیار (Standard Deviation): نشون میده عددهای یه مجموعه چقدر دور یا نزدیک به میانگین (متوسط) هستن.
واریانس (Variance): مثل انحراف معیاره، ولی به جای اینکه مستقیماً فاصله عددها از میانگین رو بگه، فاصلهها رو به توان دو میرسونه و بعد میانگینشون رو میگیره.
مد (Mode): داده ای که بیشترین تکرار رو داخل یه مجموعه داره.
حالا بیاید وارد کد بشیم و چیزایی رو که گفتیم امتحان کنیم 😃
برای مثال ها از لیستی به اسم data استفاده میکنیم
برای گرفتن میانگین باید اعدادمون رو داخل یه لیست بزاریم و بعدش از تابع mean که این ماژول در اختیارمون میذاره استفاده کنیم:
برای گرفتن میانه باید از تابع median استفاده کنیم :
برای گرفتن انحراف معیار باید از تابع stdev استفاده کنیم:
برای گرفتن واریانس باید از تابع variance استفاده کنیم:
برای گرفتن مد باید از تابع mode استفاده کنیم:
به همین راحتی !! 👌
البته باید اینم بگم که اگه نیاز به تحلیل های آماری پیچیدهتری دارید باید از کتابخونه هایی مثل NumPy استفاده کنید
امیدوارم از این پست لذت برده باشید و مفید باشه براتون 🙏
🔖 #Python, #پایتون
👤 soroushGH
💎 Channel: @DevelopixPython
توی این پست میخوایم ببینیم چجوری باید با داده های آماری داخل پایتون کار کرد. تو پایتون یه ماژول داخلی وجود داره به اسم 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
👍24❤3🔥1
عملگر والروس (Walrus Operator) 🦭
عملگر والروس (Walrus Operator) با نماد
⁉️ چرا به آن والروس میگویند؟
نام "والروس" به دلیل شباهت ظاهری این عملگر به عاجهای یک والروس (شیر دریایی) به آن داده شده است.
⁉️ چگونه کار میکند؟
کار این عملگر انجام دستورات، و در عین حال assign کردن مقدار به متغیر می باشد.
این عملگر در حالت استاندارد باید در داخل پرانتز قرار بگیرد. به نحوه استفاده و سینتکس این عملگر توجه کنید:
سادهترین مثال برای درک این عملگر، استفاده از آن در یک عبارت شرطی است:
در این مثال، ما طول رشته "hello" را محاسبه میکنیم و نتیجه را هم به متغیر n اختصاص میدهیم و هم در شرط if استفاده میکنیم. این کار باعث میشود که ما مجبور نباشیم قبل از شرط، طول رشته را در یک متغیر جداگانه ذخیره کنیم.
🆚 مقایسه با روش سنتی
بدون استفاده از عملگر والروس، برای انجام همین کار باید به صورت زیر عمل میکردیم:
همانطور که میبینید، استفاده از این عملگر باعث میشود کد ما کوتاهتر و خواناتر شود.
✅ کاربردهای دیگر عملگر والروس
0️⃣ حلقههای while:
1️⃣ فهمپذیرتر کردن کد:
2️⃣ کاهش تکرار کد:
❇️ نمونه کد
🔴 نمونه کد بدون استفاده از عملگر والرس:
🟢 نمونه کد با استفاده از عملگر والرس:
⚠️ نکات مهم
0️⃣ استفاده احتیاطانه:
اگرچه عملگر والروس میتواند کد شما را کوتاهتر کند، اما استفاده بیش از حد از آن میتواند خوانایی کد را کاهش دهد.
1️⃣ پایتون 3.8 به بعد:
این عملگر از نسخه 3.8 پایتون به بعد اضافه شده است و در استفاده از نسخه های قدیمی تر به سینتکس ارور برخورد خواهید کرد.
♻️ جمعبندی
والروس یک عملگر قدرتمند برای نوشتن کدهای پایتون بهینه و خواناتر است. با استفاده از این عملگر، میتوانید کدهای خود را کوتاهتر کرده و از تکرار کد جلوگیری کنید. با این حال، مهم است که از این عملگر به صورت مناسب استفاده کنید تا خوانایی کد شما کاهش نیابد.
💠 برای داشتن اطلاعات بیشتر در مورد عملگر ها میتوانید این پست را هم مطالعه کنید.
🔖 #Python, #پایتون, #Operatos, #عملگر
👤 LightNess
💎 Channel: @DevelopixPython
عملگر والروس (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👍6❤2
📊 رسم نمودار با پایتون
بسیاری از شما داده هایی داشتید که نیاز بوده با آنها نموداری رسم کنید و شما به دنبال کتابخونه ای برای انجام این کار بودید.
امروز اومدم چند کتابخونه رو معرفی کنم که با اونها میتونید به راحتی نمودار هایی رو رسم کنید.
1. matplotlib
این کتابخونه محبوب ترین کتابخونه رسم نمودار هست که کار با اون بسیار راحت و سریع هست.
با این کتابخونه میتونید نمودار های خطی، میله ای، دایره ای، جعبه ای، تصویری و.. رو رسم کنید.
2. seaborn
این کتابخونه با الهام گرفتن از کتابخونه matplotlib نمودار ها رو رسم میکنه اما تفاوتشون توی زیبایی نمودار هاست که این کتابخونه بهتر و زیباتر است.
استفاده از پالت های رنگی متفاوت، راحتی کار با دادی های جدولی تنظیمات بصری پیشرفته بخشی از امکانات این کتابخونهست.
3. plotly
با این کتابخونه میتونید نمودار ها رو به صورت پویا رسم کنید، جوری که امکان زوم و تحلیل اون رو داشته باشید.
با خوندن داکیومنت این پروژه میتونید نمودار های فوقالعاده ای که میشه با اون رسم کرد رو ببینید.
4. bokeh
با این کتابخونه میتونید نمودار های پویا و تعاملی برای وب رسم کنید.
از سری امکانات این کتابخونه زوم، اسکرول، پن، انتخاب و ابزار هایی برای کاوش دادهست.
همچنین امکان ادغام با فریمورک های جنگو و فلسک رو داره.
کتابخونه های زیادی وجود داره اما این کتابخونه ها بیشترین استفاده رو بین کاربران دارند.
🔖 #Python, #Chart, #پایتون, #نمودار, #چارت
👤 Yasin
💎 Channel: @DevelopixPython
بسیاری از شما داده هایی داشتید که نیاز بوده با آنها نموداری رسم کنید و شما به دنبال کتابخونه ای برای انجام این کار بودید.
امروز اومدم چند کتابخونه رو معرفی کنم که با اونها میتونید به راحتی نمودار هایی رو رسم کنید.
1. matplotlib
این کتابخونه محبوب ترین کتابخونه رسم نمودار هست که کار با اون بسیار راحت و سریع هست.
با این کتابخونه میتونید نمودار های خطی، میله ای، دایره ای، جعبه ای، تصویری و.. رو رسم کنید.
2. seaborn
این کتابخونه با الهام گرفتن از کتابخونه matplotlib نمودار ها رو رسم میکنه اما تفاوتشون توی زیبایی نمودار هاست که این کتابخونه بهتر و زیباتر است.
استفاده از پالت های رنگی متفاوت، راحتی کار با دادی های جدولی تنظیمات بصری پیشرفته بخشی از امکانات این کتابخونهست.
3. plotly
با این کتابخونه میتونید نمودار ها رو به صورت پویا رسم کنید، جوری که امکان زوم و تحلیل اون رو داشته باشید.
با خوندن داکیومنت این پروژه میتونید نمودار های فوقالعاده ای که میشه با اون رسم کرد رو ببینید.
4. bokeh
با این کتابخونه میتونید نمودار های پویا و تعاملی برای وب رسم کنید.
از سری امکانات این کتابخونه زوم، اسکرول، پن، انتخاب و ابزار هایی برای کاوش دادهست.
همچنین امکان ادغام با فریمورک های جنگو و فلسک رو داره.
کتابخونه های زیادی وجود داره اما این کتابخونه ها بیشترین استفاده رو بین کاربران دارند.
🔖 #Python, #Chart, #پایتون, #نمودار, #چارت
👤 Yasin
💎 Channel: @DevelopixPython
❤8👍8🔥1
🔶 جنگو
🔶 بخش اول
🔻 تاریخچه جنگو
🔻 مفهوم فریمورک
🔻 مفهوم ORM
🌐 منابع :
🔗 ORM : Open
🔗 Django : Open
🔖 #Python, #پایتون, #Django, #جنگو, #orm, #فریمورک
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
🔶 بخش اول
🔻 تاریخچه جنگو
جنگو (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
این فریمورک تا حد زیادی قابل قبول نوشته شده. به راحتی امکان استفاده از تمام method هارو فراهم کرده و مزیت بزرگی این فریمورک اینه که شما مستقیما با MTProto API در ارتباط هستید و واسطهای وجود نداره. پایروگرام از tgcrypto برای رمزنگاری استفاده میکنه تا بتونه با MTProto در ارتباط باشه. این کتابخونه با زبان C نوشته شده و باعث بهبود سرعته.
یکی از معایب بزرگ این فریمورک بروز نبودن اونه. تلگرام در یک سال اخیر تغییرات زیادی داشته و این فریمورک خودش رو بروز نکرده. پس شما به ناچار مجبور به استفاده از یکی از fork های اون هستید. پیشنهاد من استفاده از این fork هستش.
از بابت مستندات این فریمورک مشکلی خاصی نداره و توضیحات تمیز و مرتب برای یادگیری نوشته شدند و درعین حال با جزئیات کامل هستند.
فریمورک بعدی که مستقیما با MTProto ارتباط برقرار میکنه telethon هستش. این package نسبتا بروز و منعطف نوشته شده. برای بهبود سرعت، این فریمورک از افزونه یا کتابخونه خاص خودش به اسم cryptg استفاده میکنه. از مزایای این فریمورک داشتن امکانات مازاد هستش؛ به عنوان مثال اگر pillow نصب شده باشه کار resize کردن تصاویر رو خودش انجام میده. یا از hachoir و aiohttp برای دانلود و مدیریت document ها استفاده میکنه.
شباهت زیاد pyrogram و telethon قابل چشم پوشی نیست؛ با تسلط به یکی از این دو، میتونید ظرف کمتر از یک ساعت با مورد دیگه بطور کلی آشنایی پیدا کنید. از نحوه log کردن ها، ساختار کلاس client و سایر کلاس ها، اسامی method ها بگیرید تا نحوه استفاده از proxy ها و dispather هر دو فریمورک. شباهت این دو غیرقابل انکاره.
با وجود پیچیدگی MTProto این فریمورک و pyrogram ساختاری مشابه telebot دارند (از بابت پیاده سازی کد) و شما تقریبا حتی متوجه پیچیدگی MTProto نخواهید شد.
این فریمورک برخلاف دو فریمورک قبلی مستقیما با MTProto درارتباط نیست و نویسندگان اون ترجیح دادند که کار رو با BotAPI جلو ببرند. از بابت ساختار فوقالعاده ساده و اصطلاحا کارراهبنداز هستش. عملکرد این فریمورک به شکل long polling صورت میگیره و داده به صورت http دریافت و ارسال میشه. درحالت کلی میشه گفت که اندکی از دو فریمورکی که نام بردیم سرعت کمتری رو دارا هستش اما این دال بر این نیست که امکانات کمی رو مهیا کرده باشه و اگر نگاهی به لیست مطرح ترین کتابخانه های مرتبط به ربات های تلگرامی بیاندازیم، قطعا telebot رو در بین اونها میبینیم.
نمیتونیم مستندات این فریمورک رو تمیز بنامیم، اما نمیشه گفت که کامل هم نیستند و تمامی توضیحات ارائه شدند. ولی برای یادگیری توصیه نمیکنم که با این مستندات جلو برید چون برای دادن جزئیات کامل طراحی شده، نه برای آموزش.
همونطور که telethon رو فریمورکی مشابه pyrogram خطاب کردیم، اینجا هم میتونیم aiogram رو چیزی مشابه telebot بنامیم. این فریمورک بطور خاص برای استفاده از مفهوم asynchronous طراحی شده. یکی از ویژگی های خوب این فریمورک اینه که به لطف tg-codegen هیچ وقت از بروزرسانی های BotAPI عقب نمیمونه. از aiohttp استفاده می کنه و از بابت سرعت و عملکرد تقریبا مشابه telebot هستش.
یکی دیگه از فریمورک هایی که بر اساس 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
Telegram
| کانال ربات تلگرام |
⭕️ کانال توسعهدهندگان ربات تلگرام دولوپیکس
💠 دولوپیکس | جامعه توسعهدهندگان ایرانی
💎 @Developix
🚀 Developix.ir
📌 پشتیبانی و تبلیغات:
@DevelopixSupport
💠 دولوپیکس | جامعه توسعهدهندگان ایرانی
💎 @Developix
🚀 Developix.ir
📌 پشتیبانی و تبلیغات:
@DevelopixSupport
👍8❤5
🔹 انواع ارور ها در پایتون
🔸 بخش اول
برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.
— SyntaxError
یکی از خطا های رایج در پایتون این ارور هست. هنگامی این ارور اتفاق میافتد که شما نگارش و قانون نوشتاری کد های پایتونی را رعایت نکرده باشید.
برخی از دلایل نمایش SyntaxError:
• نبستن استرینگ
• غلط املایی در نوشتار کلمات کلیدی
• استفاده از سینتکس ورژن جدید پایتون در ورژن های قدیمیتر
• فراموش کردن بستن براکت، آکولاد یا پرانتز
مثال:
— IndentionError
در پایتون این ارور زمانی نمایش داده میشود که شما تو رفتگی ها را به خوبی رعایتنکرده باشید.
چند مورد از دلایل وقوع این ارور:
• فاصله های نادرست
• بلوک های تودرتوی نادرست
• فضای خالی در ابتدای شروع یک دستور
مثال:
— NameError
اگر هنگام استفاده از یک متغیر، آن متغیر تعریف نشده باشد این ارور را مشاهده خواهید کرد.
برای رفع این ارور اطمینان حاصل کنید که متغیر یا تابعی که از آن استفاده میکنید تعریف شده باشد.
مثال:
— ValueError
هنگامی این ارور رخ میدهد که نوع مقدار ورودی شما صحیح نیست.
مانند وقتی که یک input با تایپ int تعریف کرده باشید اما کاربر یک استرینگ به آن پاس دهد.
مثال:
— TypeError
این ارور هنگامی رخ میدهد که شما عملیاتی انجام دهید که برای آن نوع داده نامناسب باشد.
مانند زمانی که یک استرینگ را با یک تایپ int تقسیم کنید.
مثال:
منبع:
betterstack 〽️
🔖 #Python, #پایتون
👤 Yasin
💎 Channel: @DevelopixPython
🔸 بخش اول
برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.
— 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🔥5❤3
🔶 جنگو
🔶 بخش دوم
🔻 فلسفه معماری MVC
🔻 تاریخچه معماری MVC
🔻 بررسی معماری MVC
🔻 بررسی معماری MVT
🔻 معماری MVT در هنگام استفاده از API
🔻 نتیجهگیری
🌐 منبع تکمیلی
🔖 #Python, #پایتون, #Django, #جنگو, #orm, #فریمورک
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
🔶 بخش دوم
🔻 فلسفه معماری 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
👍14❤3
🔶 بخش اول
🔶 مفاهیم شیگرائی
🔻 اصول SOLID
🔻 اصل تک مسئولیتی (SRP)
✖️ مشکل: کلاس زیر هم وظیفه مدیریت کاربر و هم ارسال ایمیل ایمیل را برعهده دارد:
✔️ راهحل: تفکیک وظايف:
🔻 اصل باز/بسته (OCP)
✖️ مشکل: کلاس زیر مسئول چندین نوع پرداخت است:
✔️ راهحل: جداسازی روشهای پرداخت:
🔻 اصل جایگزینی لیسکوف (LSP)
✖️ مشکل: فرض کنید کلاسی به نام Bird داریم که برای پرندهها طراحی شده است و دو زیرکلاس داریم: Sparrow (گنجشک) و Penguin (پنگوئن). در این مثال، متد fly() برای پنگوئن اشتباه است، زیرا پنگوئن نمیتواند پرواز کند.
✔️ راهحل: تفکیک رفتارها
🔻 اصل جداسازی اینترفیس (ISP)
✖️ مشکل: کلاس Printer مجبور است متد scan را پیادهسازی کند، حتی اگر این عملیات مورد نیاز نباشد.
✔️ راهحل: در اینجا رابطها جدا میشوند تا هر کلاس فقط متدهای مورد نیاز خود را پیادهسازی کند:
🔻 اصل وارونگی وابستگی (DIP)
🔖 #Python, #پایتون, #شئگرایی, #OOP, #SOLID
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
🔶 مفاهیم شیگرائی
🔻 اصول 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🔥4❤1