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

■ گروه پایتون:
@programmers_py
Download Telegram
🔸 زندگی کوتاهه، از پایتون استفاده کن!


🐍 @python_rd
9👍3
سلام بچه ها، حالتون چطوره؟
یکم از خودتون بگید، صحبت کنیم،
الان چیکار میکنید؟
چه مباحثی از پایتون رو کار کردید؟
تو چه مرحله ای هستید؟
به درآمد رسیدید یا هنوز تو مراحل یادگیری هستید؟
3
🔆کوتاه نویسی با پایتون:
Walrus Operator (:=)

🔸از نسخه ۳.۸ به بعد یه ابزار جدید به پایتون اضافه شد به اسم Walrus Operator.
باهاش می‌تونی هم‌زمان *یه مقدار رو ذخیره کنی* و *از همون مقدار داخل شرط استفاده کنی*.
یعنی هم کدت کوتاه‌تر می‌شه، هم تمیزتر.

مثال ساده:
if (name := input("Name: ")):
print("Hello", name)

بدون walrus مجبور بودی اول name رو بگیری، بعد توی if چکش کنی.
اینجا همه‌چی یک‌جا و شیک انجام می‌شه. این قابلیت توی حلقه‌ها واقعاً مفیده.

🐍 @python_rd
3👍3
🔆بهینه‌سازی مصرف RAM با slots

🔸به
‌صورت پیش‌فرض هر آبجکت پایتون یه دیکشنری داخلی داره که کلی جا می‌گیره. 
اگه تعداد آبجکت‌ها زیاد باشه، مصرف رم می‌ره هوا. 
اینجا __slots__ به کارت میاد.

با تعریف اسلاتس، پایتون به کلاس می‌گه دقیقاً چه attribute هایی داری، 
در نتیجه دیگه واسه هر شیء دیکشنری نمی‌سازه و مصرف حافظه تا حد زیادی کم می‌شه.

class User:
    __slots__ = ("name", "age")
    def __init__(self, name, age):
        self.name = name
        self.age = age


این تکنیک مخصوص وقتاییه که با هزاران آبجکت طرفی و پرفورمنس برات مهمه.

🐍 @python_rd
2
🔆خروجی کد چیه؟

numbers = [2, 4, 6, 8]

result = []
for n in numbers:
    if n == 4 or 10:
        result.append(n)

print(result)

A) [4] 

B) [2, 4, 6, 8] 

C) [2, 4] 

D) [4, 6, 8]


🐍@python_rd
6👍2
🔆یه ترفند خیلی کاربردی برای دیباگ کردن در پایتون، استفاده از icecream به جای پرینت‌های ساده‌ست. به جای اینکه هی بنویسی print(f'x: {x}') و سعی کنی بفهمی چی به چیه، کافیه کتابخونه‌ش رو نصب کنی و از ic() استفاده کنی. این ابزار خودش اسم متغیر، مقدارش و حتی شماره خطی که توش اجرا شده رو خیلی تمیز و رنگی چاپ می‌کنه. علاوه بر این، چون خودش مقدار رو برمی‌گردونه، می‌تونی مستقیم وسط کد (حتی داخل return یا شرط‌ها) بدون اینکه منطق کد رو بهم بزنی ازش استفاده کنی و با حذف کردنش، کدهات تمیز باقی می‌مونن.

مثال:

from icecream import ic

def add(x, y):
return x + y

# به جای این:
# print(f"DEBUG: add(1, 2) = {add(1, 2)}")

# از این استفاده کن:
ic(add(1, 2))

🐍 @python_rd
👍2
🔆python list methods:


1. 🍔🍔🍟 .append(🍔) → 🍔🍔🍟🍔

2. 🍔🍔🍟 .count(🍔) → 2

3. 🍔🍔🍟 .copy() → 🍔🍔🍟

4. 🍔🍔🍟 .index(🍟) → 2

5. 🍔🍔🍟 .reverse() → 🍟🍔🍔

6. 🍔🍔🍟 .remove(🍟) → 🍔🍔

7. 🍔🍔🍟 insert( 1, 🥤) → 🍔🥤🍔🍟

8. 🍔🍔🍟 pop(1) → 🍔🍟

9. 🍔🍔🍟 pop() → 🍔🍔

🐍 @python_rd
18😁2👏1
خروجی کد چیه؟

x = 5 print( x + "5")
Anonymous Quiz
33%
55
9%
10
3%
5
54%
هیچکدام (error)
This media is not supported in your browser
VIEW IN TELEGRAM
🔆الگوریتم Bellman-Ford

🔹یافتن سریع ترین راه از نقطه A به H

def bellman_ford(nodes, edges, start, target):
dist = {n: float('inf') for n in nodes}
dist[start] = 0
for _ in range(len(nodes) - 1):
updated = False
for u, v, w in edges:
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
updated = True
if not updated: break

🐍 @python_rd
5
This media is not supported in your browser
VIEW IN TELEGRAM
🔆 الگوریتم Merge Sort

def merge_sort(arr, l, r):
if l < r:
mid = (l + r) // 2
merge_sort(arr, l, mid)
merge_sort(arr, mid + 1, r)
merge(arr, l, mid, r)

🐍 @python_rd
3
🔆کدنویسی تمیز:

