رویداد زنده

201 ترفند پایتونی مخصوص حرفه ای ها

بخش اول-مقدماتی

ترفندهای کاربردی پایتون (مقدماتی تا میان‌رده) .

۱ تعویض مقادیر (Swap Values)

ایدهٔ اصلی: به زبان ساده، می‌توانید مقادیر دو متغیر را بدون استفاده از یک متغیر موقت تعویض کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در پایتون می‌توانید چند مقدار را همزمان (tuple unpacking) جابه‌جا کنید؛ سمت راست کامل ارزیابی می‌شود و سپس به سمت چپ تخصیص می‌گردد، بنابراین نیازی به متغیر موقت ندارید.

کِی به درد می‌خوره؟

  • جابه‌جایی سریع دو متغیر یا دو عنصر از یک لیست.
  • داخل الگوریتم‌ها (مثل مرتب‌سازی‌ها) برای swap کردن عناصر.
  • نوشتن کد کوتاه‌تر و خواناتر نسبت به روش متغیر موقت.

یه مثال سریع:

a, b = b, a

یه مثال بیشتر 1:

a, b = 10, 20
a, b = b, a
print(a, b)  # 20 10
حواست باشه: اگر قصد swap کردن عناصر یک لیست را دارید: `lst[i], lst[j] = lst[j], lst[i]`.
۲ لیست‌های فشرده (List Comprehensions)

ایدهٔ اصلی: به زبان ساده، برای کدنویسی خوانا و مختصر می‌توانید از لیست‌های فشرده استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، List Comprehension راهی سریع و خوانا برای ساختن یک لیست جدید بر اساس یک iterable است. این الگو جایگزین خوبی برای حلقه‌های کوتاهِ append کردن است.

کِی به درد می‌خوره؟

  • تبدیل (Transform) داده‌ها؛ مثل تبدیل لیست رشته‌ها به لیست عدد.
  • فیلتر کردن (Filter) داده‌ها با شرط `if`.
  • ساختن خروجی‌های کوتاه برای گزارش یا پردازش داده.

یه مثال سریع:

squared_numbers = [x**2 for x in range(1, 11)]

یه مثال بیشتر 1:

numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares)  # [4, 16, 36]
حواست باشه: اگر منطق داخل comprehension پیچیده شد، آن را به چند خط حلقه یا یک تابع جداگانه تبدیل کنید.
۳ تخصیص چندگانه (Multiple Assignments)

ایدهٔ اصلی: به زبان ساده، می‌توانید چندین متغیر را در یک خط مقداردهی کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، تخصیص چندگانه باعث می‌شود چند متغیر را همزمان مقداردهی کنید. این کار هم کد را کوتاه‌تر می‌کند و هم احتمال خطا را کاهش می‌دهد.

کِی به درد می‌خوره؟

  • مقداردهی اولیه چند متغیر مرتبط (مثل x و y).
  • دریافت چند خروجی از یک تابع (return tuple).
  • باز کردن نتیجه split یا unpacking یک iterable.

یه مثال سریع:

x, y, z = 1, 2, 3

یه مثال بیشتر 1:

x, y = (12, 30)
print(x, y)  # 12 30

name, age = "Alice 30".split()
print(name, int(age))
حواست باشه: تعداد متغیرهای سمت چپ باید با تعداد مقادیر سمت راست هماهنگ باشد؛ وگرنه ValueError می‌گیرید.
۴ باز کردن (Unpacking)

ایدهٔ اصلی: به زبان ساده، می‌توانید عناصر یک لیست یا تاپل را در متغیرهای جداگانه باز کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Unpacking یعنی عناصر یک iterable (مثل list/tuple) را به چند متغیر جداگانه نسبت دهید. در پایتون امکان «باز کردن توسعه‌یافته» با `*` هم وجود دارد.

کِی به درد می‌خوره؟

  • وقتی می‌خواهید خروجی چندتایی یک تابع را به چند متغیر بدهید.
  • وقتی می‌خواهید ابتدا/انتها را جدا و وسط را به صورت لیست نگه دارید.
  • برای خواناتر کردن کد هنگام کار با داده‌های ساختاریافته.

یه مثال سریع:

numbers = [1, 2, 3]
a, b, c = numbers

یه مثال بیشتر 1:

numbers = [10, 20, 30, 40, 50]
first, *middle, last = numbers
print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50
حواست باشه: از `*rest` فقط یک‌بار در سمت چپ می‌توانید استفاده کنید.
۵ ادغام دیکشنری‌ها (Merge Dictionaries)

ایدهٔ اصلی: به زبان ساده، ادغام دو دیکشنری در پایتون ۳.۵ به بالا.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، برای ادغام دیکشنری‌ها چند روش دارید: unpacking با `**` (از ۳.۵+)، و عملگر اجتماع `|` (از ۳.۹+). در صورت تداخل کلیدها، مقدار دیکشنریِ سمت راست غالب می‌شود.

کِی به درد می‌خوره؟

  • ادغام تنظیمات (configs) یا پارامترها با اولویت‌بندی.
  • ترکیب چند منبع داده برای ساخت payload یا response.
  • ساختن دیکشنری جدید بدون تغییر دیکشنری‌های اصلی.

یه مثال سریع:

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged_dict = {**dict1, **dict2}

یه مثال بیشتر 1:

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

# Python 3.9+
merged = dict1 | dict2
print(merged)  # {'a': 1, 'b': 99, 'c': 3}
حواست باشه: اگر می‌خواهید دیکشنری اول in-place تغییر کند، از `dict1.update(dict2)` استفاده کنید.
۶ عملگر سه‌تایی (Ternary Operator)

ایدهٔ اصلی: به زبان ساده، برای عبارات شرطی مختصر می‌توانید از عملگر سه‌تایی استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، عملگر سه‌تایی در پایتون شکل کوتاهِ if/else است و زمانی خوب است که فقط «یک مقدار» را بر اساس شرط انتخاب می‌کنید.

کِی به درد می‌خوره؟

  • مقداردهی یک متغیر بر اساس شرط بدون چند خط if/else.
  • ساخت پیام/label بر اساس وضعیت.
  • قرار دادن if/else کوتاه داخل return.

یه مثال سریع:

x = 10
result = "positive" if x > 0 else "non-positive"

یه مثال بیشتر 1:

score = 72
grade = "pass" if score >= 60 else "fail"
print(grade)  # pass
حواست باشه: اگر شرط‌ها زیاد شد، از if/elif/else معمولی استفاده کنید تا کد قابل فهم بماند.
۷ دیکشنری پیش‌فرض (Default Dictionary)

ایدهٔ اصلی: به زبان ساده، می‌توانید یک دیکشنری با مقادیر پیش‌فرض برای کلیدهای ناموجود ایجاد کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `defaultdict` نوعی dict است که وقتی کلیدی وجود ندارد، به‌صورت خودکار مقدار پیش‌فرض می‌سازد (مثل ۰ یا لیست خالی).

کِی به درد می‌خوره؟

  • شمارش تکرارها بدون چک کردن وجود کلید.
  • گروه‌بندی آیتم‌ها بر اساس یک کلید (مثل دسته‌بندی محصولات).
  • ساخت دیکشنری‌های چندسطحی با کد کمتر.

یه مثال سریع:

from collections import defaultdict
d = defaultdict(int) # مقدار پیش‌فرض برای کلیدهای ناموجود ۰ است

یه مثال بیشتر 1:

from collections import defaultdict

words = ["hi", "hello", "hey", "hello", "hi"]
counts = defaultdict(int)

for w in words:
    counts[w] += 1

print(dict(counts))  # {'hi': 2, 'hello': 2, 'hey': 1}
حواست باشه: اگر فقط شمارش می‌خواهید، `Counter` هم گزینه بسیار خوبی است.
۸ تابع Zip

ایدهٔ اصلی: به زبان ساده، می‌توانید دو یا چند لیست را با استفاده از تابع zip ترکیب کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، تابع `zip` آیتم‌های چند iterable را کنار هم قرار می‌دهد و یک iterator از تاپل‌ها می‌سازد. برای دیدن نتیجه معمولاً آن را به `list(...)` تبدیل می‌کنیم.

کِی به درد می‌خوره؟

  • پیمایش موازی روی چند لیست (نام‌ها و نمره‌ها).
  • ساختن dict از دو لیست (کلیدها و مقادیر).
  • باز کردن zip با `zip(*pairs)` برای جدا کردن ستون‌ها.

یه مثال سریع:

names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

students = list(zip(names, scores))
print(students)
# خروجی: [('Alice', 85), ('Bob', 92), ('Charlie', 78)]

یه مثال بیشتر 1:

keys = ["host", "port", "debug"]
values = ["localhost", 8000, True]

config = dict(zip(keys, values))
print(config)  # {'host': 'localhost', 'port': 8000, 'debug': True}
حواست باشه: اگر طول iterableها متفاوت است و می‌خواهید همه را پوشش دهید، از `itertools.zip_longest` استفاده کنید.
۹ تابع Enumerate

ایدهٔ اصلی: به زبان ساده، می‌توانید از enumerate برای به دست آوردن همزمان اندیس و مقدار عناصر در یک لیست استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `enumerate` هنگام پیمایش، اندیس و مقدار را با هم می‌دهد. این کار باعث می‌شود به جای range و index، کد تمیزتر و امن‌تری بنویسید.

کِی به درد می‌خوره؟

  • شماره‌گذاری آیتم‌ها هنگام چاپ یا گزارش.
  • پرهیز از `list.index()` که O(n) است.
  • پیمایش همراه با اندیس شروع دلخواه (`start=`).

یه مثال سریع:

fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
    print(f"Index {index}: {fruit}")

یه مثال بیشتر 1:

fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")
حواست باشه: اگر فقط اندیس لازم دارید، `range(len(...))` هم هست؛ ولی enumerate معمولاً خواناتر است.
۱۰ any و all

ایدهٔ اصلی: به زبان ساده، می‌توانید بررسی کنید که آیا هیچ‌یک یا تمام عناصر در یک دنباله شرطی را برآورده می‌کنند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `any` می‌گوید آیا حداقل یکی از شرط‌ها True است؛ و `all` بررسی می‌کند آیا همه True هستند. هر دو lazy هستند و در صورت امکان زود متوقف می‌شوند.

کِی به درد می‌خوره؟

  • اعتبارسنجی ورودی‌ها (همه مثبت باشند، همه رشته باشند، ...).
  • بررسی وجود یک حالت خاص در داده‌ها.
  • نوشتن شرط‌های جمعی بدون حلقه دستی.

یه مثال سریع:

numbers = [2, 4, 6, 7, 8]
any_even = any(x % 2 == 0 for x in numbers)
all_even = all(x % 2 == 0 for x in numbers)

یه مثال بیشتر 1:

values = ["admin", "editor", "viewer"]
has_admin = any(role == "admin" for role in values)
all_str = all(isinstance(role, str) for role in values)

print(has_admin)  # True
print(all_str)    # True
حواست باشه: برای کاهش مصرف حافظه، از generator expression استفاده کنید نه list.
۱۱ تابع تک‌خطی (One-Liner Function)

ایدهٔ اصلی: به زبان ساده، با استفاده از لامبدا (lambda) توابع تک‌خطی ایجاد کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، lambda یک تابع بی‌نام و کوتاه است. برای کارهای خیلی ساده (به‌خصوص به عنوان key یا callback) مناسب است.

کِی به درد می‌خوره؟

  • به عنوان `key=` در sort/max/min.
  • در map/filter برای عملیات کوچک.
  • برای callbackهای کوتاه.

یه مثال سریع:

square = lambda x: x ** 2

یه مثال بیشتر 1:

people = [{"name": "Ali", "age": 20}, {"name": "Sara", "age": 18}]
sorted_people = sorted(people, key=lambda p: p["age"])
print(sorted_people)
حواست باشه: اگر lambda پیچیده شد، حتماً از `def` استفاده کنید تا خوانایی حفظ شود.
۱۲ filter و map

ایدهٔ اصلی: به زبان ساده، برای عملیات فشرده و گویای لیست می‌توانید از filter و map استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، توابع `map` و `filter` معمولاً iterator برمی‌گردانند. در خیلی از پروژه‌ها list comprehension خواناتر است، ولی map/filter برای pipeline و lazy evaluation هم کاربرد دارند.

کِی به درد می‌خوره؟

  • تبدیل و فیلتر کردن داده‌ها به صورت زنجیره‌ای.
  • استفاده از توابع آماده (مثل `str.strip`) روی لیست‌ها.
  • کاهش مصرف حافظه با lazy evaluation.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
evens = list(filter(lambda x: x % 2 == 0, numbers))
squared = list(map(lambda x: x ** 2, numbers))

یه مثال بیشتر 1:

numbers = [1, 2, 3, 4, 5, 6]

squares = list(map(lambda x: x*x, numbers))
evens = list(filter(lambda x: x % 2 == 0, numbers))

print(squares)
print(evens)
حواست باشه: اگر خروجی را یک‌بار مصرف می‌کنید، می‌توانید iterator را مستقیم در حلقه استفاده کنید و list نسازید.
۱۳ تابع sorted

ایدهٔ اصلی: به زبان ساده، می‌توانید یک لیست را مرتب کنید در حالی که لیست اصلی دست‌نخورده باقی بماند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sorted` یک لیست جدیدِ مرتب‌شده برمی‌گرداند و ورودی را تغییر نمی‌دهد. با `key=` معیار مرتب‌سازی را تعیین کنید و با `reverse=True` ترتیب را برعکس کنید.

کِی به درد می‌خوره؟

  • مرتب‌سازی برای نمایش یا گزارش.
  • مرتب کردن بر اساس فیلد/کلید خاص.
  • حفظ لیست اصلی و ساخت نسخه مرتب‌شده.

یه مثال سریع:

numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)

یه مثال بیشتر 1:

words = ["python", "go", "javascript", "c"]
by_len = sorted(words, key=len)
print(by_len)
حواست باشه: برای مرتب‌سازی in-place از `list.sort()` استفاده کنید.
۱۴ مقایسه زنجیره‌ای (Chain Comparison)

ایدهٔ اصلی: به زبان ساده، مقایسه زنجیره‌ای برای کد تمیزتر.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، مقایسه زنجیره‌ای مثل `0 < x < 20` خواناتر است و از تکرار `x` جلوگیری می‌کند. این الگو برای چک کردن بازه‌ها عالی است.

کِی به درد می‌خوره؟

  • بررسی بازه‌ها (range checks) برای نمره/سن/دما و ...
  • شرط‌های ساده و خوانا در if.
  • کاهش خطای منطقی در شرط‌های چندبخشی.

یه مثال سریع:

x = 10
if 0 < x < 20:
    print("x is in the range (0, 20)")

یه مثال بیشتر 1:

x = 5
if 1 <= x <= 10:
    print("x in [1,10]")
حواست باشه: مقایسه زنجیره‌ای در پایتون short-circuit هم دارد.
۱۵ دیکشنری‌های فشرده (Dictionary Comprehensions)

ایدهٔ اصلی: به زبان ساده، برای ساخت مختصر دیکشنری می‌توانید از دیکشنری‌های فشرده استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Dictionary Comprehension برای ساخت سریع dict از iterableها مفید است و شبیه list comprehension عمل می‌کند.

کِی به درد می‌خوره؟

  • ساخت mapping سریع (مثلاً نام → طول نام).
  • فیلتر کردن آیتم‌ها هنگام ساخت dict.
  • ساخت dict جدید بدون تغییر dict اصلی.

یه مثال سریع:

squared_dict = {x: x**2 for x in range(1, 11)}

یه مثال بیشتر 1:

words = ["hi", "hello", "hey"]
lengths = {w: len(w) for w in words}
print(lengths)
حواست باشه: در معکوس کردن dict، اگر مقادیر یکتا نباشند داده از دست می‌رود.
۱۶ zip(*reversed()) برای جابه‌جایی (Transpose) یک ماتریس

ایدهٔ اصلی: به زبان ساده، می‌توانید یک ماتریس را با استفاده از توابع zip و reversed جابه‌جا کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ترکیب `reversed` و `zip(*)` در ماتریس‌های کوچک کاربردی است. دقت کنید: `zip(*matrix)` ترانهاده می‌دهد؛ ولی `zip(*reversed(matrix))` چرخش ۹۰ درجه ساعت‌گرد می‌سازد.

کِی به درد می‌خوره؟

  • چرخش/ترانهاده کردن ماتریس‌های کوچک در مسائل الگوریتمی.
  • تبدیل داده‌های row-based به column-based.
  • کارهای سریع بدون NumPy.

یه مثال سریع:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 1) ترانهاده (Transpose) واقعی:
transposed = [list(row) for row in zip(*matrix)]
print(transposed)
# خروجی: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

# 2) چرخش 90 درجه ساعت‌گرد (Rotate 90° clockwise):
rotated = [list(row) for row in zip(*reversed(matrix))]
print(rotated)
# خروجی: [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
حواست باشه: برای داده‌های بزرگ و عملیات سنگین روی ماتریس، NumPy سریع‌تر است.
۱۷ set برای عناصر منحصر به فرد

ایدهٔ اصلی: به زبان ساده، برای به دست آوردن عناصر منحصر به فرد می‌توانید از یک لیست از set استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، تبدیل لیست به `set` راه سریع حذف تکراری‌هاست؛ اما `set` ترتیب را تضمین نمی‌کند. اگر ترتیب مهم است، باید روش دیگری استفاده کنید.

کِی به درد می‌خوره؟

  • حذف تکراری‌ها در داده‌های خام.
  • چک کردن عضویت سریع‌تر نسبت به list.
  • محاسبه اشتراک/اجتماع/تفاضل مجموعه‌ها.

یه مثال سریع:

numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_numbers = list(set(numbers))

یه مثال بیشتر 1:

numbers = [3, 1, 3, 2, 1]
unique_in_order = list(dict.fromkeys(numbers))
print(unique_in_order)  # [3, 1, 2]
حواست باشه: برای داده‌های خیلی بزرگ، set عالی است؛ اما برای حفظ ترتیب از dict.fromkeys یا روش‌های مشابه استفاده کنید.
۱۸ collections.Counter

ایدهٔ اصلی: به زبان ساده، برای شمارش تعداد تکرار عناصر در یک لیست می‌توانید از Counter استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `collections.Counter` برای شمارش فراوانی آیتم‌ها ساخته شده و امکاناتی مثل `most_common` دارد.

کِی به درد می‌خوره؟

  • شمارش کلمات/حروف/آیتم‌ها.
  • یافتن پرتکرارترین‌ها.
  • ساخت آمار سریع بدون حلقه‌نویسی زیاد.

یه مثال سریع:

from collections import Counter
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
number_counts = Counter(numbers) # خروجی: Counter({4: 4, 3: 3, 2: 2, 1: 1})

یه مثال بیشتر 1:

from collections import Counter

text = "banana"
c = Counter(text)
print(c.most_common(2))  # [('a', 3), ('n', 2)]
حواست باشه: Counter روی داده‌های hashable کار می‌کند (مثل str, int, tuple).
۱۹ sum با مقدار اولیه

ایدهٔ اصلی: به زبان ساده، برای جمع مقادیر با یک مقدار اولیه می‌توانید از sum استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sum(iterable, start)` از مقدار `start` شروع می‌کند. برای عددها مناسب است، اما برای رشته‌ها بهتر است از join استفاده کنید.

کِی به درد می‌خوره؟

  • جمع کردن اعداد با offset اولیه.
  • جمع کردن خروجی generator بدون ساخت لیست.
  • محاسبه مجموع امتیازها/وزن‌ها.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
sum_with_start = sum(numbers, 10) # نتیجه: 25 (10 + 1 + 2 + 3 + 4 + 5)

یه مثال بیشتر 1:

numbers = [1, 2, 3]
print(sum(numbers, 10))  # 16
print(sum(x*x for x in range(1, 5)))  # 30
حواست باشه: برای concatenation رشته از `''.join(...)` استفاده کنید.
۲۰ collections.defaultdict با لیست

ایدهٔ اصلی: به زبان ساده، می‌توانید از defaultdict با یک لیست به عنوان سازنده پیش‌فرض استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `defaultdict` نوعی dict است که وقتی کلیدی وجود ندارد، به‌صورت خودکار مقدار پیش‌فرض می‌سازد (مثل ۰ یا لیست خالی).

کِی به درد می‌خوره؟

  • شمارش تکرارها بدون چک کردن وجود کلید.
  • گروه‌بندی آیتم‌ها بر اساس یک کلید (مثل دسته‌بندی محصولات).
  • ساخت دیکشنری‌های چندسطحی با کد کمتر.

یه مثال سریع:

from collections import defaultdict
colors = [("apple", "red"), ("banana", "yellow"), ("cherry", "red"), ("orange", "orange")]
color_dict = defaultdict(list)
for fruit, color in colors:
    color_dict[color].append(fruit)
# خروجی: {'red': ['apple', 'cherry'], 'yellow': ['banana'], 'orange': ['orange']}

یه مثال بیشتر 1:

from collections import defaultdict

words = ["hi", "hello", "hey", "hello", "hi"]
counts = defaultdict(int)

for w in words:
    counts[w] += 1

print(dict(counts))  # {'hi': 2, 'hello': 2, 'hey': 1}
حواست باشه: اگر فقط شمارش می‌خواهید، `Counter` هم گزینه بسیار خوبی است.
۲۱ عبارت with برای کار با فایل‌ها

ایدهٔ اصلی: به زبان ساده، برای مدیریت تمیزتر فایل‌ها می‌توانید از عبارت with استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `with` تضمین می‌کند که فایل/منبع حتی اگر خطا رخ دهد هم بسته می‌شود. این بهترین روش کار با فایل‌هاست.

کِی به درد می‌خوره؟

  • خواندن/نوشتن فایل بدون فراموش کردن close.
  • کار با منابعی که cleanup می‌خواهند (lock/connection).
  • نوشتن کد مقاوم در برابر خطا.

یه مثال سریع:

with open("file.txt", "r") as file:
    content = file.read()
# نیازی به بستن دستی فایل نیست، این کار به طور خودکار توسط بلوک 'with' انجام می‌شود.

یه مثال بیشتر 1:

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("سلام دنیا")
حواست باشه: می‌توانید چند فایل را در یک with مدیریت کنید: `with open(...) as a, open(...) as b:`
۲۲ isinstance برای بررسی نوع

