ch
Feedback

不要被骗子欺骗!Telemetrio 会找到并标记这些频道 👉 如果想查看标记,请订阅

PyCoders (پایتون)

PyCoders (پایتون)

前往频道在 Telegram

◇ #پایتون جادوگر دنیای برنامه نویسی! ◇ معرفی حوزه های کاری پایتون ◇ معرفی کتابخونه های کاربردی ◇ معرفی دوره های مفید ◇ معرفی تکنیک ها و نکات ◇ نقشه راه حوزه های مختلف ◇ اخبار و آپدیت های پایتون ◇ و هر چیزی در مورد پایتون! ■ گروه پایتون: @programmers_py

显示更多
4 105
订阅者
-124 小时
-17 天
-330 天
帖子存档
🔆 وضعیت رسمی Free-threaded (بدون GIL) و JIT 🔹 نسخه پایدار Python 3.14 تغییرات بزرگی را در هسته زبان تثبیت کرد. مهم‌ترین نکات از اسناد رسمی پایتون عبارتند از: 🔹 پشتیبانی رسمی از Free-threaded: حالت بدون GIL (مبتنی بر PEP 703 و PEP 779) دیگر آزمایشی نیست و رسماً پشتیبانی می‌شود (با جریمه عملکردی بسیار ناچیز ۵ تا ۱۰ درصدی در کدهای تک‌نخی). 🔹 کامپایلر JIT آزمایشی: باینری‌های رسمی ویندوز و macOS حالا شامل JIT آزمایشی هستند که با تنظیم متغیر محیطی PYTHON_JIT=1 فعال می‌شود. همچنین فضای‌نام جدید sys._jit برای بررسی وضعیت JIT اضافه شده است. 🔹 منبع رسمی: Python 3.14 Release Notes - What’s New in Python 🐍 @python_rd

🔆 ترفند باز کردن فایل‌ها با contextlib.suppress به جای try-except 🔹 وقتی می‌خواهید از بروز یک خطای خاص (مثل پیدا نشدن فایل برای حذف) جلوگیری کنید، نوشتن بلوک‌های متعدد try-except-pass کد را شلوغ می‌کند. ماژول داخلی contextlib تابع بی‌نظیری به نام suppress دارد.
from contextlib import suppress
import os

# روش قدیمی و شلوغ
try:
    os.remove("temp_cache.log")
except FileNotFoundError:
    pass

# روش تمیز و حرفه‌ای با contextlib.suppress
with suppress(FileNotFoundError):
    os.remove("temp_cache.log")

print("فایل پاک شد یا اصلاً وجود نداشت!")
🔹 نکته: این روش خوانایی کد را به شدت بالا می‌برد و سرعت اجرای آن تفاوتی با try-except سنتی ندارد چون در سطح CPython بهینه شده است. 🐍 @python_rd

🔆 کتابی در سطح متوسط برای یادگیری نکات زبان پایتون 🔹 github.com/yasoob/intermediatePython 🐍 @pyrhon_rd
🔆 کتابی در سطح متوسط برای یادگیری نکات زبان پایتون 🔹 github.com/yasoob/intermediatePython 🐍 @pyrhon_rd

🔆 پیاده‌سازی مقادیر پیش‌فرض مشروط با collections.ChainMap 🔹 فرض کنید برنامه‌ای دارید که تنظیمات را از ۳ منبع اولویت‌دار می‌خواند: آرگومان‌های ورودی CLI، متغیرهای محیطی، و فایل پیش‌فرض Config. به‌جای نوشتن شرط‌های متوالی و متدهای متعدد .get():
from collections import ChainMap

default_config = {'theme': 'dark', 'port': 8000, 'debug': False}
env_config = {'port': 9000, 'debug': True}
cli_args = {'theme': 'light'}

# اولویت از چپ به راست: CLI > ENV > DEFAULT
config = ChainMap(cli_args, env_config, default_config)

