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

■ گروه پایتون:
@programmers_py
Download Telegram
🔆 با این کتابخانه پایتون، با یک خط کد دیتای تلگرام/اینستاگرام رو استخراج کن!


🔹 اگه دنبال یک ابزار پرسرعت و راحت برای 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
🔆 سایت خوبی برای یادگیری دیزاین پترن‌ها با زبان پایتون

🔹https://python-patterns.guide

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

🔹https://github.com/chiphuyen/python-is-cool

🐍 @python_rd
🔆 ترفند مخفی | ساخت لودینگ متنی (Streaming Output)

🔹 وقتی از AI مدل‌ها استفاده می‌کنی، دیدی متنشون کلمه به کلمه مثل تایپ شدن چاپ میشه؟ بهش میگن Streaming! نیازی به لایبرری خاصی نداری؛ با خود پایتون تو چند خط پیاده‌ش کن:

import sys
import time


def stream_text(text, delay=0.04):
for char in text:
sys.stdout.write(char)
sys.stdout.flush()
time.sleep(delay)
print()


stream_text("سلام! این یک خروجی استریم‌شده است...")

🔹 به چه دردی میخوره؟
وقتی داری ابزارهای CLI یا اسکریپت‌های تعاملی می‌نویسی، حس زنده بودن به برنامه‌ت میده و UI متنی رو ۱۰۰ درجه جذاب‌تر می‌کنه.

🐍 @python_rd
❤2🔥1
🔆 کارایی و ساختار | پدیده Late Binding در Lambdaهای پایتون


🔹 تا حالا شده توی یک حلقه چندتا لمداسازی (Lambda) کنی و موقع اجرا ببینی همه با هم یک جواب تکراری میدن؟! این دقیقاً به خاطر پدیده Late Binding (ارزیابی دیرهنگام) در پایتونه.


🔹 کد مشکل‌دار:

funcs = [lambda: i for i in range(3)]

for f in funcs:
print(f()) # خروجی: 2, 2, 2 !

🔹 دلیلش چیه؟
پایتون مقدار متغیر i رو موقع تعریف لمدا ذخیره نمی‌کنه، بلکه موقع اجرا (Call) به سراغ مقدار نهایی i توی حافظه می‌ره!


🔹 راه حل استاندارد (با استفاده از Default Argument):

funcs = [lambda x=i: x for i in range(3)]

for f in funcs:
print(f()) # خروجی: 0, 1, 2 (درست شد!)

🔹 به چه دردی میخوره؟
این باگ توی پروژه‌های واقعی (مثل ساخت Callback برای دکمه‌های UI یا تعاریف Dynamic توی دیتابیس و کارهای Async) خیلی زیاد اتفاق می‌افته و فهمیدنش جلوی ساعت‌ها دیباگینگ گیج‌کننده رو می‌گیره.

🐍 @python_rd
❤1
🔆 این ریپازیتوری مجموعه‌ای از آموزش‌های پایتون در زمینه‌های مختلفه از چیزهای ابتدایی گرفته تا ML یا کتابخونه‌های کاربردی مثل numpy و pandas

🔹https://github.com/codebasics/py

🐍 @python_rd