Forwarded from Developix Support
⭕️ کمتر از ۲ هفته تا شروع دورهی محبوب و تخصصی ماشینلرنینگ آکادمی آمانج باقی مونده!
⚠️ جای ۷نفر از شما در دوره ما خالیه!
🎁 برای اعضای پیج یه کد تخفیف ۴۰۰ هزار تومانی در نظر گرفتیم: ml4
💰قیمت دوره: ۵.۹ میلیون تومان
(امکان پرداخت قسطی هم وجود داره)
🧑🏫مدرس دوره: دکتر ریحانی مدیر فنی نوسازان، دیتاساینتیست و دکتری کامپیوتر دانشگاه تهران
⏰ شروع دوره: ۱۵ دی ماه ۱۴۰۲ (جمعهها ۱۵-۱۱)
📊 ۵۵ ساعت آموزش مقدماتی تا پیشرفته
📍ویژگیهای دوره:
✔️هر هفته وبینار برگزار میشه و شما میتونید مستقیما با استاد تعامل داشتهباشید.
✔️ در پایان دوره، مدرک نمرهدار آکادمی آمانج بهتون داده میشه.
✔️ در طول دوره، پشتیبانهای فنی آمانج حواسشون به همه چیز هست تا بهترین تجربه رو در طول یادگیری داشته باشین.
✔️سرفصلهای دوره ماشین لرنینگ کاملا بهروز و مطابق با نیاز بازار کاره.
✔️بعد از پایان دوره میتونید در کامیونیتی تخصصی برنامهنویسی آمانج عضو بشید که حسابی به دردتون میخوره.
🌐 👈🏻برای اطلاعات بیشتر و ثبتنام کلیک کنید
@AmanjAdmin
09107603363
02191692911
⚠️ جای ۷نفر از شما در دوره ما خالیه!
🎁 برای اعضای پیج یه کد تخفیف ۴۰۰ هزار تومانی در نظر گرفتیم: ml4
💰قیمت دوره: ۵.۹ میلیون تومان
(امکان پرداخت قسطی هم وجود داره)
🧑🏫مدرس دوره: دکتر ریحانی مدیر فنی نوسازان، دیتاساینتیست و دکتری کامپیوتر دانشگاه تهران
⏰ شروع دوره: ۱۵ دی ماه ۱۴۰۲ (جمعهها ۱۵-۱۱)
📊 ۵۵ ساعت آموزش مقدماتی تا پیشرفته
📍ویژگیهای دوره:
✔️هر هفته وبینار برگزار میشه و شما میتونید مستقیما با استاد تعامل داشتهباشید.
✔️ در پایان دوره، مدرک نمرهدار آکادمی آمانج بهتون داده میشه.
✔️ در طول دوره، پشتیبانهای فنی آمانج حواسشون به همه چیز هست تا بهترین تجربه رو در طول یادگیری داشته باشین.
✔️سرفصلهای دوره ماشین لرنینگ کاملا بهروز و مطابق با نیاز بازار کاره.
✔️بعد از پایان دوره میتونید در کامیونیتی تخصصی برنامهنویسی آمانج عضو بشید که حسابی به دردتون میخوره.
🌐 👈🏻برای اطلاعات بیشتر و ثبتنام کلیک کنید
@AmanjAdmin
09107603363
02191692911
درود.
میخواستم درباره ی آبجکت معروف و شناخته شده ی generator حرف بزنیم ولی با نگاه کمی متفاوتتر تا به این برسیم که دقیقا چطور کار میکنه و چطور پیداش شد. نیاز هست که کمی حرف های پیش نیاز بزنیم صبور باشید.
قبل از هر چیزی درباره ی خود فانکشن حرف بزنیم؛ ولی نه تو پایتون بلکه تو C:
وقتی یه فانکشنی کال میشه، توی call stack یک frame جدید میاد که برای اون فانکشن هست. این frame شامل تمام متغیر های لوکال و پارامتر های اون فانکشنه. وقتی فانکشن تموم میشه چه اتفاقی میفته؟ اون frame از stack پاپ میشه (یا دقیق ترش stack pointer کم میشه)
و نکته اینجاس که هرچی که توی اون frame هست دیگه قابل دسترس نیست و اگر استفادشون کنیم، undefined behavior هست. چرا؟ چون توی "مموری استک" این frame قرار داده شده بود و اون فضا الان آزاد شده و قابل استفاده هست برای بقیه (توی پرانتز، در C که مدیریت حافظه نداره، باید آبجکت هایی که توی heap میسازیم رو خودمون مدیریت کنیم نه استک):
با اینکه آدرسش رو return کردیم ولی باز هم نمیتونیم به آیتم های لیست دسترسی داشته باشیم.
حالا اینارو گفتم که موضوع مهمی رو بگم. اونم اینه که تو پایتون هم همین call stack و اینا هست ولی اون frame object توی heap ساخته میشه. این یعنی اگر بخوایم میتونیم اون رو ذخیره داشته باشیم و همیشه بمونه! مثلا مانع از نابود شدن خودش و آبجکت های درونش بشیم. تو مثال زیر
خب حالا که اینو گفتیم بریم سراغ خود آبجکت فانکشن تو پایتون. وقتی فانکشن کال میشه یه frame object ساخته میشه. این frame object داخلش آبجکت های زیادی هست (مستقیم یا غیرمستقیم) از جمله رفرنس داره به متغیر های داخل اون namespace و رفرنسی داره به code object که یک unit ئه executable هست. داخل این code object ما bytecode ها رو داریم که همون instruction ها هستن.
درواقع instruction ها هستن که اجرا میشن و این state ذخیره میشه. تو کد زیر
خب حالا بخش جالب ماجرا اینجاست. ما به عنوان طراحان فرضی زبان پایتون، میدونیم که frame ما میتونه خارج از موقع کال شدن هم زنده بمونه + از طرفی به state هم که دسترسی داریم. ( اینکه الان متغیر های local چیا هستن، اینکه الان تا instruction چندم اجرا شده و غیره)
فقط یه مشکلی هست، فانکشن های ما وقتی کال میشن از اولین instruction تا آخرینش رو اجرا میکنن و تموم میشن و همه ی آبجکت های داخل اون frame از بین میرن (اگر رفرنس دیگه ای نداشته باشن جای دیگه).
الان همه چیز محیا هست برای اینکه یه ساختار یا keyword جدیدی بیاریم تو زبان که هرجایی از execution فانکشن خواستیم بتونیم pause کنیم و اون رو با هر state ای که داره به حال خودش رها کنیم.
بیایم yield رو معرفی کنیم! هروقت yield اومد، کافیه اجرا رو متوقف کنیم و مثل فانکشن ها (که بعد از تموم شدنشون، frame شون از stack frame جدا میشن) frame این generator ها رو هم جدا کنیم.
بعدا اگه خواستیم generator رو ادامه بدیم و روش next بزنیم (مستقیم خودمون یا غیر مستقیم توسط پایتون) تنها کاری که باید بکنیم اینه که frameش رو برداریم و بچسبونیم به stack frame ممون و از اون state ای که بودیم ادامه بدیم.
این call stack با linked list پیاده سازی شده و frame ها نود های اون هستن. با
جنریتور ها با وجود سرعت خوبی که دارن، برای سرعت بیشتر ساخته نشدن بلکه برای استفاده بهینهتر از مموری ساخته شدن. داشتن همچین آبجکتی (به اضافه ساختار هایی مثل
👤 SorousH
💎 Channel: @DevelopixPython
میخواستم درباره ی آبجکت معروف و شناخته شده ی generator حرف بزنیم ولی با نگاه کمی متفاوتتر تا به این برسیم که دقیقا چطور کار میکنه و چطور پیداش شد. نیاز هست که کمی حرف های پیش نیاز بزنیم صبور باشید.
قبل از هر چیزی درباره ی خود فانکشن حرف بزنیم؛ ولی نه تو پایتون بلکه تو C:
وقتی یه فانکشنی کال میشه، توی call stack یک frame جدید میاد که برای اون فانکشن هست. این frame شامل تمام متغیر های لوکال و پارامتر های اون فانکشنه. وقتی فانکشن تموم میشه چه اتفاقی میفته؟ اون frame از stack پاپ میشه (یا دقیق ترش stack pointer کم میشه)
و نکته اینجاس که هرچی که توی اون frame هست دیگه قابل دسترس نیست و اگر استفادشون کنیم، undefined behavior هست. چرا؟ چون توی "مموری استک" این frame قرار داده شده بود و اون فضا الان آزاد شده و قابل استفاده هست برای بقیه (توی پرانتز، در C که مدیریت حافظه نداره، باید آبجکت هایی که توی heap میسازیم رو خودمون مدیریت کنیم نه استک):
int *returnArray() {
int arr[3] = {11, 22, 33};
printf("%p\n", arr);
printf("%d\n", arr[1]);
return &arr;
}
int main(void) {
int *arr;
arr = returnArray();
printf("%p\n", arr);
printf("%d\n", arr[1]); // ???
}
با اینکه آدرسش رو return کردیم ولی باز هم نمیتونیم به آیتم های لیست دسترسی داشته باشیم.
حالا اینارو گفتم که موضوع مهمی رو بگم. اونم اینه که تو پایتون هم همین call stack و اینا هست ولی اون frame object توی heap ساخته میشه. این یعنی اگر بخوایم میتونیم اون رو ذخیره داشته باشیم و همیشه بمونه! مثلا مانع از نابود شدن خودش و آبجکت های درونش بشیم. تو مثال زیر
global f
رو اگه از کامنت در بیارید obj از بین نمیره چون frame رو ذخیره کردیم:from gc import collect
from sys import _getframe
class A:
def __del__(self):
print("del called")
def fn():
# global f
f = _getframe(0)
obj = A()
fn()
collect()
input()
خب حالا که اینو گفتیم بریم سراغ خود آبجکت فانکشن تو پایتون. وقتی فانکشن کال میشه یه frame object ساخته میشه. این frame object داخلش آبجکت های زیادی هست (مستقیم یا غیرمستقیم) از جمله رفرنس داره به متغیر های داخل اون namespace و رفرنسی داره به code object که یک unit ئه executable هست. داخل این code object ما bytecode ها رو داریم که همون instruction ها هستن.
درواقع instruction ها هستن که اجرا میشن و این state ذخیره میشه. تو کد زیر
lasti
یعنی last instruction. (توی cpu هم اتفاق مشابهی میفته. اینجا pvm میخواد بدونه چی رو اجرا کرده و حالا نوبت چیه):from sys import _getframe
def fn():
print(_getframe(0).f_lasti)
a = 10
print(_getframe(0).f_lasti)
fn()
خب حالا بخش جالب ماجرا اینجاست. ما به عنوان طراحان فرضی زبان پایتون، میدونیم که frame ما میتونه خارج از موقع کال شدن هم زنده بمونه + از طرفی به state هم که دسترسی داریم. ( اینکه الان متغیر های local چیا هستن، اینکه الان تا instruction چندم اجرا شده و غیره)
فقط یه مشکلی هست، فانکشن های ما وقتی کال میشن از اولین instruction تا آخرینش رو اجرا میکنن و تموم میشن و همه ی آبجکت های داخل اون frame از بین میرن (اگر رفرنس دیگه ای نداشته باشن جای دیگه).
الان همه چیز محیا هست برای اینکه یه ساختار یا keyword جدیدی بیاریم تو زبان که هرجایی از execution فانکشن خواستیم بتونیم pause کنیم و اون رو با هر state ای که داره به حال خودش رها کنیم.
بیایم yield رو معرفی کنیم! هروقت yield اومد، کافیه اجرا رو متوقف کنیم و مثل فانکشن ها (که بعد از تموم شدنشون، frame شون از stack frame جدا میشن) frame این generator ها رو هم جدا کنیم.
بعدا اگه خواستیم generator رو ادامه بدیم و روش next بزنیم (مستقیم خودمون یا غیر مستقیم توسط پایتون) تنها کاری که باید بکنیم اینه که frameش رو برداریم و بچسبونیم به stack frame ممون و از اون state ای که بودیم ادامه بدیم.
def gen():
a = 1
yield
b = 1
yield
g = gen()
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
next(g)
print(g.gi_frame.f_lasti, g.gi_frame.f_locals)
این call stack با linked list پیاده سازی شده و frame ها نود های اون هستن. با
f_back
به frame قبلی اشاره میکنن به راحتی وصل میشن و جدا میشن.جنریتور ها با وجود سرعت خوبی که دارن، برای سرعت بیشتر ساخته نشدن بلکه برای استفاده بهینهتر از مموری ساخته شدن. داشتن همچین آبجکتی (به اضافه ساختار هایی مثل
yield from
) میتونه زمینه خیلی چیز ها رو فراهم کنه. از جمله فریموورک هایی مثل asyncio :)👤 SorousH
💎 Channel: @DevelopixPython
Forwarded from Developix Support
DragonCloud - دراگون کلود
ارائه خدمات سرور مجازی و اختصاصی
با بهترین سخت افزار های موجود و شبکه ای قدرتمند
- استفاده از پردازنده core i9 14900k
- رم های DDR5
- حافظه های NVMe
جهت دریافت اطلاعات بیشتر و خرید عضو شوید👇🏽
@DragonCloud_ir
ارائه خدمات سرور مجازی و اختصاصی
با بهترین سخت افزار های موجود و شبکه ای قدرتمند
- استفاده از پردازنده core i9 14900k
- رم های DDR5
- حافظه های NVMe
جهت دریافت اطلاعات بیشتر و خرید عضو شوید👇🏽
@DragonCloud_ir
Python Ethical Hacking from scratch.pdf
6.6 MB
🔸 Python Ethical Hacking
کتابی که اخیرا به صورت کلی مطالعه کردم، کتابی جالب در زمینه هک با استفاده از زبان برنامهنویسی پایتون است. در بخش اول درمورد مفاهیم اولیه از جمله TCP، OSI، Types of hackers و ... صحبت میشود که اگر با این مفاهیم آشنا هستید میتوانید از بخش2-قسمت4 کتاب شروع به مطالعه کنید.
از جمله مواردی که در کتاب پوشش داده شده، حمله Arp Spoofing میباشد که با بهرهگیری از کتابخانه scapy، یک بدافزار برای بوجود آوردن اختلال در اتصال اینترنت هدف نوشته شده است. همچنین، توضیحات جامعی نیز درباره اجرای حمله MITM نیز در این کتاب ارائه شده.
درکنار موارد ذکر شده، یاد خواهید گرفت که چطور با استفاده از این زبان یک بدافزار توسعه بدهید، مکانیزم های امنیتی متوقفکننده بدافزار را دور بزنید، چطور پسورد کرک کنید و دیگر اقدامات مربوط به این حوزه را انجام دهید.
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
کتابی که اخیرا به صورت کلی مطالعه کردم، کتابی جالب در زمینه هک با استفاده از زبان برنامهنویسی پایتون است. در بخش اول درمورد مفاهیم اولیه از جمله TCP، OSI، Types of hackers و ... صحبت میشود که اگر با این مفاهیم آشنا هستید میتوانید از بخش2-قسمت4 کتاب شروع به مطالعه کنید.
از جمله مواردی که در کتاب پوشش داده شده، حمله Arp Spoofing میباشد که با بهرهگیری از کتابخانه scapy، یک بدافزار برای بوجود آوردن اختلال در اتصال اینترنت هدف نوشته شده است. همچنین، توضیحات جامعی نیز درباره اجرای حمله MITM نیز در این کتاب ارائه شده.
درکنار موارد ذکر شده، یاد خواهید گرفت که چطور با استفاده از این زبان یک بدافزار توسعه بدهید، مکانیزم های امنیتی متوقفکننده بدافزار را دور بزنید، چطور پسورد کرک کنید و دیگر اقدامات مربوط به این حوزه را انجام دهید.
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
capitalize() -> str
>>> "string methods".capitalize()
'String methods'
lower() -> str
>>> "STRING METHODS".lower()
'string methods'
casefold() -> str
>>> "STRING METHODS".casefold()
'string methods'
>>> "ß".lower()
'ß'
>>> "ß".casefold()
'ss'
center(width, [fillchar]) -> str
>>> "string".center(10, "+")
'++string++'
>>> "string".center(10)
' string '
count(value[, start[, end]]) -> int
>>> "string methods".count("t")
2
>>> "string methods".count("t", 2)
1
>>> "string methods".count("t", 2, 3)
0
endswith(suffix[, start[, end]]) -> bool
>>> "string methods".endswith("ds")
True
>>> "string methods".endswith("ds", 5)
True
>>> "string methods".endswith("ds", 5, 7)
False
find(sub[, start[, end]]) -> int
>>> "string methods".find("s")
0
>>> "string methods".find("#")
-1
>>> "string methods".find("s", 5)
13
join(iterable) -> list
>>> ",".join("string")
's,t,r,i,n,g'
>>> ",".join(["1","2","3"])
'1,2,3'
>>> ",".join({"1","2","3"})
'3,2,1'
>>> ",".join({"1" : 1, "2" : 2})
'1,2'
replace(old, new[, count]) -> str
>>> "hi-hi-hi".replace("hi", "hey")
'hey-hey-hey'
>>> "hi-hi-hi".replace("hi" , "hey", 2)
'hey-hey-hi'
>>> "hi-hi-hi".replace("hi", "hey", 1)
'hey-hi-hi'
split(sep=None, maxsplit=-1) -> list
>>> "hi-hi-hi".split()
['hi-hi-hi']
>>> "hi hi hi".split()
['hi', 'hi', 'hi']
>>> "hi-hi-hi".split("-")
['hi', 'hi', 'hi']
>>> "hi-hi-hi".split("-", 1)
['hi', 'hi-hi']
>>> "hi hi hi".split(maxsplit=1)
['hi', 'hi hi']
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
| کانال توسعهدهندگان پایتون |
Numpy and Pandas.pdf
5.5 MB
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
💢 معرفی فریمورک DJango
جنگو یک فریمورک پایتون برای ساخت اپلیکیشن های وب است و از معماری MVT استفاده میکند تا کدها تمیزتر، کارآمدتر و کمتر شوند.
هدف اصلی جنگو ساخت آسان سایت های پیچیده و وابسته به دیتابیس است و بر پایه قابلیت استفاده مجدد و قابل اتصال بودن اجزای مختلف و توسعه سریع طراحی شده است؛ از وبسایت های مشهوری که از جنگو استفاده میکنند میتوان به اینستاگرام، یوتیوب و سرویس های گوگل اشاره کرد.
مزایای جنگو بهطور خلاصه :
- افزایش سرعت برنامهنویسی
- کارایی بالا و امکان توسعه
- امنیت مطلوب
🔖 #Python, #پایتون
👤 Maryam
💎 Channel: @DevelopixPython
جنگو یک فریمورک پایتون برای ساخت اپلیکیشن های وب است و از معماری MVT استفاده میکند تا کدها تمیزتر، کارآمدتر و کمتر شوند.
هدف اصلی جنگو ساخت آسان سایت های پیچیده و وابسته به دیتابیس است و بر پایه قابلیت استفاده مجدد و قابل اتصال بودن اجزای مختلف و توسعه سریع طراحی شده است؛ از وبسایت های مشهوری که از جنگو استفاده میکنند میتوان به اینستاگرام، یوتیوب و سرویس های گوگل اشاره کرد.
مزایای جنگو بهطور خلاصه :
- افزایش سرعت برنامهنویسی
- کارایی بالا و امکان توسعه
- امنیت مطلوب
🔖 #Python, #پایتون
👤 Maryam
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - astral-sh/rye: a Hassle-Free Python Experience
a Hassle-Free Python Experience. Contribute to astral-sh/rye development by creating an account on GitHub.
ادبیات زبان پایتون | The Zen of Python
"Zen of Python" مجموعهای از بیست اصل است که طراحی زبان برنامه نویسی پایتون بر مبنای آن صورت گرفته. این اصول به دو مفهوم اصلی "خوانایی" و "سادگی" تأکید دارند.
این اصول در ابتدا به صورت قواعد شفاهی میان توسعه دهندگان اصلی پایتون وجود داشت و چندین سال بعد به طور اتفاقی توسط یکی از توسعه دهندگان اصلی پایتون "Tim Peters" در قالب شعر و طنز نوشته شد و در مستندات پایتون (PEP 20) نیز قرار گرفت. یکی از دلایل نوشتن این اصول زمانی بوجود آمد که حدادوا بیست سال قبل برنامهنویسان زیادی با اصول و ایدئولوژیهای مختلف از زبانهای دیگر به دنیای پایتون هجوم آوردند. اما این اصول و ایدهها با اساس طراحی پایتون در تضاد بود، و همین علت باعث شد اصول طراحی پایتون در چهارچوب این بیست قانون نوشته شود و برنامهنویسان را با اصول برنامهنویسی و طراحی این زبان آشنا سازد. در ادامه به توضیح این اصول پرداخته شده:
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
"Zen of Python" مجموعهای از بیست اصل است که طراحی زبان برنامه نویسی پایتون بر مبنای آن صورت گرفته. این اصول به دو مفهوم اصلی "خوانایی" و "سادگی" تأکید دارند.
این اصول در ابتدا به صورت قواعد شفاهی میان توسعه دهندگان اصلی پایتون وجود داشت و چندین سال بعد به طور اتفاقی توسط یکی از توسعه دهندگان اصلی پایتون "Tim Peters" در قالب شعر و طنز نوشته شد و در مستندات پایتون (PEP 20) نیز قرار گرفت. یکی از دلایل نوشتن این اصول زمانی بوجود آمد که حدادوا بیست سال قبل برنامهنویسان زیادی با اصول و ایدئولوژیهای مختلف از زبانهای دیگر به دنیای پایتون هجوم آوردند. اما این اصول و ایدهها با اساس طراحی پایتون در تضاد بود، و همین علت باعث شد اصول طراحی پایتون در چهارچوب این بیست قانون نوشته شود و برنامهنویسان را با اصول برنامهنویسی و طراحی این زبان آشنا سازد. در ادامه به توضیح این اصول پرداخته شده:
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
• زیبایی بهتر از زشتی است
مثال بارز از رعایت این اصل را در سینتکس پایتون مشاهده میکنیم و در زمان نوشتن کد نیز باید به آن توجه شود. با توجه به اینکه هر فرد میتواند تعریف متفاوتی از زیبایی داشته باشد، یک الگوی زیبایی که مورد قبول همه واقع شود وجود ندارد، اما پایبندی به یک الگوی مشخص بهبود ظاهر کد را به دنبال دارد.
• وضاحت بهتر از ابهام است
کد باید اهداف و مقاصد خود را به وضاحت و صراحت بیان کند و از هرگونه پیچیدگی و ابهام در نوشتن کد خودداری گردد. نوشتن کامنت، داک استرینگ، تعریف تایپ، استفاده از اسمهای مناسب و پیروی از یک الگوی مشخص به وضاحت کد افزوده میشود.
در این مثال، نامگذاری مناسب تابع و پارامتر ها به وضوح هدف تابع را نشان میدهد. اضافه کردن داک استرینگ و تعریف تایپ برای پارامتر ها و خروجی نیز باعث وضاحت بیشتر خواهد شد.
• سادگی بهتر از پیچیدگی و پیچیدگی بهتر از بهم ریختگی است
روشهای ساده بیشتر اوقات بهتر و سودمندتر هستند و باید بجای روشهای پیچیده استفاده شوند. اما بعضی موضوعات اساساً پیچیده هستند و پیادهسازی آنها با روشی ساده امکانپذیر نیست. در این صورت، بهتر است این پیچیدگی با حفظ نظم پیادهسازی شوند تا از بهم ریختگی جلوگیری شود. نمونه بارز آن استفاده از list comprehension است که هرچند روشی پیچیده هستند اما مانع بهم ریختگی میشوند.
در این مثال، روش دوم از list comprehension استفاده کرده که باعث میشود کد کوتاهتر و خواناتر شود، در حالی که روش اول با استفاده از حلقه و شرطها بهم ریختگی بیشتری دارد و پیچیدهتر به نظر میرسد.
• مسطح و هموار بهتر از تو در تو است (تنها در این مورد 🙄)
نوشتن کد به صورت تو در تو باعث ناخوانا شدن برنامه میشود و بهتر است کدها تا حد امکان به صورت مسطح و کم عمق نوشته شوند.
• پراکندگی بهتر از تراکم است
در عین حال، نوشتن کد به صورت هموار و مسطح نباید باعث تراکم کد در یک خط شود و هر کد باید فضای کافی داشته باشد تا خوانایی و زیبایی کد حفظ شود.
• خوانایی مهم است
کدها باید به گونهای پیادهسازی شوند که دیگران به آسانی بتوانند آنها را بخوانند و درک کنند. به همین دلیل، سینتکس پایتون مشابه به زبان گفتاری انسان است. همچنین، پایبندی به اصول یادشده، مانند سادگی، وضاحت، و مسطح بودن کد، باعث افزایش خوانایی کد میشود.
• موارد خاص آنقدری خاص نیستند که قوانین را نقض کنند، اما سودمندی بر قوانین غلبه دارد!
در برنامهنویسی همیشه یک تعداد اصول و قوانین خاص وجود دارد که پیش آمدن موارد خاص نباید باعث نقض قوانین شود. هرچند بیش از حد اصولی بودن ممکن است همیشه سودمند نباشد. به عنوان یک مثال بارز از بیش از حد اصولی بودن میتوان به زبان برنامهنویسی جاوا اشاره کرد، پیروی دائم این زبان از اصول شی گرایی باعث شده است که پیادهسازی کوچکترین برنامهها نیز به مقدار زیادی از کد داشته باشند. به همین دلیل، نیاز است تعادل میان این دو اصل حفظ شود. بهترین رویکرد این است که به اصول پایبند باشیم، اما در همان زمان، سعی کنیم که سودمندی کد نیز در نظر گرفته شود. (پایبند به اصول باش اما تا زمانی که سودمنده 🤓☝️)
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
مثال بارز از رعایت این اصل را در سینتکس پایتون مشاهده میکنیم و در زمان نوشتن کد نیز باید به آن توجه شود. با توجه به اینکه هر فرد میتواند تعریف متفاوتی از زیبایی داشته باشد، یک الگوی زیبایی که مورد قبول همه واقع شود وجود ندارد، اما پایبندی به یک الگوی مشخص بهبود ظاهر کد را به دنبال دارد.
• وضاحت بهتر از ابهام است
کد باید اهداف و مقاصد خود را به وضاحت و صراحت بیان کند و از هرگونه پیچیدگی و ابهام در نوشتن کد خودداری گردد. نوشتن کامنت، داک استرینگ، تعریف تایپ، استفاده از اسمهای مناسب و پیروی از یک الگوی مشخص به وضاحت کد افزوده میشود.
python
# Implicit ❌
def area(l, w):
return l * w
# Explicit ✅
def calculate_rectangle_area(length, width):
return length * width
در این مثال، نامگذاری مناسب تابع و پارامتر ها به وضوح هدف تابع را نشان میدهد. اضافه کردن داک استرینگ و تعریف تایپ برای پارامتر ها و خروجی نیز باعث وضاحت بیشتر خواهد شد.
• سادگی بهتر از پیچیدگی و پیچیدگی بهتر از بهم ریختگی است
روشهای ساده بیشتر اوقات بهتر و سودمندتر هستند و باید بجای روشهای پیچیده استفاده شوند. اما بعضی موضوعات اساساً پیچیده هستند و پیادهسازی آنها با روشی ساده امکانپذیر نیست. در این صورت، بهتر است این پیچیدگی با حفظ نظم پیادهسازی شوند تا از بهم ریختگی جلوگیری شود. نمونه بارز آن استفاده از list comprehension است که هرچند روشی پیچیده هستند اما مانع بهم ریختگی میشوند.
python
# Complex ❌
result = []
for i in range(10):
if i % 2 == 0:
result.append(i)
# Complex but organized ✅️
result = [i for i in range(10) if i % 2 == 0]
در این مثال، روش دوم از list comprehension استفاده کرده که باعث میشود کد کوتاهتر و خواناتر شود، در حالی که روش اول با استفاده از حلقه و شرطها بهم ریختگی بیشتری دارد و پیچیدهتر به نظر میرسد.
• مسطح و هموار بهتر از تو در تو است (تنها در این مورد 🙄)
نوشتن کد به صورت تو در تو باعث ناخوانا شدن برنامه میشود و بهتر است کدها تا حد امکان به صورت مسطح و کم عمق نوشته شوند.
# Nested ❌
if x > 0:
if y > 0:
if z > 0:
...
# Flat ✅️
if x > 0 and y > 0 and z > 0:
...
• پراکندگی بهتر از تراکم است
در عین حال، نوشتن کد به صورت هموار و مسطح نباید باعث تراکم کد در یک خط شود و هر کد باید فضای کافی داشته باشد تا خوانایی و زیبایی کد حفظ شود.
# Dense ❌
if x > 0: print("Positive"); print("Check done")
# Sparse ✅️
if x > 0:
print("Positive")
print("Check done")
• خوانایی مهم است
کدها باید به گونهای پیادهسازی شوند که دیگران به آسانی بتوانند آنها را بخوانند و درک کنند. به همین دلیل، سینتکس پایتون مشابه به زبان گفتاری انسان است. همچنین، پایبندی به اصول یادشده، مانند سادگی، وضاحت، و مسطح بودن کد، باعث افزایش خوانایی کد میشود.
• موارد خاص آنقدری خاص نیستند که قوانین را نقض کنند، اما سودمندی بر قوانین غلبه دارد!
در برنامهنویسی همیشه یک تعداد اصول و قوانین خاص وجود دارد که پیش آمدن موارد خاص نباید باعث نقض قوانین شود. هرچند بیش از حد اصولی بودن ممکن است همیشه سودمند نباشد. به عنوان یک مثال بارز از بیش از حد اصولی بودن میتوان به زبان برنامهنویسی جاوا اشاره کرد، پیروی دائم این زبان از اصول شی گرایی باعث شده است که پیادهسازی کوچکترین برنامهها نیز به مقدار زیادی از کد داشته باشند. به همین دلیل، نیاز است تعادل میان این دو اصل حفظ شود. بهترین رویکرد این است که به اصول پایبند باشیم، اما در همان زمان، سعی کنیم که سودمندی کد نیز در نظر گرفته شود. (پایبند به اصول باش اما تا زمانی که سودمنده 🤓☝️)
🔖 #Python, #پایتون
👤 xin
💎 Channel: @DevelopixPython
• خطاها نباید نادیده گرفته شوند، مگر به صورت صریح و واضح!
خطاهای برنامه نیاز است به صورت صحیح مدیریت شوند. استفاده از 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
🔹 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 کار با داده های آماری در پایتون
توی این پست میخوایم ببینیم چجوری باید با داده های آماری داخل پایتون کار کرد. تو پایتون یه ماژول داخلی وجود داره به اسم 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