TorhamDev | تورهام 😳
2.82K subscribers
422 photos
49 videos
21 files
596 links
code, linux and anything related.

• YouTube
youtube.com/@techwithtori

• CodeNaline Podcast
@CodeNaline

• Group
@GothamProgrammers

• Github
github.com/TorhamDev

• Email
[email protected]
Download Telegram
اسکوپ متغیرها در لیست‌کامپرهنشن.

لیست کامپرهنشن یا 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
👍73🔥1
Forwarded from HICTE Blog (Hicte Bridge)
🌭13😁7😭2👍1👏1
the _ variable in python

احتمالا تا الان حداقل یکبار متغیر ـ داخل کد کسی دیدید و براتون سوال شده که این چرا یک نفر باید از آندرلاین برای متغیر استفاده کنه؟ متغیر ـ یا 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
👍82🔥1🖕1
تاپل‌ها همیشه immutable نیستند!


قالب ما 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
TorhamDev | تورهام 😳 pinned «تاپل‌ها همیشه immutable نیستند! قالب ما tupleها رو یک دیتااستراکچر immutable یا تغییر ناپذیر میشناسیم. immutable یعنی اگر یک تایپ ساخته بشه هیچ وقت قابل تغییر نخواهد بود. یا تغریف دیکنشنری: unchanging over time or unable to be changed. در پایتون هم اگر…»
بچه‌ها دوره ماشین‌لرنینگ خوب سراغ ندارید؟ دوره ای که دیده باشید و به نظرتون خیلی خوب بوده.
6👎2🖕2
now it's a challange for people 😭😭😭😭😭😭😭
🤣19🖕1
آزادی اینجا میوه ممنوعه‌است.
💔31👍5🤣3👎1🖕1
بعد از تقریبا ۱۲ روز تعداد اندکی از آدم‌ها تونستن وصل بشن، من هم با اینترنتی که معلوم نیست تا ثانیه‌ی دیگه وصل هست یا نه مینویسم.
آسیب وحشتناکی که به کسب و کارها و روان جامعه وارد شد و کسی اندکی دربارش ابراز ناراحتی‌هم نکرد. موج بزرگ تعدیل شرکت‌های فناوری در پایان سال به خاطر این خاموشی ارتباط در ایران که کسی براش ابراز ناراحتی نخواهد کرد. موج بزرگ مهاجرت که از همین‌الان شروع شده و آدم‌هایی که برای داشتن یکی از پایه‌ترین حقوق انسانی یعنی ارتباط از کشور و محل تولدشون مهاجرت میکنن که قطعا کسی براش مهم نخواهد بود.

قبلا میگفتیم به امید اینترنت آزاد، حالا باید گفت به امید ارتباط آزاد چون حالا حتی پیامک و تماس هم مدت طولانی گرفته شد.
👍143😭3💔1
۳ ساعت تا رسیدن به ۲۸۰ ساعت خاموشی اینترنت در ایران، یک ملت که از دنیای اینترنت حذف شدن.

ساعت شمار خاموشی اینترنت ایران:
etchamber.ir
البته باید این رو هم در نظر داشت باشیم که یکسری در این زمان قطعی کاملا وصل بودن، برخی از خبرگزاری‌های انتخابی و برخی از دانشگاه‌ها کشور. جالب بدونید در دورانی که کشور به اینترنت دسترسی نداشت و ملت ایران در خاموشی به سر میبردن دوستان در دانشگاه شریف با دانشگاه بغداد کنفرانس در بستر گوگل‌میت برگذار کردن در باب هوش مصنوعی!

میتونید خبر‌های کامل رو در این ویدیو از دیجیاتو ببینید:

https://aparat.com/v/baq2r1m
💔7👍3🖕3
TorhamDev | تورهام 😳 pinned «۳ ساعت تا رسیدن به ۲۸۰ ساعت خاموشی اینترنت در ایران، یک ملت که از دنیای اینترنت حذف شدن. ساعت شمار خاموشی اینترنت ایران: etchamber.ir»
خاموشی اینترنت ایران وارد ساعت ۳۰۰ام خودش شد!

https://etchamber.ir


یکسری خبر هم بوده که تا آخر هفته متصل میشه اما کدوم هفته کسی نمیدونه :)

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

حالا باید منتظر بمونیم آخر یکی از هفته‌ها وصل بشه ببینیم چی قرار اصلا وصل بشه :)
😭4
TorhamDev | تورهام 😳 pinned «خاموشی اینترنت ایران وارد ساعت ۳۰۰ام خودش شد! https://etchamber.ir یکسری خبر هم بوده که تا آخر هفته متصل میشه اما کدوم هفته کسی نمیدونه :) و همچنین خیلی‌ها معتقدند که اینترنت دیگر هیچ وقت به حالت قبل خاموشی برنخواهد گشت و محدودهای خیلی شدیدتر اعمال خواهد…»
۳۵۰ ساعت از خاموشی اینترنت ایران گذشت، پس از ۳۵۰ ساعت برخی وبسایت‌ها از محدودت خارج شده ان، این به معنا اتصال مجدد اینترنت ایران نیست بلکه صرفا برخی سایت‌های انتخابی باز شده ان.

پس ۳۵۰ ساعت هنوز هیچ خبر رسمی مبنی بر زمان اتصال اینترنت ایران منتشر نشده است.

ساعت شمار خاموشی اینترنت ایران:
https://etchamber.ir/
👍4