PyCoders (پایتون)
4.11K subscribers
979 photos
148 videos
69 files
237 links
◇ #پایتون جادوگر دنیای برنامه نویسی!
◇ معرفی حوزه های کاری پایتون
◇ معرفی کتابخونه های کاربردی
◇ معرفی دوره های مفید
◇ معرفی تکنیک ها و نکات
◇ نقشه راه حوزه های مختلف
◇ اخبار و آپدیت های پایتون
◇ و هر چیزی در مورد پایتون!

■ گروه پایتون:
@programmers_py
Download Telegram
🌐 دکوریتورها (Decorators) توی پایتون مثل یک «روکش» برای توابع هستن. فرض کن می‌خوای به چند تا تابع، قابلیت لاگ‌گیری یا زمان‌سنجی اضافه کنی بدون اینکه کدهای اصلیشون رو تغییر بدی. دکوریتور این کار رو خیلی تمیز برات انجام می‌ده و کدت رو ماژولار نگه می‌داره.

🔹 مثلاً این کدِ یک زمان‌سنج ساده‌ست که نشون می‌ده تابع چقدر طول می‌کشه اجرا بشه:

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
❤3
🔆 خروجی این تکه کد پایتون چی میشه؟

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) کنی.
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) هستند، اگر تابع را چند بار بدون پاس دادن ورودی جدید فراخوانی کنید، پایتون هر بار از همان شیء قدیمی در حافظه استفاده می‌کند. در نتیجه، تغییرات در فراخوانی‌های قبلی، روی فراخوانی‌های بعدی اثر می‌گذارد!

🔹 به جای این کد:
#در این کد، لیست 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
🔆 با این کتابخانه پایتون، با یک خط کد دیتای تلگرام/اینستاگرام رو استخراج کن!


🔹 اگه دنبال یک ابزار پرسرعت و راحت برای 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() یا پیمایش حلقه استفاده می‌کنند. اما توی پایتون ۳.۹ به بعد یک اپراتور جذاب اضافه شده!


🔸 روش قدیمی:

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
🔆 اشتباه رایج در پایتون: لیست‌های "سرسخت"!

🔹 خیلی از بچه‌ها موقع تعریف تابع، از لیست یا دیکشنری به عنوان آرگومان پیش‌فرض استفاده می‌کنن که باعث میشه باگ‌های عجیب و غریبی توی پروژه پیش بیاد.

🔹داستان اینه: پایتون آرگومان پیش‌فرض رو فقط یک‌بار (موقع تعریف تابع) می‌سازه، نه هر بار که تابع رو صدا می‌زنی. نتیجه‌ش این میشه که لیستِ شما بین تمام فراخوانی‌ها مشترک می‌مونه!

🔹 کد غلط (باگ‌دار):
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
🔥2
🔆 چیت شیت (برگه تقلب) جمع و جور و کامل برای زبان پایتون.

🔹https://github.com/gto76/python-cheatsheet

🐍 @python_rd
❤3
🔆 کتاب رایگانی از Oreilly درباره الگوهای معماری پرکاربردی است که برای مدیریت پیچیدگی استفاده می‌شوند. این کتاب برای زبان پایتون نگارش شده است.

🔹github.com/cosmicpython/book

🐍 @python_rd
🔥3
🔆 توضیح عملی در مورد اینکه سورس کد پایتون که با سی زده شده چه شکلی کار میکنه و انواع و اقسام object ها و module ها و خود interpreter چه شکلی کار میکنه.

🔹github.com/zpoint/CPython-Internals

🐍 @python_rd
❤1
🔆 خیلی وقت‌ها برای ترکیب چند تا دیکشنری هنوز از متد update استفاده میشه، در صورتی که استفاده از عملگر پایپ یعنی | کد رو فوق‌العاده تمیز و خوانا می‌کنه.

🔹 کافیه بنویسی dict3 = dict1 | dict2 تا هر دو ادغام بشن، بدون اینکه دیتای دیکشنری‌های قبلی دستکاری بشه.

🔹مثلاً اگه دو تا دیکشنری تنظیمات داری، به جای کدهای طولانی می‌تونی اینجوری بنویسی:

