🔆تفاوت == و is در پایتون
🔹توی پایتون، عملگر == مقدار دو متغیر رو مقایسه میکنه؛ اما is بررسی میکنه که آیا هر دو متغیر دقیقاً به یک آبجکت در حافظه اشاره میکنن یا نه.
🔹 خروجی:
🔹 مقدار numbers1 و numbers2 یکسانه، پس نتیجهی == برابر True میشه؛ اما این دو لیست، آبجکتهای جداگانهای هستن، پس نتیجهی is برابر False میشه.
🔹برای مقایسهی معمولی مقادیر از == استفاده کن. کاربرد رایج و درست is، بررسی مقدار None عه:
🐍 @python_rd
🔹توی پایتون، عملگر == مقدار دو متغیر رو مقایسه میکنه؛ اما is بررسی میکنه که آیا هر دو متغیر دقیقاً به یک آبجکت در حافظه اشاره میکنن یا نه.
numbers1 = [1, 2, 3]
numbers2 = [1, 2, 3]
numbers3 = numbers1
print(numbers1 == numbers2)
print(numbers1 is numbers2)
print(numbers1 is numbers3)
🔹 خروجی:
True
False
True
🔹 مقدار numbers1 و numbers2 یکسانه، پس نتیجهی == برابر True میشه؛ اما این دو لیست، آبجکتهای جداگانهای هستن، پس نتیجهی is برابر False میشه.
🔹برای مقایسهی معمولی مقادیر از == استفاده کن. کاربرد رایج و درست is، بررسی مقدار None عه:
if result is None:
print("مقداری وجود ندارد")
🐍 @python_rd
🔥4❤1
🔆 جستجوی سریعتر با ترفند Set
🔹 چرا پایتون وقتی لیستهات بزرگ میشن کند میشه؟ چون وقتی مینویسی if item in my_list پایتون مجبوره از اولِ لیست تا اون آیتم رو دونه دونه بگرده، حالا اگه لیستت بزرگ باشه، فاجعهست! برای اینکه این مشکل رو حل کنی، لیستت رو به set تبدیل کن. توی ستها، پایتون از مکانیزم Hash استفاده میکنه و عملاً در زمان صفر پیداش میکنه. اینطوری:
🔹 تفاوتش فقط توی همین آکولاد {} هست، اما سرعت اجرای کدت رو وحشتناک میبره بالا. این یعنی کدِ بهینهتر بدون درگیریهای پیچیده.
🐍 @python_rd
🔹 چرا پایتون وقتی لیستهات بزرگ میشن کند میشه؟ چون وقتی مینویسی if item in my_list پایتون مجبوره از اولِ لیست تا اون آیتم رو دونه دونه بگرده، حالا اگه لیستت بزرگ باشه، فاجعهست! برای اینکه این مشکل رو حل کنی، لیستت رو به set تبدیل کن. توی ستها، پایتون از مکانیزم Hash استفاده میکنه و عملاً در زمان صفر پیداش میکنه. اینطوری:
# کد کند (جستجوی خطی)
search_list = [1, 2, 3, 4, 5, ...]
if 500 in search_list: # کلی زمان میبره
pass
# کد سریع (جستجوی هشی)
search_set = {1, 2, 3, 4, 5, ...}
if 500 in search_set: # در یک لحظه پیدا میکنه
pass
🔹 تفاوتش فقط توی همین آکولاد {} هست، اما سرعت اجرای کدت رو وحشتناک میبره بالا. این یعنی کدِ بهینهتر بدون درگیریهای پیچیده.
🐍 @python_rd
🔥3
🔆 قاتل N+1 در کوئریهای جنگو
🔹 بزرگترین اشتباه توی جنگو، کوئری زدن داخل حلقهست. تصور کن ۱۰۰ تا پست داری و میخوای اسم نویسنده هرکدوم رو چاپ کنی. اگه بنویسی
🔹همین تغییر کوچک، تعداد کوئریها رو از ۱۰۰ تا به فقط ۱ دونه کاهش میده و سرعت لود صفحه رو توی جنگو به کل تغییر میده.
🐍 @python_rd
🔹 بزرگترین اشتباه توی جنگو، کوئری زدن داخل حلقهست. تصور کن ۱۰۰ تا پست داری و میخوای اسم نویسنده هرکدوم رو چاپ کنی. اگه بنویسی
posts = Post.objects.all() و بعد توی حلقه صداش بزنی، جنگو برای هر پست یه کوئری جداگانه به دیتابیس میفرسته! این یعنی ۱۰۰ تا کوئری اضافه و مرگِ سرعت سایت. راه حلش select_related هست که همه رو توی یک کوئریِ "JOIN" میاره. اینطوری مثال بزنیم:# کد بد (تعداد زیادی کوئری به دیتابیس)
posts = Post.objects.all()
for post in posts:
print(post.author.name)
# کد بهینه (فقط ۱ کوئری به دیتابیس)
posts = Post.objects.select_related('author').all()
for post in posts:
print(post.author.name)
🔹همین تغییر کوچک، تعداد کوئریها رو از ۱۰۰ تا به فقط ۱ دونه کاهش میده و سرعت لود صفحه رو توی جنگو به کل تغییر میده.
🐍 @python_rd
❤4🔥1
🔆 تا حالا برای پیمایش همزمان دو لیست از
پایتون یه راه تمیزتر داره:
🔹با
🔹کد کمتر، خوانایی بیشتر، حرفهایتر.
🐍 @pyrhon_rd
range() استفاده کردی؟ پایتون یه راه تمیزتر داره:
zip()🔹با
zip میتونی آیتمهای دو لیست رو همزمان بگیری و کدت خیلی خواناتر بشه:names = ["Ali", "Sara", "Reza"]
scores = [18, 20, 15]
for name, score in zip(names, scores):
print(name, score)
🔹کد کمتر، خوانایی بیشتر، حرفهایتر.
🐍 @pyrhon_rd
🔥2👍1
🔆 معمولاً وقتی از تابع استاندارد
🔹این یعنی اگه یه دیتای مهم توی اون آیتمهای اضافی باشه، برنامه بدون اینکه هیچ خطایی بده، اون بخش رو حذف میکنه و ممکنه توی محاسباتت باگ عجیبی پیدا کنی که نفهمی از کجا اومده.
🔹استفاده از پارامتر
🔹این یه مثال ساده برای درک بهترش:
🔹به جای اینکه برنامت بیسروصدا غلط کار کنه، با این روش ترجیح میدی برنامه متوقف بشه تا بری و دیتای ناقص رو اصلاح کنی. این دقیقاً همون چیزیه که کدتو امنتر و قابلاطمینانتر میکنه.
🐍 @python_rd
zip استفاده میکنی، پایتون بدون هیچ اخطاری لیست کوتاهتر رو ملاک قرار میده و اضافههای لیست بلندتر رو کلاً نادیده میگیره.🔹این یعنی اگه یه دیتای مهم توی اون آیتمهای اضافی باشه، برنامه بدون اینکه هیچ خطایی بده، اون بخش رو حذف میکنه و ممکنه توی محاسباتت باگ عجیبی پیدا کنی که نفهمی از کجا اومده.
🔹استفاده از پارامتر
strict=True توی پایتون، مثل یه نگهبان سختگیر عمل میکنه و اگه طول لیستها با هم یکی نباشه، بلافاصله یه ValueError پرتاب میکنه تا همون لحظه متوجه بشی دیتات مشکل داره.🔹این یه مثال ساده برای درک بهترش:
# بدون strict: دادهی ۳۰ نادیده گرفته میشه و برنامه هیچی نمیگه
names = ['Ali', 'Reza']
ages = [20, 25, 30]
for n, a in zip(names, ages):
print(n, a)
# با strict: پایتون متوجه نابرابری میشه و ارور میده
# این کار کمک میکنه قبل از اینکه دیتای غلط پردازش بشه، متوقفش کنی
for n, a in zip(names, ages, strict=True):
print(n, a)
🔹به جای اینکه برنامت بیسروصدا غلط کار کنه، با این روش ترجیح میدی برنامه متوقف بشه تا بری و دیتای ناقص رو اصلاح کنی. این دقیقاً همون چیزیه که کدتو امنتر و قابلاطمینانتر میکنه.
🐍 @python_rd
👍1
🔆میدونستی
🔹یه قابلیت فوقالعاده کاربردی که خیلیها ازش غافل میمونن، استفاده از
🔹این یعنی دیگه نیازی به متغیرهای اضافه برای چک کردن پیدا شدن یا نشدن آیتمها نداری و کدت حسابی تمیز و حرفهای میشه.
🔹فرض کن یه لیست داری و میخوای ببینی عددی مثل ۵ توش هست یا نه. به جای تعریف کردن یه پرچم یا
🔹همونطور که میبینی، چون توی لیست خبری از ۵ نیست، پایتون بدون هیچ شرط اضافهای میفهمه که باید بره سراغ بلاک
🐍 @python_rd
else توی پایتون فقط مال if نیست؟🔹یه قابلیت فوقالعاده کاربردی که خیلیها ازش غافل میمونن، استفاده از
else بعد از حلقههای for یا while هست. این بلوک فقط و فقط زمانی اجرا میشه که حلقه به صورت کامل و عادی تموم بشه و با دستور break وسطش متوقف نشده باشه.🔹این یعنی دیگه نیازی به متغیرهای اضافه برای چک کردن پیدا شدن یا نشدن آیتمها نداری و کدت حسابی تمیز و حرفهای میشه.
🔹فرض کن یه لیست داری و میخوای ببینی عددی مثل ۵ توش هست یا نه. به جای تعریف کردن یه پرچم یا
flag، میتونی بنویسی که اگه حلقه تموم شد و خبری از عدد نبود، پیام «پیدا نشد» رو چاپ کنه.numbers = [1, 2, 3, 4]
for num in numbers:
if num == 5:
print("عدد ۵ پیدا شد!")
break
else:
print("عدد ۵ توی لیست وجود نداره.")
🔹همونطور که میبینی، چون توی لیست خبری از ۵ نیست، پایتون بدون هیچ شرط اضافهای میفهمه که باید بره سراغ بلاک
else و اون رو اجرا کنه.🐍 @python_rd
🔆 سه تا پروژه خیلی خفن پایتونی
🔹Virtual Steering
یعنی با حرکت دست بتونی فرمون ماشین رو توی بازی کنترل کنی، انگار یه فرمون مجازی جلوی دستته.
🔹 Virtual Portals
یه پروژه الهامگرفته از دکتر استرنج که با حرکات دست، پورتالهای مجازی میسازی.
🔹Virtual Keyboard & Mouse
یعنی کیبورد و مووس مجازی که برای تایپ و کنترل سیستم استفاده میشه.
🔹اگر بخوام خیلی ساده بگم، منظور از این پروژهها اینه که بهجای ابزارهای فیزیکی، با حرکت دست و بینایی ماشین میشه سیستم رو کنترل کرد.
🔹یعنی ترکیبی از پایتون، هوش مصنوعی و پردازش تصویر برای ساخت تجربههای تعاملی و آیندهمحور.
🐍 @python_rd
🔹Virtual Steering
یعنی با حرکت دست بتونی فرمون ماشین رو توی بازی کنترل کنی، انگار یه فرمون مجازی جلوی دستته.
🔹 Virtual Portals
یه پروژه الهامگرفته از دکتر استرنج که با حرکات دست، پورتالهای مجازی میسازی.
🔹Virtual Keyboard & Mouse
یعنی کیبورد و مووس مجازی که برای تایپ و کنترل سیستم استفاده میشه.
🔹اگر بخوام خیلی ساده بگم، منظور از این پروژهها اینه که بهجای ابزارهای فیزیکی، با حرکت دست و بینایی ماشین میشه سیستم رو کنترل کرد.
🔹یعنی ترکیبی از پایتون، هوش مصنوعی و پردازش تصویر برای ساخت تجربههای تعاملی و آیندهمحور.
🐍 @python_rd
👍1
🔹یه روش خیلی کاربردی توی پایتون اینه که بهجای چندتا شرط پشتسرهم، از دیکشنری برای مدیریت حالتها استفاده کنی.
🔹مثلاً وقتی قراره بر اساس نقش کاربر یه خروجی متفاوت بدی، بهجای if/elifهای زیاد میتونی نقشها رو داخل دیکشنری نگه داری.
🔹این کار هم کدت رو تمیزتر میکنه، هم توسعهدادنش راحتتره.
🐍 @python_rd
🔹مثلاً وقتی قراره بر اساس نقش کاربر یه خروجی متفاوت بدی، بهجای if/elifهای زیاد میتونی نقشها رو داخل دیکشنری نگه داری.
🔹این کار هم کدت رو تمیزتر میکنه، هم توسعهدادنش راحتتره.
roles = {
"admin": "full access",
"editor": "edit access",
"user": "read access"
}
user_role = "editor"
print(roles.get(user_role, "no access"))🐍 @python_rd
🔥2
🔆 یه نکته خیلی کاربردی دیگه اینه که توی شرطها لازم نیست همیشه بنویسی:
🔹میتونی خیلی تمیزتر بنویسی:
🔹 و برای حالت برعکس:
🔹 چون لیست خالی، رشته خالی، دیکشنری خالی و خیلی از آبجکتهای خالی در پایتون False محسوب میشن.
🐍 @python_rd
if len(items) == 0:
🔹میتونی خیلی تمیزتر بنویسی:
if not items:
🔹 و برای حالت برعکس:
if items:
🔹 چون لیست خالی، رشته خالی، دیکشنری خالی و خیلی از آبجکتهای خالی در پایتون False محسوب میشن.
🐍 @python_rd
👍9
🔆 یه منبع خوب برای تمرین پایتون
🔹 یه سر به Pynative.com بزن. این سایت بخش Python Exercises رو داره که تمرینهاش رو خیلی مرتب و موضوعی دستهبندی کرده؛ از Loops و Input/Output گرفته تا Functions و Lists.
🔹چیزی که این سایت رو کاربردیتر میکنه اینه که هر تمرین فقط یه صورتمسئله ساده نیست، بلکه توضیح کامل مسئله، ورودی و خروجی مورد انتظار، بخش Hint برای راهنمایی، و در نهایت Solution همراه با کد هم داره. همین باعث میشه برای کسایی که تازه دارن پایتون یاد میگیرن، یه منبع خیلی خوب برای تمرین عملی و تقویت مهارت برنامهنویسی باشه.
🐍 @python_rd
🔹 یه سر به Pynative.com بزن. این سایت بخش Python Exercises رو داره که تمرینهاش رو خیلی مرتب و موضوعی دستهبندی کرده؛ از Loops و Input/Output گرفته تا Functions و Lists.
🔹چیزی که این سایت رو کاربردیتر میکنه اینه که هر تمرین فقط یه صورتمسئله ساده نیست، بلکه توضیح کامل مسئله، ورودی و خروجی مورد انتظار، بخش Hint برای راهنمایی، و در نهایت Solution همراه با کد هم داره. همین باعث میشه برای کسایی که تازه دارن پایتون یاد میگیرن، یه منبع خیلی خوب برای تمرین عملی و تقویت مهارت برنامهنویسی باشه.
🐍 @python_rd
❤1
🔆 اعتبار سنجی تمیز داده ها در پایتون با Pydantic
🔹وقتی از کاربر داده میگیری، ممکنه مقدار اشتباه وارد بشه؛ مثلاً بهجای عدد، متن بفرسته یا یه فیلد ضروری رو جا بندازه. Pydantic دقیقاً برای همین ساخته شده؛ دادهها رو قبل از ورود به برنامه چک میکنه و اگر مشکلی باشه سریع خطا میده.
🔹توی این مثال، چون
🐍 @python_rd
🔹وقتی از کاربر داده میگیری، ممکنه مقدار اشتباه وارد بشه؛ مثلاً بهجای عدد، متن بفرسته یا یه فیلد ضروری رو جا بندازه. Pydantic دقیقاً برای همین ساخته شده؛ دادهها رو قبل از ورود به برنامه چک میکنه و اگر مشکلی باشه سریع خطا میده.
from pydantic import BaseModel, ValidationError
class User(BaseModel):
name: str
age: int
try:
user = User(name="Ali", age="twenty")
except ValidationError as e:
print(e)
🔹توی این مثال، چون
age باید عدد باشه ولی متن وارد شده، Pydantic خطا میده و جلوی ورود دادهی اشتباه رو میگیره. همین ویژگی باعث میشه توی FastAPI و پروژههای API خیلی پرکاربرد باشه.🐍 @python_rd
👍3
🔆چرا dataclass یکی از تمیزترین امکانات پایتونه؟
اگه توی پایتون کلی کلاس ساده مینویسی که فقط برای نگهداشتن دادهان، dataclass کارت رو راحت میکنه.
قبل از dataclass باید برای هر کلاس، کلی کد تکراری مینوشتی:
init
repr
eq
ولی با dataclass همون کلاس رو خیلی تمیز و کوتاه مینویسی:
🔹 پایتون خودش برات سازنده، نمایش شیء و مقایسه رو میسازه.
چرا خوبه؟
کد کمتر
خوانایی بیشتر
خطای کمتر
🔹مناسب برای مدلهای دادهای
اگر با کلاسهایی کار میکنی که فقط وظیفهشون نگهداری اطلاعاته، dataclass واقعاً یکی از بهترین انتخابهاست.
🐍 @python_rd
اگه توی پایتون کلی کلاس ساده مینویسی که فقط برای نگهداشتن دادهان، dataclass کارت رو راحت میکنه.
قبل از dataclass باید برای هر کلاس، کلی کد تکراری مینوشتی:
init
repr
eq
ولی با dataclass همون کلاس رو خیلی تمیز و کوتاه مینویسی:
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
🔹 پایتون خودش برات سازنده، نمایش شیء و مقایسه رو میسازه.
چرا خوبه؟
کد کمتر
خوانایی بیشتر
خطای کمتر
🔹مناسب برای مدلهای دادهای
اگر با کلاسهایی کار میکنی که فقط وظیفهشون نگهداری اطلاعاته، dataclass واقعاً یکی از بهترین انتخابهاست.
🐍 @python_rd
❤6💯1
🔆 توی پایتون
🔹خیلی وقتها ما با فایل، دیتابیس یا منابعی کار میکنیم که باید بعد از استفاده حتماً بسته یا آزاد بشن.
اینجا
مثلاً باز کردن فایل:
مزیتش چیه؟
- فایل بعد از تموم شدن کار، خودکار بسته میشه
- کد تمیزتر میشه
- احتمال فراموش کردن
مقایسه کن با این حالت:
اینجا اگر وسط کار خطا رخ بده، ممکنه فایل بسته نشه.
ولی
پس هر وقت با منبعی کار میکنی که باید حتماً تمیز جمع بشه،
🐍 @python_rd
with دقیقا چیکار میکنه؟🔹خیلی وقتها ما با فایل، دیتابیس یا منابعی کار میکنیم که باید بعد از استفاده حتماً بسته یا آزاد بشن.
اینجا
with به دردت میخوره.مثلاً باز کردن فایل:
with open("data.txt", "r") as file:
content = file.read()مزیتش چیه؟
- فایل بعد از تموم شدن کار، خودکار بسته میشه
- کد تمیزتر میشه
- احتمال فراموش کردن
close() از بین میرهمقایسه کن با این حالت:
file = open("data.txt", "r")
content = file.read()
file.close()اینجا اگر وسط کار خطا رخ بده، ممکنه فایل بسته نشه.
ولی
with این مشکل رو خیلی بهتر مدیریت میکنه.پس هر وقت با منبعی کار میکنی که باید حتماً تمیز جمع بشه،
with بهترین انتخابته.🐍 @python_rd
👍4❤2
🔆 توی کدنویسی خیلی وقتها پیش میاد که میخوایم یه خطای احتمالی رو نادیده بگیریم و بدون دردسر ازش رد بشیم. مثلاً فرض کن میخوای یه فایل رو حذف کنی و برات مهم نیست که اون فایل از قبل وجود داره یا نه. راه سنتی و معمولی اینه که یه بلاک try-except بنویسی و توی بخش except بنویسی pass که ظاهر کد رو شلوغ و نامرتب میکنه.
🔹 اما پایتون یه ابزار فوقالعاده تمیز برای این کار داره به اسم suppress که توی کتابخونه contextlib قرار داره. با استفاده از اون میتونی خیلی راحت بنویسی with suppress(FileNotFoundError) و بعد دستور حذف فایل رو اجرا کنی. با این کار اگه فایل وجود نداشته باشه، پایتون بدون اینکه برنامه رو کرش کنه یا نیاز به نوشتن بلاکهای طولانی باشه، خیلی شیک از روش رد میشه. این ترفند کدت رو خلوتتر و خواناتر میکنه.
🐍 @pyrhon_rd
🔹 اما پایتون یه ابزار فوقالعاده تمیز برای این کار داره به اسم suppress که توی کتابخونه contextlib قرار داره. با استفاده از اون میتونی خیلی راحت بنویسی with suppress(FileNotFoundError) و بعد دستور حذف فایل رو اجرا کنی. با این کار اگه فایل وجود نداشته باشه، پایتون بدون اینکه برنامه رو کرش کنه یا نیاز به نوشتن بلاکهای طولانی باشه، خیلی شیک از روش رد میشه. این ترفند کدت رو خلوتتر و خواناتر میکنه.
from contextlib import suppress
import os
# روش تمیز و پایتونیک بدون نیاز به try-except و pass
with suppress(FileNotFoundError):
os.remove("data.txt")
🐍 @pyrhon_rd
🔥2❤1
🔆 پایتون رو اینجوری و پله پله شروع کن، سعی نکن یه شبه بری بالا:
1) Python Fundamentals
2) Variables & Data Types
3) Operators & Input/Output
4) Conditional Statements
5) Loops
6) Functions
7) Lists, Tuples, Sets, Dictionaries
8) File Handling
9) Exception Handling
10) OOP in Python
11) Modules & Packages
12) Git & GitHub
13) SQL & Databases
14) APIs & JSON
15) Web Framework: Flask / Django / FastAPI
16) Testing & Debugging
17) Data Structures & Algorithms
18) Deployment & Cloud Basics
🐍 @pyrhon_rd
1) Python Fundamentals
2) Variables & Data Types
3) Operators & Input/Output
4) Conditional Statements
5) Loops
6) Functions
7) Lists, Tuples, Sets, Dictionaries
8) File Handling
9) Exception Handling
10) OOP in Python
11) Modules & Packages
12) Git & GitHub
13) SQL & Databases
14) APIs & JSON
15) Web Framework: Flask / Django / FastAPI
16) Testing & Debugging
17) Data Structures & Algorithms
18) Deployment & Cloud Basics
🐍 @pyrhon_rd
❤🔥6👎1
🔆تو پایتون معمولا برای شرطگذاری چندتایی از
مثلاً به جای این:
اینو بنویس:
🔹وقتی تعداد شرطها بیشتر میشه، این مدل هم کدت رو حرفهایتر میکنه هم بعداً تغییر دادنش راحتتره.
🔹 برای چک کردن چند مقدار مشخص،
🐍 @pyrhon_rd
or پشت سر هم استفاده میکنن، در حالی که in هم تمیزتره هم خواناتر.مثلاً به جای این:
status = "pending"
if status == "pending" or status == "waiting" or status == "hold":
print("not ready")
اینو بنویس:
status = "pending"
if status in {"pending", "waiting", "hold"}:
print("not ready")
🔹وقتی تعداد شرطها بیشتر میشه، این مدل هم کدت رو حرفهایتر میکنه هم بعداً تغییر دادنش راحتتره.
🔹 برای چک کردن چند مقدار مشخص،
in یکی از سادهترین چیزهاس🐍 @pyrhon_rd
❤4👍1
🔆خیلی وقتا توی جنگو فقط اسمِ کاربری رو لازم داریم، ولی اشتباهاً کلِ رکورد (با کلی فیلدِ سنگین) رو از دیتابیس میکشیم بیرون!
🔹مثلاً به جای این:
🔹اینو بنویس:
🔹 متدِ values_list با flat=True فقط اون ستونی که میخوای رو میاره و دیتابیس رو بیخودی شلوغ نمیکنه.
🔹 وقتی دیتابیست میلیونی بشه، همین کوئریهای بهینه هستن که سایتت رو سرپا نگه میدارن.
🐍 @pyrhon_rd
🔹مثلاً به جای این:
all_users = User.objects.all()
# واکشی تمامِ اطلاعات مثل بیوگرافی، آدرس، تاریخ تولد و…
🔹اینو بنویس:
usernames = User.objects.values_list(‘username’, flat=True)
🔹 متدِ values_list با flat=True فقط اون ستونی که میخوای رو میاره و دیتابیس رو بیخودی شلوغ نمیکنه.
🔹 وقتی دیتابیست میلیونی بشه، همین کوئریهای بهینه هستن که سایتت رو سرپا نگه میدارن.
🐍 @pyrhon_rd
❤4
🔆فکر کن داری اطلاعاتِ ۵ تا سایت رو اسکرپ میکنی؛ اگه پشت سر هم بزنی، باید صبر کنی اولی تموم بشه تا دومی شروع شه. این یعنی اتلاف وقت!
🔹مثلاً به جای این:
🔹اینو بنویس:
🔹 با gather به پایتون میگی: «همهشون رو با هم استارت بزن و وقتی همهشون جواب دادن، نتیجه رو یکجا بهم تحویل بده».
🔹 توی کارهای شبکهای، این تفاوت بینِ یک برنامه کند و یک سیستمِ فوقسریعِ مقیاسپذیره.
🐍 @pyrhon_rd
🔹مثلاً به جای این:
for url in urls:
data = requests.get(url).json()
# اینجا برنامه تا گرفتن جواب قفل میکنه!
🔹اینو بنویس:
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks)
🔹 با gather به پایتون میگی: «همهشون رو با هم استارت بزن و وقتی همهشون جواب دادن، نتیجه رو یکجا بهم تحویل بده».
🔹 توی کارهای شبکهای، این تفاوت بینِ یک برنامه کند و یک سیستمِ فوقسریعِ مقیاسپذیره.
🐍 @pyrhon_rd
🔥4
🔆Hypermodern Python
🔹 برای کسایی که زبانشون خوبه!
فصل 1: Setup
فصل 2: Testing
فصل 3: Linting
فصل 4: Typing
فصل 5: Documentation
فصل 6: CI/CD
https://cjolowicz.github.io/posts/hypermodern-python-01-setup/
🐍 @python_rd
🔹 برای کسایی که زبانشون خوبه!
فصل 1: Setup
فصل 2: Testing
فصل 3: Linting
فصل 4: Typing
فصل 5: Documentation
فصل 6: CI/CD
https://cjolowicz.github.io/posts/hypermodern-python-01-setup/
🐍 @python_rd
Claudiojolowicz
Hypermodern Python
A guide to modern Python tooling with a focus on simplicity and minimalism.
❤1