Ninja Learn | نینجا لرن
1.26K subscribers
96 photos
36 videos
11 files
307 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
Forwarded from 👾 Geek Engineers ([ Taha. Dostifam ])
⚠️ وقت همگی بخیر. مطلب مهمی رو باید باهاتون به اشتراک بزارم! ‼️

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

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

اگر کسی آینده نگر باشه و به امنیت خودش اهمیت بده سراغ این شرکت ها نمیره. چون ۹۹ درصد فیک هستن و اعتمادی بهشون نیست‌.

من طی این ۳ ماه امروز دومین شرکتی بود که با این شرایط باهاشون مواجه شدم... خیلی داستان جالبی است :)
شرکت اولی که باهاشون مصاحبه کردم ادعا داشت یه شرکت آمریکایی هست. مصاحبه تکنیکال رو قبول شدم. سر salary هم توافق کردیم. انگلیسی م اوکی بود. همه چی رو به خوبی پیش بردیم. تا اینکه رسیدیم به مرحله قرار داد و نوشتن رزومه! من سوال کردم ازشون که اگر چطور من رو جای به سنیور ۳۰ ساله با بیش از ۱۰ ها سال تجربه جا میزنید؟ من تنها ۱۷ سالمه و نرماله که چهره م سنمو به دقت نشون بده :)
با کمال تعجب گفتن هیچ مشکلی نیست... ما خودمون اوکی میکنیم.
بعدش گفتم مشکلی نیست. صدامو چیکار میکنید؟ گفتن اونم حل میکنیم نیازی به نگرانی نیست...
بعدش گفتم خب... با سرچ کردن چهره من تو گوگل به همه اطلاعات من تو اینترنت دسترسی دارند و خیلی سریع متوجه میشن که من ایرانی هستم!
همچنین لهجه و عدم اسپیکینگ slang و native هم به خوبی این رو نشون میده!

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

اما قضیه همینطوری تموم نشد. من با وکیل قانونی صحبت کردم و اطلاعات تخصصی ای رو باهاشون در میان گذاشتم. همچنین consequence هایی که برای من به ارمغان خواهد آورد.

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

به من گفتند با رییس شرکت جلسه ای برگذار میکنیم که کلا قضیه رو برات از نو clarify بکنیم.
رییس شرکت خودش توی تلگرام به من DM فرستاد (اشتباه اول).
خودش پیگیر موضوع شد.(اشتباه دوم).
پروفایلش رو توی گوگل سرچ کردم و به یه مقاله روانشناختی رسیدم که بنرش این اقا بود. هیچ اطلاعاتی راجب شخصی که ادعا داشت رییس اون شرکت هست پیدا نکردم. اسمش فیک بود. (اشتباه سوم).

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

و تمام.

این هم اضافه میکنم که یک CTO ایرانی داشتند. ادعای سنیوری میکرد :) گیت هاب فیک داشت همچنین. از کامیت ها ‌و محتوای ریپوزیتوری ها به خوبی میشد این رو متوجه شد.
همچنین از اسپیکینگ انگلیسی خوبی برخوردار نبود.
به من می‌گفتند انگلیسی صحبت کن. ولی این شخص که ایرانی بود ۷۰ درصد اوقات فارسی حرف میزد و معلوم بود که اسپیکینگ خوبی ندارد.

همه این اطلاعات رو ثبت و ضبط کردم. حتی interview هایی که رفتیم رو. اگر خواستید میتونم باهاتون به اشتراک بگزارم. که مبادا گیر این ادم ها بیوفتید... که تموم شدنش دست خداست :]

پ.ن : زیر همین پست اطلاعات حقوقی هم شیر میکنم باهاتون.

با تشکر.
طاها.
👍20
خب خب خب متاکلاس‌ها و متاپروگرامینگ در پایتون 🐍

خب امروز می‌خوام شما رو وارد یکی از موضوعات پیشرفته و البته خیلی جادویی پایتون کنم: متاکلاس‌ها و متاپروگرامینگ. می‌دونم که این موضوع ممکنه یکم گیج‌کننده به نظر برسه، ولی نگران چیزی نباشید؛ با مثال و توضیحات، قدم به قدم جلو می‌ریم تا ببینیم چطوری می‌تونیم رفتار کلاس‌ها رو در زمان ایجاد تغییر بدیم و کدامون رو به دلخواه تنظیم کنیم. این پست برگرفته از کتاب Fluent Python هست. که خوشبختانه تو کانال گذاشتم.