print(config['theme'])  # light (از cli)
print(config['port'])   # 9000  (از env)
print(config['debug'])  # True  (از env)
🔹 کلاس ChainMap بدون کپی کردن دیکشنری‌ها، آنها را به صورت یک لایهٔ مجازی و زنده پیوند می‌دهد و هنگام تغییر لایه اول، دادهٔ اصلی حفظ می‌شود. 🐍 @python_rd

🔆 رفتار Scoping در Comprehension پایتون ۳ 🔹 خروجی قطعه کد زیر چیست؟
x = 10
funcs = [lambda: x for x in range(3)]
results = [f() for f in funcs]
print(x, results)
الف) 10 [0, 1, 2] ب) 2 [2, 2, 2] ج) 10 [2, 2, 2] د) 10 [0, 1, 10] 🐍 @python_rd

🔆 پایتون رسماً سریع‌تر می‌شود؛ ورود تیم مفسر JIT به پروژه CPython! 🔹 توسعه‌دهندگان ارشد هسته پایتون خبر دادند که کار روی اضافه کردن یک مفسر JIT (Just-In-Time) داخلی به نسخه آینده پایتون با سرعت بالایی در حال پیشرفت است. 🔹 منبع معتبر: وبلاگ رسمی بنیان‌گذار پایتون (Guido van Rossum) و مخزن گیت‌هاب رسمی CPython (PEP 744) 🔹 جریان کار چیست؟ تا پیش از این، کدهای پایتون به بایت‌کد تبدیل و توسط مفسر بایت‌کد پایتون اجرا می‌شدند. با مکانیزم جدید JIT (که با الگوبرداری از پایتون‌های جایگزین مثل PyPy و پیشرفت‌های مدرن پیاده‌سازی شده)، پایتون کدهای تکرارپذیر را در زمان اجرا به زبان ماشین کامپایل می‌کند. 🔹 نتیجه: بنچمارک‌های اولیه نشان می‌دهد که سرعت اجرای حلقه‌ها و محاسبات عددی بدون نیاز به تغییر دادن کدهای فعلی، بین ۱۰ تا ۲۰ درصد بهبود پیدا می‌کند. پایتون آرام‌آرام ضعف بزرگ سرعتی خود را پوشش می‌دهد! 🐍 @python_rd

🔆 مجموعه‌ای از نرم‌افزارهای متن‌باز که با استفاده از زبان پایتون نوشته‌شده‌اند 🔹 github.com/mahmoud/awesome-python-applications 🐍 @python_rd

🔆 یادگیری پایتون با پروژه های ساده و جذاب 🔹 codeclubprojects.org/en-GB/python 🐍 @python_rd
🔆 یادگیری پایتون با پروژه های ساده و جذاب 🔹 codeclubprojects.org/en-GB/python 🐍 @python_rd

🔆 یک سایت خوب پر از پادکست‌های مرتبط با زبان پایتون 🔹 talkpython.fm 🐍 @python_rd
🔆 یک سایت خوب پر از پادکست‌های مرتبط با زبان پایتون 🔹 talkpython.fm 🐍 @python_rd

🌐 خروجی این کد پایتون چیست؟
x = [1, 2, 3]
y = x
x += [4, 5]

print(x)
print(y)
🔹 گزینه‌ها: 🔹A) [1, 2, 3, 4, 5] [1, 2, 3] 🔹B) [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] 🔹C) Error 🔹D) [4, 5] [1, 2, 3] 🐍 @python_rd

🔆 آیا enumerate() بهتر از index-based loop است؟ 🔹 خیلی‌ها هنوز این شکلی می‌نویسند:
items = ["apple", "banana", "orange"]

for i in range(len(items)):
    print(i, items[i])
🔹 ولی راه پایتونیک‌تر:
items = ["apple", "banana", "orange"]

for index, value in enumerate(items):
    print(index, value)
