Telegram Web Link
اگر یک برنامه نویس پایتون هستید احتمالا زیاد شنیدید که پایتون بدرد ساخت نرم افزار های گرافیکی نمیخوره و بهتره که از زبان های دیگه مثل ++C و یا #C استفاده بشه!
در بین IDE هایی که روزانه ازشون استفاده میکنیم احتمالا اسم Spyder به گوشتون خورده. افرادی که در حوزه ی هوش مصنوعی و یا Data Science مشغول هستند اسم این نرم افزار محبوب رو زیاد شنیدن و یا حتما ازش زیاد استفاده کردن و یا استفاده میکنن. بطور کلی این نرم افزار یک IDE قدرتمند و Cross-Platform عه که برای حوزه های هوش مصنوعی و Data science طراحی شده است.

💢 از قابلیت های این نرم افزار میشه به :
• پشتیبانی از چندین IPython Console
• دارا بودن یک Profiler برای گرفتن benchmark از کد
• دارا بودن یک history از هر دستوری که در هر Console زده میشه
• قابلیت نصب پلاگین
و ... اشاره کرد

📣 نکته ای که وجود داره اینه که این نرم افزار با استفاده از PyQt و PySide طراحی و ساخته شده یعنی یک نرم افزار که با پایتون برای پایتون ایجاد شده 8)

Website : https://www.spyder-ide.org/

Spyder in github : https://github.com/spyder-ide/spyder
This media is not supported in your browser
VIEW IN TELEGRAM
☁️ دامنه ابری
دامنه ابری ایده ایست برای شکستن انحصار دامنه های سنتی که توسط آیکان ثبت می شود و رایگان نیست.

اما در پای ابر شما می توانید دامنه ابری ثبت نمایید به صورت کاملا رایگان؛ فقط کافیست لینک یک دامنه قبلی یا آی پی اون هاست مورد نظر را روی آن تنظیم نمایید

🖥 فعلا این فناوری در پای ابر موجود است و امنیت فوق العاده بالایی دارد

✒️ در ضمن این دامنه ها در پای ابر هر کس برای آن شخص قابل تغییر است و انحصار طلبی را بسیار پایین می آورد

به طور مثال:
🔗 abr://pyabr.ir
دامنه پای ابر است که به آی پی سرور پای ابر تبدیل می شود.
🔰 @PSFarsi
🔰 @PyFarsi
آیا کلمه کلیدی del آبجکت رو پاک میکند ؟

متاسفانه با یه سرچ سریع میشه دید که خیلی از وبسایت ها یا مقالات نوشتن که del باعث پاک شدن آبجکت میشه. ولی در حقیقت اصلا اینطور نیست. پاک شدن آبجکت کار del نیست. توی پایتون دوتا mechanism هست برای از بین بردن آبجکت هایی که دیگه نیازشون نداریم:
1- Reference counting
2- Garbage collector
اولی میگه اگر تعداد رفرنس هایی که به یک آبجکت هستن به صفر برسه اون آبجکت پاک میشه.
دومی وقتی وارد عمل میشه که ما circular reference یا self reference داشته باشیم که اولی میگه دوتا آبجکت به هم دیگه reference داشته باشن دومی میگه یه آبجکت که نقش container و بازی میکنه یه رفرنس به خودش داشته باشه. تو این حالت هیچوقت reference به صفر نمیرسه در نتیجه آبجکت با reference counting پاک نمیشه. اینجا garbage collector میاد وسط.

حالا del چیکار میکنه ؟ فقط میاد اون اسم رو پاک میکنه! گفته بودیم متغیر ها اسم ها یا سیمبل هایی هستن که اشاره میکنن به یه آبجکتی توی مموری. یک رفرنس هستن!

برای تستش بریم درباره داندر del صحبت کنیم. این متد هیچ ربطی به کلمه کلیدی del نداره. این متد زمانی call میشه که آبجکت داره از بین میره! بهش finalizer میگن(destructor خیلی واژه صحیحی نیست). این رو پیاده سازی میکنیم تا بفهمیم کی آبجکت از بین رفت.

همونطور که تو عکس میبینید:
http://www.upsara.com/images/j708789_.png