1⃣ متاکلاس‌ها چیه؟ 🧙‍♂️
ببینید، تو پایتون همه چیز یه آبجکت هست. حتی خود کلاس‌ها هم آبجکت هستن به عبارت ساده، وقتی شما یه کلاس تعریف می‌کنید، پایتون در واقع از یه متاکلاس (که به طور پیش‌فرض type هست) برای ساخت کلاس استفاده می‌کنه.

مثلاً:
>>> class MyClass: 
... pass
>>> type(MyClass)
<class 'type'>

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

2⃣ متاکلاس‌ها چطور کار می‌کنن؟ 🛠️
وقتی شما می‌نویسید:
class MyClass:
x = 42

پایتون مراحل زیر رو انجام می‌ده:

جمع‌آوری اطلاعات:
پایتون نام کلاس، کلاس‌های والد (bases) و یه دیکشنری از ویژگی‌ها و متدهای تعریف‌شده رو می‌گیره.

فراخوانی new متاکلاس:
حالا متاکلاس (مثلاً type یا یه متاکلاس سفارشی) متد new خودش رو صدا می‌کنه. این متد ورودی‌هایی مثل:
meta_cls: خود متاکلاس (مثل MyMeta)
cls_name: نام کلاس (مثلاً "MyClass")
bases: تاپل کلاس‌های والد (مثلاً (object,))
cls_dict: دیکشنری ویژگی‌ها و متدها

رو دریافت می‌کنه و قبل از اینکه کلاس نهایی ساخته بشه، شما می‌تونید این مقادیر رو تغییر بدید یا ویژگی‌های جدید اضافه کنید.

مثال ساده:
class MyMeta(type):
def __new__(meta_cls, cls_name, bases, cls_dict):
print(f"داریم کلاس {cls_name} رو می‌سازیم!")
return super().__new__(meta_cls, cls_name, bases, cls_dict)

class MyClass(metaclass=MyMeta):
pass

وقتی کلاس MyClass ساخته می‌شه،init__init__ متاکلاس اجرا می‌شه تا تنظیمات نهایی روی کلاس اعمال بشه.

بایند شدن نام کلاس:
در آخر، کلاس ساخته‌شده به نامش در فضای نام (namespace) متصل می‌شه.

3⃣ یه مثال جون دار تر: اجباری کردن داشتن متد save 🎯
فرض کنید می‌خواید هر کلاسی که می‌سازید، حتماً باید متدی به اسم save داشته باشه. می‌تونید این کار رو با متاکلاس انجام بدید:
class EnforceSaveMeta(type):
def __new__(meta_cls, cls_name, bases, cls_dict):
if "save" not in cls_dict:
raise TypeError(f"کلاس {cls_name} باید متد 'save' رو داشته باشه!")
return super().__new__(meta_cls, cls_name, bases, cls_dict)

class ValidModel(metaclass=EnforceSaveMeta):
def save(self):
print("مدل ذخیره می‌شود!")

# استفاده:
vm = ValidModel()
vm.save() # خروجی: مدل ذخیره می‌شود!

# اگر بخواهیم کلاس بدون متد save بسازیم، خطا می‌دهد:
class InvalidModel(metaclass=EnforceSaveMeta):
pass # این کلاس خطا می‌دهد!

اینجا متاکلاس EnforceSaveMeta قبل از ساخت کلاس، دیکشنری کلاس رو چک می‌کنه و اگه متد save پیدا نشه، خطای مناسب رو ارسال میکنه.

4⃣ آناتومی متاکلاس‌ها: نقش new و init 🔬

۴.۱ new متاکلاس‌ها
متد new متاکلاس مثل یه «فروشنده» عمل می‌کنه که قبل از اینکه کلاس ساخته بشه، همه چیز رو آماده می‌کنه. ورودی‌های این متد شامل:

‏meta_cls: خود متاکلاس
‏cls_name: نام کلاس جدید
‏bases: کلاس‌های والد
‏cls_dict: دیکشنری ویژگی‌ها و متدهای کلاس

شما می‌تونید در این متد تغییراتی اعمال کنید، مثلاً ویژگی‌های جدید اضافه کنید یا حتی فرمت دیکشنری رو تغییر بدید.