final_config = default_config | user_config.

🔹اگه کلید تکراری هم وجود داشته باشه، مقدار دیکشنری سمت راست اولویت پیدا می‌کنه و جایگزین میشه. این روش مخصوصاً تو جنگو موقع ترکیب کانتکست‌های تمپلیت به‌شدت کدت رو مدرن‌تر نشون میده.

🐍 @python_rd
🔆 اگه تو پروژه‌هات با لیست‌های حجیم کار می‌کنی، استفاده از Generator Expression به‌جای List Comprehension معجزه می‌کنه.

🔹 تفاوتش فقط توی پرانتز گذاشتن به جای براکته، ولی مصرف رم رو بهینه می‌کنه.
مثلاً اگه بنویسی:

data = [i*2 for i in range(1000000)]

🔹 پایتون کل لیست رو یکجا تو حافظه میسازه،

اما اگه بنویسی:
data = (i*2 for i in range(1000000))

🔹فقط یه شیء ژنراتور داری که دیتا رو دونه‌دونه موقع نیاز تولید می‌کنه.

🔹این ترفند کوچیک می‌تونه مصرف رم سرورت رو تو پردازش‌های سنگین از گیگابایت به کیلوبایت کاهش بده.

🐍 @python_rd
❤2👍1
🔆ساده‌ترین کتابخانه برای تشخیص چهره که با زبان پایتون ساخته‌شده و به راحتی قابل استفاده است.

🔹https://github.com/ageitgey/face_recognition

🐍 @python_rd
🔆 دیکشنری با متد setdefault

🔹شاید برات پیش اومده باشه که بخوای توی یه دیکشنری داده‌ها رو گروه‌بندی کنی و هی با خطای KeyError مواجه نشی. خیلیا اول چک می‌کنن کلید هست یا نه و بعد لیست جدید می‌سازن، ولی با setdefault کل این ماجرا توی یه خط خلاصه می‌شه. این متد اگه کلید وجود نداشته باشه با مقداری که بهش دادی می‌سازدش و همون لحظه مرجعش رو برمی‌گردونه تا بتونی روش عملیات بزنی.

words = ["python", "django", "pandas", "docker", "fastapi"]
grouped = {}

# دسته‌بندی کلمات بر اساس حرف اول
for word in words:
first_letter = word[0]
grouped.setdefault(first_letter, []).append(word)

print(grouped)
# خروجی: {'p': ['python', 'pandas'], 'd': ['django', 'docker'], 'f': ['fastapi']}

🔹به چه دردی میخوره؟
این متد نسبت به نوشتن if و else های دستی هم خوانایی کد رو بالاتر می‌بره و هم توی پروژه‌های واقعی مدیریت دیکشنری‌های تو در تو رو خیلی راحت‌تر می‌کنه.

🐍 @python_rd
🔆 کتاب‌های رایگان در مورد پایتون و استفاده بهتر از shell و regex و کلی چیز دیگه.

🔹learnbyexample.github.io/books

🐍 @python_rd
🔆 ترفند unpacking با ستاره (*)

🔹 خیلی وقتا یه لیست یا تاپل داری و فقط به اولین یا آخرین عضوش نیاز داری و بقیه برات مهم نیستن یا می‌خوای جداگونه جمع بشن. به جای اینکه دست به اسلایس و ایندکس‌گذاری‌های گیج‌کننده بزنی، می‌تونی از عملگر ستاره برای آنپک کردن داده‌ها استفاده کنی تا کد خلوت و پایتونیکی داشته باشی.

scores = [18, 19, 14, 16, 20, 17]

# جدا کردن اولین نمره، نمرات وسط و آخرین نمره
first, *middle, last = scores

print("اولین:", first) # 18
print("وسطی‌ها:", middle) # [19, 14, 16, 20]
print("آخرین:", last) # 17

🔹 به چه دردی میخوره؟
این ترفند موقع لاگین یا کار با داده‌های استریم که اول و آخر پیام فرمت خاصی داره ولی بخش میانی طولش متغیره، کدت رو فوق‌العاده خوانا و شیک می‌کنه.

🐍 @python_rd
❤3