- تو cell شماره ۲ تنها رفرنس به آبجکت ساخته شده obj هست پس با del کردنش آبجکت هم پاک میشه.
- تو cell شماره ۴ ولی نشد چرا ؟ چون علاوه بر خودش یه رفرنس هم داخل لیست داشت.
- شما برای کم کردن رفرنس یه آبجکت میتونید متغیرش رو به یه آبجکت دیگه assign کنید. الان اگه cell شماره ۷ رو ببینید، دقیقا همون کاری و کرده که del داشته میکرده. تنها فرقش اینکه با زدن del دیگه اون name عه obj موجود نیست.
- خارج شدن از scope یه فاکشن هم یه رفرنس کم میکنه ازش. توی cell شماره ۸ چون آبجکت اون تو ساخته شده بوده و تنها رفرنس بوده بعد از اتمام فانکشن آبجکت delete میشه.
با متد getrefcount از ماژول sys میتونید تعداد رفرنس های به یه آبجکت رو ببینید.
This media is not supported in your browser
VIEW IN TELEGRAM
دوستان عزیزی که مایل هستند استک دومی را شروع کنند بعد یا در کنار پایتون می توانند از زبان گولنگ شروع کنند که خیلی زبان ساده و کاربردی و دارای بازار درآمدی خوب می‌باشد.

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

https://www.tg-me.com/GolangEngineer
✔️ تا حالا حتما عباراتی همچون
- call by reference
- call by value
و ... چنین عباراتی که نحوه و انواع پاس داده شدن متغیرها و ... توی زبان‌های برنامه نویسی رو بیان میکنن، شنیدید؛ و ممکنه براتون سوال شده باشه که آیا چنین چیزایی توی پایتون هم داریم؟ اگه داریم عملکرد‌شون چیه؟

پاسخ کوتاه: خیر اینارو نداریم :)
پاسخ بلند:

📺 https://youtu.be/_AEJHKGk9ns

آقای ند بچلدر (Ned Batchelder) از بزرگای پایتون.
Twitter: @nedbat

نویسنده و maintainer عه: لایبرری بسیار حقِ coverage.py
Twitter: @coveragepy


©@PyFarsi
✔️ در پایتون 3.11 چه میگذرد؟

آنتونی شاو سخنرانی عمیقی در مورد چیزهای جدید در پایتون ۳.۱۱ ارائه کرده و تغییرات مهمش رو برشمرده؛ همچنین پیشنهادات حرفه‌ای هم در مورد optimization داده 😁

https://www.youtube.com/watch?v=kJMyomV0S50&t=60s


©@PyFarsi
خروجی کد بالا چیست ؟
Anonymous Quiz
13%
5
47%
15
17%
(15, 5)
23%
SyntaxError
بنیاد پایتون کاران فارسی
خروجی کد بالا چیست؟
سلام دوستان وقتتون بخیر بریم سراغ جواب اصلی این سوال
خب ما یه تابع داریم که سه تا پارامتر داره یکیش یک آرایه یا همون لیست عه و دوتای دیگه max و min ان که به صورت پیش فرض None هستن
داخل این تابع ما دوتا lambda function تعریف کردیم به نام های min_check و max_check
این تابع در نهایت بر اساس اون دوتا lambda function یسری چیزارو بررسی میکنه و بعد یک لیست رو return میکنه
حالا بریم سراغ اون بخشی که ما اومدیم و تابع رو call کردیم و یک لیست و یک مقدار بهش دادیم
خب اون لیست میاد جای array قرار میگیره
اون مقدار 4 ام میاد جای پارامتر min قرار میگیره
تابع ما اول میره سراغ اون قسمتی که داره یک لیست return میشه
ما تو این لیست که به صورت comprehension ام نوشته شده گفتیم بیا داخل اون پارامتر array پیمایش کن و تمام آیتماش رو به لیست مون اضافه کن حالا بر چه اساسی اضافه کن؟
بر اساس اون دوتا lambda function ها
خب اون دوتا lambda function ها چی میگن؟
داخل list comprehension ای که داره داخل تابع return میشه ما گفتیم که