۴.۲ init متاکلاس‌ها
پس از ساخته‌شدن کلاس توسط new، متد init متاکلاس اجرا می‌شه تا تنظیمات نهایی روی کلاس اعمال بشه. در این متد، شما نمی‌توانید کلاس رو دوباره بسازید؛ فقط می‌تونید تنظیمات نهایی رو انجام بدید.

مثال:
پست بعد
👍81
class MetaLoggernew
def __new__(meta_cls, cls_name, bases, cls_dict):
print(f"داریم کلاس {cls_name} رو می‌سازیم!")
new super().__new__(meta_cls, cls_name, bases, clsinit

def __init__(cls, cls_name, bases, cls_dict):
print(f"کلاس {cls_name} ساخته شده و آماده استفاده است!")

initsuper().__init__(cls_name, bases, cls_dict)

class Example(metaclass=MetaLogger):
pass

# خروجی:
# داریم کلاس Example رو می‌سازیم!
# کلاس Example ساخته شده و آماده استفاده است

5⃣ مزایا و چالش‌های متاکلاس‌ها 💡⚠️
مزایا:
کنترل دقیق روی ساختار کلاس‌ها:
می‌توانید رفتار و ساختار کلاس‌ها رو به دلخواه تغییر بدید.
کاهش تکرار کد:
الگوها و قوانین مشترک رو در یک نقطه متمرکز می‌کنید.

ایجاد چارچوب‌های پیچیده:
برای ساخت فریمورک‌های پیشرفته (مثل Django یا SQLAlchemy) این تکنیک فوق‌العاده کاربردیه.

چالش‌ها:
پیچیدگی در درک:
متاکلاس‌ها مفهومی پیشرفته هستند و نیاز به زمان و تجربه برای درک کامل دارند.

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

استفاده بیش از حد:
همیشه باید از متاکلاس‌ها تنها در وقتایی استفاده کنید که واقعاً نیاز دارید؛ بعضی وقتی راه‌حل‌های ساده‌تر مانند دکوریتورها یا میکسین‌ها کفایت میکنن.

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

امید وارم مفید بوده باشه :)

#⃣ #python #programming



🥷 CHANNEL | GROUP
👍102
تو پستای بعدی بریم یکم درمورد دکوریتور ها دیپ شیم
🔥13👍5👌2
خب خب خب دکوریتورها (Decorators) در پایتون: تغییر رفتار توابع و کلاس‌ها 🐍

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

1⃣ دکوریتورها چیستند؟ 🤔
دکوریتورها در پایتون، توابع یا کلاس‌هایی هستن که مثل یه "بسته‌بندی" عمل می‌کنن. یعنی، شما یه تابع یا کلاس رو می‌گیرید، اون رو به یه دکوریتور می‌فرستید، دکوریتور رفتارش رو تغییر می‌ده (یا بهبود می‌بخشه) و نسخه تغییر یافته رو برمی‌گردونه.

مثال ساده:
def simple_decorator(func):
def wrapper(*args, **kwargs):
print("قبل از اجرای تابع")
result = func(*args, **kwargs)
print("بعد از اجرای تابع")
return result
return wrapper

@simple_decorator
def greet(name):
print(f"سلام، {name}!")

greet("علی")

اینجا دکوریتور simple_decorator قبل و بعد از اجرای تابع greet پیام چاپ می‌کنه. یعنی بدون اینکه کد اصلی تابع رو دست بزنیم، رفتارش تغییر پیدا می‌کنه.

2⃣ نحوه‌ی کارکرد دکوریتورها 🔧

🔻 دکوریتور به عنوان یک تابع
در واقع، دکوریتورها توی پایتون همون توابعی هستن که یه تابع یا کلاس رو به عنوان ورودی می‌گیرن و یه نسخه تغییر یافته برمی‌گردونن. وقتی از علامت @ استفاده می‌کنید، پایتون به طور خودکار این کار رو انجام می‌ده.

🔻 مراحل استفاده از دکوریتور:
تعریف دکوریتور:
دکوریتور یه تابعه که یه تابع ورودی می‌گیره و نسخه بهبود یافته یا تغییر یافته رو برمی‌گردونه.

اعمال دکوریتور:
با قرار دادن علامت @ قبل از تعریف تابع یا کلاس، دکوریتور روی اون اعمال می‌شه.

اجرای تابع دکوریتور:
وقتی تابع دکوریت شده فراخوانی می‌شه، اول تابع "بسته‌بندی" (wrapper) اجرا می‌شه و بعد تابع اصلی.