خیلی وقت‌ها برای فیلتر کردن یه لیست، ناخودآگاه می‌ریم سراغ حلقه‌های تو در تو و کدهای طولانی. فرض کن یه لیست از کاربرها داری و فقط می‌خوای اون‌هایی که فعال هستن و سنشون بالای ۱۸ ساله رو جدا کنی. کد معمولی و شلوغ این شکلی می‌شه:
active_adults = []
for user in users:
if user['is_active'] == True:
if user['age'] > 18:
active_adults.append(user)

اما توی پایتون می‌شه همین کار رو خیلی تمیزتر، خواناتر و سریع‌تر با List Comprehension انجام داد:
active_adults = [u for u in users if u['is_active'] and u['age'] > 18]

با این ترفند ساده هم خوانایی کد بالا می‌ره و هم تعداد خطوط کمتر می‌شه.

🐍 @python_rd
👍31
🔆بهینه‌سازی کوئری در جنگو

یکی از بزرگ‌ترین دلایل کند شدن پروژه‌های جنگویی، اجرای کوئری‌های تکراری روی دیتابیسه که بهش چالش N+1 می‌گن. فرض کن می‌خوای لیست کتاب‌ها و نام نویسنده هر کتاب رو نمایش بدی. اگر کد رو این‌طوری بنویسی، جنگو برای هر کتاب یه کوئری جداگانه به جدول نویسنده‌ها می‌زنه:
books = Book.objects.all()
for book in books:
print(book.author.name) # اجرای یک کوئری اضافه به ازای هر کتاب!

برای حل این مشکل کافیه از select_related استفاده کنی تا جنگو با یک Joint ساده در دیتابیس، همه اطلاعات رو یک‌جا بکشه بیرون و سرعت لود صفحه رو چند برابر کنه:
books = Book.objects.select_related('author').all()
for book in books:
print(book.author.name) # بدون کوئری اضافه

همیشه قبل از دیپلوی کردن پروژه، تعداد کوئری‌هاتون رو با Django Debug Toolbar چک کنید تا سرور زیر بار نره.

🐍 @python_rd
👍2
🔆 مدیریت حافظه با استفاده از Generator در پایتون

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

# بد: مصرف حافظه بالا برای لیست‌های حجیم
my_list = [x**2 for x in range(1000000)]

# خوب: مصرف حافظه ناچیز به صورت Lazy
my_gen = (x**2 for x in range(1000000))

🐍 @python_rd
3🔥1
🔆 تفاوت exists و count در کوئری‌ست‌های جنگو

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

# بد: بررسی کل جدول با count
if User.objects.filter(username="ali").count() > 0:
print("User exists")

# خوب: توقف بلافاصله بعد از پیدا کردن مورد با exists
if User.objects.filter(username="ali").exists():
print("User exists")

🐍 @python_rd
3
This media is not supported in your browser
VIEW IN TELEGRAM
🔆 کدشو توی کامنتا واست گذاشتم👌

🐍 @python_rd
3🔥2
🔆 اکوسیستم پایتون

🐍 @python_rd
3
🔆کلاس‌های پایتونی سبک‌تر با slots

🔹وقتی کلاس‌های زیادی می‌سازی، پایتون برای هر نمونه یک دیکشنری اختصاصی ایجاد می‌کنه که کلی از رم سیستم رو بی‌دلیل اشغال می‌کنه. با تعریف slots توی کلاست، به پایتون دستور می‌دی که دیگه اون دیکشنری سنگین رو نسازه و فقط ویژگی‌هایی که نوشتی رو ذخیره کنه. این ترفند برای پروژه‌های بزرگ که با دیتای حجیم سروکار دارن، مثل یک معجزه برای کاهش مصرف رم عمل می‌کنه.

class User:
slots = ['name', 'id']
def init(self, name, id):
self.name = name
self.id = id

🐍 @python_rd
🔥1
🔆 فکر کنم باید همینجوری بوده باشه😂

🐍 @python_rd
🥰4😁2
🔆 ترکیب دیکشنری‌ها با عملگر |

احتمالا قبلا برای ادغام دو دیکشنری از متد update یا روش‌های دیگه استفاده می‌کردی که کد رو شلوغ می‌کرد. حالا توی پایتون ۳.۹ به بعد، خیلی شیک می‌تونی با استفاده از عملگر پایپ یا همون | دو تا دیکشنری رو با هم ترکیب کنی. نتیجه یک دیکشنری جدیده که تمام محتویات قبلی‌ها رو داره و خیلی هم سریع‌تر و خواناتر نوشته شده.

dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}

merged = dict1 | dict2
print(merged)
# خروجی: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

🐍 @python_rd
🔆 ۸ سایت رایگان برای تمرین پایتون

🔸 Practice Python:
تمرین‌های ساده با پاسخ؛ عالی برای شروع.

🔸PyNative:
کوییز و تمرین‌های مرحله‌ای + اجرای آنلاین.

🔸PyChallenger:
درس‌های کوتاه + تمرین داخل مرورگر.

🔸LabEx:
تمرین تعاملی و سناریو محور برای مهارت‌سازی.

🔸Learn2Code:
تمرین‌های سریع بدون نیاز به ثبت‌نام.

🔸Codewars:
چالش‌های الگوریتمی (Kata) سطح‌بندی‌شده.

🔸HackerRank:
حل مسئله و آمادگی مصاحبه فنی.

🔸Project Euler:
مسائل ریاضی/محاسباتی برای سطح پیشرفته.

🐍 @python_rd
1