ایدهٔ اصلی: به زبان ساده، می‌توانید به جای استفاده از type ، برای بررسی نوع از isinstance استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، با `isinstance` می‌توانید نوع یک متغیر را چک کنید. این روش نسبت به `type(x) == ...` بهتر است چون وراثت را هم لحاظ می‌کند.

کِی به درد می‌خوره؟

  • اعتبارسنجی نوع ورودی توابع.
  • پشتیبانی از چند نوع مجاز (tuple از typeها).
  • نوشتن کد منعطف‌تر در برابر subclassها.

یه مثال سریع:

if isinstance(value, int):
    # کاری را با یک مقدار صحیح انجام بده

یه مثال بیشتر 1:

value = 3.14
if isinstance(value, (int, float)):
    print("number")
حواست باشه: در کدهای جدی، type hinting کمک می‌کند؛ اما `isinstance` هنوز برای runtime checks کاربرد دارد.
۲۳ وراثت چندگانه (Multiple Inheritance)

ایدهٔ اصلی: به زبان ساده، برای ایجاد سلسله‌مراتب کلاسی انعطاف‌پذیر می‌توانید از وراثت چندگانه استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، وراثت چندگانه در پایتون با MRO (ترتیب حل متدها) کنترل می‌شود. ترکیب mixinها کاربرد رایج آن است.

کِی به درد می‌خوره؟

  • ساخت mixinهای کوچک و ترکیب رفتارها.
  • اشتراک‌گذاری قابلیت‌های عمومی بین چند کلاس.
  • الگوهای فریم‌ورکی (در حد نیاز).

یه مثال سریع:

class A:
    def method(self):
        print("Method from class A")
class B:
    def method(self):
        print("Method from class B")
class C(A, B):
    pass
instance = C()
instance.method() # خروجی: "Method from class A"

یه مثال بیشتر 1:

class A:
    def hello(self):
        return "A"

class B:
    def hello(self):
        return "B"

class C(A, B):
    pass

print(C().hello())  # A
حواست باشه: اگر ساختار پیچیده شد، Composition (ترکیب اشیاء) را به عنوان جایگزین بررسی کنید.
۲۴ دکوراتورها (Decorators)

ایدهٔ اصلی: به زبان ساده، دکوراتورها به شما اجازه می‌دهند رفتار توابع یا متدها را تغییر داده یا بهبود ببخشید.

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

کِی به درد می‌خوره؟

  • Timing و profiling سریع توابع.
  • Authorization و validation.
  • Caching با `functools.lru_cache` یا دکوراتورهای سفارشی.

یه مثال سریع:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

یه مثال بیشتر 1:

import time
from functools import wraps

def timing(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} took {end - start:.6f}s")
        return result
    return wrapper

@timing
def work():
    return sum(range(100000))

work()
حواست باشه: داخل دکوراتور از `functools.wraps` استفاده کنید تا نام و docstring تابع اصلی حفظ شود.
۲۵ functools.partial

ایدهٔ اصلی: به زبان ساده، برای ایجاد توابع با آرگومان‌های ثابت می‌توانید از functools.partial استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `functools.partial` برخی آرگومان‌ها را از قبل مقداردهی می‌کند و یک تابع جدید می‌سازد. برای ساخت توابع تخصصی از توابع عمومی مفید است.

کِی به درد می‌خوره؟

  • ساخت wrapperهای ساده بدون نوشتن def جدید.
  • فیکس کردن پارامترهای تکراری در callbackها.
  • کاهش تکرار هنگام استفاده از توابع عمومی.

یه مثال سریع:

import functools
def power(base, exponent):
    return base ** exponent
square = functools.partial(power, exponent=2)
cube = functools.partial(power, exponent=3)
print(square(5)) # خروجی: 25
print(cube(5)) # خروجی: 125

یه مثال بیشتر 1:

from functools import partial

def power(base, exp):
    return base ** exp

square = partial(power, exp=2)
cube = partial(power, exp=3)

print(square(5))  # 25
print(cube(2))    # 8
حواست باشه: اگر partial خوانایی را کم کرد، یک تابع کوچک با def بنویسید.
۲۶ collections.namedtuple

ایدهٔ اصلی: به زبان ساده، با استفاده از namedtuple کلاس‌های ساده با فیلدهای نام‌گذاری شده ایجاد کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `namedtuple` مثل tuple است ولی فیلدهای نام‌دار دارد. سبک و سریع است و خوانایی را بالا می‌برد.

کِی به درد می‌خوره؟

  • مدل‌کردن داده‌های ساده مثل Point یا RGB.
  • خروجی چندتایی از تابع با نام‌های واضح.
  • جایگزین سبک برای کلاس‌های خیلی ساده.

یه مثال سریع:

from collections import namedtuple
Person = namedtuple("Person", ["name", "age"])
person = Person("Alice", 30)
print(person.name) # خروجی: "Alice"
print(person.age) # خروجی: 30

یه مثال بیشتر 1:

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p = Point(2, 3)
print(p.x, p.y)
print(p._asdict())
حواست باشه: اگر نیاز به mutable بودن یا validation دارید، `dataclasses` گزینه بهتری است.
۲۷ globals() و locals()

ایدهٔ اصلی: به زبان ساده، می‌توانید به متغیرهای سراسری و محلی به صورت پویا دسترسی پیدا کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `globals()` و `locals()` دیکشنری فضای نام را می‌دهند. برای دیباگ و کارهای پویا مفیدند، ولی استفاده زیاد در کدهای معمولی توصیه نمی‌شود.

کِی به درد می‌خوره؟

  • دیباگ و مشاهده متغیرهای موجود.
  • نوشتن ابزارهای آموزشی/تحلیلی.
  • پیاده‌سازی سیستم‌های پویا با طراحی مناسب.

یه مثال سریع:

x = 10
def my_function():
    y = 20
    print(locals()) # خروجی: {'y': 20}
    print(globals()['x']) # خروجی: 10
my_function()

یه مثال بیشتر 1:

x = 1
def demo():
    y = 2
    print("locals:", locals())
    print("x in globals:", "x" in globals())
demo()
حواست باشه: تغییر دادن locals معمولاً رفتار قابل اعتمادی ندارد؛ با احتیاط استفاده کنید.
۲۸ الحاق لیست‌ها (List Concatenation)

ایدهٔ اصلی: به زبان ساده، برای الحاق لیست‌ها می‌توانید از + استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، برای اتصال لیست‌ها چند راه دارید: `+` (ساخت لیست جدید)، `extend` (تغییر درجا)، و `itertools.chain` (lazy). انتخاب درست به نیاز شما بستگی دارد.

کِی به درد می‌خوره؟

  • ترکیب دو لیست کوچک با `+`.
  • اضافه کردن چند آیتم به لیست موجود با `extend`.
  • پیمایش روی چند iterable بدون ساخت لیست جدید با `itertools.chain`.

یه مثال سریع:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
concatenated_list = list1 + list2 # خروجی: [1, 2, 3, 4, 5, 6]

یه مثال بیشتر 1:

a = [1, 2]
b = [3, 4]

print(a + b)  # [1, 2, 3, 4]

a.extend(b)
print(a)      # [1, 2, 3, 4]
حواست باشه: اگر لیست خیلی بزرگ است و فقط می‌خواهید پیمایش کنید، `itertools.chain(a, b)` از نظر حافظه بهتر است.
۲۹ قالب‌بندی رشته (String Formatting)

ایدهٔ اصلی: به زبان ساده، برای قالب‌بندی رشته می‌توانید از f-string (پایتون ۳.۶ به بالا) یا str.format استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، f-string (پایتون ۳.۶+) معمولاً خواناتر است و از format specifierها پشتیبانی می‌کند. برای عددها و تاریخ‌ها می‌توانید قالب‌دهی دقیق انجام دهید.

کِی به درد می‌خوره؟

  • ساخت پیام برای لاگ‌ها و خروجی CLI.
  • نمایش عدد با اعشار/درصد/جداکننده هزار.
  • فرمت کردن تاریخ و زمان برای UI یا فایل.

یه مثال سریع:

name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
# خروجی: "My name is Alice and I am 30 years old."
print("My name is {} and I am {} years old.".format(name, age))
# خروجی: "My name is Alice and I am 30 years old."

یه مثال بیشتر 1:

pi = 3.1415926
print(f"{pi:.2f}")   # 3.14

price = 1250000
print(f"{price:,}")  # 1,250,000
حواست باشه: از f-string با `=` هم می‌توانید برای دیباگ استفاده کنید: `f'{var=}'` (پایتون ۳.۸+).
۳۰ try , except , و else

ایدهٔ اصلی: به زبان ساده، برای مدیریت خطای آموزنده‌تر می‌توانید از try ، except و else استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، try/except برای مدیریت خطاست. `else` فقط وقتی اجرا می‌شود که خطا رخ ندهد و `finally` همیشه اجرا می‌شود (cleanup).

کِی به درد می‌خوره؟

  • مدیریت خطاهای قابل پیش‌بینی (مثل تبدیل نوع، فایل پیدا نشدن).
  • جلوگیری از کرش و ارائه پیام مناسب.
  • پاک‌سازی منابع در finally.

یه مثال سریع:

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
else:
    print(f"Result: {result}")

یه مثال بیشتر 1:

try:
    x = int("42")
except ValueError:
    print("عدد نامعتبر است")
else:
    print("عدد معتبر:", x)
finally:
    print("این بخش همیشه اجرا می‌شود")
حواست باشه: به جای `except:` از گرفتن استثنای مشخص استفاده کنید تا خطاهای واقعی پنهان نشوند.
۳۱ collections.deque

ایدهٔ اصلی: به زبان ساده، برای افزودن و حذف کارآمد و امن در محیط چندنخی (thread-safe) می‌توانید از هر دو انتهای یک صف، از deque استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `deque` برای عملیات push/pop از دو سر بسیار سریع است و برای صف/بافر عالی است. با `maxlen` می‌توانید بافر محدود بسازید.

کِی به درد می‌خوره؟

  • پیاده‌سازی صف یا پشته.
  • ساخت sliding window.
  • نگه داشتن آخرین N رویداد/لاگ در حافظه.

یه مثال سریع:

from collections import deque
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)
queue.popleft() # خروجی: 1

یه مثال بیشتر 1:

from collections import deque

dq = deque(maxlen=3)
for i in range(1, 6):
    dq.append(i)
print(dq)  # deque([3, 4, 5], maxlen=3)
حواست باشه: برای ارتباط thread-safe بین نخ‌ها از `queue.Queue` استفاده کنید.
۳۲ به هم ریختن یک لیست (Shuffling a List)

ایدهٔ اصلی: به زبان ساده، برای به هم ریختن عناصر یک لیست می‌توانید از random.shuffle استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `random.shuffle` لیست را درجا (in-place) تصادفی می‌کند و چیزی برنمی‌گرداند. برای تکرارپذیری نتایج می‌توانید seed تنظیم کنید.

کِی به درد می‌خوره؟

  • تصادفی کردن ترتیب آیتم‌ها.
  • هم‌زدن داده‌ها قبل از train.
  • شبیه‌سازی و تست.

یه مثال سریع:

import random
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers)

یه مثال بیشتر 1:

import random

numbers = [1, 2, 3, 4, 5]
random.seed(42)
random.shuffle(numbers)
print(numbers)
حواست باشه: اگر نمی‌خواهید لیست اصلی تغییر کند، از `random.sample(numbers, k=len(numbers))` استفاده کنید.
۳۳ get دیکشنری با مقدار پیش‌فرض

ایدهٔ اصلی: به زبان ساده، برای دسترسی به مقادیر دیکشنری با یک مقدار پیش‌فرض در صورت عدم وجود کلید، می‌توانید از get استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `dict.get` وقتی کلید وجود نداشته باشد مقدار پیش‌فرض می‌دهد و KeyError رخ نمی‌دهد. این روش برای داده‌های ورودی (مثل JSON) خیلی کاربردی است.

کِی به درد می‌خوره؟

  • خواندن امن از dictهای ورودی.
  • مقداردهی پیش‌فرض برای کلیدهای اختیاری.
  • کاهش try/exceptهای KeyError.

یه مثال سریع:

my_dict = {'a': 1, 'b': 2}
value = my_dict.get('c', 0) # خروجی: 0

یه مثال بیشتر 1:

data = {"user": {"name": "Ali"}}
name = data.get("user", {}).get("name", "Unknown")
age = data.get("user", {}).get("age", 0)

print(name)  # Ali
print(age)   # 0
حواست باشه: برای ساخت دیکشنری-of-lists، گاهی `setdefault` ساده و کاربردی است.
۳۴ dir() برای صفات شیء

ایدهٔ اصلی: به زبان ساده، برای به دست آوردن لیستی می‌توانید از صفات و متدهای یک شیء از dir() استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `dir()` لیستی از attributeها و متدهای یک شیء را نشان می‌دهد و برای کشف قابلیت‌ها در زمان توسعه مفید است.

کِی به درد می‌خوره؟

  • آشنایی سریع با API یک شیء/کتابخانه.
  • دیباگ در REPL یا notebook.
  • همراه با `help()` و `inspect` برای جزئیات بیشتر.

یه مثال سریع:

my_list = [1, 2, 3]
attributes = dir(my_list)
print(attributes)

یه مثال بیشتر 1:

obj = "hello"
print("upper" in dir(obj))  # True
حواست باشه: برای بررسی وجود یک attribute مشخص، `hasattr(obj, 'attr')` ابزار مستقیم‌تری است.
۳۵ sys.argv برای آرگومان‌های خط فرمان