🔻 مثال دکوریتور بر روی کلاس
دکوریتورها فقط برای توابع نیستن؛ می‌تونن رفتار کلاس‌ها رو هم تغییر بدن. مثلاً:
def add_str(cls):
# افزودن یه متد برای نمایش
def __str__(self):
return f"{cls.__name__} با ویژگی‌ها: {self.__dict__}"
cls.__str__ = __str__
return cls

@add_str
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

p = Person("سارا", 28)
print(p) # خروجی: Person با ویژگی‌ها: {'name': 'سارا', 'age': 28}

اینجا دکوریتور add_str متد str
رو به کلاس Person اضافه می‌کنه، بدون اینکه کد داخل کلاس رو تغییر بده.

3⃣ مزایای استفاده از دکوریتورها
کنترل دقیق روی ساختار کد:
دکوریتورها به شما این امکان رو می‌دن تا بدون دست زدن به منطق اصلی تابع یا کلاس، رفتارشون رو تغییر بدید. این موضوع برای توسعه چارچوب‌های پیچیده خیلی مفیده.

اجرای الگوهای تکراری (DRY):
می‌تونید کدهای تکراری مثل ثبت رویدادها، اعتبارسنجی یا مدیریت استثناها رو توی یه مکان متمرکز کنید.

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

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

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

ترکیب با سایر مفاهیم:
استفاده همزمان از دکوریتورها با مفاهیم پیشرفته مثل متاکلاس‌ها یا توابع بازگشتی می‌تونه باعث پیچیدگی‌های اضافه بشه.

جمع‌بندی
دکوریتورها ابزار خیلی قدرتمندی در پایتون هستن که به شما امکان می‌دن رفتار توابع و کلاس‌ها رو بدون تغییر کد اصلی تغییر بدید. این قابلیت مخصوصاً توی پیاده‌سازی چارچوب‌های پیچیده و کنترل دقیق روی ساختار کد کاربرد زیادی داره. اگرچه درک اولیه‌ش ممکنه کمی سخت باشه، اما با تمرین و استفاده از مثال‌های عملی، دکوریتورها می‌تونن ابزار بسیار موثری برای بهبود و انعطاف‌پذیری کدتون باشن.

#⃣ #python #programming



🥷 CHANNEL | GROUP
14👍6👌2
خب این پست یه توضیح خلاصه و جمع و جور بود.
تو پست های بعدی وارد عمق این داستان میشیم
🔥10
Forwarded from 👾 Geek Engineers ([ Taha. Dostifam ])
Cyrus: A high-performance, statically-typed, manually memory-managed and procedural programming language empowered by GCCJIT. Made with Rust 🦀.

برای حمایت از ما میتونید توی گیت هاب ⭐️ بدید که خیلی به دیده شدنش توی explore گیت هاب کمک میکنه. همینطور اگر با دوستاتون شیر کنید خیلی خوشحال میشیم =) ❤️🤌🏿

Community:
@cyrus_lang

GitHub:
https://github.com/cyrus-lang/Cyrus-Lang
15👍1
شرمنده برای فعالیت کم.
در سفر هستم 👀
❤‍🔥185🔥2👌2
دلار ۹۰ هزار تومنی رو کجای دلمون بزاریم :)

هرچند توقعشو داشتم و احتمالا تا قبل عید ۱۰۰ تومنو رد میکنه. (مردم کاری از دستشون برنمیاد)
💔28
سلام دوستان 👋

خب، خب، خب... همونطوری که می‌دونید (یا شاید هنوز نمی‌دونید 🌚)، همایش فرانت چپتر داره شروع می‌شه درسته که اسمش پیشوند "فرانت" داره، ولی خبر خوبش اینه که بچه‌های بک‌اند هم توش حضور دارن.

شخصاً کلی تعریفش رو شنیدم و به شدت پیشنهاد می‌کنم که شرکت کنید 🤩 (به فکر پیدا کردن کانکشن باشید بیشتر 🤫)

لینک ثبت‌نام ایونت 👇:
🔖 https://frontchapter.ir/event


راستی، یه کد تخفیف ۱۲۳,۰۰۰ تومنی هم براتون گرفتم 😁

کد تخفیف: ninjalearn

Enjoy ❤️

#⃣ #event



