یکی از خفن ترین تغییراتی که زبان پایتون ورژن 3.8 داشت معرفی اپراتور walrus یا «دونقطه مساوی» یا := بوده. با این اپراتور میتونیم به متغیر مقداری تخصیص بدیم و دقیقا همونجا هم ازش استفاده کنیم. یه نمونه استفادهاش رو ببینید
والروس (walrus) اسم یه حیوانه، اونی که دندوناش بلنده:فُک
والروس (walrus) اسم یه حیوانه، اونی که دندوناش بلنده:فُک
python courses
یکی از خفن ترین تغییراتی که زبان پایتون ورژن 3.8 داشت معرفی اپراتور walrus یا «دونقطه مساوی» یا := بوده. با این اپراتور میتونیم به متغیر مقداری تخصیص بدیم و دقیقا همونجا هم ازش استفاده کنیم. یه نمونه استفادهاش رو ببینید والروس (walrus) اسم یه حیوانه،…
حالتی ک تا الان استفاده میکردیم
python courses
یکی از خفن ترین تغییراتی که زبان پایتون ورژن 3.8 داشت معرفی اپراتور walrus یا «دونقطه مساوی» یا := بوده. با این اپراتور میتونیم به متغیر مقداری تخصیص بدیم و دقیقا همونجا هم ازش استفاده کنیم. یه نمونه استفادهاش رو ببینید والروس (walrus) اسم یه حیوانه،…
حالتی که از 3.8 ب بعد استفاده میکنیم:)
علامت @ در پایتون برای تعریف دکوراتور قبل تابع و کلاس استفاده میشه. ولی یه جای دیگه هم @ میتونه استفاده بشه: به عنوان یک عملگر باینری (مثل جمع و ضرب و ...) و اسمش هم برای «ضرب ماتریسی» رزرو شده.
حالا ما خودمون میتونیم کلاس «یه چیزی» رو بنویسیم و براش matmul تعریف کنیم
حالا ما خودمون میتونیم کلاس «یه چیزی» رو بنویسیم و براش matmul تعریف کنیم
در زبان #پایتون برای هر کلاسی به صورت پیشفرض امکان ساختن attribute به صورت دینامیک وجود داره. از طرفی باعث میشه استفاده از حافظه بره بالا.
میتونیم با slots جلوی ساخته شدن اتریبیوتها به صورت دینامیک را بگیریم. تفاوتش را ببینید:
میتونیم با slots جلوی ساخته شدن اتریبیوتها به صورت دینامیک را بگیریم. تفاوتش را ببینید:
python courses
Photo
ولی داستان چیه که #پایتون میتونه به صورت دینامیک اتریبیوت اضافه کنه؟
جوابش به همون dict مربوط میشه ولی بیاین مرحله به مرحله چک کنیم ببینیم چه اتفاقی میافته
👇
جوابش به همون dict مربوط میشه ولی بیاین مرحله به مرحله چک کنیم ببینیم چه اتفاقی میافته
👇
python courses
ولی داستان چیه که #پایتون میتونه به صورت دینامیک اتریبیوت اضافه کنه؟ جوابش به همون dict مربوط میشه ولی بیاین مرحله به مرحله چک کنیم ببینیم چه اتفاقی میافته 👇
۱. مثلا آبجکت whatever را فرض کنید که dict هم داره.
۲. حالا ما از whatever می پرسیم whatever.folan مقدارش چیه
۳. در واقع ما با نوشتن whatever.folan داریم متد getattr از whatever را صدا میزنیم و folan تبدیل میشه به رشته "folan" اینجوری:
whatever.__getattr__("folan")
۴. بعد getattrمیره سراغ dict خودش ببینه کلید "folan"تعریف شده یا نه. یعنی این شکلی:
self.__dict__["folan"]
۵. مقدارش رو ریترن میکنه.
۲. حالا ما از whatever می پرسیم whatever.folan مقدارش چیه
۳. در واقع ما با نوشتن whatever.folan داریم متد getattr از whatever را صدا میزنیم و folan تبدیل میشه به رشته "folan" اینجوری:
whatever.__getattr__("folan")
۴. بعد getattrمیره سراغ dict خودش ببینه کلید "folan"تعریف شده یا نه. یعنی این شکلی:
self.__dict__["folan"]
۵. مقدارش رو ریترن میکنه.
python courses
۱. مثلا آبجکت whatever را فرض کنید که dict هم داره. ۲. حالا ما از whatever می پرسیم whatever.folan مقدارش چیه ۳. در واقع ما با نوشتن whatever.folan داریم متد getattr از whatever را صدا میزنیم و folan تبدیل میشه به رشته "folan" اینجوری: whatever.__getattr__("folan")…
موقع ست کردن هم اینجوری میشه:
۱. مقدار ست میشه
whatever.folan = "ye chizi"
۲. متد setattr صدا زده میشه ولی یه آرگومان بیشتر داره چون باید مقدار value را هم بگیره. منظور از value هر چیزیه که سمت راست علامت مساوی نوشتیم.
whatever.__setattr__("folan", "ye chizi")
۳. بعدش هم که کلید دیکشنری اگه وجود نداشته باشه اضافه میشه و اگه وجود داشت، مقدارش (value) آپدیت میشه
self.__dict__["folan"] = "ye chizi"
۱. مقدار ست میشه
whatever.folan = "ye chizi"
۲. متد setattr صدا زده میشه ولی یه آرگومان بیشتر داره چون باید مقدار value را هم بگیره. منظور از value هر چیزیه که سمت راست علامت مساوی نوشتیم.
whatever.__setattr__("folan", "ye chizi")
۳. بعدش هم که کلید دیکشنری اگه وجود نداشته باشه اضافه میشه و اگه وجود داشت، مقدارش (value) آپدیت میشه
self.__dict__["folan"] = "ye chizi"
بهتره توی کدهای پایتون، به تایپها هم توجه کنیم
حالا یه سوال:
اگر بخواهیم type hint را برای تابع lambda به کار ببریم، روش پیاده سازی چطور خواهد بود؟
با توجه به اینکه علامت کالن «:» در تعریف lambda معنای خاصی داره و نمیتونیم مثل def برای تعریف تایپ ازش استفاده کنیم.
جواب: 👇
حالا یه سوال:
اگر بخواهیم type hint را برای تابع lambda به کار ببریم، روش پیاده سازی چطور خواهد بود؟
با توجه به اینکه علامت کالن «:» در تعریف lambda معنای خاصی داره و نمیتونیم مثل def برای تعریف تایپ ازش استفاده کنیم.
جواب: 👇
تصویر پایین، تعریف یک تابع در زبان #پایتون رو نشون میده.
ولی داستان اون آرگومانهای عجیب و غریب اسلش «/» یا ستاره «*» چیه؟
ولی داستان اون آرگومانهای عجیب و غریب اسلش «/» یا ستاره «*» چیه؟
اگه از #پایتون ورژن 3.8 و یا بالاتر استفاده میکنید، میتونید تابعها را این جوری هم تعریف کنید
هر چیزی قبل اسلش «/» بیاد، positional argument شناخته میشه. یعنی نمیتونم موقع callکردن تابع از آرگومانهای کمتری استفاده کنم. و از طرفی، اجازه هم ندارم از keyword استفاده کنم
هر چیزی قبل اسلش «/» بیاد، positional argument شناخته میشه. یعنی نمیتونم موقع callکردن تابع از آرگومانهای کمتری استفاده کنم. و از طرفی، اجازه هم ندارم از keyword استفاده کنم
بعد «/» هر چی بنویسیم، میتونه هم positional استفاده بشه هم با اسم یا کلید واژه (به صورت keyword). کاملا اختیاری هست.
ولی این حالت اختیاری بودنش تا زمانی ادامه پیدا میکنه که برسیم به آرگومان «*» از اون جا به بعد داستان فرق میکنه و «باید» از آرگومان keyword استفاده کنیم
ولی این حالت اختیاری بودنش تا زمانی ادامه پیدا میکنه که برسیم به آرگومان «*» از اون جا به بعد داستان فرق میکنه و «باید» از آرگومان keyword استفاده کنیم