ایدهٔ اصلی: به زبان ساده، با استفاده از sys.argv به آرگومان‌های خط فرمان دسترسی پیدا کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sys.argv` آرگومان‌های خط فرمان را می‌دهد. برای CLIهای حرفه‌ای‌تر از `argparse` یا کتابخانه‌هایی مثل `typer` استفاده کنید.

کِی به درد می‌خوره؟

  • نوشتن اسکریپت‌های ساده.
  • دریافت مسیر فایل/آپشن‌ها.
  • ساخت ابزارهای داخلی تیم.

یه مثال سریع:

import sys
if len(sys.argv) > 1:
    file_name = sys.argv[1]
    print(f"File name: {file_name}")

یه مثال بیشتر 1:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("file")
parser.add_argument("--verbose", action="store_true")
args = parser.parse_args()

print("file:", args.file)
print("verbose:", args.verbose)
حواست باشه: همیشه `--help` را در CLI در نظر بگیرید تا استفاده آسان شود.
۳۶ zip برای پیمایش موازی

ایدهٔ اصلی: به زبان ساده، برای پیمایش موازی روی چندین لیست می‌توانید از zip استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، تابع `zip` آیتم‌های چند iterable را کنار هم قرار می‌دهد و یک iterator از تاپل‌ها می‌سازد. برای دیدن نتیجه معمولاً آن را به `list(...)` تبدیل می‌کنیم.

کِی به درد می‌خوره؟

  • پیمایش موازی روی چند لیست (نام‌ها و نمره‌ها).
  • ساختن dict از دو لیست (کلیدها و مقادیر).
  • باز کردن zip با `zip(*pairs)` برای جدا کردن ستون‌ها.

یه مثال سریع:

names = ["Alice", "Bob", "Charlie"]
ages = [30, 25, 35]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")

یه مثال بیشتر 1:

keys = ["host", "port", "debug"]
values = ["localhost", 8000, True]

config = dict(zip(keys, values))
print(config)  # {'host': 'localhost', 'port': 8000, 'debug': True}
حواست باشه: اگر طول iterableها متفاوت است و می‌خواهید همه را پوشش دهید، از `itertools.zip_longest` استفاده کنید.
۳۷ بررسی عضویت (Check for Membership)

ایدهٔ اصلی: به زبان ساده، می‌توانید بررسی کنید که آیا یک عنصر در یک لیست یا دیکشنری وجود دارد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، عملگر `in` برای بررسی عضویت استفاده می‌شود. از نظر عملکردی، جستجو در `set` و `dict` معمولاً سریع‌تر از `list` است (میانگین O(1)).

کِی به درد می‌خوره؟

  • چک کردن اینکه یک کلید در dict هست یا نه.
  • حذف تکراری‌ها و چک سریع با set.
  • اعتبارسنجی ورودی بر اساس whitelist.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
if 3 in numbers:
    print("3 is in the list.")
my_dict = {'a': 1, 'b': 2}
if 'b' in my_dict:
    print("Key 'b' exists in the dictionary.")

یه مثال بیشتر 1:

allowed = {"GET", "POST", "PUT"}
method = "POST"
print(method in allowed)  # True
حواست باشه: اگر مرتباً membership check می‌کنید، داده را به set تبدیل کنید تا سریع‌تر شود.
۳۸ عبارت pass

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

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `pass` یعنی «فعلاً هیچ کاری نکن». این برای تعریف بلوک‌های خالی لازم است (مثلاً بدنه کلاس/تابع که بعداً پر می‌شود).

کِی به درد می‌خوره؟

  • استاب کردن تابع/کلاس در حین طراحی.
  • نوشتن if/except/loop خالی (به‌صورت موقت).
  • وقتی به یک placeholder نیاز دارید تا سینتکس کامل شود.

یه مثال سریع:

def my_function():
    # TODO: Implement this function
    pass

یه مثال بیشتر 1:

def todo():
    pass  # TODO: implement later

class MyClass:
    pass
حواست باشه: در کد نهایی بهتر است `pass`های موقت را حذف یا با منطق واقعی جایگزین کنید.
۳۹ تابع reversed

ایدهٔ اصلی: به زبان ساده، می‌توانید یک لیست یا رشته را با استفاده از reversed معکوس کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `reversed()` iterator معکوس می‌دهد. برای پیمایش از انتها به ابتدا مفید است و معمولاً حافظه اضافی زیادی مصرف نمی‌کند.

کِی به درد می‌خوره؟

  • پیمایش از آخر به اول.
  • ساخت نسخه معکوس رشته/لیست.
  • الگوریتم‌هایی که از انتها شروع می‌شوند.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
reversed_numbers = list(reversed(numbers))

یه مثال بیشتر 1:

text = "abcd"
print("".join(reversed(text)))  # dcba
حواست باشه: سریع‌ترین روش معکوس کردن رشته معمولاً slicing است: `text[::-1]`.
۴۰ FizzBuzz

ایدهٔ اصلی: به زبان ساده، مسئله کلاسیک FizzBuzz با استفاده از یک لیست فشرده.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، FizzBuzz تمرین کلاسیک شرط‌هاست. نسخهٔ one-liner جذاب است، ولی نسخهٔ چندخطی خواناتر است.

کِی به درد می‌خوره؟

  • تمرین شرط‌ها و حلقه‌ها.
  • آموزش تبدیل قواعد به کد.
  • تمرین list comprehension و منطق کوتاه.

یه مثال سریع:

result = ["Fizz" * (x % 3 == 0) + "Buzz" * (x % 5 == 0) or x for x in range(1, 101)]

یه مثال بیشتر 1:

result = []
for x in range(1, 16):
    if x % 15 == 0:
        result.append("FizzBuzz")
    elif x % 3 == 0:
        result.append("Fizz")
    elif x % 5 == 0:
        result.append("Buzz")
    else:
        result.append(x)

print(result)
حواست باشه: اگر هدف یادگیری است، همیشه خوانایی را اولویت دهید.
۴۱ فیلتر کردن مقادیر False

ایدهٔ اصلی: به زبان ساده، می‌توانید مقادیر False را از یک لیست با استفاده از filter حذف کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `filter(None, iterable)` همه مقادیر falsy مثل 0، ''، None، False و لیست خالی را حذف می‌کند.

کِی به درد می‌خوره؟

  • پاک‌سازی لیست از مقادیر خالی.
  • حذف None/'' قبل از پردازش.
  • ساخت لیست تمیز برای ذخیره یا نمایش.

یه مثال سریع:

data = [0, 1, False, True, "", "hello", None]
filtered_data = list(filter(None, data)) # خروجی: [1, True, 'hello']

یه مثال بیشتر 1:

data = [0, 1, "", "hi", None, [], [1], False]
clean = list(filter(None, data))
print(clean)  # [1, 'hi', [1]]
حواست باشه: اگر فقط می‌خواهید None را حذف کنید (نه 0)، از `x is not None` استفاده کنید.
۴۲ ادغام دو لیست

ایدهٔ اصلی: به زبان ساده، برای ادغام دو لیست می‌توانید از عملگر + یا متد extend استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، برای ادغام دو لیست می‌توانید از `+` (ساخت لیست جدید) یا `extend` (درجا) استفاده کنید. انتخاب به این بستگی دارد که می‌خواهید لیست اول تغییر کند یا نه.

کِی به درد می‌خوره؟

  • ترکیب داده‌های دو منبع.
  • اضافه کردن batch جدید داده به لیست موجود.
  • ساخت لیست جدید بدون تغییر ورودی‌ها.

یه مثال سریع:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
merged_list = list1 + list2 # خروجی: [1, 2, 3, 4, 5, 6]
# یا
list1.extend(list2) # خروجی: [1, 2, 3, 4, 5, 6]

یه مثال بیشتر 1:

a = [1, 2]
b = [3, 4]

new_list = a + b
print(new_list)  # [1, 2, 3, 4]

a.extend(b)
print(a)         # [1, 2, 3, 4]
حواست باشه: برای ادغام چندین iterable بدون ساخت لیست جدید، `itertools.chain` مفید است.
۴۳ عبارت if درون‌خطی (Inline if Statement)

ایدهٔ اصلی: به زبان ساده، برای عبارات شرطی مختصر می‌توانید از if درون‌خطی استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، عملگر سه‌تایی در پایتون شکل کوتاهِ if/else است و زمانی خوب است که فقط «یک مقدار» را بر اساس شرط انتخاب می‌کنید.

کِی به درد می‌خوره؟

  • مقداردهی یک متغیر بر اساس شرط بدون چند خط if/else.
  • ساخت پیام/label بر اساس وضعیت.
  • قرار دادن if/else کوتاه داخل return.

یه مثال سریع:

x = 10
result = "positive" if x > 0 else "non-positive"

یه مثال بیشتر 1:

score = 72
grade = "pass" if score >= 60 else "fail"
print(grade)  # pass
حواست باشه: اگر شرط‌ها زیاد شد، از if/elif/else معمولی استفاده کنید تا کد قابل فهم بماند.
۴۴ sum با لیست فشرده

ایدهٔ اصلی: به زبان ساده، برای انجام عملیات حسابی روی لیست‌ها می‌توانید از sum با لیست فشرده استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، List Comprehension راهی سریع و خوانا برای ساختن یک لیست جدید بر اساس یک iterable است. این الگو جایگزین خوبی برای حلقه‌های کوتاهِ append کردن است.

کِی به درد می‌خوره؟

  • تبدیل (Transform) داده‌ها؛ مثل تبدیل لیست رشته‌ها به لیست عدد.
  • فیلتر کردن (Filter) داده‌ها با شرط `if`.
  • ساختن خروجی‌های کوتاه برای گزارش یا پردازش داده.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
sum_squared = sum(x ** 2 for x in numbers) # خروجی: 55

یه مثال بیشتر 1:

numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares)  # [4, 16, 36]
حواست باشه: اگر منطق داخل comprehension پیچیده شد، آن را به چند خط حلقه یا یک تابع جداگانه تبدیل کنید.
۴۵ ارسال آرگومان‌های چندگانه

ایدهٔ اصلی: به زبان ساده، می‌توانید آرگومان‌های چندگانه را با استفاده از سینتکس *args و **kwargs به یک تابع ارسال کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، با `*args` می‌توانید آرگومان‌های positional متغیر بگیرید و با `**kwargs` آرگومان‌های نام‌دار. این‌ها برای نوشتن wrapperها و forwarding بسیار کاربردی‌اند.

کِی به درد می‌خوره؟

  • نوشتن توابع عمومی که تعداد آرگومان‌ها متغیر است.
  • نوشتن wrapper/decorator که پارامترها را به تابع اصلی پاس می‌دهد.
  • ساخت APIهای منعطف.

یه مثال سریع:

def print_args(*args):
    for arg in args:
        print(arg)

print_args(1, 2, 3, 4)
# خروجی:
# 1
# 2
# 3
# 4

def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

print_kwargs(a=1, b=2, c=3)
# خروجی:
# a 1
# b 2
# c 3

یه مثال بیشتر 1:

def logger(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

logger(1, 2, a=3, b=4)
حواست باشه: زیاده‌روی در استفاده از args/kwargs می‌تواند امضای تابع را مبهم کند؛ برای APIهای عمومی، امضای واضح بهتر است.
۴۶ chr و ord

ایدهٔ اصلی: به زبان ساده، می‌توانید کاراکترها را به کدهای اسکی (ASCII) و برعکس تبدیل کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `ord` کد یونیکد یک کاراکتر را می‌دهد و `chr` برعکس، از کد یونیکد کاراکتر می‌سازد. برای کارهای متنی/رمزگذاری ساده مفید است.

کِی به درد می‌خوره؟

  • تبدیل کاراکتر به عدد و برعکس.
  • ساختن الگوریتم‌های ساده روی حروف (مثل Caesar cipher).
  • کار با یونیکد و کدپوینت‌ها.

یه مثال سریع:

char = 'A'
ascii_code = ord(char) # خروجی: 65
ascii_code = 65
char = chr(ascii_code) # خروجی: 'A'

یه مثال بیشتر 1:

ch = "A"
code = ord(ch)
print(code)       # 65
print(chr(code))  # A
حواست باشه: در کار با زبان‌های مختلف (فارسی، ایموجی)، یونیکد می‌تواند چند کدپوینت داشته باشد؛ مراقب باشید.
۴۷ all و any

ایدهٔ اصلی: به زبان ساده، می‌توانید بررسی کنید که آیا تمام یا هر یک از عناصر در یک دنباله شرطی را برآورده می‌کنند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `any` می‌گوید آیا حداقل یکی از شرط‌ها True است؛ و `all` بررسی می‌کند آیا همه True هستند. هر دو lazy هستند و در صورت امکان زود متوقف می‌شوند.

کِی به درد می‌خوره؟

  • اعتبارسنجی ورودی‌ها (همه مثبت باشند، همه رشته باشند، ...).
  • بررسی وجود یک حالت خاص در داده‌ها.
  • نوشتن شرط‌های جمعی بدون حلقه دستی.

یه مثال سریع:

numbers = [2, 4, 6, 7, 8]
any_even = any(x % 2 == 0 for x in numbers)
all_even = all(x % 2 == 0 for x in numbers)

یه مثال بیشتر 1:

values = ["admin", "editor", "viewer"]
has_admin = any(role == "admin" for role in values)
all_str = all(isinstance(role, str) for role in values)

print(has_admin)  # True
print(all_str)    # True
حواست باشه: برای کاهش مصرف حافظه، از generator expression استفاده کنید نه list.
۴۸ round

ایدهٔ اصلی: به زبان ساده، برای گرد کردن اعداد به تعداد مشخصی می‌توانید از ارقام اعشار از round استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `round` گرد کردن انجام می‌دهد، اما دقت کنید که در پایتون «Banker’s rounding» هم وجود دارد: 2.5 به 2 و 3.5 به 4 گرد می‌شود.

کِی به درد می‌خوره؟

  • گرد کردن برای نمایش (نه محاسبات مالی دقیق).
  • کاهش تعداد اعشار در خروجی.
  • نزدیک کردن مقدارهای float برای چاپ/گزارش.

یه مثال سریع:

number = 3.14159
rounded_number = round(number, 2) # خروجی: 3.14

یه مثال بیشتر 1:

print(round(2.5))  # 2
print(round(3.5))  # 4
print(round(2.3456, 2))  # 2.35
حواست باشه: برای محاسبات مالی دقیق، از `decimal.Decimal` استفاده کنید.
۴۹ الحاق و تکرار لیست

ایدهٔ اصلی: به زبان ساده، برای عملیات لیست می‌توانید از الحاق ( + ) و تکرار ( * ) استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ضرب لیست (`list * n`) برای تکرار عناصر مفید است، اما برای لیست‌های تو در تو می‌تواند دام باشد چون ارجاع‌ها تکرار می‌شوند.

کِی به درد می‌خوره؟

  • ساخت لیست اولیه با مقدار ثابت (مثل [0]*n).
  • تکرار الگوها در داده‌های ساده.
  • ساخت بافرهای اولیه.

یه مثال سریع:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
concatenated_list = list1 + list2 # خروجی: [1, 2, 3, 4, 5, 6]
repeated_list = list1 * 3 # خروجی: [1, 2, 3, 1, 2, 3, 1, 2, 3]

یه مثال بیشتر 1:

# دام رایج: لیست دوبعدی با ضرب
matrix = [[0]*3]*2
matrix[0][0] = 99
print(matrix)  # [[99, 0, 0], [99, 0, 0]]  (هر دو ردیف تغییر کردند!)

# راه درست:
matrix2 = [[0]*3 for _ in range(2)]
matrix2[0][0] = 99
print(matrix2)  # [[99, 0, 0], [0, 0, 0]]
حواست باشه: برای لیست‌های تو در تو حتماً از comprehension استفاده کنید تا هر سطر آبجکت جدا باشد.
۵۰ تابع map

ایدهٔ اصلی: به زبان ساده، برای اعمال یک تابع بر روی تمام عناصر یک لیست می‌توانید از map استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `map` یک iterator می‌دهد که تابع را روی هر عنصر اعمال می‌کند. برای دیدن خروجی می‌توانید آن را به list تبدیل کنید.

کِی به درد می‌خوره؟

  • اعمال یک تبدیل ساده روی همه عناصر.
  • زمانی که تابع آماده دارید و می‌خواهید pipeline بسازید.
  • ترکیب با توابع استاندارد مثل `str.strip`.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))

یه مثال بیشتر 1:

names = ["  ali ", " sara ", " reza "]
clean = list(map(str.strip, names))
print(clean)  # ['ali', 'sara', 'reza']
حواست باشه: در بسیاری از موارد list comprehension خواناتر است: `[s.strip() for s in names]`.
۵۱ max و min با تابع کلید (Key Function)

ایدهٔ اصلی: به زبان ساده، برای یافتن عنصری با بیشترین یا کمترین مقدار بر اساس یک صفت خاص، می‌توانید از max و min با یک تابع کلید استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، با `max` و `min` می‌توانید بزرگ‌ترین/کوچک‌ترین مقدار را پیدا کنید. با `key=` معیار انتخاب را تغییر می‌دهید.

کِی به درد می‌خوره؟

  • انتخاب بزرگ‌ترین آیتم بر اساس طول/سن/امتیاز و ...
  • پیدا کردن بهترین نتیجه/بیشترین مقدار در لیست دیکشنری‌ها.
  • پیدا کردن نزدیک‌ترین مقدار با معیار دلخواه.

یه مثال سریع:

people = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]
oldest_person = max(people, key=lambda x: x['age'])
youngest_person = min(people, key=lambda x: x['age'])

یه مثال بیشتر 1:

words = ["hi", "hello", "hey"]
print(max(words, key=len))  # hello
حواست باشه: اگر چند آیتم مساوی باشند، اولین مورد بر اساس ترتیب iterable برگردانده می‌شود.
۵۲ sorted با تابع کلید

ایدهٔ اصلی: به زبان ساده، برای مرتب‌سازی یک لیست بر اساس یک صفت خاص، می‌توانید از sorted با یک تابع کلید استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sorted` یک لیست جدیدِ مرتب‌شده برمی‌گرداند و ورودی را تغییر نمی‌دهد. با `key=` معیار مرتب‌سازی را تعیین کنید و با `reverse=True` ترتیب را برعکس کنید.

کِی به درد می‌خوره؟

  • مرتب‌سازی برای نمایش یا گزارش.
  • مرتب کردن بر اساس فیلد/کلید خاص.
  • حفظ لیست اصلی و ساخت نسخه مرتب‌شده.

یه مثال سریع:

people = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]
sorted_by_age = sorted(people, key=lambda x: x['age'])

یه مثال بیشتر 1:

words = ["python", "go", "javascript", "c"]
by_len = sorted(words, key=len)
print(by_len)
حواست باشه: برای مرتب‌سازی in-place از `list.sort()` استفاده کنید.
۵۳ ماژول itertools

ایدهٔ اصلی: به زبان ساده، ماژول itertools مجموعه‌ای از ابزارها را برای کار با تکرارکننده‌ها (iterators) فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `itertools` ابزارهای قدرتمند برای کار با iteratorها می‌دهد. این ابزارها معمولاً lazy هستند و برای پردازش داده‌های بزرگ مناسب‌اند.

کِی به درد می‌خوره؟

  • ساخت ترکیب‌ها (combinations) و جایگشت‌ها (permutations).
  • زنجیره کردن iterableها بدون ساخت لیست جدید.
  • گروه‌بندی داده‌های مرتب‌شده با `groupby`.

یه مثال سریع:

import itertools
# حاصلضرب دکارتی
colors = ['red', 'blue']
sizes = ['small', 'large']
product = list(itertools.product(colors, sizes))
# خروجی: [('red', 'small'), ('red', 'large'), ('blue', 'small'), ('blue', 'large')]

# جایگشت‌ها
letters = ['a', 'b', 'c']
perms = list(itertools.permutations(letters, 2))
# خروجی: [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

# ترکیب‌ها
letters = ['a', 'b', 'c']
combinations = list(itertools.combinations(letters, 2))
# خروجی: [('a', 'b'), ('a', 'c'), ('b', 'c')]

یه مثال بیشتر 1:

import itertools

for comb in itertools.combinations([1, 2, 3, 4], 2):
    print(comb)
حواست باشه: `groupby` فقط عناصر پشت سر هم را گروه می‌کند؛ معمولاً نیاز به sort قبلش دارید.
۵۴ ماژول random

ایدهٔ اصلی: به زبان ساده، ماژول random توابعی برای تولید اعداد تصادفی فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `random` برای کارهای عمومی تصادفی مناسب است. برای کارهای امنیتی (توکن/پسورد) از `secrets` استفاده کنید.

کِی به درد می‌خوره؟

  • sample و shuffle داده‌ها.
  • شبیه‌سازی‌های ساده.
  • تست‌های قابل تکرار با seed.

یه مثال سریع:

import random
# عدد صحیح تصادفی
random_number = random.randint(1, 10)
# عدد اعشاری تصادفی
random_float = random.random() # محدوده: 0.0 <= random_float < 1.0
# انتخاب تصادفی
choices = ['apple', 'banana', 'cherry']
random_choice = random.choice(choices)

یه مثال بیشتر 1:

import random

items = [1, 2, 3, 4, 5]
print(random.choice(items))
print(random.sample(items, k=3))
حواست باشه: برای تولید توکن امن از `secrets.token_hex()` استفاده کنید.
۵۵ ماژول datetime

ایدهٔ اصلی: به زبان ساده، ماژول datetime کلاس‌هایی برای کار با تاریخ و زمان فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `datetime` برای تاریخ و زمان است. در پروژه‌های واقعی، timezone (مثل UTC) را جدی بگیرید تا خطاهای اختلاف ساعت رخ ندهد.

کِی به درد می‌خوره؟

  • ثبت زمان رویدادها در لاگ.
  • محاسبه بازه‌ها با timedelta.
  • فرمت کردن تاریخ برای نمایش/ذخیره.

یه مثال سریع:

import datetime
# دریافت تاریخ و زمان فعلی
current_datetime = datetime.datetime.now()
# قالب‌بندی تاریخ
formatted_date = current_datetime.strftime('%Y-%m-%d')
# محاسبه اختلاف زمانی
date1 = datetime.datetime(2023, 1, 1)
date2 = datetime.datetime(2023, 12, 31)
time_difference = date2 - date1

یه مثال بیشتر 1:

import datetime

now = datetime.datetime.now()
print(now.isoformat(timespec="seconds"))
حواست باشه: اگر با timezone کار می‌کنید، از `datetime.datetime.now(datetime.timezone.utc)` استفاده کنید.
۵۶ collections.defaultdict برای شمارش عناصر

ایدهٔ اصلی: به زبان ساده، برای شمارش تکرار عناصر در یک لیست می‌توانید از defaultdict استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `defaultdict` نوعی dict است که وقتی کلیدی وجود ندارد، به‌صورت خودکار مقدار پیش‌فرض می‌سازد (مثل ۰ یا لیست خالی).

کِی به درد می‌خوره؟

  • شمارش تکرارها بدون چک کردن وجود کلید.
  • گروه‌بندی آیتم‌ها بر اساس یک کلید (مثل دسته‌بندی محصولات).
  • ساخت دیکشنری‌های چندسطحی با کد کمتر.

یه مثال سریع:

from collections import defaultdict
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
number_counts = defaultdict(int)
for num in numbers:
    number_counts[num] += 1
# خروجی: defaultdict(
, {1: 1, 2: 2, 3: 3, 4: 4})

یه مثال بیشتر 1:

from collections import defaultdict

words = ["hi", "hello", "hey", "hello", "hi"]
counts = defaultdict(int)

for w in words:
    counts[w] += 1

print(dict(counts))  # {'hi': 2, 'hello': 2, 'hey': 1}
حواست باشه: اگر فقط شمارش می‌خواهید، `Counter` هم گزینه بسیار خوبی است.
۵۷ collections.Counter

ایدهٔ اصلی: به زبان ساده، برای شمارش تکرار عناصر در یک لیست می‌توانید از Counter استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `collections.Counter` برای شمارش فراوانی آیتم‌ها ساخته شده و امکاناتی مثل `most_common` دارد.

کِی به درد می‌خوره؟

  • شمارش کلمات/حروف/آیتم‌ها.
  • یافتن پرتکرارترین‌ها.
  • ساخت آمار سریع بدون حلقه‌نویسی زیاد.

یه مثال سریع:

from collections import Counter
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
number_counts = Counter(numbers)
# خروجی: Counter({4: 4, 3: 3, 2: 2, 1: 1})

یه مثال بیشتر 1:

from collections import Counter

text = "banana"
c = Counter(text)
print(c.most_common(2))  # [('a', 3), ('n', 2)]
حواست باشه: Counter روی داده‌های hashable کار می‌کند (مثل str, int, tuple).
۵۸ ماژول json

ایدهٔ اصلی: به زبان ساده، ماژول json به شما امکان کار با داده‌های JSON را می‌دهد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `json` برای سریال‌سازی/دی‌سریال‌سازی داده‌ها بین Python و JSON است. با `ensure_ascii=False` خروجی فارسی خواناتر می‌شود.

کِی به درد می‌خوره؟

  • تعامل با APIها.
  • ذخیره تنظیمات و داده‌ها.
  • ساخت لاگ یا خروجی قابل اشتراک.

یه مثال سریع:

import json
# تبدیل دیکشنری به JSON
data = {'name': 'Alice', 'age': 30}
json_data = json.dumps(data)
# تبدیل JSON به دیکشنری
json_data = '{"name": "Alice", "age": 30}'
data = json.loads(json_data)

یه مثال بیشتر 1:

import json

data = {"message": "سلام", "ok": True}
print(json.dumps(data, ensure_ascii=False, indent=2))
حواست باشه: همه آبجکت‌های پایتون JSON-serializable نیستند؛ برای کلاس‌ها باید تبدیل دستی انجام دهید.
۵۹ ماژول sys

ایدهٔ اصلی: به زبان ساده، ماژول sys دسترسی به برخی متغیرهای استفاده شده یا نگهداری شده توسط مفسر پایتون را فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `sys` امکانات سطح سیستم/مفسر را می‌دهد: آرگومان‌ها، مسیرها، خروج برنامه، اندازه اشیاء و ...

کِی به درد می‌خوره؟

  • نوشتن CLIها و کنترل exit code.
  • دسترسی به sys.path و تنظیم importها.
  • دیباگ و بررسی حافظه با getsizeof.

یه مثال سریع:

import sys
# آرگومان‌های خط فرمان
script_name = sys.argv[0]
arguments = sys.argv[1:]
# حداکثر عمق بازگشت (Recursion)
max_recursion_depth = sys.getrecursionlimit()
# پلتفرم فعلی
current_platform = sys.platform

یه مثال بیشتر 1:

import sys

print(sys.version)
print(sys.platform)
حواست باشه: دستکاری sys.path باید با احتیاط باشد؛ بهتر است ساختار پروژه درست طراحی شود.
۶۰ ماژول os

ایدهٔ اصلی: به زبان ساده، ماژول os راهی برای استفاده از قابلیت‌های وابسته به سیستم عامل فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `os` برای کارهای سیستم‌عامل مثل فایل‌ها، پوشه‌ها، env vars و اجرای دستورات است.

کِی به درد می‌خوره؟

  • ساخت/حذف پوشه‌ها و فایل‌ها.
  • خواندن متغیرهای محیطی (ENV).
  • کار با مسیرها (در کنار os.path/pathlib).

یه مثال سریع:

import os
# دایرکتوری کاری فعلی
current_directory = os.getcwd()
# تغییر دایرکتوری
os.chdir('/path/to/directory')
# لیست کردن محتویات دایرکتوری
directory_contents = os.listdir()
# ایجاد دایرکتوری
os.makedirs('/path/to/new_directory')
# حذف دایرکتوری
os.rmdir('/path/to/empty_directory')

یه مثال بیشتر 1:

import os

print(os.getenv("HOME"))
print(os.listdir("."))
حواست باشه: برای کار با مسیرها، `pathlib` معمولاً خواناتر است.
۶۱ ماژول pickle

ایدهٔ اصلی: به زبان ساده، ماژول pickle به شما امکان سریال‌سازی (serialize) اشیاء پایتون را می‌دهد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، pickle برای سریال‌سازی اشیاء پایتون است ولی **امن نیست**. داده pickle را فقط از منابع قابل اعتماد loads کنید.

کِی به درد می‌خوره؟

  • ذخیره موقت (cache) داده‌ها در محیط قابل اعتماد.
  • ذخیره سریع آبجکت‌های پایتون برای پردازش بعدی.
  • انتقال داده بین بخش‌هایی که به هم اعتماد دارند.

یه مثال سریع:

import pickle
# سریال‌سازی شیء به فایل
data = {'name': 'Alice', 'age': 30}
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
# دی‌سریال‌سازی شیء از فایل
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)

یه مثال بیشتر 1:

import pickle

data = {"a": 1}
blob = pickle.dumps(data)
print(pickle.loads(blob))
حواست باشه: برای تبادل داده بین سیستم‌ها، JSON یا فرمت‌های امن‌تر را ترجیح دهید.
۶۲ برش لیست (List Slicing)

ایدهٔ اصلی: به زبان ساده، برای استخراج زیرلیست‌ها می‌توانید از یک لیست از برش لیست استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Slicing برای گرفتن زیرلیست یا کپی/معکوس کردن لیست بسیار کاربردی است: `list[start:stop:step]`.

کِی به درد می‌خوره؟

  • گرفتن زیرلیست از داده‌ها.
  • کپی سریع لیست با `[:]`.
  • معکوس کردن با `[::-1]`.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
sublist = numbers[1:4] # خروجی: [2, 3, 4]

یه مثال بیشتر 1:

nums = [0, 1, 2, 3, 4, 5]
print(nums[1:4])   # [1, 2, 3]
print(nums[::2])   # [0, 2, 4]
print(nums[::-1])  # [5, 4, 3, 2, 1, 0]
حواست باشه: Slicing کپی می‌سازد؛ برای مجموعه‌های خیلی بزرگ، به هزینه حافظه توجه کنید.
۶۳ متدهای رشته (String Methods)

ایدهٔ اصلی: به زبان ساده، برای دستکاری رشته‌ها می‌توانید از متدهای داخلی رشته استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، متدهای رشته مثل `strip`, `split`, `replace`, `startswith` و ... ابزارهای پایه‌ای برای پاک‌سازی و پردازش متن هستند.

کِی به درد می‌خوره؟

  • پاک‌سازی ورودی کاربر.
  • پردازش داده‌های متنی مثل CSV ساده.
  • استخراج بخش‌های مورد نیاز از متن.

یه مثال سریع:

text = "Hello, World!"
# تبدیل به حروف کوچک
lowercase_text = text.lower() # خروجی: "hello, world!"
# تبدیل به حروف بزرگ
uppercase_text = text.upper() # خروجی: "HELLO, WORLD!"
# بزرگ کردن حرف اول
capitalized_text = text.capitalize() # خروجی: "Hello, world!"
# شمارش تکرار
count = text.count('l') # خروجی: 3
# جایگزینی زیررشته‌ها
replaced_text = text.replace('World', 'Python') # خروجی: "Hello, Python!"