🔹 اگر index را از 1 بخواهی:
for index, value in enumerate(items, start=1):
    print(index, value)
🔹 چرا بهتر است؟ خواناتر است خطای index کمتر می‌شود پایتونیک‌تر و حرفه‌ای‌تر است 🔹 این از آن تفاوت‌های کوچک است که کیفیت کد را در بلندمدت خیلی بالا می‌برد. 🐍 @python_rd

🔆 یک تله عجیب در پایتون: bool در واقع زیرکلاس int است 🔹 خیلی‌ها می‌دانند True == 1 و False == 0، اما نکته عجیب‌تر اینجاست که:
print(isinstance(True, int))   # True
print(True + True)             # 2
print(False + 10)              # 10
🔹 این یعنی: True و False فقط مقدار بولی نیستند در سطح type system، از int ارث‌بری می‌کنند 🔹 این رفتار در خیلی از سناریوها مفید است، ولی اگر روی counting، hashing یا data processing کار کنی، گاهی می‌تواند نتایج عجیبی بسازد. 🐍 @python_rd

کوییز پایتون 🔆 خروجی اجرای کد زیر چیست؟
t = (1, 2, [3, 4])

try:
    t[2] += [5]
except TypeError:
    pass

print(t)
🔹 گزینه‌ها: 1️⃣ (1, 2, [3, 4]) 2️⃣ (1, 2, [3, 4, 5]) 3️⃣ خطای مدیریت‌نشده رخ می‌دهد و برنامه متوقف می‌شود 4️⃣ خروجی (1, 2, [5]) خواهد بود 🐍@python_rd

🔆 راز مکانیزم پیاده‌سازی و تغییر جهت NaN در الگوریتم مرتب‌سازی پایتون (Timsort) 🔹 باگ ریاضیاتی پنهان: چرا پایتون هیچ‌وقت نمی‌تواند لیستی از NaNها را مرتب کند؟! 🔹 در پایتون، مقدار float('nan') (Not a Number) خصوصیت عجیبی دارد: nan طبق استاندارد IEEE-754 با خودش هم برابر نیست! float('nan') == float('nan') ⬅️ خروجی False است! float('nan') < 5 ⬅️ باز هم False است! 🔹 حالا شگفتی ماجرا در متد .sort() پایتون است: الگوریتم مرتب‌سازی CPython یعنی Timsort بر اصل تقارن و ترتیبی بودن مقایسه‌ها استوار است. اگر شما لیستی شامل اعداد و NaN را با .sort() مرتب کنید: 🔹 نتیجه خروجی به ترتیب قرارگیری اولیه عناصر بستگی دارد و غیرقابل‌پیش‌بینی است! 🔹 پایتون هیچ خطایی (Error) پرتاب نمی‌کند، اما خروجی نهایی مرتب‌شده نخواهد بود! 🔹 مهندسان CPython سال‌هاست که در گیت‌هاب پایتون روی این موضوع بحث دارند و تصمیم گرفته‌اند برای حفظ پرفورمنس Timsort، هیچ لایه اعتبارسنجی اضافی اضافه نکنند و این مسئولیت را روی دوش برنامه‌نویس بگذارند! 🐍@python_rd

🔆 حذف تاریخی GIL از پایتون (Free-threaded Python) 🔹 یک رویداد تاریخی: حذف قفل مفسر (GIL) از هسته CPython رسماً کلید خورد! 🔹 سرانجام پس از سال‌ها بحث و مناظره در بنیاد نرم‌افزار پایتون (PSF)، طرح PEP 703 (معروف به Free-threaded CPython) تصویب و گام‌های اجرایی آن آغاز شد. با این تغییر، مفسر پایتون می‌تواند از تمام هسته‌های پردازنده (Multi-Core CPU) در Multi-threading به صورت واقعی بهره ببرد بدون اینکه گلوگاه قفل مفسر سر راهش باشد. 🔹 نکات کلیدی این تحول: ▪️ پشتیبانی اولیه به صورت بیلد آزمایشی (Experimental / --disable-gil) در دسترس قرار گرفته است. ▪️ تیم‌های توسعه کتابخانه‌های بزرگ مانند NumPy و PyTorch در حال بازنویسی بخش‌های C-API خود برای سازگاری با حالت بدون GIL هستند. ▪️ طبق پیش‌بینی هسته مرکزی، پایتون در پردازش‌های سنگین موازی تا چند برابر افزایش کارایی را تجربه خواهد کرد. 🔹 منبع رسمی: • مستندات رسمی PEP 703: peps.python.org/pep-0703 • اعلامیه Steering Council پایتون: discuss.python.org 🐍 @python_rd