if min_check(value) and max_check(value)

یعنی اگه چیزی که هر دوی این توابع return میکنن True بود بیا اون value ای که داخل array پیمایش شده رو به لیست اضافه کن
————
*. نکته .*
تو پایتون داشتیم که برای بررسی True بودن یک شرط و یا یک result یا ... ما میتونیم به این صورت ام بنویسیم :
if True:
# do something
# or
n = True
if n:
# do something
————
خب داخل اون قسمتی که ما تابع رو call کردیم بعد از لیست، اون عدد 4 میاد به جای min قرار میگیره و از اینجا دیگه اون min ما، None نیست!
و چون max هیچ آرگومانی نگرفته None باقی میمونه و چیزی که بر میگردونه True هست (طبق شرطی که براش داخل تابع max_check تعریف شده) پس ما باید بریم سراغ min_check
تابع min_check میاد بررسی میکنه و میگه حالا که پارامتر min دیگه None نیست بیا چک کن (تو قسمت else) که چه آیتمایی از اون array ما بزرگتر یا مساوی min هستن (اون min در واقع به عنوان یک عدد پایه در نظر گرفته میشه و باید اعداد بزرگتر از min به لیست اضافه بشه همینطور برعکسش اگه max مقدار داشت، باید آیتمای کوچیکتر ازش به لیست اضافه بشه)
هر کدوم که بزرگتر یا مساوی بودن به لیست ما اضافه کن و در نهایت چیزی که return میشه اینه :
[4, 5, 6]

>>> array = [1, 2, 3, 4, 5, 6]
>>> min = 4
>>> min_check = lambda value: True if min is None else (value >= min)

# 1 >= 4 => False
# 2 >= 4 => False
# 3 >= 4 => False
# 4 >= 4 => True
# 5 >= 4 => True
# 6 >= 4 => True
This media is not supported in your browser
VIEW IN TELEGRAM
☄️ وصل شدن از طریق SSH به سرور لینوکسی

🔥 خوب همونطور که تونستیم به سرور لینوکسی خودمون با استفاده از ssh متصل بشیم و دستورات مورد نظر رو توی سرور وارد کنیم و خروجی دستورات رو مشاهده کنیم.

🔥 اگر بخوایم به یک سرور وصل بشیم از متد connect راحت استفاده می‌کنیم و اگر بخوایم مثلا صدتا سرور بدیم که ابزار چک کنه و هرکدوم تونست وصل بشه یک سری دستورات توی سرور به طور خودکار انجام بده، از متد auto_checker استفاده می‌کنیم.

♨️ یوزر و پسورد و سرور بهش بدین کرک کنه 😁 میتونید به سلیقه خودتون پیشرفته ترش کنید.

آدرس گپ :
🔰 www.tg-me.com/PyFarsi

آدرس کانال :
🔰 @PSFarsi
Organize Python code like a PRO 🐍📦

پروژه‌تون رو مثل یک حرفه‌ای ساختاربندی و مرتب کنید.

از اونجایی که پایتون یک زبان خیلی منعطف هست (مثل جاوا نیست که وقتی یه فایل جاوا درست میکنید باید یه کلاسِ پابلیک به همون اسم داخلش باشه) شما این اجازه رو دارید که کل کد یک پروژه رو توی یک فایل، و یا هر تابع رو توی یک فایل جدا بنویسید 😑🥴

با این مقاله یاد بگیرید که چگونه پروژه‌تون رو درست ساختار بندی کنید.

https://guicommits.com/organize-python-code-like-a-pro/


©@PyFarsi
✔️ سوال.

بهترین راه برای فهمیدن اینکه یه آبجکت hashable هست، چیه؟!

جوابتون رو کامنت کنید.
پاسخش رو فردا میگذارم.


©@PyFarsi
خب شاید پیش خودتون بگید، آبجکتی که داندر hash داشته باشه حتما hashable عه دیگه، این داندر رو داره و جوابتون این باشه:

o = obj
if hasattr(o, '__hash__'):
print(f"{o} is hashable")

اما خیر 😁