یه مثال بیشتر 1:

s = "  hello world  "
print(s.strip())          # "hello world"
print(s.upper())          # "  HELLO WORLD  "
print(s.strip().split())  # ['hello', 'world']
حواست باشه: رشته‌ها immutable هستند؛ هر عملیات معمولاً رشته جدید می‌سازد.
۶۴ متد str.join()

ایدهٔ اصلی: به زبان ساده، برای الحاق عناصر یک لیست به یک رشته واحد می‌توانید از str.join() استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `str.join` بهترین روش برای چسباندن چند رشته است. از `+` در حلقه‌ها پرهیز کنید چون کند می‌شود.

کِی به درد می‌خوره؟

  • ساخت متن خروجی از لیست رشته‌ها.
  • ترکیب خطوط برای ذخیره در فایل.
  • ساخت path یا query ساده (با دقت).

یه مثال سریع:

words = ['Hello', 'World', '!']
sentence = ' '.join(words) # خروجی: "Hello World !"

یه مثال بیشتر 1:

words = ["hello", "world"]
print(" ".join(words))      # "hello world"
print("\n".join(words))    # دو خط جدا
حواست باشه: join روی iterable از رشته‌ها کار می‌کند؛ اگر عدد دارید اول به str تبدیل کنید.
۶۵ تابع enumerate

ایدهٔ اصلی: به زبان ساده، برای به دست آوردن همزمان اندیس و مقدار عناصر در یک لیست می‌توانید از enumerate استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `enumerate` هنگام پیمایش، اندیس و مقدار را با هم می‌دهد. این کار باعث می‌شود به جای range و index، کد تمیزتر و امن‌تری بنویسید.

کِی به درد می‌خوره؟

  • شماره‌گذاری آیتم‌ها هنگام چاپ یا گزارش.
  • پرهیز از `list.index()` که O(n) است.
  • پیمایش همراه با اندیس شروع دلخواه (`start=`).

یه مثال سریع:

fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
    print(f"Index {index}: {fruit}")

یه مثال بیشتر 1:

fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")
حواست باشه: اگر فقط اندیس لازم دارید، `range(len(...))` هم هست؛ ولی enumerate معمولاً خواناتر است.
۶۶ تابع open با عبارت with

ایدهٔ اصلی: به زبان ساده، برای مدیریت خودکار بستن فایل می‌توانید از عبارت with استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `with` تضمین می‌کند که فایل/منبع حتی اگر خطا رخ دهد هم بسته می‌شود. این بهترین روش کار با فایل‌هاست.

کِی به درد می‌خوره؟

  • خواندن/نوشتن فایل بدون فراموش کردن close.
  • کار با منابعی که cleanup می‌خواهند (lock/connection).
  • نوشتن کد مقاوم در برابر خطا.

یه مثال سریع:

with open("file.txt", "r") as file:
    content = file.read()
# نیازی به بستن دستی فایل نیست، این کار به طور خودکار توسط بلوک 'with' انجام می‌شود.

یه مثال بیشتر 1:

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("سلام دنیا")
حواست باشه: می‌توانید چند فایل را در یک with مدیریت کنید: `with open(...) as a, open(...) as b:`
۶۷ is و == برای مقایسه اشیاء

ایدهٔ اصلی: به زبان ساده، برای بررسی اینکه آیا دو متغیر به یک شیء یکسان ارجاع می‌دهند می‌توانید از is و برای مقایسه مقادیر از == استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `==` برابری مقدار (equality) را بررسی می‌کند، ولی `is` هویت شیء (identity) را. برای `None` باید از `is None` استفاده کنید.

کِی به درد می‌خوره؟

  • چک کردن None به شکل استاندارد (`is None`).
  • تشخیص اینکه دو reference دقیقاً به یک شیء اشاره می‌کنند یا نه.
  • پرهیز از باگ‌های مقایسه identity به جای equality.

یه مثال سریع:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1 is list2:
    print("Same object")
else:
    print("Different objects")
# خروجی: "Different objects"
if list1 == list2:
    print("Equal values")
else:
    print("Different values")
# خروجی: "Equal values"

یه مثال بیشتر 1:

a = [1, 2]
b = [1, 2]
print(a == b)  # True (مقدار برابر است)
print(a is b)  # False (شیء یکسان نیست)

x = None
print(x is None)  # True
حواست باشه: از `is` برای مقایسه عدد/رشته و ... استفاده نکنید؛ مگر موارد خاص (مثل None, True, False).
۶۸ حلقه while با عبارت else

ایدهٔ اصلی: به زبان ساده، برای اجرای کد زمانی که شرط حلقه while نادرست می‌شود، می‌توانید از else با حلقه‌های while استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، بخش `else` بعد از حلقه while فقط وقتی اجرا می‌شود که حلقه با `break` متوقف نشده باشد. این الگو برای «جستجو» مفید است.

کِی به درد می‌خوره؟

  • جستجو در داده‌ها: اگر پیدا شد break، اگر نشد else.
  • نوشتن الگوریتم‌هایی که حالت شکست/موفقیت دارند.
  • کاهش نیاز به فلگ‌های کمکی.

یه مثال سریع:

count = 0
while count < 5:
    print(count)
    count += 1
else:
    print("Loop finished!")
# خروجی: "0 1 2 3 4 Loop finished!"

یه مثال بیشتر 1:

n = 10
i = 1
while i <= n:
    if i*i == n:
        print("perfect square")
        break
    i += 1
else:
    print("not a perfect square")
حواست باشه: همین مفهوم برای `for ... else` هم وجود دارد.
۶۹ حلقه for با عبارت else

ایدهٔ اصلی: به زبان ساده، برای اجرای کد زمانی که حلقه for بدون برخورد با عبارت break کامل می‌شود، می‌توانید از else با حلقه‌های for استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در `for ... else`، بخش else وقتی اجرا می‌شود که حلقه با break تمام نشده باشد. معمولاً برای جستجو/بررسی وجود یک مورد استفاده می‌شود.

کِی به درد می‌خوره؟

  • پیدا کردن عدد اول یا یافتن یک عنصر خاص.
  • جستجو در لیست‌ها بدون فلگ اضافی.
  • اعلام «پیدا نشد» به شکل تمیز.

یه مثال سریع:

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    if fruit == "banana":
        break
else:
    print("No 'banana' found!")
# خروجی: "No 'banana' found!" (اگر banana در لیست نباشد)

یه مثال بیشتر 1:

n = 29
for i in range(2, int(n**0.5) + 1):
    if n % i == 0:
        print("not prime")
        break
else:
    print("prime")
حواست باشه: اگر break رخ دهد، else اجرا نمی‌شود.
۷۰ دیکشنری‌های فشرده (Dictionary Comprehensions)

ایدهٔ اصلی: به زبان ساده، برای ساخت مختصر دیکشنری می‌توانید از دیکشنری‌های فشرده استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Dictionary Comprehension برای ساخت سریع dict از iterableها مفید است و شبیه list comprehension عمل می‌کند.

کِی به درد می‌خوره؟

  • ساخت mapping سریع (مثلاً نام → طول نام).
  • فیلتر کردن آیتم‌ها هنگام ساخت dict.
  • ساخت dict جدید بدون تغییر dict اصلی.

یه مثال سریع:

squared_dict = {x: x**2 for x in range(1, 11)}

یه مثال بیشتر 1:

words = ["hi", "hello", "hey"]
lengths = {w: len(w) for w in words}
print(lengths)
حواست باشه: در معکوس کردن dict، اگر مقادیر یکتا نباشند داده از دست می‌رود.
۷۱ ماژول Timeit برای زمان‌بندی کد

ایدهٔ اصلی: به زبان ساده، برای اندازه‌گیری زمان اجرای کد می‌توانید از ماژول timeit استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `timeit` برای بنچمارک کدهای کوچک مناسب است. به جای یک‌بار اجرا، چندبار اجرا می‌کند تا نتیجه پایدارتر شود.

کِی به درد می‌خوره؟

  • مقایسه دو روش مختلف پیاده‌سازی.
  • اندازه‌گیری دقیق‌تر نسبت به time.time برای تکه کدهای کوتاه.
  • بهینه‌سازی micro-optimizationها.

یه مثال سریع:

import timeit
def my_function():
    return sum(range(1000000))
execution_time = timeit.timeit(my_function, number=100)
print(f"Execution time: {execution_time} seconds")

یه مثال بیشتر 1:

import timeit

print(timeit.timeit("[x*x for x in range(1000)]", number=1000))
حواست باشه: برای پروفایل کل برنامه، از `cProfile` یا ابزارهای پروفایل سطح بالاتر استفاده کنید.
۷۲ else با try و except

ایدهٔ اصلی: به زبان ساده، برای مشخص کردن کدی که باید در صورت عدم بروز استثنا اجرا شود، می‌توانید از else با try و except استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، try/except برای مدیریت خطاست. `else` فقط وقتی اجرا می‌شود که خطا رخ ندهد و `finally` همیشه اجرا می‌شود (cleanup).

کِی به درد می‌خوره؟

  • مدیریت خطاهای قابل پیش‌بینی (مثل تبدیل نوع، فایل پیدا نشدن).
  • جلوگیری از کرش و ارائه پیام مناسب.
  • پاک‌سازی منابع در finally.

یه مثال سریع:

try:
    result = 10 / 2
except ZeroDivisionError as e:
    print(f"Error: {e}")
else:
    print(f"Result: {result}")

یه مثال بیشتر 1:

try:
    x = int("42")
except ValueError:
    print("عدد نامعتبر است")
else:
    print("عدد معتبر:", x)
finally:
    print("این بخش همیشه اجرا می‌شود")
حواست باشه: به جای `except:` از گرفتن استثنای مشخص استفاده کنید تا خطاهای واقعی پنهان نشوند.
۷۳ zip و باز کردن برای پیمایش موازی

ایدهٔ اصلی: به زبان ساده، برای پیمایش موازی روی چندین لیست می‌توانید از zip و باز کردن (unpacking) استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Unpacking یعنی عناصر یک iterable (مثل list/tuple) را به چند متغیر جداگانه نسبت دهید. در پایتون امکان «باز کردن توسعه‌یافته» با `*` هم وجود دارد.

کِی به درد می‌خوره؟

  • وقتی می‌خواهید خروجی چندتایی یک تابع را به چند متغیر بدهید.
  • وقتی می‌خواهید ابتدا/انتها را جدا و وسط را به صورت لیست نگه دارید.
  • برای خواناتر کردن کد هنگام کار با داده‌های ساختاریافته.

یه مثال سریع:

names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
    print(f"{name}: {score}")

یه مثال بیشتر 1:

numbers = [10, 20, 30, 40, 50]
first, *middle, last = numbers
print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50
حواست باشه: از `*rest` فقط یک‌بار در سمت چپ می‌توانید استفاده کنید.
۷۴ try با finally

ایدهٔ اصلی: به زبان ساده، برای مشخص کردن کد پاک‌سازی که همیشه اجرا می‌شود، چه استثنا رخ دهد یا نه، می‌توانید از finally استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

try:
    # کدی که ممکن است استثنا ایجاد کند
    result = 10 / 2
finally:
    # کد پاک‌سازی که همیشه اجرا می‌شود
    print("Cleanup")
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۵ تابع isinstance برای بررسی نوع

ایدهٔ اصلی: به زبان ساده، می‌توانید به جای استفاده از type ، برای بررسی نوع از isinstance استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، با `isinstance` می‌توانید نوع یک متغیر را چک کنید. این روش نسبت به `type(x) == ...` بهتر است چون وراثت را هم لحاظ می‌کند.

کِی به درد می‌خوره؟

  • اعتبارسنجی نوع ورودی توابع.
  • پشتیبانی از چند نوع مجاز (tuple از typeها).
  • نوشتن کد منعطف‌تر در برابر subclassها.

یه مثال سریع:

if isinstance(value, int):
    # کاری را با یک مقدار صحیح انجام بده

یه مثال بیشتر 1:

value = 3.14
if isinstance(value, (int, float)):
    print("number")
حواست باشه: در کدهای جدی، type hinting کمک می‌کند؛ اما `isinstance` هنوز برای runtime checks کاربرد دارد.
۷۶ لیست فشرده با شرط

ایدهٔ اصلی: به زبان ساده، برای فیلتر کردن عناصر در یک لیست می‌توانید از لیست فشرده با شرط استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، List Comprehension راهی سریع و خوانا برای ساختن یک لیست جدید بر اساس یک iterable است. این الگو جایگزین خوبی برای حلقه‌های کوتاهِ append کردن است.

کِی به درد می‌خوره؟

  • تبدیل (Transform) داده‌ها؛ مثل تبدیل لیست رشته‌ها به لیست عدد.
  • فیلتر کردن (Filter) داده‌ها با شرط `if`.
  • ساختن خروجی‌های کوتاه برای گزارش یا پردازش داده.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
even_numbers = [x for x in numbers if x % 2 == 0]

یه مثال بیشتر 1:

numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares)  # [4, 16, 36]
حواست باشه: اگر منطق داخل comprehension پیچیده شد، آن را به چند خط حلقه یا یک تابع جداگانه تبدیل کنید.
۷۷ get دیکشنری با مقدار پیش‌فرض

ایدهٔ اصلی: به زبان ساده، برای دسترسی به مقادیر دیکشنری با یک مقدار پیش‌فرض در صورت عدم وجود کلید، می‌توانید از get استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `dict.get` وقتی کلید وجود نداشته باشد مقدار پیش‌فرض می‌دهد و KeyError رخ نمی‌دهد. این روش برای داده‌های ورودی (مثل JSON) خیلی کاربردی است.

کِی به درد می‌خوره؟

  • خواندن امن از dictهای ورودی.
  • مقداردهی پیش‌فرض برای کلیدهای اختیاری.
  • کاهش try/exceptهای KeyError.

یه مثال سریع:

my_dict = {'a': 1, 'b': 2}
value = my_dict.get('c', 0) # خروجی: 0

یه مثال بیشتر 1:

data = {"user": {"name": "Ali"}}
name = data.get("user", {}).get("name", "Unknown")
age = data.get("user", {}).get("age", 0)

print(name)  # Ali
print(age)   # 0
حواست باشه: برای ساخت دیکشنری-of-lists، گاهی `setdefault` ساده و کاربردی است.
۷۸ عبارت del

ایدهٔ اصلی: به زبان ساده، برای حذف عناصر می‌توانید از یک لیست یا حذف متغیرها از del استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

my_list = [1, 2, 3, 4, 5]
del my_list[2] # حذف عنصر در اندیس 2
x = 10
del x # حذف متغیر 'x'
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۹ enumerate با اندیس شروع

ایدهٔ اصلی: به زبان ساده، برای مشخص کردن مقدار اولیه اندیس، می‌توانید از enumerate با اندیس شروع استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `enumerate` هنگام پیمایش، اندیس و مقدار را با هم می‌دهد. این کار باعث می‌شود به جای range و index، کد تمیزتر و امن‌تری بنویسید.

کِی به درد می‌خوره؟

  • شماره‌گذاری آیتم‌ها هنگام چاپ یا گزارش.
  • پرهیز از `list.index()` که O(n) است.
  • پیمایش همراه با اندیس شروع دلخواه (`start=`).

یه مثال سریع:

fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):
    print(f"Index {index}: {fruit}")

یه مثال بیشتر 1:

fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")
حواست باشه: اگر فقط اندیس لازم دارید، `range(len(...))` هم هست؛ ولی enumerate معمولاً خواناتر است.
۸۰ ماژول re برای عبارات منظم (Regular Expressions)

ایدهٔ اصلی: به زبان ساده، ماژول re به شما امکان کار با عبارات منظم را می‌دهد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import re
text = "Hello, World! My name is Alice."
pattern = r"Hello, (.*?)[.!]"
match = re.search(pattern, text)
if match:
    name = match.group(1)
    print(f"Name: {name}")
# خروجی: "Name: World"
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۱ تابع sys.exit()

