https://youtu.be/suATPK45sjk
از چندین توسعه دهنده خفن و تکلید میپرسن که پندی که دارن چیه. واقعا نکتههای خفنی گفتن حتماااا ببینید
#vid_per_day
@TorhamDevCH
از چندین توسعه دهنده خفن و تکلید میپرسن که پندی که دارن چیه. واقعا نکتههای خفنی گفتن حتماااا ببینید
#vid_per_day
@TorhamDevCH
YouTube
How to Become a Great Software Developer — Best Advice from Top-Notch Engineers
👉 Check our documentary "Beyond The Success Of Kotlin: https://youtu.be/E8CtE7qTb-Q
👉 Integrate GitHub Copilot and ChatGPT into your daily work for streamlined, efficient development.
https://aw.club/global/en/courses/ai-supported-software-engineering
Leverage…
👉 Integrate GitHub Copilot and ChatGPT into your daily work for streamlined, efficient development.
https://aw.club/global/en/courses/ai-supported-software-engineering
Leverage…
👍3❤1🖕1
همجا گیتهاب شده کوپایلت.
البته ابزار خوبیه. چند وقتی پک گیتهاب گرفتم و از کوپایلت استفاده میکنم کمک میکنه سریعتر کد پیش ببری. بعدا دربارش مینویسم.
@TorhamDevCH
البته ابزار خوبیه. چند وقتی پک گیتهاب گرفتم و از کوپایلت استفاده میکنم کمک میکنه سریعتر کد پیش ببری. بعدا دربارش مینویسم.
@TorhamDevCH
❤2🖕1
Forwarded from BenDev
👍56💔5🖕2
Forwarded from جادی | Jadi
به نظر میرسه اپل قراره با پرداخت یکمیلیارد دلار در سال، از جمنای گوگل برای هوش مصنوعی سیری استفاده کنه. چیزی که واقعا جالبه اینه که اپل ظاهراً پذیرفته که فعلا توان رقابت در این حوزه رو نداره و باید برای داشتن این قابلیتها، از رقیب سنتیاش سرویس بخره.
#اپل #گوگل #خبر
#اپل #گوگل #خبر
❤5👌3🖕1
فرق بین repr و str در پایتون.
سوال اصلی میتونه این باشه که repr کارش چیه و str کارش چیه؟
زمانی که شما دانر repr رو مینوسید باید یک هدف داشته باشید. خروجی repr باید unambiguous باشه. یا فارسیش بدون ابهام، روشن یا صریح باشه.
برای مثال
درست هست و
اشتباه. این در صورتی که MyClass ورودی int دریافت میکنه در نتیجه داندر repr اش باید نشون بده که این ورودیها int هستند نه چیز دیگری.
به عبارت دیگه اگر کسی eval را روی خروجی repr شما اجرا کنه باید بدون خطا اجرا بشه و یک اون کلاس رو بسازه. حالا دقیقا لازم نیست همین چیزی که دارید بسازه ولی باید بدون خطا یک instanse از اون کلاس رو بسازه. به زبان کد:
اما هدف str چیه؟ هدفش خوانایی هستن و قرار نیست بی ابهام یا صریح و شفاف باشه. مثلا اگر کلاس شما برای ساخت به ip به همراه subnet نیاز داره لازم نیست حتما داخل str هم سابنت رو هم قرار بدید و میتونید خلاصه کنید و ip خالی بزارید.
دانر str برای دیدن یوزر هست نه برنامه نویس. در نتیجه چیزهای اضافه رو میتونید پاک کنید.
نکته مهم: اگر قرار یکی از این ۲ دانر رو توسعه بدید همیشه repr رو توسعه بدید چرا که اگر str صدا زده بشه روی آبجکت شما و وجود نداشته باشه به عنوان fallback بعدش repr صدا زده میشه.
تمام اینها رو میتونید با detail بیشتر در کتاب fluent پایتون یا سوال استکاورفلو زیر بخونید. استکاورفلو توصیه میکنم حتما بخونید.
https://stackoverflow.com/questions/1436703/what-is-the-difference-between-str-and-repr
@TorhamDevCH 😳
سوال اصلی میتونه این باشه که repr کارش چیه و str کارش چیه؟
زمانی که شما دانر repr رو مینوسید باید یک هدف داشته باشید. خروجی repr باید unambiguous باشه. یا فارسیش بدون ابهام، روشن یا صریح باشه.
برای مثال
MyClass(1, 2)
درست هست و
MyClass("1", "2")اشتباه. این در صورتی که MyClass ورودی int دریافت میکنه در نتیجه داندر repr اش باید نشون بده که این ورودیها int هستند نه چیز دیگری.
به عبارت دیگه اگر کسی eval را روی خروجی repr شما اجرا کنه باید بدون خطا اجرا بشه و یک اون کلاس رو بسازه. حالا دقیقا لازم نیست همین چیزی که دارید بسازه ولی باید بدون خطا یک instanse از اون کلاس رو بسازه. به زبان کد:
eval(repr(c))==c
اما هدف str چیه؟ هدفش خوانایی هستن و قرار نیست بی ابهام یا صریح و شفاف باشه. مثلا اگر کلاس شما برای ساخت به ip به همراه subnet نیاز داره لازم نیست حتما داخل str هم سابنت رو هم قرار بدید و میتونید خلاصه کنید و ip خالی بزارید.
دانر str برای دیدن یوزر هست نه برنامه نویس. در نتیجه چیزهای اضافه رو میتونید پاک کنید.
نکته مهم: اگر قرار یکی از این ۲ دانر رو توسعه بدید همیشه repr رو توسعه بدید چرا که اگر str صدا زده بشه روی آبجکت شما و وجود نداشته باشه به عنوان fallback بعدش repr صدا زده میشه.
تمام اینها رو میتونید با detail بیشتر در کتاب fluent پایتون یا سوال استکاورفلو زیر بخونید. استکاورفلو توصیه میکنم حتما بخونید.
https://stackoverflow.com/questions/1436703/what-is-the-difference-between-str-and-repr
@TorhamDevCH 😳
Stack Overflow
What is the difference between __str__ and __repr__?
What is the difference between __str__ and __repr__ in Python?
👍12🖕4❤3
یک نکته مهم که باید همیشه رعایت کنید این هست که "شما باید بیشتر dunder متدها رو توسعه بدید بهجای اینکه صدا بزنیدشون"
یعنی چی؟ یعنی شما نباید
صدا بزنید باید str(myobj) صدا بزنید. شما باید خود
توسعه بدید.
تنها داندر متدی که قالبا صدا زده میشه init هست.
به عبارت دیگه. داندر متدها باید توسط مفسر خود پایتون صدا زده بشن نه خود شما.
@TorhamDevCH 😳
یعنی چی؟ یعنی شما نباید
myobj.__str__()
صدا بزنید باید str(myobj) صدا بزنید. شما باید خود
__str__
توسعه بدید.
تنها داندر متدی که قالبا صدا زده میشه init هست.
به عبارت دیگه. داندر متدها باید توسط مفسر خود پایتون صدا زده بشن نه خود شما.
@TorhamDevCH 😳
👍9🖕4
چه زمانی خوبه از .fortmat استفاده کنید و چه زمانی از f-string ؟
در تمام مواقع خوبه که از f-string استفاده کنید. مگر اینکه string شما قرار بعدا مقدار دهی بشه. مثلا اگر یک متن پیامک چند خطی دارید که از فایل کانفیگ خونده میشه اونجا خوبه که از .format و ٪ ها استفاده کنید. به غیر از این بهتره که f-string استفاده کنید. چون بسیار خواناتر هست و کد تمیز تری در نهایت خواهید داشت.
@TorhamDevCH 😳
در تمام مواقع خوبه که از f-string استفاده کنید. مگر اینکه string شما قرار بعدا مقدار دهی بشه. مثلا اگر یک متن پیامک چند خطی دارید که از فایل کانفیگ خونده میشه اونجا خوبه که از .format و ٪ ها استفاده کنید. به غیر از این بهتره که f-string استفاده کنید. چون بسیار خواناتر هست و کد تمیز تری در نهایت خواهید داشت.
@TorhamDevCH 😳
👍10🖕4🔥1
TorhamDev | تورهام 😳 pinned «فرق بین repr و str در پایتون. سوال اصلی میتونه این باشه که repr کارش چیه و str کارش چیه؟ زمانی که شما دانر repr رو مینوسید باید یک هدف داشته باشید. خروجی repr باید unambiguous باشه. یا فارسیش بدون ابهام، روشن یا صریح باشه. برای مثال MyClass(1, 2) درست…»
اگه شما هم هر بار بعد از آپدیت #دبیان به مشکل درایور انویدیا میخورید راه حلش این سه تا کامند. حداقل چندباری که برای من اتفاق افتاده همین بوده.
در نهایت هم میتونید با این کامند چک کنید که کار میکنه یا نه.
@TorhamDevCH 😳
sudo apt update
sudo apt install linux-headers-$(uname -r)
sudo dkms autoinstall
sudo modprobe nvidia
در نهایت هم میتونید با این کامند چک کنید که کار میکنه یا نه.
nvidia-smi
@TorhamDevCH 😳
❤5🖕1
این چند روز گذشته رو داشتم رو این پروژه کار میکردم. کارش ساده است یک habit tracker یا شاید هم میشه گفت todo list تحت ترمیناله. کدش کامل کامل نیست. یکدور باید ریفکتور بشه و دوتا بخش دیگه اش کامل بشه. ولی الان قابل استفاده است. اگه دلتون خواست میتونید مشارک کنید و help page اضافه کنید یا کد رو ریفکتور کنید.
https://github.com/TorhamDev/Ablaze
@TorhamDevCH
https://github.com/TorhamDev/Ablaze
@TorhamDevCH
1👍9🔥2👎1
TorhamDev | تورهام 😳
این چند روز گذشته رو داشتم رو این پروژه کار میکردم. کارش ساده است یک habit tracker یا شاید هم میشه گفت todo list تحت ترمیناله. کدش کامل کامل نیست. یکدور باید ریفکتور بشه و دوتا بخش دیگه اش کامل بشه. ولی الان قابل استفاده است. اگه دلتون خواست میتونید مشارک…
برای دیتابیسش از duckDB استفاده کردم. یک دیتابیس که مثل sqlite داخل یک فایل ساده است. دلیل استفاده هم این بود که قرار یکسری لاگ ذخیره کنم که json هستش و sqlite جیسون هندل نمیکنه.
https://duckdb.org/
https://duckdb.org/
DuckDB
An in-process SQL OLAP database management system
DuckDB is an in-process SQL OLAP database management system. Simple, feature-rich, fast & open source.
1👍6🔥2❤1
Forwarded from جادی | Jadi
https://youtube.com/shorts/RDEjHeHmciQ?feature=share
یکی از منابع رنج روزمره ما اینه که یادمون میره انسان هستیم و برای یاد گرفتن زمان خاصی نیازه، برای جابجا شدن زمان خاصی نیازه، برای آرامش زمان لازمه، برای خوردن زمان لازمه و ... ما درگیر چیزی به اسم «تله بهرهوری» میشیم و برامون تکرار می شه که می تونیم سریع و سریعتر باشیم و رنج بیشتری می کشیم و اتفاقا هر چقدر بیشتر می دویم، کمتر جلو می ریم. قدم های دقیق و پیوسته ما رو به جاهای بهتری می رسونن.
یکی از منابع رنج روزمره ما اینه که یادمون میره انسان هستیم و برای یاد گرفتن زمان خاصی نیازه، برای جابجا شدن زمان خاصی نیازه، برای آرامش زمان لازمه، برای خوردن زمان لازمه و ... ما درگیر چیزی به اسم «تله بهرهوری» میشیم و برامون تکرار می شه که می تونیم سریع و سریعتر باشیم و رنج بیشتری می کشیم و اتفاقا هر چقدر بیشتر می دویم، کمتر جلو می ریم. قدم های دقیق و پیوسته ما رو به جاهای بهتری می رسونن.
YouTube
قدم های آروم و دقیق و پیوسته ما رو به جای بهتری میرسونن تا دویدن بی و سر ته؛ گپی در باب زمان
یکی از منابع رنج روزمره ما اینه که یادمون میره انسان هستیم و برای یاد گرفتن زمان خاصی نیازه، برای جابجا شدن زمان خاصی نیازه، برای آرامش زمان لازمه، برای خور...
❤6🔥1
رفتار پایتون برای بررسی Truthy یا Falsy بودن آبجکتها.
در پایتون، تمام آبجکتها یا truthy هستند یا falsy یعنی اگر روی آبجکت x بیاییم bool(x) صدا کنیم یا بهمون Trueمیده یا False
پس تمام آبجکتها در پایتون میتونن ماهیت صحیح یا غلط داشته باشند. اما پایتون چطور این رو تشخیص میده و ما چطور میتونیم کنترلش کنیم؟
در پایتون تمام آبجکتهایی که توسظ کاربر یا همون برنامهنویس ساخته میشه ماهیت صحیح یا truthy داره. در نتیجه اگر شما همچین کدی داشتی باشید خروجی پرینت True خواهد بود:
اما پایتون چطور این رفتار بررسی میکنه؟ مثل اکثر چیزهای دیگه در پایتون این رفتار توسط یک داندر متود ( متودهایی که با دوتا _ شروع و تموم میشند) کنترل میشه و اون متود bool هستش. در نتیجه اگر کلاس من این متد رو توسعه بده و خروجی False برگردونه کلاس من ماهیت false میگیره:
در نتیجه این رفتار با این متد میشه تغییر داد و کنترل کرد. اما یک نکته دیگه هم وجود داره. اگر کلاس شما داندر متود bool توسعه نداده باشه پایتون میاد از داندر متد len استفاده میکنه که وظیفه اش برگردوندن طول آبجکت هستد و خروجی یک int برمیگردونه. زمانی که شما bool(x) صدا بزنید پایتون اول سعی میکنه داندر متد bool صدا بزنه اما اگر این متد توسعه داده نشده بود داندر متد len صدا میزنه و اگر خروجی صفر بود اون آبجکت ماهیت false میگیره و اگر خروجی بزرگتر از صفر بود ماهیت true. برای مثال کلاس پایین ماهیت true داره:
@TorhamDevCH
در پایتون، تمام آبجکتها یا truthy هستند یا falsy یعنی اگر روی آبجکت x بیاییم bool(x) صدا کنیم یا بهمون Trueمیده یا False
پس تمام آبجکتها در پایتون میتونن ماهیت صحیح یا غلط داشته باشند. اما پایتون چطور این رو تشخیص میده و ما چطور میتونیم کنترلش کنیم؟
در پایتون تمام آبجکتهایی که توسظ کاربر یا همون برنامهنویس ساخته میشه ماهیت صحیح یا truthy داره. در نتیجه اگر شما همچین کدی داشتی باشید خروجی پرینت True خواهد بود:
class MyClass: ...
my_class = MyClass()
print(bool(my_class))
اما پایتون چطور این رفتار بررسی میکنه؟ مثل اکثر چیزهای دیگه در پایتون این رفتار توسط یک داندر متود ( متودهایی که با دوتا _ شروع و تموم میشند) کنترل میشه و اون متود bool هستش. در نتیجه اگر کلاس من این متد رو توسعه بده و خروجی False برگردونه کلاس من ماهیت false میگیره:
class FalsyClass:
def __bool__(self):
return False
falsy_class = FalsyClass()
print(bool(falsy_class))
در نتیجه این رفتار با این متد میشه تغییر داد و کنترل کرد. اما یک نکته دیگه هم وجود داره. اگر کلاس شما داندر متود bool توسعه نداده باشه پایتون میاد از داندر متد len استفاده میکنه که وظیفه اش برگردوندن طول آبجکت هستد و خروجی یک int برمیگردونه. زمانی که شما bool(x) صدا بزنید پایتون اول سعی میکنه داندر متد bool صدا بزنه اما اگر این متد توسعه داده نشده بود داندر متد len صدا میزنه و اگر خروجی صفر بود اون آبجکت ماهیت false میگیره و اگر خروجی بزرگتر از صفر بود ماهیت true. برای مثال کلاس پایین ماهیت true داره:
class TruthyClass:
def __len__(self):
return 1
truthy_class = TruthyClass()
print(bool(truthy_class))
@TorhamDevCH
❤15🤝4👎1🔥1
اسکوپ متغیرها در لیستکامپرهنشن.
لیست کامپرهنشن یا list comprehension یا گاهی listcomps یک سینکس خاص در پایتون هست که به شما اجازه میده در یک حلقه یک خطی یک لیست یا یک sequence بسازید. شیوه کار خود listcomp و برادر و خواهراش که تاپل و دیکشنری کامپرهنشن هستند یک پست جداست. تو این پست میخوام درباره scope متغیرهای یک comprehension بگم.
یک comprehension در پایتون اسکوپ خاص و لوکال خودش داره درست مثل یک فانکشن، در نتیجه اگر متغییری رو داخل این لیست کامپرهنشن بسازید اون متغییر بعد از اتمام اون کامپرهنشن دیگه وجود نداره. برای مثال:
output:
همون طوری که میبینید متغیر i دیگه وجود نداره و بعد از تمام شدن کامپرهنشن از بین میره. اما اگر بخوایید یک متغیر داشته باشیم که بعد از اتمام کامپرهنشن هنوز وجود داشته باشه باید چیکار کنیم؟ فرض کنید داخل همین مثال میخواییم همیشه آخرین کلمهای که داخل کامپرهنشن استفاده شده رو داشته باشیم.
توی همچین مواردی میتونید از walrus operator کمک بگیریم. با استفاده از walrus میتونیم یک متغییر خارج از اسکوپ لوکال اون کامپرهنشن قرار بدیم و بعد از اتمام اون خط کد هنوز بهش دسترسی داشته باشیم. که داخل مثال پایین کاربردش رو میبینید:
output:
همینطور که میبنید هم لیست کلمات رو ساختیم و هم آخرین کلمه رو داریم.
یک سری نکته درباره comprehenstionها که خوبه رعایت کنیم:
۱. اگر کامپرهشن شما بزرگتر از یک خط و یک حلقه شد شاید بهتر باشه اون رو به شکل یک حلقه ساده و سنتی بنویسید.
۲. اگر از لیست ساخته شده توسط کامپرهنشن استفاده نمیکنید بهتر از حلقه ساده استفاده کنید.
۳. در پایتون عباراتی که بین () [] {} میان میتونن به خطوط مختلف بدون استفاده از بکاسلش شکسته بشن، پس اگه لیست کامپرهنشن شما داشت بزرگ میشد و تصمیم گرفتید به یک لیست ساده تغییریش ندید میتونید اون رو خطهای متخلف بشکنید تا خوندنش راحت تر باشه.
@TorhamDevCH
لیست کامپرهنشن یا list comprehension یا گاهی listcomps یک سینکس خاص در پایتون هست که به شما اجازه میده در یک حلقه یک خطی یک لیست یا یک sequence بسازید. شیوه کار خود listcomp و برادر و خواهراش که تاپل و دیکشنری کامپرهنشن هستند یک پست جداست. تو این پست میخوام درباره scope متغیرهای یک comprehension بگم.
یک comprehension در پایتون اسکوپ خاص و لوکال خودش داره درست مثل یک فانکشن، در نتیجه اگر متغییری رو داخل این لیست کامپرهنشن بسازید اون متغییر بعد از اتمام اون کامپرهنشن دیگه وجود نداره. برای مثال:
words = "ABCDE"
words_list = [i for i in words]
print(words_list)
print(i)
output:
['A', 'B', 'C', 'D', 'E']
Traceback (most recent call last):
File "/home/torham/p/fluent_python/listcomps.py", line 6, in <module>
print(i)
^
NameError: name 'i' is not defined.
همون طوری که میبینید متغیر i دیگه وجود نداره و بعد از تمام شدن کامپرهنشن از بین میره. اما اگر بخوایید یک متغیر داشته باشیم که بعد از اتمام کامپرهنشن هنوز وجود داشته باشه باید چیکار کنیم؟ فرض کنید داخل همین مثال میخواییم همیشه آخرین کلمهای که داخل کامپرهنشن استفاده شده رو داشته باشیم.
توی همچین مواردی میتونید از walrus operator کمک بگیریم. با استفاده از walrus میتونیم یک متغییر خارج از اسکوپ لوکال اون کامپرهنشن قرار بدیم و بعد از اتمام اون خط کد هنوز بهش دسترسی داشته باشیم. که داخل مثال پایین کاربردش رو میبینید:
words = "ABCDE"
words_list = [last_word := i for i in words]
print(words_list)
print("last word >> ", last_word)
output:
['A', 'B', 'C', 'D', 'E']
last word >> E
همینطور که میبنید هم لیست کلمات رو ساختیم و هم آخرین کلمه رو داریم.
یک سری نکته درباره comprehenstionها که خوبه رعایت کنیم:
۱. اگر کامپرهشن شما بزرگتر از یک خط و یک حلقه شد شاید بهتر باشه اون رو به شکل یک حلقه ساده و سنتی بنویسید.
۲. اگر از لیست ساخته شده توسط کامپرهنشن استفاده نمیکنید بهتر از حلقه ساده استفاده کنید.
۳. در پایتون عباراتی که بین () [] {} میان میتونن به خطوط مختلف بدون استفاده از بکاسلش شکسته بشن، پس اگه لیست کامپرهنشن شما داشت بزرگ میشد و تصمیم گرفتید به یک لیست ساده تغییریش ندید میتونید اون رو خطهای متخلف بشکنید تا خوندنش راحت تر باشه.
@TorhamDevCH
👍7❤3🔥1
the _ variable in python
احتمالا تا الان حداقل یکبار متغیر ـ داخل کد کسی دیدید و براتون سوال شده که این چرا یک نفر باید از آندرلاین برای متغیر استفاده کنه؟ متغیر ـ یا dummy variable یک متغیر که برای چیزهایی استفاده میشه که لازمشون نداریم. مثلا در یک مصاحبه ما ۳ مقدار خروجی داریم ولی فقط دوتا اول لازم داریم:
اینطوری ما متغیر ۳ام رو omit کردیم یا انداختیمش دور.
اما احتمالا تا اینجای کار رو خیلیهاتون میدونستید. ولی بیایید به ۲ کاربرد دیگه این متغیر نگاهی بندازیم.
استفاده به عنوان wild card در match-case
اگر با match-case پایتون آشنا باشید میدونید که در آخر هر مچ-کیس شما از ـ استفاده میکنید تا مقدار دیفالت مشخص کنید که اگر هیچ کدوم از موارد مشخص شده نبود یک کار خاصی انجام بدید. اینجا در حقیقت ـ یک wild card که به همه چیز مچ میشه و برای شما رفتار دیفالت بودن رو ارمغان میاره D:
استفاده از این متغیر حتی جالب تر میشه زمانی که شما میتونید از اون داخل خود مچ-کیس استفاده کنید.
همینطور که میبینید در کیس اول *_ استفاده شده که در حقیقت گفته که ورودی باید یک لیست باشه که با کلمه "BEEP" شروع شده باشه. هرچیزی این وسط بود اشکال نداره ولی باید دوتا float در آخرش وجود داشته باشه. اینجا ما از _ به عنوان وایلد کارت استفاده کردیم و همچنین ورودی های اضافه و غیر ضروری دور ریختیم.
البته که شما میتونید به جای استفاده از ـ* از یک متغیر استفاده کنید و ورودیهاتون رو بگیرید:
و آخرین کاربرد این متغیر در کنسول پایتون هست. هر پردازشی که نتیجه ای غیر از None داشته باشه در نهایت داخل این متغیر ذخیره میشه. برای مثال:
@TorhamDevCH
احتمالا تا الان حداقل یکبار متغیر ـ داخل کد کسی دیدید و براتون سوال شده که این چرا یک نفر باید از آندرلاین برای متغیر استفاده کنه؟ متغیر ـ یا dummy variable یک متغیر که برای چیزهایی استفاده میشه که لازمشون نداریم. مثلا در یک مصاحبه ما ۳ مقدار خروجی داریم ولی فقط دوتا اول لازم داریم:
a, b, _ = complex_process_with_three_result()
اینطوری ما متغیر ۳ام رو omit کردیم یا انداختیمش دور.
اما احتمالا تا اینجای کار رو خیلیهاتون میدونستید. ولی بیایید به ۲ کاربرد دیگه این متغیر نگاهی بندازیم.
استفاده به عنوان wild card در match-case
اگر با match-case پایتون آشنا باشید میدونید که در آخر هر مچ-کیس شما از ـ استفاده میکنید تا مقدار دیفالت مشخص کنید که اگر هیچ کدوم از موارد مشخص شده نبود یک کار خاصی انجام بدید. اینجا در حقیقت ـ یک wild card که به همه چیز مچ میشه و برای شما رفتار دیفالت بودن رو ارمغان میاره D:
def handle_command(message):
match message:
case "BEEP":
print("BEEPED")
case "YELL":
print("YELLED")
case _:
print("invalid command.")
استفاده از این متغیر حتی جالب تر میشه زمانی که شما میتونید از اون داخل خود مچ-کیس استفاده کنید.
def handle_command(message):
match message:
case ["BEEP", *_, float(freq), float(time)]:
print(f"BEEPED FOR {freq} AND {time} long")
case ["NECK", angle]:
print(f"Rotated neck for {angle}")
case _:
print("invalid command.")
همینطور که میبینید در کیس اول *_ استفاده شده که در حقیقت گفته که ورودی باید یک لیست باشه که با کلمه "BEEP" شروع شده باشه. هرچیزی این وسط بود اشکال نداره ولی باید دوتا float در آخرش وجود داشته باشه. اینجا ما از _ به عنوان وایلد کارت استفاده کردیم و همچنین ورودی های اضافه و غیر ضروری دور ریختیم.
البته که شما میتونید به جای استفاده از ـ* از یک متغیر استفاده کنید و ورودیهاتون رو بگیرید:
def handle_command(message):
match message:
case ["BEEP", *extra_items, float(freq), float(time)]:
print(f"BEEPED FOR {freq} AND {time} long also extra items: {extra_items}")
case ["NECK", angle]:
print(f"Rotated neck for {angle}")
case _:
print("invalid command.")
handle_command(["BEEP", 23, 23, 23,"a", 2.1, 3.2])
و آخرین کاربرد این متغیر در کنسول پایتون هست. هر پردازشی که نتیجه ای غیر از None داشته باشه در نهایت داخل این متغیر ذخیره میشه. برای مثال:
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 + 4
7
>>> _
7
>>>
@TorhamDevCH
👍8❤2🔥1🖕1
تاپلها همیشه immutable نیستند!
قالب ما tupleها رو یک دیتااستراکچر immutable یا تغییر ناپذیر میشناسیم. immutable یعنی اگر یک تایپ ساخته بشه هیچ وقت قابل تغییر نخواهد بود.
یا تغریف دیکنشنری:
unchanging over time or unable to be changed.
در پایتون هم اگر شما یک tuple رو یک بار تعریف کنید دیگه قابل تغییر نیست. برای مثال:
خب پس تاپل غیر قابل تغییر. اما یک نکته مهم درباره غیر قابل تغییر بودن تاپل ها وجود داره و اونم اینه که با اینکه خود تاپل غیر قابل تغییر یا immutble هست محتوا داخل اون قابل تغییر D:
به این مثال دقت کنید:
همینطور که میبینید ما تونستیم محتوا لیستی که داخل این تاپل بود تغییر بدیم. پس اگر یک دیتا تایپ mutable داخل تاپل داشته باشیم تاپل ما میتونه تغییر کنه. اما سایز یا lenght تاپل هیچ وقت تغییر نمیکنه.
تمام اینها به یک نکته جالب میرسه. ما میدونیم تنها چیزهایی میتونن hash بشند در پایتون که غیر قابل تغییر باشن و تنها چیزهایی که میتونن hash بشند میتونن به عنوان کلید یک دیکشنری استفاده بشن. برای مثال:
اما اگر ما از یک mutable داخل این تایپل استفاده کنیم از اونجایی که این تاپیل حالا میتونه تغییر پیدا کنه قابل hash شدن نیست و در نتیجه نمیتونه به عنوان کلید دیکششنری استفاده بشه:
این نکته گاهی میتونه به slient bug برسه و یک جایی به مشکل بخوره D:
@TorhamDevCH
قالب ما tupleها رو یک دیتااستراکچر immutable یا تغییر ناپذیر میشناسیم. immutable یعنی اگر یک تایپ ساخته بشه هیچ وقت قابل تغییر نخواهد بود.
یا تغریف دیکنشنری:
unchanging over time or unable to be changed.
در پایتون هم اگر شما یک tuple رو یک بار تعریف کنید دیگه قابل تغییر نیست. برای مثال:
>>> a = (1, 2, 3)
>>> a[1]="new value"
Traceback (most recent call last):
File "<python-input-3>", line 1, in <module>
a[1]="new value"
~^^^
TypeError: 'tuple' object does not support item assignment
>>>
خب پس تاپل غیر قابل تغییر. اما یک نکته مهم درباره غیر قابل تغییر بودن تاپل ها وجود داره و اونم اینه که با اینکه خود تاپل غیر قابل تغییر یا immutble هست محتوا داخل اون قابل تغییر D:
به این مثال دقت کنید:
>>> a = (1, 2, ["first"])
>>> a
(1, 2, ['first'])
>>> a[2].append("second")
>>> a
(1, 2, ['first', 'second'])
>>>
همینطور که میبینید ما تونستیم محتوا لیستی که داخل این تاپل بود تغییر بدیم. پس اگر یک دیتا تایپ mutable داخل تاپل داشته باشیم تاپل ما میتونه تغییر کنه. اما سایز یا lenght تاپل هیچ وقت تغییر نمیکنه.
تمام اینها به یک نکته جالب میرسه. ما میدونیم تنها چیزهایی میتونن hash بشند در پایتون که غیر قابل تغییر باشن و تنها چیزهایی که میتونن hash بشند میتونن به عنوان کلید یک دیکشنری استفاده بشن. برای مثال:
>>> a = (1, 2)
>>> {a:"a as the key"}
{(1, 2): 'a as the key'}
>>>
اما اگر ما از یک mutable داخل این تایپل استفاده کنیم از اونجایی که این تاپیل حالا میتونه تغییر پیدا کنه قابل hash شدن نیست و در نتیجه نمیتونه به عنوان کلید دیکششنری استفاده بشه:
>>> a = (1, [2, 3])
>>> {a: "a as the key"}
Traceback (most recent call last):
File "<python-input-14>", line 1, in <module>
{a: "a as the key"}
TypeError: unhashable type: 'list'
>>>
این نکته گاهی میتونه به slient bug برسه و یک جایی به مشکل بخوره D:
@TorhamDevCH
❤10👍4🔥2🖕1