🥷 CHANNEL | GROUP
👌42👍1👎1
خب برگشتیم و به زودی با روال عادی پیش میریم 😁
🔥113
پیشنهادی دارید برای بهتر شدن فعالیت های کانال و کیفیت پست ها؟
4
بعضی دوستان پیشنهاد دادن که کانال ادمین داشته باشه برای تولید محتوای بیشتر.

دیدم ایده بدی نیست.
هرکسی که دوست داره تو کانال تولید محتوا بکنه، درمورد موضوع:
ساختمان داده ها

  یه پست بنویسه بفرسته به ایدی
@mohammad_strout
بررسی کنم (ساختار و کیفیتش مثل پستای خود کانال باشه)، بین کسایی که فرستادن یه نفر که بهتر بوده رو انتخاب میکنم ادمین کانال بشه و تو پستا کمک کنه.

#⃣ #notif



🥷 CHANNEL | GROUP
👌8👍2
خب خب خب پشت صحنه دکوریتورها در پایتون: چه اتفاقی پشت پرده می‌افته؟ 🚀

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

1⃣ پایتون چطوری کد رو اجرا می‌کنه؟ 📜
قبل از اینکه بریم سراغ دکوریتورها، یه نکته مهم:
پایتون یه زبان مفسریه، یعنی خط‌به‌خط کد رو اجرا می‌کنه. ولی قبل از اجرا، اول کد رو به بایت‌کد تبدیل می‌کنه و بعد اون رو می‌فرسته برای ماشین مجازی پایتون (PVM).
تو این فرآیند، هر تابع و کلاس یه آبجکت جداگانه توی حافظه می‌شه و همینجاست که دکوریتورها وارد عمل می‌شن 🚀

2⃣ دکوریتورها دقیقاً چیکار می‌کنن؟ 🔧

1⃣ وقتی @ می‌ذاریم، واقعاً چی می‌شه؟
وقتی یه تابع رو با @my_decorator دکوریت می‌کنیم، پایتون پشت صحنه این کارو انجام می‌ده:
@my_decorator
def func(...):
...

میشه این:
def func(...):
...

func = my_decorator(func)

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

2⃣ ترتیب اجرا چطوریه؟
وقتی دکوریتور روی تابع اعمال می‌شه:
تابع اصلی به عنوان یه آبجکت ساخته می‌شه.

دکوریتور اجرا می‌شه و تابع اصلی رو می‌گیره.

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

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

3⃣ چه بلایی سر تابع میاد؟ 🔍

1⃣ تابع اصلی تبدیل می‌شه به...
هر تابع تو پایتون یه آبجکته، پس دکوریتورها می‌تونن روش تغییرات زیادی بدن:
قبل از اجرا یه کار انجام بدن (مثلاً لاگ بگیرن).
تابع اصلی رو اجرا کنن.
بعد از اجرا هم یه کار دیگه انجام بدن (مثلاً خروجی رو دستکاری کنن).
یا حتی یه چیز کاملاً جدید برگردونن
در نتیجه، اسم تابع دیگه به اون چیزی که اول تعریف کردید اشاره نمی‌کنه، بلکه به خروجی دکوریتور اشاره داره.

2⃣ مشکل متادیتا و راه‌حل functools.wraps
یه مشکل اینه که دکوریتور باعث می‌شه اطلاعات تابع (مثل نام، توضیحات و...) از بین بره. برای حل این مشکل، باید از functools.wraps استفاده کنیم:
import functools

def log_calls(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"قبل از اجرای {func.__name__}")
result = func(*args, **kwargs)
print(f"بعد از اجرای {func.__name__}")
return result
return wrapper

اینطوری، متادیتای تابع اصلی حفظ می‌شه وdoc __doc__ دسترسی داشت. 😎

3⃣ دکوریتورهای پشت سر هم (Chaining Decorators)
اگه چندتا دکوریتور رو روی یه تابع بذاریم، ترتیبش مهمه. به این مثال دقت کن:
@decorator_a
@decorator_b
def func():
pass

اول decorator_b اجرا می‌شه و خروجی‌ش می‌ره تو decorator_a. پس ترتیب اجرا به این شکله:
func = decorator_b(func)

func = decorator_a(func)


پس، دکوریتوری که پایین‌تر نوشته شده، زودتر اجرا می‌شه 🔄

4⃣ پشت صحنه در زمان کامپایل و اجرا 🕒