ایدهٔ اصلی: به زبان ساده، برای خروج می‌توانید از اسکریپت پایتون از sys.exit() استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sys.exit(code)` برنامه را با کد خروج مشخص خاتمه می‌دهد. 0 یعنی موفق، و غیرصفر معمولاً یعنی خطا.

کِی به درد می‌خوره؟

  • خاتمه دادن به CLI در صورت ورودی نامعتبر.
  • بازگرداندن exit code مناسب به سیستم/CI.
  • توقف برنامه در شرایط بحرانی.

یه مثال سریع:

import sys
def my_function():
    # مقداری کد
    if some_condition:
        sys.exit()
# کد دیگر

یه مثال بیشتر 1:

import sys

if len(sys.argv) < 2:
    print("Usage: python app.py <filename>")
    sys.exit(2)

print("OK")
حواست باشه: برای برنامه‌های بزرگ‌تر، مدیریت خطاها با exception و هندل مرکزی هم گزینه خوبی است.
۸۲ ماژول inspect

ایدهٔ اصلی: به زبان ساده، ماژول inspect توابعی برای بازرسی اشیاء زنده فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، با `*args` می‌توانید آرگومان‌های positional متغیر بگیرید و با `**kwargs` آرگومان‌های نام‌دار. این‌ها برای نوشتن wrapperها و forwarding بسیار کاربردی‌اند.

کِی به درد می‌خوره؟

  • نوشتن توابع عمومی که تعداد آرگومان‌ها متغیر است.
  • نوشتن wrapper/decorator که پارامترها را به تابع اصلی پاس می‌دهد.
  • ساخت APIهای منعطف.

یه مثال سریع:

import inspect
def my_function(a, b=10, *args, c=20, **kwargs):
    pass
# دریافت آرگومان‌های تابع
argspec = inspect.getfullargspec(my_function)
# خروجی: FullArgSpec(args=['a', 'b'], varargs='args', varkw='kwargs', defaults=(10,), kwonlyargs=['c'], kwonlydefaults={'c': 20}, annotations={})

یه مثال بیشتر 1:

def logger(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

logger(1, 2, a=3, b=4)
حواست باشه: زیاده‌روی در استفاده از args/kwargs می‌تواند امضای تابع را مبهم کند؛ برای APIهای عمومی، امضای واضح بهتر است.
۸۳ تابع open با حالت‌های مختلف

ایدهٔ اصلی: به زبان ساده، برای عملیات مختلف فایل می‌توانید از تابع open با حالت‌های مختلف استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، حالت‌های رایج open: `r` خواندن، `w` نوشتن (پاک کردن قبلی)، `a` اضافه کردن، `x` ایجاد اگر نبود، و `b` برای باینری.

کِی به درد می‌خوره؟

  • کار با فایل‌های متنی و باینری.
  • ساخت فایل جدید با جلوگیری از overwrite با `x`.
  • نوشتن لاگ یا append کردن داده.

یه مثال سریع:

# حالت خواندن (پیش‌فرض)
with open("file.txt", "r") as file:
    content = file.read()
# حالت نوشتن (ایجاد فایل جدید یا بازنویسی فایل موجود)
with open("file.txt", "w") as file:
    file.write("Hello, World!")
# حالت افزودن (باز کردن برای نوشتن، اما افزودن به انتهای فایل)
with open("file.txt", "a") as file:
    file.write("\nGoodbye, World!")
# حالت باینری (خواندن یا نوشتن داده‌های باینری)
with open("file.bin", "wb") as file:
    file.write(b'\x01\x02\x03')

یه مثال بیشتر 1:

# ایجاد فایل جدید (اگر وجود داشته باشد خطا می‌دهد)
with open("new_file.txt", "x", encoding="utf-8") as f:
    f.write("created!")
حواست باشه: برای فایل‌های باینری مثل تصویر از حالت 'rb' و 'wb' استفاده کنید.
۸۴ قالب‌بندی رشته با f-string

ایدهٔ اصلی: به زبان ساده، برای قالب‌بندی رشته می‌توانید از f-string (پایتون ۳.۶ به بالا) استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، f-string (پایتون ۳.۶+) معمولاً خواناتر است و از format specifierها پشتیبانی می‌کند. برای عددها و تاریخ‌ها می‌توانید قالب‌دهی دقیق انجام دهید.

کِی به درد می‌خوره؟

  • ساخت پیام برای لاگ‌ها و خروجی CLI.
  • نمایش عدد با اعشار/درصد/جداکننده هزار.
  • فرمت کردن تاریخ و زمان برای UI یا فایل.

یه مثال سریع:

name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
# خروجی: "My name is Alice and I am 30 years old."

یه مثال بیشتر 1:

pi = 3.1415926
print(f"{pi:.2f}")   # 3.14

price = 1250000
print(f"{price:,}")  # 1,250,000
حواست باشه: از f-string با `=` هم می‌توانید برای دیباگ استفاده کنید: `f'{var=}'` (پایتون ۳.۸+).
۸۵ __name__ و __main__

ایدهٔ اصلی: به زبان ساده، برای ایجاد ماژول‌های قابل استفاده مجدد می‌توانید از __name__ و __main__ استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، الگوی `if __name__ == '__main__':` باعث می‌شود فایل هم قابل import باشد و هم وقتی مستقیم اجرا شد، بخش main اجرا شود.

کِی به درد می‌خوره؟

  • نوشتن ماژول قابل reuse.
  • جلوگیری از اجرای ناخواسته کد هنگام import.
  • ساخت CLI ساده در یک فایل.

یه مثال سریع:

# my_module.py
def my_function():
    print("Hello from my_function!")
if __name__ == "__main__":
    # زمانی اجرا می‌شود که اسکریپت مستقیماً اجرا شود
    my_function()

یه مثال بیشتر 1:

def main():
    print("Run as script")

if __name__ == "__main__":
    main()
حواست باشه: در پروژه‌های بزرگ‌تر، entrypointها را می‌توانید در `pyproject.toml` یا setup تعریف کنید.
۸۶ تابع range

ایدهٔ اصلی: به زبان ساده، برای تولید دنباله‌ای می‌توانید از اعداد از تابع range استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `range` یک sequence تنبل است و لیست نمی‌سازد (memory efficient). `range(stop)` از 0 شروع می‌کند و stop را شامل نمی‌شود.

کِی به درد می‌خوره؟

  • حلقه‌های شمارشی.
  • ساخت دنباله‌ها بدون مصرف حافظه زیاد.
  • تولید اندیس‌ها با step مشخص.

یه مثال سریع:

numbers = list(range(1, 11))
# خروجی: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

یه مثال بیشتر 1:

for i in range(1, 6):
    print(i)  # 1..5

print(list(range(0, 10, 3)))  # [0, 3, 6, 9]
حواست باشه: برای پیمایش روی لیست‌ها، enumerate اغلب بهتر از range(len(...)) است.
۸۷ عبارت pass

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

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `pass` یعنی «فعلاً هیچ کاری نکن». این برای تعریف بلوک‌های خالی لازم است (مثلاً بدنه کلاس/تابع که بعداً پر می‌شود).

کِی به درد می‌خوره؟

  • استاب کردن تابع/کلاس در حین طراحی.
  • نوشتن if/except/loop خالی (به‌صورت موقت).
  • وقتی به یک placeholder نیاز دارید تا سینتکس کامل شود.

یه مثال سریع:

def my_function():
    # TODO: Implement this function
    pass

یه مثال بیشتر 1:

def todo():
    pass  # TODO: implement later

class MyClass:
    pass
حواست باشه: در کد نهایی بهتر است `pass`های موقت را حذف یا با منطق واقعی جایگزین کنید.
۸۸ بلوک try , except , و finally

ایدهٔ اصلی: به زبان ساده، برای مدیریت استثنا می‌توانید از try ، except و finally استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، try/except برای مدیریت خطاست. `else` فقط وقتی اجرا می‌شود که خطا رخ ندهد و `finally` همیشه اجرا می‌شود (cleanup).

کِی به درد می‌خوره؟

  • مدیریت خطاهای قابل پیش‌بینی (مثل تبدیل نوع، فایل پیدا نشدن).
  • جلوگیری از کرش و ارائه پیام مناسب.
  • پاک‌سازی منابع در finally.

یه مثال سریع:

try:
    # کدی که ممکن است استثنا ایجاد کند
    result = 10 / 0
except ZeroDivisionError as e:
    # مدیریت استثنا
    print(f"Error: {e}")
finally:
    # کد پاک‌سازی که همیشه اجرا می‌شود
    print("Cleanup")

یه مثال بیشتر 1:

try:
    x = int("42")
except ValueError:
    print("عدد نامعتبر است")
else:
    print("عدد معتبر:", x)
finally:
    print("این بخش همیشه اجرا می‌شود")
حواست باشه: به جای `except:` از گرفتن استثنای مشخص استفاده کنید تا خطاهای واقعی پنهان نشوند.
۸۹ Namedtuples برای کلاس‌های ساده

ایدهٔ اصلی: به زبان ساده، برای ایجاد کلاس‌های ساده با فیلدهای نام‌گذاری شده می‌توانید از namedtuple استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `namedtuple` مثل tuple است ولی فیلدهای نام‌دار دارد. سبک و سریع است و خوانایی را بالا می‌برد.

کِی به درد می‌خوره؟

  • مدل‌کردن داده‌های ساده مثل Point یا RGB.
  • خروجی چندتایی از تابع با نام‌های واضح.
  • جایگزین سبک برای کلاس‌های خیلی ساده.

یه مثال سریع:

from collections import namedtuple
Person = namedtuple("Person", ["name", "age"])
person = Person("Alice", 30)
print(person.name) # خروجی: "Alice"
print(person.age) # خروجی: 30

یه مثال بیشتر 1:

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p = Point(2, 3)
print(p.x, p.y)
print(p._asdict())
حواست باشه: اگر نیاز به mutable بودن یا validation دارید، `dataclasses` گزینه بهتری است.
۹۰ تابع sorted با کلید سفارشی

ایدهٔ اصلی: به زبان ساده، برای مرتب‌سازی یک لیست بر اساس یک صفت خاص، می‌توانید از sorted با یک تابع کلید سفارشی استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `sorted` یک لیست جدیدِ مرتب‌شده برمی‌گرداند و ورودی را تغییر نمی‌دهد. با `key=` معیار مرتب‌سازی را تعیین کنید و با `reverse=True` ترتیب را برعکس کنید.

کِی به درد می‌خوره؟

  • مرتب‌سازی برای نمایش یا گزارش.
  • مرتب کردن بر اساس فیلد/کلید خاص.
  • حفظ لیست اصلی و ساخت نسخه مرتب‌شده.

یه مثال سریع:

people = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]
sorted_by_age = sorted(people, key=lambda x: x['age'])

یه مثال بیشتر 1:

words = ["python", "go", "javascript", "c"]
by_len = sorted(words, key=len)
print(by_len)
حواست باشه: برای مرتب‌سازی in-place از `list.sort()` استفاده کنید.
۹۱ متد setdefault دیکشنری

ایدهٔ اصلی: به زبان ساده، برای تنظیم یک مقدار پیش‌فرض برای یک کلید ناموجود در یک دیکشنری می‌توانید از setdefault استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

my_dict = {'a': 1, 'b': 2}
value = my_dict.setdefault('c', 0) # خروجی: 0
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۲ قالب‌بندی زمان با datetime

ایدهٔ اصلی: به زبان ساده، برای قالب‌بندی زمان می‌توانید از datetime استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `datetime` برای تاریخ و زمان است. در پروژه‌های واقعی، timezone (مثل UTC) را جدی بگیرید تا خطاهای اختلاف ساعت رخ ندهد.

کِی به درد می‌خوره؟

  • ثبت زمان رویدادها در لاگ.
  • محاسبه بازه‌ها با timedelta.
  • فرمت کردن تاریخ برای نمایش/ذخیره.

یه مثال سریع:

import datetime
now = datetime.datetime.now()
# قالب‌بندی به صورت ISO 8601
formatted_time = now.isoformat() # خروجی: "2023-08-02T12:34:56.789012"
# قالب‌بندی سفارشی
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S.%f") # خروجی: "2023-08-02 12:34:56.789012"

یه مثال بیشتر 1:

import datetime

now = datetime.datetime.now()
print(now.isoformat(timespec="seconds"))
حواست باشه: اگر با timezone کار می‌کنید، از `datetime.datetime.now(datetime.timezone.utc)` استفاده کنید.
۹۳ ماژول os برای عملیات فایل

ایدهٔ اصلی: به زبان ساده، ماژول os توابعی برای عملیات مرتبط با فایل فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `os` برای کارهای سیستم‌عامل مثل فایل‌ها، پوشه‌ها، env vars و اجرای دستورات است.

کِی به درد می‌خوره؟

  • ساخت/حذف پوشه‌ها و فایل‌ها.
  • خواندن متغیرهای محیطی (ENV).
  • کار با مسیرها (در کنار os.path/pathlib).

یه مثال سریع:

import os
# دریافت دایرکتوری کاری فعلی
current_directory = os.getcwd()
# لیست کردن فایل‌ها در یک دایرکتوری
files = os.listdir('/path/to/directory')
# بررسی وجود یک فایل یا دایرکتوری
exists = os.path.exists('/path/to/file_or_directory')
# ایجاد یک دایرکتوری
os.makedirs('/path/to/new_directory')
# حذف یک فایل
os.remove('/path/to/file')
# تغییر نام یک فایل
os.rename('/path/to/old_file', '/path/to/new_file')
# دریافت اندازه فایل
file_size = os.path.getsize('/path/to/file')

یه مثال بیشتر 1:

import os

print(os.getenv("HOME"))
print(os.listdir("."))
حواست باشه: برای کار با مسیرها، `pathlib` معمولاً خواناتر است.
۹۴ عملگر in برای بررسی عضویت

ایدهٔ اصلی: به زبان ساده، می‌توانید بررسی کنید که آیا یک عنصر در یک لیست یا دیکشنری وجود دارد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، عملگر `in` برای بررسی عضویت استفاده می‌شود. از نظر عملکردی، جستجو در `set` و `dict` معمولاً سریع‌تر از `list` است (میانگین O(1)).

کِی به درد می‌خوره؟

  • چک کردن اینکه یک کلید در dict هست یا نه.
  • حذف تکراری‌ها و چک سریع با set.
  • اعتبارسنجی ورودی بر اساس whitelist.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
if 3 in numbers:
    print("3 is in the list.")
my_dict = {'a': 1, 'b': 2}
if 'b' in my_dict:
    print("Key 'b' exists in the dictionary.")

یه مثال بیشتر 1:

allowed = {"GET", "POST", "PUT"}
method = "POST"
print(method in allowed)  # True
حواست باشه: اگر مرتباً membership check می‌کنید، داده را به set تبدیل کنید تا سریع‌تر شود.
۹۵ ماژول time برای عملیات زمانی

ایدهٔ اصلی: به زبان ساده، ماژول time توابعی برای کار با زمان فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `time` توابعی مثل `sleep` و `perf_counter` دارد. برای اندازه‌گیری دقیق زمان، `perf_counter` بهتر از `time.time` است.

کِی به درد می‌خوره؟

  • توقف کوتاه (sleep) در اسکریپت‌ها.
  • زمان‌سنجی ساده با perf_counter.
  • کارهای مرتبط با timestamp.

یه مثال سریع:

import time
# دریافت زمان فعلی به ثانیه
current_time = time.time()
# توقف برای مدت زمان مشخص
time.sleep(3) # توقف برای 3 ثانیه

یه مثال بیشتر 1:

import time

start = time.perf_counter()
time.sleep(0.2)
end = time.perf_counter()
print(f"Elapsed: {end - start:.3f}s")
حواست باشه: برای بنچمارک‌های ریز از timeit استفاده کنید.
۹۶ عبارت assert

ایدهٔ اصلی: به زبان ساده، برای اشکال‌زدایی و تست می‌توانید از assert استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `assert` برای چک کردن فرضیات در زمان توسعه است. اگر شرط False شود، AssertionError رخ می‌دهد.

کِی به درد می‌خوره؟

  • دیباگ و چک کردن invariants.
  • تست‌های کوچک در حین توسعه.
  • اطمینان از پیش‌شرط‌ها (در حالت توسعه).

یه مثال سریع:

def my_function(x):
    assert x > 0, "x must be positive"
    # بقیه کد

یه مثال بیشتر 1:

def divide(a, b):
    assert b != 0, "b must not be zero"
    return a / b

print(divide(10, 2))
حواست باشه: در حالت اجرای بهینه (`-O`) assertها حذف می‌شوند؛ برای validation واقعی از if/raise استفاده کنید.
۹۷ ماژول random برای اعداد تصادفی

ایدهٔ اصلی: به زبان ساده، ماژول random توابعی برای تولید اعداد تصادفی فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `random` برای کارهای عمومی تصادفی مناسب است. برای کارهای امنیتی (توکن/پسورد) از `secrets` استفاده کنید.

کِی به درد می‌خوره؟

  • sample و shuffle داده‌ها.
  • شبیه‌سازی‌های ساده.
  • تست‌های قابل تکرار با seed.

یه مثال سریع:

import random
# عدد صحیح تصادفی
random_number = random.randint(1, 10)
# عدد اعشاری تصادفی
random_float = random.random() # محدوده: 0.0 <= random_float < 1.0
# انتخاب تصادفی
choices = ['apple', 'banana', 'cherry']
random_choice = random.choice(choices)

یه مثال بیشتر 1:

import random

items = [1, 2, 3, 4, 5]
print(random.choice(items))
print(random.sample(items, k=3))
حواست باشه: برای تولید توکن امن از `secrets.token_hex()` استفاده کنید.
۹۸ ماژول os.path برای عملیات مسیر

ایدهٔ اصلی: به زبان ساده، ماژول os.path توابعی برای عملیات مرتبط با مسیر فراهم می‌کند.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `os` برای کارهای سیستم‌عامل مثل فایل‌ها، پوشه‌ها، env vars و اجرای دستورات است.

کِی به درد می‌خوره؟

  • ساخت/حذف پوشه‌ها و فایل‌ها.
  • خواندن متغیرهای محیطی (ENV).
  • کار با مسیرها (در کنار os.path/pathlib).

یه مثال سریع:

import os.path
# بررسی وجود یک مسیر
exists = os.path.exists('/path/to/file_or_directory')
# دریافت مسیر مطلق
absolute_path = os.path.abspath('file.txt')
# اتصال مسیرها
path = os.path.join('/path/to', 'file.txt')
# دریافت نام پایه یک مسیر
base_name = os.path.basename('/path/to/file.txt')

یه مثال بیشتر 1:

import os

print(os.getenv("HOME"))
print(os.listdir("."))
حواست باشه: برای کار با مسیرها، `pathlib` معمولاً خواناتر است.
۹۹ تابع filter برای فیلتر کردن عناصر

ایدهٔ اصلی: به زبان ساده، برای فیلتر کردن عناصر در یک لیست بر اساس یک شرط می‌توانید از filter استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `filter(func, iterable)` آیتم‌هایی را نگه می‌دارد که func برایشان True شود. اگر func را None بدهید، فقط truthyها می‌مانند.

کِی به درد می‌خوره؟

  • فیلتر کردن داده‌ها بر اساس شرط.
  • پاک‌سازی لیست‌ها از آیتم‌های خالی (با filter(None,...)).
  • ساخت pipelineهای پردازش داده به صورت iterator.

یه مثال سریع:

numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

یه مثال بیشتر 1:

numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4, 6]
حواست باشه: List comprehension معمولاً خواناتر است: `[x for x in numbers if x % 2 == 0]`.
۱۰۰ توابع lambda

ایدهٔ اصلی: به زبان ساده، برای توابع ساده و بی‌نام می‌توانید از توابع lambda استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، lambda یک تابع بی‌نام و کوتاه است. برای کارهای خیلی ساده (به‌خصوص به عنوان key یا callback) مناسب است.

کِی به درد می‌خوره؟

  • به عنوان `key=` در sort/max/min.
  • در map/filter برای عملیات کوچک.
  • برای callbackهای کوتاه.

یه مثال سریع:

add = lambda x, y: x + y
result = add(3, 5) # خروجی: 8

یه مثال بیشتر 1:

people = [{"name": "Ali", "age": 20}, {"name": "Sara", "age": 18}]
sorted_people = sorted(people, key=lambda p: p["age"])
print(sorted_people)
حواست باشه: اگر lambda پیچیده شد، حتماً از `def` استفاده کنید تا خوانایی حفظ شود.
۱۰۱ تابع functools.partial

ایدهٔ اصلی: به زبان ساده، برای ایجاد توابع با آرگومان‌های ثابت می‌توانید از functools.partial استفاده کنید.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `functools.partial` برخی آرگومان‌ها را از قبل مقداردهی می‌کند و یک تابع جدید می‌سازد. برای ساخت توابع تخصصی از توابع عمومی مفید است.

کِی به درد می‌خوره؟

  • ساخت wrapperهای ساده بدون نوشتن def جدید.
  • فیکس کردن پارامترهای تکراری در callbackها.
  • کاهش تکرار هنگام استفاده از توابع عمومی.

یه مثال سریع:

import functools
def power(base, exponent):
    return base ** exponent
square = functools.partial(power, exponent=2)
cube = functools.partial(power, exponent=3)
print(square(5)) # خروجی: 25
print(cube(5)) # خروجی: 125

یه مثال بیشتر 1:

from functools import partial

def power(base, exp):
    return base ** exp

square = partial(power, exp=2)
cube = partial(power, exp=3)

print(square(5))  # 25
print(cube(2))    # 8
حواست باشه: اگر partial خوانایی را کم کرد، یک تابع کوچک با def بنویسید.

بخش دوم-پیشرفته

موضوعات پیشرفته‌تر و ابزارهای مهم اکوسیستم پایتون.

۱ مدیرهای زمینه (Context Managers)

ایدهٔ اصلی: به زبان ساده، توضیح: مدیرهای زمینه مدیریت منابع را در پایتون با فراهم کردن راهی برای تخصیص و آزادسازی منابع ساده می‌کنند. این کار با استفاده از عبارت with انجام می‌شود، جایی که منطق راه‌اندازی و پایان‌دهی به طور خودکار مدیریت می‌شود.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Context Managerها برای مدیریت منابع هستند: setup در __enter__ و cleanup در __exit__. این الگو باعث می‌شود نشت منابع کمتر شود.

کِی به درد می‌خوره؟

  • مدیریت فایل، قفل، تراکنش DB، کانکشن شبکه و ...
  • اجرای cleanup حتی در صورت exception.
  • نوشتن APIهای تمیز با قرارداد روشن.

یه مثال سریع:

from contextlib import contextmanager

@contextmanager
def manage_file(filename):
    file = open(filename, 'r')
    yield file
    file.close()

with manage_file('file.txt') as file:
    print(file.read())

یه مثال بیشتر 1:

class Timer:
    def __enter__(self):
        import time
        self.start = time.perf_counter()
        return self
    def __exit__(self, exc_type, exc, tb):
        import time
        end = time.perf_counter()
        print(f"Elapsed: {end - self.start:.6f}s")

with Timer():
    _ = sum(range(1000000))
حواست باشه: برای مدیریت چند منبع پویا (تعداد نامعلوم)، از `contextlib.ExitStack` استفاده کنید.
۲ متاکلاس‌ها (Metaclasses)

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: متاکلاس‌ها در پایتون کلاس‌هایی از کلاس‌ها هستند. آن‌ها به شما اجازه می‌دهند تا ایجاد و رفتار یک کلاس را کنترل کنید. تابع type معمولاً به عنوان یک متاکلاس استفاده می‌شود.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، متاکلاس‌ها پیشرفته‌اند. در بسیاری از نیازها، `__init_subclass__` یا decorator کلاس کافی است و پیچیدگی کمتر دارد.

کِی به درد می‌خوره؟

  • ثبت خودکار کلاس‌ها (registry).
  • اعتبارسنجی ساختار کلاس هنگام تعریف.
  • ساخت DSLها یا فریم‌ورک‌ها.

یه مثال سریع:

class Meta(type):
    def __new__(cls, name, bases, dct):
        print(f"Creating class {name}")
        return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=Meta):
    pass

یه مثال بیشتر 1:

class Base:
    registry = []
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        Base.registry.append(cls)

class A(Base): ...
class B(Base): ...

print([c.__name__ for c in Base.registry])  # ['A', 'B']
حواست باشه: قبل از متاکلاس، راه‌های ساده‌تر را امتحان کنید چون debug و نگهداری متاکلاس سخت‌تر است.
۳ انباشت دکوراتور (Decorator Stacking)

ایدهٔ اصلی: به زبان ساده، توضیح: انباشت دکوراتور به اعمال چندین دکوراتور به یک تابع اشاره دارد. ترتیب مهم است، زیرا هر دکوراتور تابعی را که توسط دکوراتور قبلی بازگردانده شده است، در بر می‌گیرد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

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

کِی به درد می‌خوره؟

  • Timing و profiling سریع توابع.
  • Authorization و validation.
  • Caching با `functools.lru_cache` یا دکوراتورهای سفارشی.

یه مثال سریع:

def decorator_one(func):
    def wrapper():
        print("Decorator One")
        func()
    return wrapper

def decorator_two(func):
    def wrapper():
        print("Decorator Two")
        func()
    return wrapper

@decorator_one
@decorator_two
def my_function():
    print("Original Function")

my_function()

یه مثال بیشتر 1:

import time
from functools import wraps

def timing(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} took {end - start:.6f}s")
        return result
    return wrapper

@timing
def work():
    return sum(range(100000))

work()
حواست باشه: داخل دکوراتور از `functools.wraps` استفاده کنید تا نام و docstring تابع اصلی حفظ شود.
۴ حاشیه‌نویسی تابع (Function Annotations)

ایدهٔ اصلی: به زبان ساده، توضیح: حاشیه‌نویسی تابع برای ارائه فراداده (metadata) در مورد پارامترها و مقدار بازگشتی تابع استفاده می‌شود. این می‌تواند برای مستندسازی و راهنمایی نوع (type hinting) مفید باشد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

def add(a: int, b: int) -> int:
    """Add two integers."""
    return a + b
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵ سربارگذاری تابع (Function Overloading)

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

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، پایتون سربارگذاری سنتی ندارد، ولی `functools.singledispatch` امکان dispatch بر اساس نوع را می‌دهد.

کِی به درد می‌خوره؟

  • APIهایی که برای انواع مختلف ورودی رفتار متفاوت دارند.
  • کاهش if/elifهای زیاد بر اساس type.
  • کتابخانه‌های عمومی‌تر.

یه مثال سریع:

def multiply(a, b=None):
    if b is None:
        return a * a
    else:
        return a * b

print(multiply(3)) # خروجی: 9
print(multiply(3, 4)) # خروجی: 12

یه مثال بیشتر 1:

from functools import singledispatch

@singledispatch
def describe(x):
    return f"Unknown: {x}"

@describe.register
def _(x: int):
    return f"int: {x}"

@describe.register
def _(x: str):
    return f"str: {x}"

print(describe(10))
print(describe("hi"))
حواست باشه: `typing.overload` برای type checker است و در runtime رفتار را عوض نمی‌کند.
۶ کلاس‌های پایه انتزاعی (Abstract Base Classes - ABCs)

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: کلاس‌های پایه انتزاعی برای تعریف یک رابط مشترک برای کلاس‌های مشتق شده استفاده می‌شوند. آن‌ها به شما اجازه می‌دهند متدهایی را تعریف کنید که باید در هر کلاس فرزند پیاده‌سازی شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ABCs قراردادها را رسمی می‌کنند: کلاس فرزند باید متدهای abstract را پیاده‌سازی کند. این برای معماری‌های بزرگ مفید است.

کِی به درد می‌خوره؟

  • تعریف interface مشترک بین چند پیاده‌سازی.
  • کاهش خطاهای runtime با الزام به پیاده‌سازی.
  • ساخت معماری پلاگین/driver.

یه مثال سریع:

from abc import ABC, abstractmethod

class MyABC(ABC):
    @abstractmethod
    def my_abstract_method(self):
        pass

class ConcreteClass(MyABC):
    def my_abstract_method(self):
        print("Implemented abstract method")

obj = ConcreteClass()
obj.my_abstract_method() # خروجی: Implemented abstract method

یه مثال بیشتر 1:

from abc import ABC, abstractmethod

class Storage(ABC):
    @abstractmethod
    def save(self, key, value): ...
    @abstractmethod
    def load(self, key): ...

class MemoryStorage(Storage):
    def __init__(self):
        self._db = {}
    def save(self, key, value):
        self._db[key] = value
    def load(self, key):
        return self._db.get(key)

s = MemoryStorage()
s.save("a", 1)
print(s.load("a"))
حواست باشه: برای پروژه‌های کوچک، ABC ممکن است overkill باشد؛ اما در پروژه‌های بزرگ بسیار مفید است.
۷ وارد کردن پویا (Dynamic Importing)

ایدهٔ اصلی: به زبان ساده، توضیح: وارد کردن پویا به شما اجازه می‌دهد ماژول‌ها و کلاس‌ها را در زمان اجرا وارد کنید. می‌توانید از ماژول importlib یا تابع __import__ برای این منظور استفاده کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Dynamic import وقتی مفید است که نام ماژول/کلاس در زمان اجرا مشخص می‌شود (مثلاً از config).

کِی به درد می‌خوره؟

  • سیستم پلاگین.
  • lazy import برای کاهش زمان startup.
  • انتخاب backend بر اساس تنظیمات.

یه مثال سریع:

import importlib

math_module = importlib.import_module('math')
sqrt = math_module.sqrt
print(sqrt(16)) # خروجی: 4.0

یه مثال بیشتر 1:

import importlib

module_name = "math"
mod = importlib.import_module(module_name)
print(mod.sqrt(81))
حواست باشه: اگر از dynamic import زیاد استفاده می‌کنید، تست و مستندسازی را جدی بگیرید.
۸ مولدها در مقابل تکرارکننده‌ها (Generators vs. Iterators)

ایدهٔ اصلی: به زبان ساده، توضیح.

ایدهٔ اصلی: به زبان ساده، تکرارکننده‌ها (Iterators): شیئی که امکان پیمایش روی عناصر خود را با استفاده از متدهای __iter__ و __next__ فراهم می‌کند. مولدها (Generators): راهی ساده‌تر برای ایجاد تکرارکننده‌ها با استفاده از توابع و عبارت yield .

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

# تکرارکننده
class MyIterator:
    def __iter__(self):
        self.num = 1
        return self
    def __next__(self):
        self.num *= 2
        return self.num

# مولد
def my_generator():
    num = 1
    while True:
        num *= 2
        yield num
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹ کوروتین‌ها (Coroutines)

ایدهٔ اصلی: به زبان ساده، توضیح: کوروتین‌ها شکل کلی‌تری از زیرروال‌ها هستند که چندین نقطه ورود برای توقف و از سرگیری اجرا را فراهم می‌کنند. در پایتون، می‌توانید با استفاده از کلمات کلیدی async و await کوروتین ایجاد کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import asyncio

async def my_coroutine():
    print("Start")
    await asyncio.sleep(1)
    print("End")

asyncio.run(my_coroutine())
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۱۰ مدیرهای زمینه ناهمگام (Asynchronous Context Managers)

ایدهٔ اصلی: به زبان ساده، توضیح: مدیرهای زمینه ناهمگام امکان مدیریت منابع را در یک زمینه ناهمگام با استفاده از async with فراهم می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `ord` کد یونیکد یک کاراکتر را می‌دهد و `chr` برعکس، از کد یونیکد کاراکتر می‌سازد. برای کارهای متنی/رمزگذاری ساده مفید است.

کِی به درد می‌خوره؟

  • تبدیل کاراکتر به عدد و برعکس.
  • ساختن الگوریتم‌های ساده روی حروف (مثل Caesar cipher).
  • کار با یونیکد و کدپوینت‌ها.

یه مثال سریع:

import aiofiles

async def read_file():
    async with aiofiles.open('file.txt', mode='r') as file:
        contents = await file.read()
        print(contents)

# برای اجرای کد بالا در یک زمینه مناسب از asyncio.run(read_file()) استفاده کنید

یه مثال بیشتر 1:

ch = "A"
code = ord(ch)
print(code)       # 65
print(chr(code))  # A
حواست باشه: در کار با زبان‌های مختلف (فارسی، ایموجی)، یونیکد می‌تواند چند کدپوینت داشته باشد؛ مراقب باشید.
۱۱ تکرارکننده‌های ناهمگام (Asynchronous Iterators)

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: تکرارکننده‌های ناهمگام امکان پیمایش ناهمگام را با استفاده از متدهای __aiter__ و __anext__ فراهم می‌کنند. آن‌ها به شما امکان می‌دهند روی آیتم‌ها به صورت ناهمگام پیمایش کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `ord` کد یونیکد یک کاراکتر را می‌دهد و `chr` برعکس، از کد یونیکد کاراکتر می‌سازد. برای کارهای متنی/رمزگذاری ساده مفید است.

کِی به درد می‌خوره؟

  • تبدیل کاراکتر به عدد و برعکس.
  • ساختن الگوریتم‌های ساده روی حروف (مثل Caesar cipher).
  • کار با یونیکد و کدپوینت‌ها.

یه مثال سریع:

class AsyncCounter:
    def __init__(self, limit):
        self.limit = limit
    def __aiter__(self):
        self.count = 0
        return self
    async def __anext__(self):
        if self.count < self.limit:
            self.count += 1
            return self.count
        else:
            raise StopAsyncIteration

async def run():
    async for value in AsyncCounter(5):
        print(value)

# برای اجرای کد از asyncio.run(run()) استفاده کنید

یه مثال بیشتر 1:

ch = "A"
code = ord(ch)
print(code)       # 65
print(chr(code))  # A
حواست باشه: در کار با زبان‌های مختلف (فارسی، ایموجی)، یونیکد می‌تواند چند کدپوینت داشته باشد؛ مراقب باشید.
۱۲ کتابخانه asyncio

ایدهٔ اصلی: به زبان ساده، توضیح: کتابخانه asyncio برای نوشتن کد همزمان با استفاده از سینتکس async/await در پایتون استفاده می‌شود. این کتابخانه یک حلقه رویداد (event loop) فراهم می‌کند که زمان‌بندی و اجرای وظایف ناهمگام را مدیریت می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، asyncio برای I/O concurrency عالی است (شبکه/فایل/DB). برای CPU-bound معمولاً باید از process pool استفاده کنید.

کِی به درد می‌خوره؟

  • درخواست‌های همزمان به چند API.
  • بات‌ها و سرویس‌های I/O محور.
  • ساخت pipeline async.

یه مثال سریع:

import asyncio

async def print_numbers():
    for i in range(5):
        print(i)
        await asyncio.sleep(1)

asyncio.run(print_numbers())

یه مثال بیشتر 1:

import asyncio

async def say(name, delay):
    await asyncio.sleep(delay)
    return f"Hi {name}"

async def main():
    results = await asyncio.gather(
        say("Ali", 1),
        say("Sara", 0.5),
    )
    print(results)

asyncio.run(main())
حواست باشه: داخل async از توابع blocking مثل requests/time.sleep استفاده نکنید؛ نسخه‌های async را به کار ببرید.
۱۳ Concurrent.Futures

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول concurrent.futures یک رابط سطح بالا برای اجرای ناهمگام توابع با استفاده از نخ‌ها (threads) یا فرآیندها (processes) فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from concurrent.futures import ThreadPoolExecutor

def task(n):
    return n * 2

with ThreadPoolExecutor() as executor:
    results = executor.map(task, [1, 2, 3])
    print(list(results)) # خروجی: [2, 4, 6]
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۱۴ ThreadPoolExecutor

ایدهٔ اصلی: به زبان ساده، توضیح: کلاس ThreadPoolExecutor برای مدیریت موازی‌سازی مبتنی بر نخ استفاده می‌شود. این کلاس اجرای همزمان وظایف را در نخ‌های جداگانه امکان‌پذیر می‌سازد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ThreadPool برای کارهای I/O-bound مناسب است. برای CPU-bound به خاطر GIL معمولاً ProcessPool بهتر است.

کِی به درد می‌خوره؟

  • دانلود/شبکه با کتابخانه‌های blocking.
  • خواندن/نوشتن فایل همزمان.
  • اجرای چند کار مستقل بدون thread دستی.

یه مثال سریع:

from concurrent.futures import ThreadPoolExecutor

def square(n):
    return n * n

with ThreadPoolExecutor() as executor:
    future = executor.submit(square, 3)
    print(future.result()) # خروجی: 9

یه مثال بیشتر 1:

from concurrent.futures import ThreadPoolExecutor

def work(i):
    return i * 2

with ThreadPoolExecutor(max_workers=4) as ex:
    print(list(ex.map(work, range(5))))
حواست باشه: اگر کتابخانه async دارید، async/await هم گزینه خوبی است.
۱۵ ProcessPoolExecutor

ایدهٔ اصلی: به زبان ساده، توضیح: کلاس ProcessPoolExecutor امکان اجرای موازی وظایف را در فرآیندهای مختلف فراهم می‌کند و از چندین هسته CPU بهره می‌برد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ProcessPool برای کارهای CPU-bound مناسب است چون هر process مفسر جدا دارد و محدودیت GIL کمتر اثر می‌گذارد.

کِی به درد می‌خوره؟

  • محاسبات سنگین روی CPU.
  • اجرای parallel واقعی روی چند هسته.
  • تقسیم کارهای مستقل.

یه مثال سریع:

from concurrent.futures import ProcessPoolExecutor

def multiply(n):
    return n * 2

with ProcessPoolExecutor() as executor:
    results = list(executor.map(multiply, [1, 2, 3]))
    print(results) # خروجی: [2, 4, 6]

یه مثال بیشتر 1:

from concurrent.futures import ProcessPoolExecutor

def cpu_work(n):
    return sum(i*i for i in range(n))

with ProcessPoolExecutor() as ex:
    print(list(ex.map(cpu_work, [200000, 200000, 200000])))
حواست باشه: در ProcessPool، آرگومان‌ها باید pickleable باشند و overhead بین processها را در نظر بگیرید.
۱۶ مدیریت حافظه (Memory Management)

ایدهٔ اصلی: به زبان ساده، توضیح: مدیریت حافظه در پایتون شامل تخصیص، آزادسازی و جمع‌آوری زباله (garbage collection) حافظه است. مدیر حافظه پایتون این جنبه‌ها را به طور خودکار مدیریت می‌کند، اما شما می‌توانید با استفاده از برخی توابع داخلی با آن تعامل داشته باشید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import gc

# فعال‌سازی دستی جمع‌آوری زباله
gc.collect()

# دریافت تعداد اشیاء ردیابی شده توسط جمع‌آورنده زباله
print(gc.get_count())
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۱۷ پروفایل‌سازی و بهینه‌سازی (Profiling and Optimization)

ایدهٔ اصلی: به زبان ساده، توضیح: پروفایل‌سازی به اندازه‌گیری اجرای برنامه برای تحلیل عملکرد آن اشاره دارد. بهینه‌سازی شامل بهبود عملکرد کد با کاهش گلوگاه‌ها (bottlenecks) است.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import cProfile

def factorial(n):
    return 1 if n == 0 else n * factorial(n-1)

def main():
    print(factorial(10))

cProfile.run('main()')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۱۸ سایthon (Cython)

ایدهٔ اصلی: به زبان ساده، توضیح: سایthon یک زبان برنامه‌نویسی است که پایتون را با C ترکیب می‌کند و بهبود عملکرد را ممکن می‌سازد. این زبان اجازه می‌دهد کد پایتون به C کامپایل شود و در نتیجه سرعت اجرا بهبود یابد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

# my_cython_module.pyx
def multiply(a, b):
    return a * b

# کامپایل با سایthon
# cythonize -i my_cython_module.pyx

# استفاده در پایتون
# import my_cython_module
# print(my_cython_module.multiply(3, 4)) # خروجی: 12
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۱۹ نماهای حافظه (Memory Views)

ایدهٔ اصلی: به زبان ساده، توضیح: نماهای حافظه راهی برای دسترسی به داده‌های داخلی یک شیء بدون کپی کردن فراهم می‌کنند. آن‌ها امکان دستکاری کارآمد ساختارهای داده‌ای را که از پروتکل بافر پشتیبانی می‌کنند، فراهم می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

arr = bytearray([1, 2, 3, 4])
mem_view = memoryview(arr)
mem_view[1] = 5
print(arr) # خروجی: bytearray(b'\x01\x05\x03\x04')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۲۰ GIL (قفل سراسری مفسر - Global Interpreter Lock)

ایدهٔ اصلی: به زبان ساده، توضیح: قفل سراسری مفسر (GIL) یک mutex است که اجازه می‌دهد در هر زمان فقط یک نخ در مفسر اجرا شود. این می‌تواند عملکرد برنامه‌های چندنخی وابسته به CPU را محدود کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، GIL در CPython باعث می‌شود threadها برای CPU-bound بهبود خطی ندهند. برای I/O-bound threadها هنوز مفیدند.

کِی به درد می‌خوره؟

  • انتخاب درست بین thread/process/async.
  • درک محدودیت‌های همزمانی در CPython.
  • طراحی معماری مناسب برای کارهای CPU و I/O.

یه مثال سریع:

# GIL می‌تواند بر کدی مانند این تأثیر بگذارد:
from threading import Thread

def count_up_to(n):
    count = 0
    while count < n:
        count += 1

threads = [Thread(target=count_up_to, args=(100000000,)) for _ in range(2)]
for t in threads:
    t.start()
for t in threads:
    t.join()
# عملکرد ممکن است به صورت خطی با تعداد نخ‌ها به دلیل GIL افزایش نیابد
حواست باشه: برای CPU-bound معمولاً process یا کتابخانه‌های بومی (مثل NumPy) بهتر هستند.
۲۱ افزونه‌های C (C Extensions)

ایدهٔ اصلی: به زبان ساده، توضیح: افزونه‌های C امکان ادغام کد C با پایتون را برای دستیابی به عملکرد بهتر در بخش‌های حیاتی کد فراهم می‌کنند. آن‌ها به توسعه‌دهندگان اجازه می‌دهند ماژول‌های بومی را در C بنویسند که می‌توانند مانند ماژول‌های معمولی پایتون وارد و استفاده شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

مثال 1:

// example.c
#include 


static PyObject* multiply(PyObject* self, PyObject* args) {
    int a, b;
    if (!PyArg_ParseTuple(args, "ii", &a, &b))
        return NULL;
    return Py_BuildValue("i", a * b);
}
// ... (بقیه کد افزونه C)

مثال 2:

# کامپایل کردن
# gcc -shared -o example.so -I /usr/include/python3.8 example.c

مثال 3:

# استفاده در پایتون
# import example
# print(example.multiply(2, 3)) # خروجی: 6
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۲۲ C-API

ایدهٔ اصلی: به زبان ساده، توضیح: C-API پایتون امکان ارتباط بین پایتون و C را فراهم می‌کند و ایجاد افزونه‌های بومی سفارشی و تعامل با اشیاء پایتون از کد C را ممکن می‌سازد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

ایدهٔ اصلی: به زبان ساده، // مشابه مثال افزونه C در بالا.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در کار با APIها، علاوه بر درخواست، مدیریت خطا، timeout، retry و rate limit مهم است.

کِی به درد می‌خوره؟

  • اتصال به سرویس‌های بیرونی.
  • ساخت کلاینت داخلی برای سرویس‌ها.
  • جمع‌آوری داده از API.
حواست باشه: در پروژه واقعی حتماً timeout تنظیم کنید و خطاها را هندل کنید.
۲۳ NumPy

ایدهٔ اصلی: به زبان ساده، توضیح: NumPy یک کتابخانه قدرتمند برای محاسبات عددی در پایتون است که پشتیبانی از آرایه‌ها و ماتریس‌های بزرگ را به همراه توابع ریاضی برای عملیات روی این آرایه‌ها فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، NumPy عملیات برداری و آرایه‌ای را سریع انجام می‌دهد چون بخش‌های سنگین در C اجرا می‌شوند. هدف اصلی کاهش حلقه‌های پایتونی است.

کِی به درد می‌خوره؟

  • محاسبات عددی و ماتریسی.
  • پردازش داده علمی.
  • پیش‌پردازش داده برای ML.

یه مثال سریع:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# جمع عنصر به عنصر
result = a + b
print(result) # خروجی: [5 7 9]

یه مثال بیشتر 1:

import numpy as np

arr = np.array([1, 2, 3, 4])
print(arr * 10)
حواست باشه: برای سرعت، سعی کنید عملیات را برداری کنید و از حلقه‌های پایتونی کم‌تر استفاده کنید.
۲۴ SciPy

ایدهٔ اصلی: به زبان ساده، توضیح: SciPy یک کتابخانه منبع باز است که برای محاسبات علمی و فنی استفاده می‌شود. این کتابخانه بر پایه NumPy ساخته شده و ماژول‌های اضافی برای بهینه‌سازی، انتگرال‌گیری، درون‌یابی و موارد دیگر فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from scipy.optimize import minimize

def objective_function(x):
    return x**2 + 3*x - 5

result = minimize(objective_function, 0)
print(result.x) # خروجی: تقریب از نقطه کمینه
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۲۵ pandas

ایدهٔ اصلی: به زبان ساده، توضیح: pandas یک کتابخانه محبوب برای دستکاری و تحلیل داده است. این کتابخانه ساختارهای داده‌ای مانند DataFrame و Series را برای مدیریت و تحلیل داده‌های ساختاریافته فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، pandas برای داده‌های جدولی عالی است. با DataFrame می‌توانید فیلتر، گروه‌بندی و تجمیع انجام دهید.

کِی به درد می‌خوره؟

  • تحلیل و پاک‌سازی داده.
  • خواندن/نوشتن CSV/Excel/SQL.
  • ETL سبک و گزارش‌گیری.

یه مثال سریع:

import pandas as pd

data = {
    'Name': ['Alice', 'Bob'],
    'Age': [25, 30]
}
df = pd.DataFrame(data)

# فیلتر کردن بر اساس سن
filtered_df = df[df['Age'] > 26]
print(filtered_df) # خروجی: داده‌های مربوط به Bob

یه مثال بیشتر 1:

import pandas as pd

df = pd.DataFrame({"name": ["Ali", "Sara"], "score": [18, 15]})
print(df[df["score"] >= 17])
حواست باشه: برای دیتاست‌های خیلی بزرگ ممکن است به chunking یا ابزارهای دیگری مثل Dask/Polars نیاز داشته باشید.
۲۶ Matplotlib

ایدهٔ اصلی: به زبان ساده، توضیح: Matplotlib یک کتابخانه پرکاربرد برای ایجاد تجسم‌های ایستا، تعاملی و متحرک در پایتون است.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Matplotlib کتابخانهٔ پایهٔ رسم نمودار است و کنترل دقیق روی اجزای نمودار می‌دهد.

کِی به درد می‌خوره؟

  • نمودارهای علمی و گزارش‌ها.
  • EDA و بررسی سریع داده‌ها.
  • ذخیره نمودار به فایل.

یه مثال سریع:

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [4, 6, 8]

plt.plot(x, y)
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.title('Line Plot')
plt.show()

یه مثال بیشتر 1:

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [1, 4, 9]
plt.plot(x, y)
plt.title("y = x^2")
plt.show()
حواست باشه: در محیط‌های headless ممکن است نیاز به backend مناسب یا ذخیره فایل به جای show داشته باشید.
۲۷ Seaborn

ایدهٔ اصلی: به زبان ساده، توضیح: Seaborn یک کتابخانه تجسم داده مبتنی بر Matplotlib است. این کتابخانه یک رابط سطح بالاتر و آسان‌تر برای ایجاد گرافیک‌های آموزنده و جذاب فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Seaborn روی Matplotlib ساخته شده و نمودارهای آماری آماده‌تر دارد؛ برای EDA خیلی سریع است.

کِی به درد می‌خوره؟

  • heatmap، boxplot، pairplot و ...
  • بررسی توزیع داده‌ها.
  • نمودارهای آماری با استایل بهتر.

یه مثال سریع:

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
sns.boxplot(x='day', y='total_bill', data=tips)
plt.show()
حواست باشه: Seaborn برای رسم نیاز به matplotlib دارد و معمولاً با DataFrameها خوب کار می‌کند.
۲۸ Plotly

ایدهٔ اصلی: به زبان ساده، توضیح: Plotly یک کتابخانه رسم نمودار است که امکان ایجاد نمودارهای تعاملی و جذاب بصری را فراهم می‌کند. می‌توان از آن برای انواع مختلف نمودارها و تجسم‌ها استفاده کرد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Plotly نمودارهای تعاملی می‌سازد و برای وب/داشبورد عالی است (hover/zoom).

کِی به درد می‌خوره؟

  • داشبوردهای تعاملی.
  • گزارش‌های تعاملی در notebook.
  • نمایش داده برای تصمیم‌گیری.

یه مثال سریع:

import plotly.express as px

iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species")
fig.show()
حواست باشه: اگر نیاز به اپ کامل دارید، Plotly با Dash بسیار رایج است.
۲۹ Bokeh

ایدهٔ اصلی: به زبان ساده، توضیح: Bokeh یک کتابخانه پایتون برای ایجاد تجسم‌های تعاملی مبتنی بر وب است. این کتابخانه ابزارهایی برای تولید گرافیک‌های زیبا و تعاملی که می‌توانند در برنامه‌های وب تعبیه شوند، فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Bokeh هم برای نمودارهای تعاملی وب طراحی شده و خروجی HTML مستقل تولید می‌کند.

کِی به درد می‌خوره؟

  • نمودارهای تعاملی قابل تعبیه در وب.
  • داشبوردهای ساده.
  • ارتباط با جاوااسکریپت.

یه مثال سریع:

from bokeh.plotting import figure, show

p = figure(title="Line Plot Example", x_axis_label='x', y_axis_label='y')
p.line([1, 2, 3], [4, 6, 5], line_width=2)
show(p)
حواست باشه: برای داشبوردهای سریع‌تر، Streamlit هم می‌تواند گزینه خوبی باشد.
۳۰ scikit-learn

ایدهٔ اصلی: به زبان ساده، توضیح: scikit-learn یک کتابخانه محبوب برای یادگیری ماشین است. این کتابخانه ابزارهای ساده و کارآمدی برای داده‌کاوی، تحلیل داده و مدل‌سازی فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، scikit-learn برای ML کلاسیک است: regression, classification, clustering و preprocessing. برای baseline بسیار مناسب است.

کِی به درد می‌خوره؟

  • ساخت مدل‌های کلاسیک سریع.
  • pipelineهای preprocessing + model.
  • cross-validation و ارزیابی مدل.

یه مثال سریع:

from sklearn.linear_model import LinearRegression

X = [[1], [2], [3]]
y = [2, 4, 6]
model = LinearRegression()
model.fit(X, y)

prediction = model.predict([[4]])
print(prediction) # خروجی: تقریب از 8
حواست باشه: برای deep learning معمولاً از TensorFlow یا PyTorch استفاده می‌شود.
۳۱ TensorFlow

ایدهٔ اصلی: به زبان ساده، توضیح: TensorFlow یک چارچوب یادگیری ماشین منبع باز است که توسط گوگل توسعه یافته است. این چارچوب برای ایجاد مدل‌های یادگیری عمیق و سایر وظایف یادگیری ماشین طراحی شده است.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ابزارها برای deep learning هستند. برای مثال‌های واقعی معمولاً به GPU و تنظیمات محیط نیاز دارید.

کِی به درد می‌خوره؟

  • شبکه‌های عصبی برای CV/NLP و ...
  • آموزش مدل‌های بزرگ‌تر با GPU.
  • استقرار مدل‌ها در سرویس‌ها.

یه مثال سریع:

import tensorflow as tf
import numpy as np

# تعریف یک مدل Sequential ساده
model = tf.keras.Sequential([
    tf.keras.layers.Dense(16, activation='relu', input_shape=(10,)),
    tf.keras.layers.Dense(1)
])
# کامپایل مدل
model.compile(optimizer='adam', loss='mse')
# تولید داده‌های ساختگی
data = np.random.random((1000, 10))
labels = np.random.randint(2, size=(1000, 1))
# آموزش مدل
model.fit(data, labels, epochs=10)
حواست باشه: همیشه نسخه‌های سازگار CUDA/cuDNN و کتابخانه را چک کنید.
۳۲ PyTorch

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

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ابزارها برای deep learning هستند. برای مثال‌های واقعی معمولاً به GPU و تنظیمات محیط نیاز دارید.

کِی به درد می‌خوره؟

  • شبکه‌های عصبی برای CV/NLP و ...
  • آموزش مدل‌های بزرگ‌تر با GPU.
  • استقرار مدل‌ها در سرویس‌ها.

یه مثال سریع:

import torch
import torch.nn as nn

# تعریف یک مدل خطی ساده
model = nn.Linear(10, 1)
# ایجاد داده‌های ورودی و خروجی تصادفی
x = torch.randn(1000, 10)
y = torch.randn(1000, 1)
# تعریف تابع هزینه و بهینه‌ساز
loss_fn = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# حلقه آموزش
for t in range(100):
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
حواست باشه: همیشه نسخه‌های سازگار CUDA/cuDNN و کتابخانه را چک کنید.
۳۳ Keras

ایدهٔ اصلی: به زبان ساده، توضیح: Keras یک API سطح بالا برای شبکه‌های عصبی است که قادر به اجرا بر روی TensorFlow، CNTK یا Theano است. این API ساخت، آموزش و استقرار انواع مختلف مدل‌های شبکه عصبی را آسان می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ابزارها برای deep learning هستند. برای مثال‌های واقعی معمولاً به GPU و تنظیمات محیط نیاز دارید.

کِی به درد می‌خوره؟

  • شبکه‌های عصبی برای CV/NLP و ...
  • آموزش مدل‌های بزرگ‌تر با GPU.
  • استقرار مدل‌ها در سرویس‌ها.

یه مثال سریع:

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# تعریف یک مدل Sequential
model = Sequential([
    Dense(16, activation='relu', input_shape=(10,)),
    Dense(1)
])
# کامپایل مدل
model.compile(optimizer='adam', loss='mse')
# تولید داده‌های ساختگی
data = np.random.random((1000, 10))
labels = np.random.randint(2, size=(1000, 1))
# آموزش مدل
model.fit(data, labels, epochs=10)
حواست باشه: همیشه نسخه‌های سازگار CUDA/cuDNN و کتابخانه را چک کنید.
۳۴ معماری‌های شبکه عصبی (Neural Network Architectures)

ایدهٔ اصلی: به زبان ساده، توضیح: معماری‌های شبکه عصبی به طراحی و سازماندهی لایه‌ها در یک شبکه عصبی اشاره دارد، مانند شبکه‌های عصبی کانولوشنی (CNNs)، شبکه‌های عصبی بازگشتی (RNNs) و شبکه‌های مولد تخاصمی (GANs).

ایدهٔ اصلی: به زبان ساده، مثال کد (CNN با Keras)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۳۵ یادگیری انتقالی (Transfer Learning)

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

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از مدل VGG16 از پیش آموزش‌دیده)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from keras.applications.vgg16 import VGG16
from keras.layers import GlobalAveragePooling2D, Dense
from keras.models import Model

# بارگذاری مدل VGG16 از پیش آموزش‌دیده + لایه‌های سطح بالاتر
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(1, activation='sigmoid')(x)
model = Model(inputs=base_model.input, outputs=predictions)

# ابتدا: فقط لایه‌های بالایی را آموزش دهید (که به طور تصادفی مقداردهی اولیه شده‌اند)
for layer in base_model.layers:
    layer.trainable = False
model.compile(optimizer='adam', loss='binary_crossentropy')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۳۶ یادگیری تقویتی (Reinforcement Learning)

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

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Q-learning)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import numpy as np

# ماتریس انتقال ساختگی (حالت، اقدام) -> حالت بعدی
transition_matrix = [[0, 1], [0, 2], [1, 2]]
# مقداردهی اولیه جدول Q
Q = np.zeros((3, 2))
# فراپارامترها
alpha = 0.1
gamma = 0.9
# حلقه آموزش
for episode in range(1000):
    state = 0
    done = False
    while not done:
        action = np.random.choice([0, 1])
        next_state = transition_matrix[state][action]
        reward = 1 if next_state == 2 else 0
        Q[state, action] = (1 - alpha) * Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state]))
        state = next_state
        if state == 2:
            done = True
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۳۷ پردازش زبان طبیعی (Natural Language Processing - NLP)

ایدهٔ اصلی: به زبان ساده، توضیح: پردازش زبان طبیعی (NLP) شامل کاربرد الگوریتم‌ها برای شناسایی و استخراج قوانین زبان طبیعی به منظور درک، تفسیر و تولید زبان‌های انسانی توسط کامپیوتر است.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از NLTK برای توکن‌سازی)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import nltk
# nltk.download('punkt') # در صورت نیاز
sentence = "Natural Language Processing is fascinating."
tokens = nltk.word_tokenize(sentence)
print(tokens) # خروجی: ['Natural', 'Language', 'Processing', 'is', 'fascinating', '.']
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۳۸ عبارات منظم (Regular Expressions)

ایدهٔ اصلی: به زبان ساده، توضیح: عبارات منظم راهی برای جستجو، تطبیق و دستکاری رشته‌ها با استفاده از الگوها فراهم می‌کنند. آن‌ها ابزاری قدرتمند برای پردازش متن هستند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import re
pattern = r"\d+" # یک یا چند رقم را تطبیق می‌دهد
result = re.findall(pattern, "The year is 2023.")
print(result) # خروجی: ['2023']
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۳۹ محاسبات موازی (Parallel Computing)

ایدهٔ اصلی: به زبان ساده، توضیح: محاسبات موازی اجرای همزمان چندین محاسبه یا فرآیند است. این کار می‌تواند به طور قابل توجهی سرعت محاسبات را افزایش دهد.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از multiprocessing )

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from multiprocessing import Pool

def square_number(n):
    return n * n

numbers = [1, 2, 3, 4]
with Pool() as pool:
    results = pool.map(square_number, numbers)
    print(results) # خروجی: [1, 4, 9, 16]
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۴۰ محاسبات توزیع‌شده (Distributed Computing)

ایدهٔ اصلی: به زبان ساده، توضیح: محاسبات توزیع‌شده شامل همکاری چندین کامپیوتر برای حل یک مسئله محاسباتی است. Apache Spark معمولاً برای پردازش داده‌های توزیع‌شده استفاده می‌شود.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Apache Spark)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

# from pyspark import SparkContext

# sc = SparkContext("local", "Simple App")
# numbers = sc.parallelize([1, 2, 3, 4])
# squares = numbers.map(lambda x: x * x)
# print(squares.collect()) # خروجی: [1, 4, 9, 16]
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۴۱ وب اسکرپینگ (Web Scraping)

ایدهٔ اصلی: به زبان ساده، توضیح: وب اسکرپینگ استخراج داده از وب‌سایت‌ها است. کتابخانه‌هایی مانند BeautifulSoup می‌توانند اسناد HTML و XML را تجزیه کنند و اسکرپ کردن داده‌ها را آسان‌تر کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از BeautifulSoup)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، وب‌اسکرپینگ استخراج داده از وب است. به robots.txt و قوانین سایت احترام بگذارید و نرخ درخواست را محدود کنید.

کِی به درد می‌خوره؟

  • جمع‌آوری داده‌های عمومی برای تحلیل.
  • مانیتورینگ محتوا/قیمت (اگر مجاز باشد).
  • آرشیو کردن اطلاعات.

یه مثال سریع:

from bs4 import BeautifulSoup
import requests

url = "http://example.com"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
title = soup.find('title')
print(title.text) # خروجی: Example Domain
حواست باشه: برای صفحات پویا ممکن است Selenium/Playwright لازم باشد که هزینه و پیچیدگی را بالا می‌برد.
۴۲ یکپارچه‌سازی API (API Integration)

ایدهٔ اصلی: به زبان ساده، توضیح: یکپارچه‌سازی API شامل تعامل با APIها برای بازیابی یا دستکاری داده‌ها است. اکثر APIهای مدرن داده‌ها را در قالب JSON بازمی‌گردانند.

ایدهٔ اصلی: به زبان ساده، مثال کد (درخواست داده JSON)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در کار با APIها، علاوه بر درخواست، مدیریت خطا، timeout، retry و rate limit مهم است.

کِی به درد می‌خوره؟

  • اتصال به سرویس‌های بیرونی.
  • ساخت کلاینت داخلی برای سرویس‌ها.
  • جمع‌آوری داده از API.

یه مثال سریع:

import requests

response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
data = response.json()
print(data['title']) # خروجی: 'delectus aut autem'
حواست باشه: در پروژه واقعی حتماً timeout تنظیم کنید و خطاها را هندل کنید.
۴۳ GraphQL

ایدهٔ اصلی: به زبان ساده، توضیح: GraphQL یک زبان پرس‌وجو و زمان اجرا برای APIها است که اولویت را به دادن دقیقاً داده‌های درخواستی مشتریان و نه بیشتر می‌دهد.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از graphqlclient در پایتون)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

# from graphqlclient import GraphQLClient

# client = GraphQLClient('https://api.graph.cool/simple/v1/swapi')
# result = client.execute('''
# {
#   allPersons {
#     name
#   }
# }
# ''')
# print(result)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۴۴ داکر (Docker)

ایدهٔ اصلی: به زبان ساده، توضیح: داکر پلتفرمی است که برای توسعه، ارسال و اجرای برنامه‌ها در داخل کانتینرها استفاده می‌شود. یک Dockerfile نحوه ساخت کانتینر را تعریف می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد (Dockerfile ساده)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Docker بسته‌بندی برنامه و وابستگی‌ها را استاندارد می‌کند و اجرا را در محیط‌های مختلف یکسان نگه می‌دارد.

کِی به درد می‌خوره؟

  • یکسان‌سازی محیط توسعه.
  • استقرار ساده‌تر در CI/CD.
  • ایزوله کردن وابستگی‌ها.

یه مثال سریع:

FROM python:3.8
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]
حواست باشه: Dockerfile را بهینه بنویسید تا build سریع‌تر و ایمیج کوچک‌تر شود.
۴۵ کوبرنتیز (Kubernetes)

ایدهٔ اصلی: به زبان ساده، توضیح: کوبرنتیز یک سیستم ارکستراسیون برای خودکارسازی استقرار، مقیاس‌بندی و مدیریت برنامه‌های کانتینری است.

ایدهٔ اصلی: به زبان ساده، مثال کد (فایل YAML استقرار کوبرنتیز)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Kubernetes ارکستراسیون کانتینرهاست: مقیاس‌پذیری، self-healing، و استقرار مرحله‌ای.

کِی به درد می‌خوره؟

  • مدیریت سرویس‌ها در مقیاس بالا.
  • rollout/rollback بدون downtime.
  • مدیریت config و secretها.

یه مثال سریع:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image
حواست باشه: برای شروع، مفاهیم Deployment/Service/Ingress را خوب یاد بگیرید.
۴۶ محاسبات بدون سرور (Serverless Computing)

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: محاسبات بدون سرور به شما امکان می‌دهد کد را بدون تأمین یا مدیریت سرورها اجرا کنید. AWS Lambda یک پلتفرم محبوب بدون سرور است.

ایدهٔ اصلی: به زبان ساده، مثال کد (تابع AWS Lambda در پایتون)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۴۷ چارچوب‌های توسعه وب (Web Development Frameworks)

ایدهٔ اصلی: به زبان ساده، توضیح: چارچوب‌های توسعه وب مانند Flask و Django با ارائه الگوهای کد قابل استفاده مجدد به ساخت برنامه‌های وب کمک می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Flask)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۴۸ APIهای RESTful

ایدهٔ اصلی: به زبان ساده، توضیح: APIهای RESTful (Representational State Transfer) امکان تعامل با منابع را از طریق عملیات بدون حالت فراهم می‌کنند. آن‌ها از متدهای استاندارد HTTP مانند GET، POST، PUT، DELETE پیروی می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد (ایجاد یک نقطه پایانی RESTful با Flask)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در کار با APIها، علاوه بر درخواست، مدیریت خطا، timeout، retry و rate limit مهم است.

کِی به درد می‌خوره؟

  • اتصال به سرویس‌های بیرونی.
  • ساخت کلاینت داخلی برای سرویس‌ها.
  • جمع‌آوری داده از API.

یه مثال سریع:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/users/
', methods=['GET'])
def get_user(user_id):
    user = {'id': user_id, 'name': 'Alice'} # داده‌های نمونه
    return jsonify(user)

if __name__ == '__main__':
    app.run()
حواست باشه: در پروژه واقعی حتماً timeout تنظیم کنید و خطاها را هندل کنید.
۴۹ APIهای GraphQL

ایدهٔ اصلی: به زبان ساده، توضیح: APIهای GraphQL یک زبان پرس‌وجوی انعطاف‌پذیر ارائه می‌دهند که به مشتریان امکان می‌دهد دقیقاً داده‌های مورد نیاز خود را درخواست کنند. این می‌تواند منجر به بازیابی کارآمدتر داده‌ها شود.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Graphene با Flask)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در کار با APIها، علاوه بر درخواست، مدیریت خطا، timeout، retry و rate limit مهم است.

کِی به درد می‌خوره؟

  • اتصال به سرویس‌های بیرونی.
  • ساخت کلاینت داخلی برای سرویس‌ها.
  • جمع‌آوری داده از API.

یه مثال سریع:

# from flask import Flask
# from flask_graphql import GraphQLView
# import graphene

# class Query(graphene.ObjectType):
#     hello = graphene.String()
#     def resolve_hello(self, info):
#         return "World"

# app = Flask(__name__)
# app.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql',
# schema=graphene.Schema(query=Query)))
حواست باشه: در پروژه واقعی حتماً timeout تنظیم کنید و خطاها را هندل کنید.
۵۰ ارتباط WebSocket

ایدهٔ اصلی: به زبان ساده، توضیح: WebSocketها کانال‌های ارتباطی تمام‌دوطرفه (full-duplex) را بر روی یک اتصال TCP واحد فراهم می‌کنند و امکان به‌روزرسانی‌های بی‌درنگ بین کلاینت‌ها و سرورها را فراهم می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از WebSocket با Flask-SocketIO)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

# from flask import Flask, render_template
# from flask_socketio import SocketIO

# app = Flask(__name__)
# socketio = SocketIO(app)

# @app.route('/')
# def main():
#     return render_template('index.html')

# @socketio.on('message')
# def handle_message(msg):
#     print('Received message:', msg)

# if __name__ == '__main__':
#     socketio.run(app)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۱ OAuth و احراز هویت

ایدهٔ اصلی: به زبان ساده، توضیح: OAuth یک پروتکل استاندارد برای تفویض دسترسی است که معمولاً به عنوان راهی برای کاربران برای اعطای دسترسی به اطلاعات خود در یک سایت به سایت دیگر استفاده می‌شود.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Flask-OAuthlib)

ایدهٔ اصلی: به زبان ساده، (کد ارائه شده در تصویر یک مثال کامل برای این بخش است.)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۲ امنیت API (API Security)

ایدهٔ اصلی: به زبان ساده، توضیح: امنیت API شامل پیاده‌سازی اقداماتی برای ایمن‌سازی APIها در برابر دسترسی غیرمجاز و حملات است. تکنیک‌ها شامل احراز هویت مبتنی بر توکن، رمزگذاری و موارد دیگر است.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از Flask-JWT برای احراز هویت توکن)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، در کار با APIها، علاوه بر درخواست، مدیریت خطا، timeout، retry و rate limit مهم است.

کِی به درد می‌خوره؟

  • اتصال به سرویس‌های بیرونی.
  • ساخت کلاینت داخلی برای سرویس‌ها.
  • جمع‌آوری داده از API.

یه مثال سریع:

# from flask import Flask, jsonify, request
# from flask_jwt import JWT, jwt_required

# app = Flask(__name__)
# app.config['SECRET_KEY'] = 'super-secret'

# def authenticate(username, password):
#     # اعتبارسنجی کاربر
#     return {'id': 1, 'username': 'user'}

# def identity(payload):
#     return {'id': 1, 'username': 'user'}

# jwt = JWT(app, authenticate, identity)

# @app.route('/protected')
# @jwt_required()
# def protected():
#     return jsonify({'message': 'This is a protected view.'})
حواست باشه: در پروژه واقعی حتماً timeout تنظیم کنید و خطاها را هندل کنید.
۵۳ SQLAlchemy

ایدهٔ اصلی: به زبان ساده، توضیح: SQLAlchemy یک جعبه ابزار SQL و کتابخانه نگاشت شیء-رابطه‌ای (ORM) برای پایتون است. این کتابخانه امکان تعامل با پایگاه‌های داده رابطه‌ای را به روشی شیءگرا فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

engine = create_engine('sqlite:///users.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
new_user = User(name='Alice')
session.add(new_user)
session.commit()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۴ پایگاه‌های داده NoSQL

ایدهٔ اصلی: به زبان ساده، توضیح: پایگاه‌های داده NoSQL داده‌ها را در قالب‌های غیرجدولی مانند زوج‌های کلید-مقدار، اسناد، گراف‌ها یا فروشگاه‌های ستون-گسترده ذخیره می‌کنند. آن‌ها می‌توانند مقیاس‌پذیری و عملکرد بهتری را برای برخی از انواع داده‌ها ارائه دهند.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از MongoDB با PyMongo)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['test_database']
collection = db['test_collection']
data = {'name': 'Alice', 'age': 30}
collection.insert_one(data)
for item in collection.find():
    print(item)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۵ چندنخی (Multithreading)

ایدهٔ اصلی: به زبان ساده، توضیح: چندنخی شامل اجرای همزمان چندین نخ در یک فرآیند واحد است. این امکان اجرای کارآمد وظایف را، به ویژه برای کدهای وابسته به ورودی/خروجی یا کدهای شبکه ساختاریافته سطح بالا، فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از ماژول threading )

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import threading

def print_numbers():
    for i in range(10):
        print(i)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۶ چندپردازشی (Multiprocessing)

ایدهٔ اصلی: به زبان ساده، توضیح: چندپردازشی شامل اجرای همزمان چندین فرآیند است. برخلاف نخ‌ها، فرآیندها فضای حافظه را به اشتراک نمی‌گذارند. این می‌تواند برای وظایف وابسته به CPU مناسب‌تر باشد.

ایدهٔ اصلی: به زبان ساده، مثال کد (استفاده از ماژول multiprocessing )

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from multiprocessing import Process

def print_numbers():
    for i in range(10):
        print(i)

process1 = Process(target=print_numbers)
process2 = Process(target=print_numbers)
process1.start()
process2.start()
process1.join()
process2.join()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۵۷ دکوراتورها (Decorators)

ایدهٔ اصلی: به زبان ساده، توضیح: دکوراتورها راهی برای تغییر یا بهبود توابع در پایتون بدون تغییر کد آن‌ها هستند. آن‌ها اغلب برای لاگ‌گیری، اعمال کنترل دسترسی، ابزار دقیق، کش کردن و غیره استفاده می‌شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

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

کِی به درد می‌خوره؟

  • Timing و profiling سریع توابع.
  • Authorization و validation.
  • Caching با `functools.lru_cache` یا دکوراتورهای سفارشی.

یه مثال سریع:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

یه مثال بیشتر 1:

import time
from functools import wraps

def timing(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} took {end - start:.6f}s")
        return result
    return wrapper

@timing
def work():
    return sum(range(100000))

work()
حواست باشه: داخل دکوراتور از `functools.wraps` استفاده کنید تا نام و docstring تابع اصلی حفظ شود.
۵۸ لاگ‌گیری (Logging)

ایدهٔ اصلی: به زبان ساده، توضیح: لاگ‌گیری فرآیند ثبت پیام‌ها برای درک جریان یک برنامه و تشخیص مشکلات است. ماژول لاگ‌گیری داخلی پایتون راهی انعطاف‌پذیر برای پیکربندی و تولید پیام‌های لاگ فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، logging جایگزین print در پروژه‌هاست و امکان سطح‌بندی و خروجی‌های مختلف را فراهم می‌کند.

کِی به درد می‌خوره؟

  • ثبت رویدادها برای مانیتورینگ.
  • دیباگ در production با سطح‌های مختلف.
  • ارسال لاگ به فایل/سیستم مرکزی.

یه مثال سریع:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("This is an info message")
logger.warning("This is a warning message")

یه مثال بیشتر 1:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("app")
logger.info("Hello log!")
حواست باشه: برای production معمولاً format استاندارد و handlerهای مناسب نیاز است.
۵۹ مدیریت بسته (pip)

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: pip نصب‌کننده بسته برای پایتون است. این به شما امکان می‌دهد بسته‌های اضافی را که بخشی از کتابخانه استاندارد پایتون نیستند، نصب و مدیریت کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، بهتر است وابستگی‌ها را در محیط مجازی نصب کنید و نسخه‌ها را در فایل requirements یا ابزارهایی مثل Poetry مدیریت کنید.

کِی به درد می‌خوره؟

  • نصب وابستگی‌ها در CI.
  • قفل کردن نسخه‌ها برای جلوگیری از ناسازگاری.
  • مدیریت توسعه/تولید.

یه مثال سریع:

pip install requests
حواست باشه: برای بازتولید دقیق محیط، pin کردن نسخه‌ها مهم است.
۶۰ عملگر Walrus

ایدهٔ اصلی: به زبان ساده، توضیح: عملگر walrus ( := ) که در پایتون ۳.۸ معرفی شد، به شما امکان می‌دهد مقداری را به عنوان بخشی از یک عبارت به یک متغیر اختصاص دهید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

if (n := len([1, 2, 3])) > 2:
    print(f"List has {n} elements.")
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۱ ماژول dis

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: ماژول dis در پایتون به شما امکان می‌دهد بایت‌کد پایتون را دیس‌اسمبل کنید، که می‌تواند برای درک جزئیات سطح پایین مفید باشد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import dis

def my_function():
    a = 10
    b = 20
    return a + b

dis.dis(my_function)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۲ functools.lru_cache

ایدهٔ اصلی: به زبان ساده، توضیح: دکوراتور functools.lru_cache نتایج فراخوانی‌های تابع را کش می‌کند و راهی ساده برای سرعت بخشیدن به توابعی که نتایج یکسانی را به طور مکرر محاسبه می‌کنند، فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from functools import lru_cache

@lru_cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۳ عبارت else در حلقه‌ها

ایدهٔ اصلی: به زبان ساده، توضیح: یک عبارت else بعد از یک حلقه (for/while) در صورتی اجرا می‌شود که حلقه به طور عادی به پایان برسد (یعنی بدون برخورد با عبارت break ).

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

for i in range(3):
    print(i)
else:
    print("Loop finished without break.")
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۴ باز کردن پارامتر تابع (Function Parameter Unpacking)

ایدهٔ اصلی: به زبان ساده، توضیح: می‌توانید از ستاره ( * ) برای باز کردن لیست‌ها/تاپل‌ها و از دو ستاره ( ** ) برای باز کردن دیکشنری‌ها هنگام فراخوانی یک تابع استفاده کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، Unpacking یعنی عناصر یک iterable (مثل list/tuple) را به چند متغیر جداگانه نسبت دهید. در پایتون امکان «باز کردن توسعه‌یافته» با `*` هم وجود دارد.

کِی به درد می‌خوره؟

  • وقتی می‌خواهید خروجی چندتایی یک تابع را به چند متغیر بدهید.
  • وقتی می‌خواهید ابتدا/انتها را جدا و وسط را به صورت لیست نگه دارید.
  • برای خواناتر کردن کد هنگام کار با داده‌های ساختاریافته.

یه مثال سریع:

def function(a, b, c):
    return a + b + c

args = [1, 2, 3]
print(function(*args)) # خروجی: 6

یه مثال بیشتر 1:

numbers = [10, 20, 30, 40, 50]
first, *middle, last = numbers
print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50
حواست باشه: از `*rest` فقط یک‌بار در سمت چپ می‌توانید استفاده کنید.
۶۵ ماژول ast

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول درخت نحو انتزاعی (Abstract Syntax Tree - ast ) در پایتون به شما امکان می‌دهد با کد منبع پایتون به صورت برنامه‌نویسی تعامل داشته باشید، مانند تحلیل، تغییر یا حتی تولید کد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import ast

source_code = 'a = 5 + 2'
parsed_code = ast.parse(source_code)
print(ast.dump(parsed_code))
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۶ contextlib.suppress

ایدهٔ اصلی: به زبان ساده، توضیح: contextlib.suppress یک مدیر زمینه است که استثناهای مشخص شده را در صورت وقوع در داخل بلوک سرکوب می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from contextlib import suppress

with suppress(ZeroDivisionError):
    result = 1 / 0
print("Code continues without raising an exception.")
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۷ سربارگذاری عملگر (Operator Overloading)

ایدهٔ اصلی: به زبان ساده، توضیح: پایتون به کلاس‌ها اجازه می‌دهد تا با پیاده‌سازی متدهای ویژه (مانند __add__ ، __mul__ ) رفتار سفارشی برای عملگرها تعریف کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۸ ماژول array

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول array یک ساختار داده دنباله‌ای تعریف می‌کند که شبیه به لیست است اما عناصری از همان نوع را به روشی کارآمدتر از نظر حافظه ذخیره می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from array import array

arr = array('d', [1.0, 2.5, 3.1])
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۶۹ مانکی پچینگ (Monkey Patching)

ایدهٔ اصلی: به زبان ساده، توضیح: مانکی پچینگ شامل تغییر یا گسترش کلاس‌ها یا ماژول‌های دیگر در زمان اجرا است، معمولاً برای اشکال‌زدایی یا بهبود عملکرد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

class SomeClass:
    def greet(self):
        return "Hello!"

def new_greet(self):
    return "Hello (patched)!"

obj = SomeClass()
print(obj.greet())  # Hello

# مونکی‌پچ: جایگزینی متد در زمان اجرا
SomeClass.greet = new_greet

print(obj.greet())  # Hello (patched)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۰ مولدها با yield from

ایدهٔ اصلی: به زبان ساده، توضیح: با استفاده از yield from ، می‌توانید بخشی از عملیات یک مولد را به مولد دیگری واگذار کنید و کد را ساده‌تر کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

def chain(*iterables):
    for iterable in iterables:
        yield from iterable

result = list(chain([1, 2], [3, 4])) # خروجی: [1, 2, 3, 4]
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۱ ماژول shutil

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول shutil توابعی برای انجام عملیات فایل سطح بالا مانند کپی یا انتقال فایل‌ها و دایرکتوری‌ها فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import shutil

shutil.copyfile('source.txt', 'destination.txt')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۲ collections.Counter

ایدهٔ اصلی: به زبان ساده، توضیح: collections.Counter یک زیرکلاس از دیکشنری برای شمارش اشیاء قابل هش (hashable) است.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `collections.Counter` برای شمارش فراوانی آیتم‌ها ساخته شده و امکاناتی مثل `most_common` دارد.

کِی به درد می‌خوره؟

  • شمارش کلمات/حروف/آیتم‌ها.
  • یافتن پرتکرارترین‌ها.
  • ساخت آمار سریع بدون حلقه‌نویسی زیاد.

یه مثال سریع:

from collections import Counter

count = Counter(['a', 'b', 'c', 'a', 'b', 'b'])
print(count) # خروجی: Counter({'b': 3, 'a': 2, 'c': 1})

یه مثال بیشتر 1:

from collections import Counter

text = "banana"
c = Counter(text)
print(c.most_common(2))  # [('a', 3), ('n', 2)]
حواست باشه: Counter روی داده‌های hashable کار می‌کند (مثل str, int, tuple).
۷۳ ماژول pathlib

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول pathlib مجموعه‌ای از کلاس‌ها را برای مدیریت مسیرهای سیستم فایل ارائه می‌دهد و راهی شیءگراتر برای کار با مسیرهای فایل فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from pathlib import Path

path = Path('folder/file.txt')
print(path.exists())
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۴ توصیف‌گرها (Descriptors)

ایدهٔ اصلی: به زبان ساده، توضیح: توصیف‌گرها راهی برای سفارشی‌سازی دسترسی به صفات با استفاده از متدهایی مانند __get__ ، __set__ و __delete__ فراهم می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

class Descriptor:
    def __get__(self, instance, owner):
        print("Getting the attribute")

class MyClass:
    attribute = Descriptor()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۵ ماژول heapq

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول heapq توابعی برای پیاده‌سازی هیپ‌ها (صف‌های اولویت) بر اساس لیست‌های معمولی فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import heapq

heap = [3, 1, 4, 1, 5]
heapq.heapify(heap)
print(heapq.heappop(heap)) # خروجی: 1
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۶ عبارات نام‌گذاری شده با _

ایدهٔ اصلی: به زبان ساده، توضیح: در REPL (پوسته تعاملی)، می‌توانید از _ برای دسترسی به نتیجه آخرین عبارت استفاده کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد (در REPL)

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

>>> 5 + 2
7
>>> _ + 3
10
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۷ شمارش‌ها با enum

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول enum راهی برای ایجاد شمارش‌ها (enumerations) تعریف می‌کند، که مجموعه‌ای از نام‌های نمادین متصل به مقادیر ثابت منحصر به فرد هستند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۷۸ محیط‌های مجازی با venv

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول venv پشتیبانی از ایجاد محیط‌های پایتون سبک و ایزوله را فراهم می‌کند، که هر کدام دایرکتوری‌های نصب و وابستگی‌های خود را دارند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، venv محیط مجازی سبک استاندارد پایتون است. وابستگی‌های پروژه را از سیستم جدا می‌کند.

کِی به درد می‌خوره؟

  • جلوگیری از تداخل نسخه‌ها بین پروژه‌ها.
  • راه‌اندازی سریع پروژه روی سیستم جدید.
  • بهبود reproducibility.

یه مثال سریع:

python3 -m venv myenv
حواست باشه: پوشه venv را داخل git قرار ندهید.
۷۹ ماژول queue

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول queue راهی برای ایجاد صف‌های امن در محیط چندنخی (thread-safe) فراهم می‌کند که برای ارتباط ایمن بین نخ‌ها استفاده می‌شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from queue import Queue

q = Queue()
q.put('item')
item = q.get()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۰ ماژول dataclasses

ایدهٔ اصلی: به زبان ساده، توضیح: dataclasses که در پایتون ۳.۷ معرفی شد، یک دکوراتور و توابعی برای افزودن خودکار متدهای ویژه به کلاس‌ها فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۱ توابع بازگشتی (Recursive Functions)

ایدهٔ اصلی: به زبان ساده، توضیح: توابع بازگشتی به عنوان بخشی از اجرای خود، خود را فراخوانی می‌کنند و اغلب برای مسائلی که می‌توانند به زیرمسائل ساده‌تر تقسیم شوند، استفاده می‌شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۲ ماژول itertools

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول itertools مجموعه‌ای از ابزارهای سریع و کارآمد از نظر حافظه برای کار با تکرارکننده‌ها مانند combinations ، permutations و groupby فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `itertools` ابزارهای قدرتمند برای کار با iteratorها می‌دهد. این ابزارها معمولاً lazy هستند و برای پردازش داده‌های بزرگ مناسب‌اند.

کِی به درد می‌خوره؟

  • ساخت ترکیب‌ها (combinations) و جایگشت‌ها (permutations).
  • زنجیره کردن iterableها بدون ساخت لیست جدید.
  • گروه‌بندی داده‌های مرتب‌شده با `groupby`.

یه مثال سریع:

from itertools import combinations

comb = combinations([1, 2, 3], 2)
print(list(comb)) # خروجی: [(1, 2), (1, 3), (2, 3)]

یه مثال بیشتر 1:

import itertools

for comb in itertools.combinations([1, 2, 3, 4], 2):
    print(comb)
حواست باشه: `groupby` فقط عناصر پشت سر هم را گروه می‌کند؛ معمولاً نیاز به sort قبلش دارید.
۸۳ استفاده از locals() و globals()

ایدهٔ اصلی: به زبان ساده، توضیح: تابع locals() یک دیکشنری از فضای نام فعلی را برمی‌گرداند و globals() یک دیکشنری از فضای نام سراسری را برمی‌گرداند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `globals()` و `locals()` دیکشنری فضای نام را می‌دهند. برای دیباگ و کارهای پویا مفیدند، ولی استفاده زیاد در کدهای معمولی توصیه نمی‌شود.

کِی به درد می‌خوره؟

  • دیباگ و مشاهده متغیرهای موجود.
  • نوشتن ابزارهای آموزشی/تحلیلی.
  • پیاده‌سازی سیستم‌های پویا با طراحی مناسب.

یه مثال سریع:

def my_function():
    x = 10
    print(locals())

my_function() # خروجی: {'x': 10}

یه مثال بیشتر 1:

x = 1
def demo():
    y = 2
    print("locals:", locals())
    print("x in globals:", "x" in globals())
demo()
حواست باشه: تغییر دادن locals معمولاً رفتار قابل اعتمادی ندارد؛ با احتیاط استفاده کنید.
۸۴ کوروتین‌ها با yield

ایدهٔ اصلی: به زبان ساده، توضیح: کوروتین‌ها شکل کلی‌تری از زیرروال‌ها هستند. می‌توان با استفاده از کلمه کلیدی yield در نقاط مختلف وارد، خارج و از سر گرفته شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

def my_coroutine():
    while True:
        received = yield
        print('Received:', received)

coro = my_coroutine()
next(coro)
coro.send(42) # خروجی: Received: 42
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۵ zip_longest از itertools

ایدهٔ اصلی: به زبان ساده، توضیح: zip_longest تکرارپذیرهای ورودی را zip می‌کند و مقادیر گمشده را با یک مقدار پرکننده مشخص پر می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، `itertools` ابزارهای قدرتمند برای کار با iteratorها می‌دهد. این ابزارها معمولاً lazy هستند و برای پردازش داده‌های بزرگ مناسب‌اند.

کِی به درد می‌خوره؟

  • ساخت ترکیب‌ها (combinations) و جایگشت‌ها (permutations).
  • زنجیره کردن iterableها بدون ساخت لیست جدید.
  • گروه‌بندی داده‌های مرتب‌شده با `groupby`.

یه مثال سریع:

from itertools import zip_longest

result = zip_longest([1, 2], [3, 4, 5], fillvalue=0)
print(list(result)) # خروجی: [(1, 3), (2, 4), (0, 5)]

یه مثال بیشتر 1:

import itertools

for comb in itertools.combinations([1, 2, 3, 4], 2):
    print(comb)
حواست باشه: `groupby` فقط عناصر پشت سر هم را گروه می‌کند؛ معمولاً نیاز به sort قبلش دارید.
۸۶ unittest.mock

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: unittest.mock ابزارهایی برای شبیه‌سازی (mocking) اشیاء در تست‌های واحد فراهم می‌کند و به شما امکان می‌دهد بخش‌هایی از سیستم تحت تست خود را با اشیاء شبیه‌سازی شده جایگزین کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from unittest.mock import MagicMock

mock = MagicMock(return_value=42)
print(mock()) # خروجی: 42
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۷ چندنخی با ماژول threading

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول threading برنامه‌نویسی همزمان را با استفاده از نخ‌ها امکان‌پذیر می‌سازد و اجازه می‌دهد چندین عملیات به طور همزمان اجرا شوند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import threading

def print_numbers():
    for i in range(5):
        print(i)

thread = threading.Thread(target=print_numbers)
thread.start()
thread.join()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۸ صفت __slots__

ایدهٔ اصلی: به زبان ساده، توضیح: __slots__ صفتی است که می‌توانید به یک کلاس اضافه کنید تا با جلوگیری از ایجاد پویای صفات، در حافظه صرفه‌جویی کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

class MyClass:
    __slots__ = ['name', 'age']
    def __init__(self, name, age):
        self.name = name
        self.age = age
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۸۹ عملگرهای بیتی (Bitwise Operators)

ایدهٔ اصلی: به زبان ساده، توضیح: عملگرهای بیتی امکان دستکاری بیت‌های منفرد در یک عدد صحیح را فراهم می‌کنند، مانند AND بیتی ( & )، OR ( | ) و XOR ( ^ ).

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

x = 5 # باینری: 101
y = 3 # باینری: 011
print(x & y) # خروجی: 1 (باینری: 001)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۰ ماژول‌های bz2 و gzip

ایدهٔ اصلی: به زبان ساده، توضیح: این ماژول‌ها ابزارهایی برای کار با فایل‌های فشرده با استفاده از فرمت‌های فایل bzip2 و gzip فراهم می‌کنند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import bz2

content = b"Compress this content"
compressed_content = bz2.compress(content)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۱ اشیاء memoryview

ایدهٔ اصلی: به زبان ساده، توضیح: memoryview به شما دسترسی به حافظه مشترک داده‌ها را بدون کپی کردن آن می‌دهد و امکان دستکاری کارآمد مجموعه‌های داده بزرگ را فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

data = bytearray(b"Hello, world!")
view = memoryview(data)
chunk = view[7:13]
print(bytes(chunk)) # خروجی: b'world!'
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۲ زنجیره‌سازی استثنا (Exception Chaining)

ایدهٔ اصلی: به زبان ساده، توضیح: در پایتون ۳، می‌توانید از کلمه کلیدی from برای زنجیره‌سازی استثناها استفاده کنید، که به درک رابطه علت و معلولی بین استثناها کمک می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

try:
    int("not_a_number")
except ValueError as e:
    raise TypeError("Something went wrong") from e
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۳ هشدارهای منسوخ شدن با warnings

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول warnings به شما امکان می‌دهد به کاربران در مورد تغییرات در کد یا منسوخ شدن‌ها هشدار دهید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import warnings

def old_function():
    warnings.warn("This function is deprecated", DeprecationWarning)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۴ متغیرهای زمینه با contextvars

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول contextvars متغیرهای زمینه را فراهم می‌کند، که متغیرهایی هستند که بسته به زمینه خود مقادیر متفاوتی دارند، مانند درون نخ‌ها یا وظایف ناهمگام مختلف.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

from contextvars import ContextVar

var = ContextVar('var', default='default value')
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۵ متد as_integer_ratio

ایدهٔ اصلی: به زبان ساده، توضیح: اشیاء float متدی به نام as_integer_ratio دارند که یک جفت عدد صحیح را برمی‌گرداند که عدد ممیز شناور را به صورت یک کسر نشان می‌دهد.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

x = 0.75
print(x.as_integer_ratio()) # خروجی: (3, 4)
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۶ ماژول cmd برای برنامه‌های CLI

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول cmd یک چارچوب ساده برای ساخت رابط‌های خط فرمان (CLI) فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import cmd

class MyShell(cmd.Cmd):
    def do_greet(self, line):
        print("Hello, World!")

shell = MyShell()
shell.cmdloop()
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۷ دکوراتورهای Property

ایدهٔ اصلی: به زبان ساده، می‌توانید توضیح: دکوراتورهای Property ( @property ، @ .setter و @ .deleter ) به شما امکان می‌دهند صفات یک کلاس را از طریق متدها مدیریت کنید.

ایدهٔ اصلی: به زبان ساده، مثال کد.

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

کِی به درد می‌خوره؟

  • Timing و profiling سریع توابع.
  • Authorization و validation.
  • Caching با `functools.lru_cache` یا دکوراتورهای سفارشی.

یه مثال سریع:

class Person:
    def __init__(self, name):
        self._name = name
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, value):
        self._name = value

یه مثال بیشتر 1:

import time
from functools import wraps

def timing(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} took {end - start:.6f}s")
        return result
    return wrapper

@timing
def work():
    return sum(range(100000))

work()
حواست باشه: داخل دکوراتور از `functools.wraps` استفاده کنید تا نام و docstring تابع اصلی حفظ شود.
۹۸ ماژول codecs

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول codecs توابعی برای رمزگذاری و رمزگشایی داده‌ها، از جمله مدیریت رمزگذاری‌های مختلف متن، فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، این ترفند یکی از قابلیت‌های کاربردی پایتون است که معمولاً برای کوتاه‌تر شدن کد و افزایش خوانایی استفاده می‌شود. بهتر است همیشه بین «کوتاه‌نویسی» و «خوانایی برای تیم» تعادل برقرار کنید.

کِی به درد می‌خوره؟

  • کاهش کد تکراری و ساده‌تر شدن پیاده‌سازی.
  • افزایش خوانایی با استفاده از امکانات استاندارد زبان.
  • نوشتن کد قابل نگهداری‌تر و تمیزتر.

یه مثال سریع:

import codecs

encoded = codecs.encode('text', 'base64')
print(encoded) # خروجی: b'dGV4dA==\n'
حواست باشه: اگر این ترفند باعث گیج شدن خواننده کد می‌شود، نسخهٔ ساده‌تر (ولی واضح‌تر) را ترجیح بدهید.
۹۹ اصطلاح __main__ پایتون

ایدهٔ اصلی: به زبان ساده، توضیح: اصطلاح if __name__ == "__main__" به شما امکان می‌دهد کدی بنویسید که هم توسط برنامه‌های دیگر از طریق import قابل استفاده باشد و هم به صورت مستقل اجرا شود.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، الگوی `if __name__ == '__main__':` باعث می‌شود فایل هم قابل import باشد و هم وقتی مستقیم اجرا شد، بخش main اجرا شود.

کِی به درد می‌خوره؟

  • نوشتن ماژول قابل reuse.
  • جلوگیری از اجرای ناخواسته کد هنگام import.
  • ساخت CLI ساده در یک فایل.

یه مثال سریع:

def main():
    print("This script is running standalone")

if __name__ == "__main__":
    main()

یه مثال بیشتر 1:

def main():
    print("Run as script")

if __name__ == "__main__":
    main()
حواست باشه: در پروژه‌های بزرگ‌تر، entrypointها را می‌توانید در `pyproject.toml` یا setup تعریف کنید.
۱۰۰ ماژول inspect

ایدهٔ اصلی: به زبان ساده، توضیح: ماژول inspect چندین تابع مفید برای به دست آوردن اطلاعات در مورد اشیاء زنده مانند ماژول‌ها، کلاس‌ها، متدها و غیره فراهم می‌کند.

ایدهٔ اصلی: به زبان ساده، مثال کد.

یه کم بیشتر: اگر بخواهیم دقیق‌تر بگوییم، ماژول `inspect` برای introspection است: امضای توابع، سورس کد، ماژول‌ها و ...

کِی به درد می‌خوره؟

  • دیباگ و ابزارسازی.
  • نوشتن decoratorهایی که امضا مهم است.
  • ساخت سیستم‌های plugin و مستندسازی خودکار.

یه مثال سریع:

import inspect

def my_function():
    pass

print(inspect.isfunction(my_function)) # خروجی: True

یه مثال بیشتر 1:

import inspect

def add(a, b=1):
    return a + b

print(inspect.signature(add))  # (a, b=1)
حواست باشه: برای برخی آبجکت‌ها (به‌خصوص built-inهای C)، getsource ممکن است کار نکند.

عنوان

متن پیام در اینجا قرار میگیرد

کانون دانه کار
هر آنچه نیاز دارید همین‌جاست
ورود یا ثبت‌نام