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

■ گروه پایتون:
@programmers_py
Download Telegram
🔆 enumerate()

تو پایتون به چه درد می‌خوره؟

🔹وقتی می‌خوای هم شماره‌ی آیتم رو داشته باشی، هم خود مقدار رو، لازم نیست با
range(len(...))

خودت دردسر درست کنی. 
تابع
enumerate()

این کار رو خیلی تمیز انجام می‌ده.

🔹مثال:
fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits):
    print(index, fruit)

🔹خروجی:
0 apple
1 banana
2 cherry

🔹اگر بخوای شمارش از 1 شروع بشه هم می‌تونی از آرگومان دوم استفاده کنی:
for index, fruit in enumerate(fruits, start=1):
    print(index, fruit)

🔹خروجی:
1 apple
2 banana
3 cherry

🔹چرا مهمه؟
- کدت تمیزتر می‌شه
- خوانایی بالاتر می‌ره
- از range(len(...)) بهتر و پایتونیک‌تره

🐍 @python_rd
6
🔆ساخت پسورد تصادفی با پایتون

🔹با ماژول secrets می‌تونی پسوردهای تصادفی و امن بسازی. این ماژول برای کارهای امنیتی، انتخاب بهتری نسبت به random محسوب می‌شه.

import secrets
import string

characters = string.ascii_letters + string.digits + "!@#$%"

password = "".join(
secrets.choice(characters)
for _ in range(12)
)

print(password)

🔹هر بار که برنامه اجرا بشه، یک پسورد ۱۲ کاراکتری جدید ساخته می‌شه.

a8@Kp2#xQ9Lm

🐍 @python_rd
2
🔆تفاوت == و is در پایتون

🔹توی پایتون، عملگر == مقدار دو متغیر رو مقایسه می‌کنه؛ اما 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
🔥41
🔆 جستجوی سریع‌تر با ترفند Set

🔹 چرا پایتون وقتی لیست‌هات بزرگ میشن کند میشه؟ چون وقتی مینویسی 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 در کوئری‌های جنگو

🔹 بزرگترین اشتباه توی جنگو، کوئری زدن داخل حلقه‌ست. تصور کن ۱۰۰ تا پست داری و میخوای اسم نویسنده هرکدوم رو چاپ کنی. اگه بنویسی 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
This media is not supported in your browser
VIEW IN TELEGRAM
🔆 کدشو داخل کامنت واست گذاشتم👇🏻

🐍 @python_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
🔆 معمولاً وقتی از تابع استاندارد 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
🔆میدونستی 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
👍1
🔹یه روش خیلی کاربردی توی پایتون اینه که به‌جای چندتا شرط پشت‌سرهم، از دیکشنری برای مدیریت حالت‌ها استفاده کنی.

🔹مثلاً وقتی قراره بر اساس نقش کاربر یه خروجی متفاوت بدی، به‌جای 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
🔆 یه نکته خیلی کاربردی دیگه اینه که توی شرط‌ها لازم نیست همیشه بنویسی:
if len(items) == 0:

🔹می‌تونی خیلی تمیزتر بنویسی:
if not items:

🔹 و برای حالت برعکس:
if items:

🔹 چون لیست خالی، رشته خالی، دیکشنری خالی و خیلی از آبجکت‌های خالی در پایتون False محسوب میشن.

🐍 @python_rd
👍9
99d69af5-4e5e-4482-a45a-fc19c507a35e.png
2.3 MB
🔆 والپیپر پایتون


🔹(محتوا کم آوردم)
🐍 @python_rd
🤣62😁1
🔆 یه منبع خوب برای تمرین پایتون

🔹 یه سر به Pynative.com بزن. این سایت بخش Python Exercises رو داره که تمرین‌هاش رو خیلی مرتب و موضوعی دسته‌بندی کرده؛ از Loops و Input/Output گرفته تا Functions و Lists.