اول یه چیز پایه‌ای بگیم.
کلاس آبجکت object پایه‌ای ترین base class در پایتونه و اینکه میگن همه‌چیز در پایتون آبجکته، یکی از دلیلاش اینه. هر چیزی که فکرش رو بکنید از object ارث می‌بره.

این کلاس کلی داندر متد داره و از قضا دو تا داندر که در این مطلب برای ما مهم هستن رو هم با هم داره

داندر eq -> برای چک کردن تساوی دو تا آبجکت
obj1 == obj2
داندر hash -> برای برگرداندن مقدار hash آبجکت که از تابع hash میگیریم
hash(obj)

وقتی یک کلاسی شما می‌نویسید:
class Spam:
pass

این کلاس به طور خودکار از کلاس آبجکت ارث می‌بره که تبعا داندر متد‌ها براش resolve میشن، که یعنی، ارث‌‌شون میبره، یا اینکه میگرده توی کلاس object پیدا شون میکنه.

نکته‌ی داندر eq
رفتار پیش‌فرض داندر eq به این صورته که میان آیدی‌های دو آبجکت رو باهم مقایسه میکنه. یعنی اگه اون رو override نکرده باشید و بخواید آبجکت‌هاتون رو با هم مقایسه کنید، وقتی جواب True میگیرید که دو تا آبجکت در واقع یک آبجکت باشن. دقیقا همون کاری که is انجام میده.

s1 = s2 = Spam()
s1 == s2 -> True

اما شاید چنین رفتاری رو نخواید و جور دیگه‌ای بخوایید که آبجکت‌های شما تساوی‌شون چک بشه
خب میاید داندر eq رو جوری که میخواید اورراید میکنید

اما 😁

وقتی این کار رو کردید، اتفاقی که میوفته اینه که مقدار داندر hash شما None میشه و آبجکت شما دیگه hashable نیست
این یعنی دیگه نمی‌تونید توی دیکشنری و ست بذاریدش و ....

این در حالیه که آبجکت شما همچنان داندر hash داره ولی hashable نیست.

این توضیحات میشن دلیل اینکه چرا اون شرط باگ داره.

اما راه‌حل چیه؟
خب شاید بیاید بگید بجای اینکه چک کنیم هست، چک میکنیم که None نباشه

if o.__hash__ is not None:
...

این تا حدی مشکل رو حل میکنه اما از اونجایی که پایتون یه زبان به شدت داینامیک عه:

class Spam:
def __eq__ ...

Spam.hash = "Gotcha, Im neither hashable nor None =)"

پس بهترین راه‌حل چیه؟
It is easier to ask forgiveness than permission

try:
hash(o)
except TypeError:
print("unhashable")
else:
print("hashable")

اما یه سوال بی جواب میمونه!
بالاتر گفتیم اگه داندر eq رو اورراید کنیم آبجکت ما دیگه hashable نیست و توی ست و دیکشنری نمی‌تونیم استفاده کنیم. من میخوام اون ور اورراید کنم و بازم hashable باشه 😒😒

خب جوابش ساده‌ست

شما باید داندر hash رو هم اورراید کنید و یه مقدار int برگردونید

نکته‌ای که هست و باید بهش توجه داشته باشید اینه که باید بتونید یه عددی تولید کنید که تکراری شدنش سخت باشه (اگه تکراری بشه اشکالی نداره) و به ویژگی‌های آبجکت شما وابسته هم باشه (حتما قرار نیست به ویژگی‌هاش وابسته باشه، اما اگه باشه، اون نکته‌ی قبلی راحت‌تر بدست میاد)

برای مثال
class Spam:
def __init__(self, name):
self.name = name

def __eq__(self):
....

def __hash__(self):
return hash(self.name)

تبعا شما اسامی مختلفی قراره به هر آبجکت که از Spam درست میکنید بدید، و این باعث میشه که hash هر بار فرق کنه

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

به این حالت که هش یکسانه ولی آبجکتا یکی نیستن، میگن hash collision. که پایتون خودش این رو هندل میکنه
و بحثش در این مقال "دیگر 😮‍💨" نمیگنجد.

موفق باشید 😁✌️
2025/07/07 21:13:09
Back to Top
HTML Embed Code: