🔆 تست پایتون!
خروجی چیه؟
۱)
۲)
۳)
۴)
🐍 @python_rd
x = 10
res = [x for x in range(3)]
print(x)
خروجی چیه؟
۱)
2۲)
10۳)
UnboundLocalError۴)
None🐍 @python_rd
❤1🥱1
🔆 چرا در پایتون به معنای واقعی نمیتوانیم thread داشته باشیم. توی این مقاله جالب بصورت ملموس در مورد GIL در پایتون صحبت میشه.
🔹https://pythonspeed.com/articles/python-gil
🐍 @python_rd
🔹https://pythonspeed.com/articles/python-gil
🐍 @python_rd
Python⇒Speed
When Python can’t thread: a deep-dive into the GIL’s impact
Python’s Global Interpreter Lock (GIL) stops threads from running in parallel or concurrently. Learn how to determine impact of the GIL on your code.
🔆داکیومنت خوبی برای class-base view توی جنگو که به همراه متدها و attribute های هر قسمت کامل توضیح داده شده.
🔹https://ccbv.co.uk
🐍 @python_rd
🔹https://ccbv.co.uk
🐍 @python_rd
ccbv.co.uk
Django Class-Based-View Inspector -- Classy CBV
The best way to understand Django's class-based views is to see it in Classy CBV, so pick your version and jump in at the deep end.
❤1🔥1
🔆 ۶ تکنیک طلایی برای نوشتن کدهای پایتونی تمیزتر و حرفهایتر
🔹۱. استفاده از List Comprehension به جای حلقههای طولانی:
به جای نوشتن حلقههای چندخطی برای ساخت لیست، از ساختار تکخطی و خوانای پایتون استفاده کنید تا هم کد سریعتر اجرا شود و هم شلوغی بیهوده کم شود.
🔹۲. مدیریت فایلها و کانکشنها با Context Manager:
استفاده از ساختار
🔹 ۳. نامگذاری بر اساس استانداردهای PEP 8:
نام توابع و متغیرها را با حروف کوچک و زیرخط (
🔹 ۴. بهرهگیری از Type Hinting:
با مشخص کردن نوع ورودی و خروجی توابع، اشکالزدایی پروژه بسیار سادهتر میشود و ویرایشگر کدهایتان خطاهای نوع داده را سریعتر پیدا میکند.
🔹 ۵. جایگزینی f-string با فرمتهای قدیمی:
فرمتبندی با f-string سریعترین، خواناترین و تمیزترین روش برای الحاق متغیرها به رشتههاست.
🔹 ۶. کنترل خطا با ساختار try-except دقیق:
از بلاکهای کلی
🐍 @python_rd
🔹۱. استفاده از List Comprehension به جای حلقههای طولانی:
به جای نوشتن حلقههای چندخطی برای ساخت لیست، از ساختار تکخطی و خوانای پایتون استفاده کنید تا هم کد سریعتر اجرا شود و هم شلوغی بیهوده کم شود.
🔹۲. مدیریت فایلها و کانکشنها با Context Manager:
استفاده از ساختار
with خیالتان را از بسته شدن خودکار فایلها، کانکشنهای دیتابیس و مدیریت منابع در صورت بروز خطا راحت میکند.🔹 ۳. نامگذاری بر اساس استانداردهای PEP 8:
نام توابع و متغیرها را با حروف کوچک و زیرخط (
snake_case) و نام کلاسها را با حروف بزرگ (PascalCase) بنویسید تا خوانایی پروژه برای همتیمیها حفظ شود.🔹 ۴. بهرهگیری از Type Hinting:
با مشخص کردن نوع ورودی و خروجی توابع، اشکالزدایی پروژه بسیار سادهتر میشود و ویرایشگر کدهایتان خطاهای نوع داده را سریعتر پیدا میکند.
🔹 ۵. جایگزینی f-string با فرمتهای قدیمی:
فرمتبندی با f-string سریعترین، خواناترین و تمیزترین روش برای الحاق متغیرها به رشتههاست.
🔹 ۶. کنترل خطا با ساختار try-except دقیق:
از بلاکهای کلی
except: خودداری کنید و همیشه خطاهای مشخص و احتمالی مثل KeyError یا ValueError را مدیریت کنید تا خطاهای پیشبینینشده مخفی نمانند.🐍 @python_rd
❤2✍1
🌐 دکوریتورها (Decorators) توی پایتون مثل یک «روکش» برای توابع هستن. فرض کن میخوای به چند تا تابع، قابلیت لاگگیری یا زمانسنجی اضافه کنی بدون اینکه کدهای اصلیشون رو تغییر بدی. دکوریتور این کار رو خیلی تمیز برات انجام میده و کدت رو ماژولار نگه میداره.
🔹 مثلاً این کدِ یک زمانسنج سادهست که نشون میده تابع چقدر طول میکشه اجرا بشه:
🔹 میبینی که چطور با قرار دادن
🐍 @python_rd
🔹 مثلاً این کدِ یک زمانسنج سادهست که نشون میده تابع چقدر طول میکشه اجرا بشه:
import time
def timer(func):
def wrapper():
start = time.time()
func()
print(f"زمان اجرا: {time.time() - start:.4f} ثانیه")
return wrapper
@timer
def say_hello():
time.sleep(1)
print("سلام به دنیای پایتون!")
say_hello()
🔹 میبینی که چطور با قرار دادن
@timer بالای تابع say_hello، بدون اینکه حتی یک خط از منطق داخل خودِ تابع رو دستکاری کنیم، قابلیت زمانسنجی بهش اضافه شد. هر جا دیدی یه چیزی با @ شروع میشه و بالای تعریف یه تابع نشسته، بدون که داره اون تابع رو با قابلیتهای جدید "دکور" میکنه.🐍 @python_rd
🔥2❤1
🔆 کتابی در مورد پترنهای ساده برای ساختن اپلیکیشنهای پیچیده با پایتون که به رایگان و آنلاین قابل مطالعه است.
🔹https://www.cosmicpython.com/book/preface.html
🐍 @python_rd
🔹https://www.cosmicpython.com/book/preface.html
🐍 @python_rd
❤3
🔆 خروجی این تکه کد پایتون چی میشه؟
🔹 گزینهها:
۱) [1] و [2]
۲) [1] و [1, 2]
۳) خطا میده
۴) [2] و [2]
🐍 @python_rd
def add_item(item, my_list=[]):
my_list.append(item)
return my_list
print(add_item(1))
print(add_item(2))
🔹 گزینهها:
۱) [1] و [2]
۲) [1] و [1, 2]
۳) خطا میده
۴) [2] و [2]
🐍 @python_rd
🔆 اگر توی پایتون تابعی داری که محاسبات سنگین انجام میده یا ورودیهای تکراری داره، نیازی نیست هر بار از اول اجرا بشه! با استفاده از دکوراتور lru_cache میتونی خروجیها رو کَش (Cache) کنی.
🔹 به چه دردی میخوره؟
این روش برای توابعی عالیه که با ورودی یکسان، همیشه خروجی یکسانی میدن (Pure Functions).
🐍 @pyrhon_rd
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# اجرای این کد بدون lru_cache زمان زیادی میبره.
print(fibonacci(100))
🔹 به چه دردی میخوره؟
این روش برای توابعی عالیه که با ورودی یکسان، همیشه خروجی یکسانی میدن (Pure Functions).
🐍 @pyrhon_rd
👍1
🔆 هیچوقت از لیست یا دیکشنری خالی به عنوان مقدار پیشفرض (Default Value) توی توابع استفاده نکنید!
🔹وقتی در تعریف یک تابع در پایتون، مقداری مثل یک لیست ([]) یا دیکشنری ({}) را بهعنوان مقدار پیشفرض قرار میدهید، پایتون این شیء را فقط یکبار (در زمان تعریف تابع و Load شدن کد) در حافظه میسازد.
🔹 از آنجایی که لیستها و دیکشنریها قابل تغییر (Mutable) هستند، اگر تابع را چند بار بدون پاس دادن ورودی جدید فراخوانی کنید، پایتون هر بار از همان شیء قدیمی در حافظه استفاده میکند. در نتیجه، تغییرات در فراخوانیهای قبلی، روی فراخوانیهای بعدی اثر میگذارد!
🔹 به جای این کد:
🔹 اینجوری بنویس:
🐍 @python_rd
🔹وقتی در تعریف یک تابع در پایتون، مقداری مثل یک لیست ([]) یا دیکشنری ({}) را بهعنوان مقدار پیشفرض قرار میدهید، پایتون این شیء را فقط یکبار (در زمان تعریف تابع و Load شدن کد) در حافظه میسازد.
🔹 از آنجایی که لیستها و دیکشنریها قابل تغییر (Mutable) هستند، اگر تابع را چند بار بدون پاس دادن ورودی جدید فراخوانی کنید، پایتون هر بار از همان شیء قدیمی در حافظه استفاده میکند. در نتیجه، تغییرات در فراخوانیهای قبلی، روی فراخوانیهای بعدی اثر میگذارد!
🔹 به جای این کد:
#در این کد، لیست users فقط یکبار ساخته میشود و تمام کاربران جدید به همان یک لیست اضافه میشوند.
def add_user(user_name, user_list=[]):
user_list.append(user_name)
return user_list
# فراخوانی اول
print(add_user("امیر"))
# خروجی: ['امیر']
# فراخوانی دوم (بدون پاس دادن لیست جدید)
print(add_user("سارا"))
# خروجی انتظار میرفت ['سارا'] باشه، اما میشه: ['امیر', 'سارا']
🔹 اینجوری بنویس:
#از None به عنوان مقدار پیشفرض استفاده میکنیم و داخل تابع بررسی میکنیم که اگر مقدار None بود، یک لیست جدید ایجاد شود.
def add_user(user_name, user_list=None):
if user_list is None:
user_list = [] # ایجاد لیست جدید در هر بار اجرای تابع
user_list.append(user_name)
return user_list
print(add_user("امیر")) # خروجی: ['امیر']
print(add_user("سارا")) # خروجی: ['سارا'] (کاملاً مستقل و درست!)
🐍 @python_rd
👍3
🔆 لیست خوبی از مطالب مرتبط با برنامهنویسی فانکشنال با پایتون
🔹 github.com/sfermigier/awesome-functional-python
🐍 @python_rd
🔹 github.com/sfermigier/awesome-functional-python
🐍 @python_rd
GitHub
GitHub - sfermigier/awesome-functional-python: A curated list of awesome things related to functional programming in Python.
A curated list of awesome things related to functional programming in Python. - sfermigier/awesome-functional-python
🔆 با این کتابخانه پایتون، با یک خط کد دیتای تلگرام/اینستاگرام رو استخراج کن!
🔹 اگه دنبال یک ابزار پرسرعت و راحت برای Scraping یا جمعآوری دیتا از وب هستید، کتابخانه BeautifulSoup و Scrapy رو همه میشناسن؛ اما کتابخانه Selectolax سرعتی تا ۱۰ برابر بیشتر ارائه میده!
🔹 چرا Selectolax؟
پردازش HTML با موتور C (فوقالعاده سریع)
مصرف حافظه بسیار کم نسبت به BeautifulSoup
یادگیری سریع و سینتکس ساده
🔹 نمونه کد ساده:
🔹به چه دردی میخوره؟
عالی برای پروژههای بزرگ جمعآوری اطلاعات و رباتهای تلگرامی که نیاز به پردازش حجم بالای دیتا دارند.
🐍 @python_rd
🔹 اگه دنبال یک ابزار پرسرعت و راحت برای Scraping یا جمعآوری دیتا از وب هستید، کتابخانه BeautifulSoup و Scrapy رو همه میشناسن؛ اما کتابخانه Selectolax سرعتی تا ۱۰ برابر بیشتر ارائه میده!
🔹 چرا Selectolax؟
پردازش HTML با موتور C (فوقالعاده سریع)
مصرف حافظه بسیار کم نسبت به BeautifulSoup
یادگیری سریع و سینتکس ساده
🔹 نمونه کد ساده:
from selectolax.parser import HTMLParser
html = "<html><body><h1 class='title'>Hello Python!</h1></body></html>"
tree = HTMLParser(html)
node = tree.css_first('h1.title')
print(node.text()) # Output: Hello Python!
🔹به چه دردی میخوره؟
عالی برای پروژههای بزرگ جمعآوری اطلاعات و رباتهای تلگرامی که نیاز به پردازش حجم بالای دیتا دارند.
🐍 @python_rd
❤1👍1
🔆 خیلی از برنامهنویسهای تازهکار هنوز از روشهای قدیمی مثل update() یا پیمایش حلقه استفاده میکنند. اما توی پایتون ۳.۹ به بعد یک اپراتور جذاب اضافه شده!
🔸 روش قدیمی:
🔹روش جدید و تمیز (پایتون ۳.۹+):
🔹نکته: اگه کلید تکراری وجود داشته باشه (مثل b)، مقدار دیکشنری سمت راست جایگزین میشه.
🐍 @python_rd
🔸 روش قدیمی:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# روش اول: تغییر روی dict1
dict1.update(dict2)
# روش دوم (پایتون ۳.۵ به بعد):
merged = {**dict1, **dict2}🔹روش جدید و تمیز (پایتون ۳.۹+):
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# استفاده از اپراتور Union (|)
merged = dict1 | dict2
print(merged)
# Output: {'a': 1, 'b': 3, 'c': 4}🔹نکته: اگه کلید تکراری وجود داشته باشه (مثل b)، مقدار دیکشنری سمت راست جایگزین میشه.
🐍 @python_rd
👍4
🔆 اشتباه رایج در پایتون: لیستهای "سرسخت"!
🔹 خیلی از بچهها موقع تعریف تابع، از لیست یا دیکشنری به عنوان آرگومان پیشفرض استفاده میکنن که باعث میشه باگهای عجیب و غریبی توی پروژه پیش بیاد.
🔹داستان اینه: پایتون آرگومان پیشفرض رو فقط یکبار (موقع تعریف تابع) میسازه، نه هر بار که تابع رو صدا میزنی. نتیجهش این میشه که لیستِ شما بین تمام فراخوانیها مشترک میمونه!
🔹 کد غلط (باگدار):
🔹کد درست (پایتونیک):
همیشه از
🔹 این یه نکتهی ساده ولی حیاتیه که کدت رو از یه کدِ آماتوری به یه کدِ حرفهای تبدیل میکنه.
🐍 @python_rd
🔹 خیلی از بچهها موقع تعریف تابع، از لیست یا دیکشنری به عنوان آرگومان پیشفرض استفاده میکنن که باعث میشه باگهای عجیب و غریبی توی پروژه پیش بیاد.
🔹داستان اینه: پایتون آرگومان پیشفرض رو فقط یکبار (موقع تعریف تابع) میسازه، نه هر بار که تابع رو صدا میزنی. نتیجهش این میشه که لیستِ شما بین تمام فراخوانیها مشترک میمونه!
🔹 کد غلط (باگدار):
def add_item(val, my_list=[]):
my_list.append(val)
return my_list
print(add_item(1)) # خروجی: [1]
print(add_item(2)) # خروجی: [1, 2] !!!
🔹کد درست (پایتونیک):
همیشه از
None استفاده کن و مقداردهی رو داخل تابع انجام بده:def add_item(val, my_list=None):
if my_list is None:
my_list = []
my_list.append(val)
return my_list
print(add_item(1)) # خروجی: [1]
print(add_item(2)) # خروجی: [2]
🔹 این یه نکتهی ساده ولی حیاتیه که کدت رو از یه کدِ آماتوری به یه کدِ حرفهای تبدیل میکنه.
🐍 @python_rd
❤2
🔆 کتاب خوبی برای یادگیری معماری تر و تمیز که برای زبان برنامهنویسی پایتون آموزش داده شده
🔹https://www.thedigitalcatbooks.com/pycabook-introduction
🐍 @python_rd
🔹https://www.thedigitalcatbooks.com/pycabook-introduction
🐍 @python_rd
🔥2
🔆 چیت شیت (برگه تقلب) جمع و جور و کامل برای زبان پایتون.
🔹https://github.com/gto76/python-cheatsheet
🐍 @python_rd
🔹https://github.com/gto76/python-cheatsheet
🐍 @python_rd
❤3
🔆 کتاب رایگانی از Oreilly درباره الگوهای معماری پرکاربردی است که برای مدیریت پیچیدگی استفاده میشوند. این کتاب برای زبان پایتون نگارش شده است.
🔹github.com/cosmicpython/book
🐍 @python_rd
🔹github.com/cosmicpython/book
🐍 @python_rd
🔥3
🔆 مجموعهای از کدهای کمتر شناختهشده در زبان پایتون به همراه توضیحات مکمل.
🔹 github.com/satwikkansal/wtfpython
🐍 @python_rd
🔹 github.com/satwikkansal/wtfpython
🐍 @python_rd
GitHub
GitHub - satwikkansal/wtfpython: What the f*ck Python? 😱
What the f*ck Python? 😱. Contribute to satwikkansal/wtfpython development by creating an account on GitHub.
❤1
🔆 توضیح عملی در مورد اینکه سورس کد پایتون که با سی زده شده چه شکلی کار میکنه و انواع و اقسام object ها و module ها و خود interpreter چه شکلی کار میکنه.
🔹github.com/zpoint/CPython-Internals
🐍 @python_rd
🔹github.com/zpoint/CPython-Internals
🐍 @python_rd
❤1
🔆 خیلی وقتها برای ترکیب چند تا دیکشنری هنوز از متد update استفاده میشه، در صورتی که استفاده از عملگر پایپ یعنی | کد رو فوقالعاده تمیز و خوانا میکنه.
🔹 کافیه بنویسی
🔹مثلاً اگه دو تا دیکشنری تنظیمات داری، به جای کدهای طولانی میتونی اینجوری بنویسی:
🔹اگه کلید تکراری هم وجود داشته باشه، مقدار دیکشنری سمت راست اولویت پیدا میکنه و جایگزین میشه. این روش مخصوصاً تو جنگو موقع ترکیب کانتکستهای تمپلیت بهشدت کدت رو مدرنتر نشون میده.
🐍 @python_rd
🔹 کافیه بنویسی
dict3 = dict1 | dict2 تا هر دو ادغام بشن، بدون اینکه دیتای دیکشنریهای قبلی دستکاری بشه.🔹مثلاً اگه دو تا دیکشنری تنظیمات داری، به جای کدهای طولانی میتونی اینجوری بنویسی:
final_config = default_config | user_config.🔹اگه کلید تکراری هم وجود داشته باشه، مقدار دیکشنری سمت راست اولویت پیدا میکنه و جایگزین میشه. این روش مخصوصاً تو جنگو موقع ترکیب کانتکستهای تمپلیت بهشدت کدت رو مدرنتر نشون میده.
🐍 @python_rd
🔆 اگه تو پروژههات با لیستهای حجیم کار میکنی، استفاده از Generator Expression بهجای List Comprehension معجزه میکنه.
🔹 تفاوتش فقط توی پرانتز گذاشتن به جای براکته، ولی مصرف رم رو بهینه میکنه.
مثلاً اگه بنویسی:
🔹 پایتون کل لیست رو یکجا تو حافظه میسازه،
اما اگه بنویسی:
🔹فقط یه شیء ژنراتور داری که دیتا رو دونهدونه موقع نیاز تولید میکنه.
🔹این ترفند کوچیک میتونه مصرف رم سرورت رو تو پردازشهای سنگین از گیگابایت به کیلوبایت کاهش بده.
🐍 @python_rd
🔹 تفاوتش فقط توی پرانتز گذاشتن به جای براکته، ولی مصرف رم رو بهینه میکنه.
مثلاً اگه بنویسی:
data = [i*2 for i in range(1000000)]🔹 پایتون کل لیست رو یکجا تو حافظه میسازه،
اما اگه بنویسی:
data = (i*2 for i in range(1000000)) 🔹فقط یه شیء ژنراتور داری که دیتا رو دونهدونه موقع نیاز تولید میکنه.
🔹این ترفند کوچیک میتونه مصرف رم سرورت رو تو پردازشهای سنگین از گیگابایت به کیلوبایت کاهش بده.
🐍 @python_rd
❤2👍1