🔹چیزی که این سایت رو کاربردی‌تر می‌کنه اینه که هر تمرین فقط یه صورت‌مسئله ساده نیست، بلکه توضیح کامل مسئله، ورودی و خروجی مورد انتظار، بخش Hint برای راهنمایی، و در نهایت Solution همراه با کد هم داره. همین باعث می‌شه برای کسایی که تازه دارن پایتون یاد می‌گیرن، یه منبع خیلی خوب برای تمرین عملی و تقویت مهارت برنامه‌نویسی باشه.

🐍 @python_rd
1
🔆 اعتبار سنجی تمیز داده ها در پایتون با Pydantic

🔹وقتی از کاربر داده می‌گیری، ممکنه مقدار اشتباه وارد بشه؛ مثلاً به‌جای عدد، متن بفرسته یا یه فیلد ضروری رو جا بندازه. 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 همون کلاس رو خیلی تمیز و کوتاه می‌نویسی:
from dataclasses import dataclass

@dataclass
class User:
name: str
age: int

🔹 پایتون خودش برات سازنده، نمایش شیء و مقایسه رو می‌سازه.

چرا خوبه؟

کد کمتر
خوانایی بیشتر
خطای کمتر

🔹مناسب برای مدل‌های داده‌ای

اگر با کلاس‌هایی کار می‌کنی که فقط وظیفه‌شون نگهداری اطلاعاته، dataclass واقعاً یکی از بهترین انتخاب‌هاست.

🐍 @python_rd
6💯1
🔆 توی پایتون 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
👍42
🔆 توی کدنویسی خیلی وقت‌ها پیش میاد که می‌خوایم یه خطای احتمالی رو نادیده بگیریم و بدون دردسر ازش رد بشیم. مثلاً فرض کن می‌خوای یه فایل رو حذف کنی و برات مهم نیست که اون فایل از قبل وجود داره یا نه. راه سنتی و معمولی اینه که یه بلاک try-except بنویسی و توی بخش except بنویسی pass که ظاهر کد رو شلوغ و نامرتب می‌کنه.

🔹 اما پایتون یه ابزار فوق‌العاده تمیز برای این کار داره به اسم suppress که توی کتابخونه contextlib قرار داره. با استفاده از اون می‌تونی خیلی راحت بنویسی with suppress(FileNotFoundError) و بعد دستور حذف فایل رو اجرا کنی. با این کار اگه فایل وجود نداشته باشه، پایتون بدون اینکه برنامه رو کرش کنه یا نیاز به نوشتن بلاک‌های طولانی باشه، خیلی شیک از روش رد میشه. این ترفند کدت رو خلوت‌تر و خواناتر می‌کنه.

from contextlib import suppress
import os

# روش تمیز و پایتونیک بدون نیاز به try-except و pass
with suppress(FileNotFoundError):
os.remove("data.txt")

🐍 @pyrhon_rd
🔥21
🔆 پایتون رو اینجوری و پله پله شروع کن، سعی نکن یه شبه بری بالا:

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
🔆تو پایتون معمولا برای شرط‌گذاری چندتایی از 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
🔆خیلی وقتا توی جنگو فقط اسمِ کاربری رو لازم داریم، ولی اشتباهاً کلِ رکورد (با کلی فیلدِ سنگین) رو از دیتابیس می‌کشیم بیرون!

🔹مثلاً به جای این:
all_users = User.objects.all()
# واکشی تمامِ اطلاعات مثل بیوگرافی، آدرس، تاریخ تولد و…

🔹اینو بنویس:
usernames = User.objects.values_list(‘username’, flat=True)

🔹 متدِ values_list با flat=True فقط اون ستونی که می‌خوای رو میاره و دیتابیس رو بی‌خودی شلوغ نمی‌کنه.

🔹 وقتی دیتابیس‌ت میلیونی بشه، همین کوئری‌های بهینه هستن که سایتت رو سرپا نگه میدارن.

🐍 @pyrhon_rd
4