🔆 مدیریت تمیز منابع با Context Managerهای سفارشی (contextlib) 🔹 ساخت Context Managerها معمولاً با نوشتن کلاس و متدهای enter و exit انجام می‌شود. اما با دکوراتور contextmanager@ از ماژول contextlib می‌توانید این کار را خیلی سریع‌تر و پایتونیک‌تر انجام دهید.
from contextlib import contextmanager
import time


@contextmanager
def measure_time(task_name: str):
  start_time = time.perf_counter()
  print(f"--- شروع: {task_name} ---")
  try:
    yield  # کنترل اجرا در این نقطه به بدنه with منتقل می‌شود
  finally:
    elapsed = time.perf_counter() - start_time
    print(f"--- پایان: {task_name} | زمان اجرا: {elapsed:.4f} ثانیه ---\n")


# استفاده کاربردی
with measure_time("پردازش سنگین داده‌ها"):
  # شبیه‌سازی یک کار سنگین
  total = sum(i**2 for i in range(10_000_000))
  print(f"نتیجه محاسبات: {total}")
🐍 @python_rd

🔆 چرا برای داده‌های حجیم نباید از return استفاده کنی؟ 🔹 وقتی یک تابع لیست بزرگی از داده‌ها رو با return برمی‌گرداند، کل داده‌ها باید همزمان توی رم (RAM) لود بشن که باعث مصرف شدید حافظه و کندی سیستم میشه. 🔹 اما اگر به جای return از yield استفاده کنی، تابع تبدیل به یک Generator میشه که داده‌ها رو به صورت تک‌به‌تک و تنبل (Lazy Evaluation) تولید می‌کنه:
def read_large_file(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.strip()  # هر بار فقط یک خط را در حافظه نگه می‌دارد
🔹با این روش می‌تونی فایل‌های چند گیگابایتی رو با مصرف چند مگابایت رم پردازش کنی! 🐍 @python_rd

🔆 خروجی این تکه کد چیه؟
def add_item(item, lst=[]):
    lst.append(item)
    return lst

print(add_item(1))
print(add_item(2))
print(add_item(3, [9, 9]))
print(add_item(4))
🔹گزینه‌ها: الف) [1], [2], [9, 9, 3], [4] ب) [1], [1, 2], [9, 9, 3], [1, 2, 4] ج) [1], [2], [3], [4] 🐍 @python_rd

🔆 مدیریت منابع با contextlib 🔹 از تکرار try...finally برای بستن فایل‌ها و اتصال‌ها خسته شدی؟ 🔹 پایتون ابزاری به نام Context Manager داره که با دستور with استفاده میشه. اما اگر بخوای خودت یک Context Manager سفارشی بسازی، نیازی نیست حتماً کلاس با متدهای enter و exit بنویسی! با ماژول contextlib و دکوراتور @contextmanager می‌تونی خیلی تمیز این کار رو انجام بدی:
from contextlib import contextmanager

@contextmanager
def managed_resource():
    print("-> باز کردن اتصال/فایل")
    yield "Resource Object"
    print("-> بستن ایمن اتصال/فایل")

# استفاده:
with managed_resource() as res:
    print(f"در حال کار با: {res}")
🐍 @python_rd