1⃣ دکوریتور کی اجرا می‌شه؟
دکوریتورها همون موقعی که تابع یا کلاس تعریف می‌شه اجرا می‌شن، نه وقتی که تابع رو صدا می‌زنید. پس این کد:
@my_decorator
def my_func():
pass

در لحظه‌ای که پایتون به این خط کد می‌رسه، my_decorator(my_func) اجرا می‌شه و خروجی‌ش جایگزین my_func می‌شه.

2⃣ ذخیره تابع در فضای نام (Namespace Binding)
بعد از این فرآیند، اسم تابع به تابع دکوریت‌شده اشاره می‌کنه. پس اگه تابع اصلی رو نگه نداشته باشید، دیگه بهش دسترسی ندارید

3⃣ تأثیر روی بهینه‌سازی
چون دکوریتورها می‌تونن کد تابع رو تغییر بدن، ممکنه باعث بشن که بهینه‌سازی‌هایی که پایتون انجام می‌ده، دیگه درست کار نکنه. برای مثال، اگه دکوریتور یه حلقه اضافه کنه یا اجرای تابع رو تغییر بده، بایت‌کد نهایی کاملاً متفاوت می‌شه.

5⃣ نکات مهم که باید رعایت کنید 💡

از functools.wraps استفاده کنید
اگه دکوریتورتون متادیتای تابع رو تغییر می‌ده، این کار باعث می‌شه اطلاعات تابع اصلی حفظ بشه.

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

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

#⃣ #python #programming



🥷 CHANNEL | GROUP
14👍6🔥3👎1👏1👌1
Title not found

#⃣ #fun



🥷 CHANNEL | GROUP
💔20👍2
This media is not supported in your browser
VIEW IN TELEGRAM
4
خب سلام دوستان رسیدیم به ساختمان داده ها؛ ساختار هایی که برای مدیریت داده ها خیلی کاربردی ان💡

همونطور که میدونید، داخل برنامه هامون نیاز داریم داده ها را به صورتی ذخیره و مدیریت کنیم که پردازش سریعتر و مصرف حافظه بهینه تر بشه.
به طور مثال میخوایم کاربران یک اپلیکیشن را مدیریت کنیم یا مسیرهای کوتاه تر بین دو شهر را در نقشه پیدا کنیم!
🔸اینجا ساختار مناسب خیلی میتونه مفید باشه!
🔍 ساختمان داده چه کاربردی داره؟
🔸کاهش زمان عملیات ها (مثل جستجو، افزودن یا حذف داده)
🔸بهینه سازی مصرف حافظه (ذخیره هوشمندانه داده ها بدون اتلاف فضا)

🧱 چند نوع ساختمان داده داریم؟
به طور کلی به دو دسته تقسیم میشه:

1️⃣ ساختارهای اولیه (Primitive Data Types)
🔸پایه ای ترین نوع ذخیره داده ها مثل int ، float ، char و boolean
این تایپ ها تشکیل دهنده پایه ساختمان داده های پیچیده تر هستن!


2️⃣ ساختارهای غیراولیه (Non-Primitive)
🔸برای مدیریت مجموعه های بزرگ و پیچیده داده ها استفاده میشن و عمدتا به دو گروه تقسیم میشن:

1️⃣ ساختارهای خطی (Linear):
🔸داده ها به صورت ترتیبی چیده میشن مثل: آرایه (Array)، پشته (Stack)، صف (Queue)، لیست پیوندی (Linked List).
و از کاربرد هاشون میشه به مدیریت صف پیامها، ذخیره اطلاعات کاربران به ترتیب ثبتنام اشاره کرد.


2️⃣ ساختارهای غیرخطی (Non-Linear):
🔸داده ها به صورت سلسله مراتبی یا شبکه ای ذخیره میشن و از نمونه هاشون میشه به درخت (Tree)، گراف (Graph)، جدول هش (Hash Table) اشاره کرد
و نمونه کاربرد هاشون هم پیدا کردن کوتاه ترین مسیر در نقشه (با گراف)، جستجوی سریع در دیکشنری (با درخت دودویی) هست.


در پستهای آینده، هر یک از این ساختارها رو
ببیشتر بررسی میکنیم 🚀
اگر سوالی یا پیشنهادی دارید خوشحال میشم کامنت بگذارید! 💬

#️⃣ #data_structure #programming



🥷 CHANNEL | GROUP
👍106