تابع reduce
در پایتون، ماژول functools دسترسی به قابلیتهای تابعی (Functional Programming) زبان را فراهم میکند. یکی از توابع مهم و کاربردی این ماژول، تابع reduce است که با اعمال متوالی یک تابع مشخص روی عناصر یک مجموعه داده، آن مجموعه را به یک مقدار نهایی کاهش میدهد و نتایج میانی را در طول فرآیند حفظ میکند.
بهعنوان مثال، میتوان عملکرد reduce را در ضرب متوالی اعداد مشاهده کرد:
ابتدا عدد 1 در 2 ضرب میشود، سپس حاصل بهدستآمده در 3 ضرب میگردد و این روند به همین شکل ادامه پیدا میکند.
#python #functools
✔️ حذف None و مقادیر تکراری با حفظ ترتیب در پایتون
در بسیاری از سناریوهای واقعی (دیتاپروسسینگ، لاگها، ورودی کاربر)،
علاوه بر حذف مقادیر تکراری و None، حفظ ترتیب عناصر هم اهمیت دارد.
در این حالت استفاده از set مناسب نیست، چون ترتیب را از بین میبرد.
راهحل تمیز و پایتونیک، استفاده از dict.fromkeys است:
data = [1, 2, None, 3, 2, None, 4, 1]
clean_data = list(dict.fromkeys(x for x in data if x is not None))
print(clean_data)
📌 خروجی:
[1, 2, 3, 4]
🔍 مزایا
. ترتیب لیست حفظ میشود
. بدون حلقهی دستی
. مناسب پیشپردازش دیتا
⚠️ نکته:
این روش از پایتون 3.7 به بعد کاملاً قابل اعتماد است (ترتیب دیکشنری حفظ میشود).
#fromkeys | #dict | #list | #none | @LearnPythonIcy
✔️ گروهبندی آیتمها در پایتون با defaultdict
در بسیاری از سناریوهای واقعی
(دیتاپروسسینگ، گزارشگیری، لاگها، دستهبندی دادهها)،
نیاز داریم آیتمها را بر اساس یک کلید مشخص گروهبندی کنیم.
روشهای معمول با if و in کد را شلوغ میکنند.
راهحل پایتونیک و تمیز: استفاده از defaultdict.
from collections import defaultdict
data = [
("apple", "fruit"),
("carrot", "vegetable"),
("banana", "fruit"),
("spinach", "vegetable"),
]
grouped = defaultdict(list)
for item, category in data:
grouped[category].append(item)
print(dict(grouped))
📌 خروجی:
{
'fruit': ['apple', 'banana'],
'vegetable': ['carrot', 'spinach']
}
🔍 مزایا
کد خوانا و کوتاه
بدون نیاز به چککردن وجود کلید
مناسب برای دستهبندی دیتا و گزارشها
⚠️ نکته: defaultdict مقدار پیشفرض میسازد،
پس اگر نوع داده اشتباه انتخاب شود، ممکن است باگ پنهان ایجاد کند.
#defaultdict | #collections | #python | #dataprocessing | @LearnPythonIcy☄ دقت در محاسبات عددی (Floating vs Decimal vs Fraction)
در اغلب زبانهای برنامهنویسی، اعداد اعشاری از نوع Floating-point بهصورت دودویی در حافظه ذخیره میشوند.
این یعنی در بسیاری از محاسبات، با مقادیر تقریبی سروکار داریم، نه عدد دقیق.
برای افزایش دقت:
میتوان از Decimal استفاده کرد که خطای اعشاری را تا حد زیادی کاهش میدهد،
اما حتی Decimal هم در برخی سناریوهای خاص کاملاً بینقص نیست.
📌 وقتی دقت ۱۰۰٪ اهمیت دارد (مثل محاسبات مالی، آماری یا ریاضی دقیق)،
بهترین انتخاب Fraction است.
که Fraction عدد را بهصورت کسر منطقی (صورت/مخرج) ذخیره میکند، نه اعشار تقریبی؛
در نتیجه محاسبات:
. دقیق
. قابل پیشبینی
. بدون خطای اعشاری
انجام میشوند.
✅ خلاصهی انتخاب
float → سریع ولی تقریبی
Decimal → دقیقتر، مناسب محاسبات حساس
Fraction → دقیقترین گزینه برای محاسبات ایدهآل
🧪 مثال
from decimal import Decimal
from fractions import Fraction
# float
print(0.1 + 0.2)
# خروجی: 0.30000000000000004
# Decimal
print(Decimal("0.1") + Decimal("0.2"))
# خروجی: 0.3
# Fraction
print(Fraction(1, 10) + Fraction(2, 10))
# خروجی: 3/10📌 نکته مهم: float بهخاطر نمایش دودویی دچار خطا میشود. Decimal باید با رشته (string) ساخته شود. Fraction نتیجه را دقیق و بدون خطا نگه میدارد #numbers | #precision | #FloatingPoint | #Decimal | #Fraction | @Learnpythonicy
➿ کار با فایلهای YAML در Python با کتابخانه PyYAML
کتابخانه PyYAML امکان کار آسان و مؤثر با فایلهای YAML (YAML Ain’t Markup Language) را فراهم میکند. این فرمت معمولاً برای پیکربندیها، تنظیمات و تبادل دادههای ساختاریافته استفاده میشود.
import yaml
# دادهای که میخواهیم در فایل ذخیره کنیم
data_to_write = {'name': 'علی', 'age': 25, 'city': 'تهران'}
# نوشتن داده در فایل YAML
with open('example.yaml', 'w') as file:
yaml.dump(data_to_write, file, default_flow_style=False)
# خواندن داده از فایل YAML
with open('example.yaml', 'r') as file:
loaded_data = yaml.safe_load(file)
print(f"دادههای بارگذاری شده: {loaded_data}")
خروجی فایل example.yaml:
age: 25
city: تهران
name: علی
در این مثال، ما دیکشنری data_to_write را در فایل example.yaml ذخیره کرده و سپس دادهها را دوباره در متغیر loaded_data بارگذاری میکنیم.
کتابخانه PyYAML ابزار ساده و خوانایی برای کار با دادههای YAML در Python فراهم میکند. چه برای ذخیره پیکربندیها، چه تبادل دادههای ساختاریافته، PyYAML باعث میشود کد شما خوانا و آسان برای استفاده باشد. 🙂↔️
#yaml | #pyyaml | @learnpythonicyاین تست واقعاً ذهن آدمو درگیر میکنه 😈
اول فکر کن خروجی این کد چیه؟ 🤯 و بعد توضیحات و بخون!
❓چرا
- خط ۲: append روی لیست مشترک، همه رو [1] میکنه
- خط ۳: x[1] + [2] یه لیست جدیــد میسازه و به x[1] نسبت داده میشه ← دیگه با بقیه مشترک نیست، میشه [2]
- خط ۴: extend روی لیست مشترک (که هنوز x[0] و x[2] بهش وصله) عدد ۳ رو اضافه میکنه ← هر دو میشن [1, 3]
🔥نکته تستیِ پست
عملگر + همیشه یه لیست جدید میسازه، در حالی که append و extend روی لیست موجود تغییر اعمال میکنند!
Output: [[1, 3], [2], [1, 3]]
🎯 سوال
اگه به جای x[1] = x[1] + [2] مینوشتیم x[1].append(2) چی میشد؟ 🤔👇
#تست_تایم | @learnpythonicy
➿ کار با فایلهای YAML در Python با کتابخانه PyYAML
کتابخانه PyYAML امکان کار آسان و مؤثر با فایلهای YAML (YAML Ain’t Markup Language) را فراهم میکند. این فرمت معمولاً برای پیکربندیها، تنظیمات و تبادل دادههای ساختاریافته استفاده میشود.
import yaml
# دادهای که میخواهیم در فایل ذخیره کنیم
data_to_write = {'name': 'علی', 'age': 25, 'city': 'تهران'}
# نوشتن داده در فایل YAML
with open('example.yaml', 'w') as file:
yaml.dump(data_to_write, file, default_flow_style=False)
# خواندن داده از فایل YAML
with open('example.yaml', 'r') as file:
loaded_data = yaml.safe_load(file)
print(f"دادههای بارگذاری شده: {loaded_data}")
خروجی فایل example.yaml:
age: 25
city: تهران
name: علی
در این مثال، ما دیکشنری data_to_write را در فایل example.yaml ذخیره کرده و سپس دادهها را دوباره در متغیر loaded_data بارگذاری میکنیم.
کتابخانه PyYAML ابزار ساده و خوانایی برای کار با دادههای YAML در Python فراهم میکند. چه برای ذخیره پیکربندیها، چه تبادل دادههای ساختاریافته، PyYAML باعث میشود کد شما خوانا و آسان برای استفاده باشد. 🙂↔️
#yaml | #pyyaml | @learnpythonicy
✔️ مدیریت فایلها در پایتون با ۷ روش حرفهای!
برای کار با فایلها در پایتون، این تکنیکهای کاربردی را امتحان کنید:
1️⃣ باز کردن و خواندن فایل
with open('file.txt', 'r') as f:
content = f.read()
print(content)
2️⃣ نوشتن در فایل
with open('file.txt', 'w') as f:
f.write("سلام دنیا!")
3️⃣ افزودن به فایل
with open('file.txt', 'a') as f:
f.write("\nخط جدید")
4️⃣ خواندن خط به خط
with open('file.txt', 'r') as f:
for line in f:
print(line.strip())
5️⃣ بررسی وجود فایل
import os print(os.path.exists('file.txt')) # True یا False6️⃣ حذف فایل
import os os.remove('file.txt')7️⃣ مدیریت مسیرها با pathlib
from pathlib import Path
path = Path('file.txt')
print(path.exists())
print(path.read_text())
🗝 روش ویژه: خواندن و نوشتن فایلهای CSV با pandas
import pandas as pd df = pd.read_csv('data.csv') print(df.head()) df.to_csv('output.csv', index=False)نکات طلایی * همیشه از
withبرای مدیریت فایل استفاده کنید * برای مسیرهای پیچیده از
pathlibکمک بگیرید * برای دادههای جدولی از
pandasبهره ببرید #PythonMagic | #FileHandling | #pathlib | #pandas | @learnpythonic > *برای ذخیرهسازی، تحلیل داده و اتوماسیون کاربرد دارد*
✔️ کار با لیستها در پایتون با ۷ روش حرفهای!
برای مدیریت لیستها و دادههای متوالی، این تکنیکهای کاربردی را امتحان کنید:
1️⃣ ایجاد لیست
fruits = ['apple', 'banana', 'cherry']
print(fruits)
2️⃣ اضافه کردن عنصر
fruits.append('orange')
print(fruits)
3️⃣ درج عنصر در موقعیت خاص
fruits.insert(1, 'kiwi')
print(fruits)
4️⃣ حذف عنصر
fruits.remove('banana')
print(fruits)
5️⃣ دسترسی به عناصر با ایندکس
print(fruits[0]) # اولین عنصر
print(fruits[-1]) # آخرین عنصر
6️⃣ مرتبسازی لیست
numbers = [5, 2, 9, 1]
numbers.sort()
print(numbers)
7️⃣ لیستها با فهم لیست (List Comprehension)
squares = [x**2 for x in range(5)]
print(squares)
🗝 روش ویژه: تبدیل لیست به آرایه NumPy
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr * 2)
نکات طلایی
* برای اضافه و حذف عنصر از
appendو
removeاستفاده کنید * List comprehension کد شما را کوتاه و خواناتر میکند * برای محاسبات عددی بزرگ، لیستها را به
NumPy arrayتبدیل کنید #PythonMagic | #ListHandling | #NumPy | #ListComprehension | @learnpythonicy > *برای ذخیره داده، محاسبات و پردازش اطلاعات کاربرد دارد*
✔️ 10 Python Set Tricks You Should Know! 🐍✨
1️⃣ ساخت Set یکتا از لیست
unique_items = set([1, 2, 2, 3, 4])
2️⃣ افزودن آیتم
my_set.add(5)
3️⃣ حذف آیتم بدون خطا
my_set.discard(10) # Error نمیدهد
4️⃣ اجتماع دو مجموعه (Union)
result = set1 | set2
5️⃣ اشتراک دو مجموعه (Intersection)
common = set1 & set2
6️⃣ تفاضل مجموعهها (Difference)
diff = set1 - set2
7️⃣ بررسی زیرمجموعه بودن
if set1 <= set2:
print("Subset")
8️⃣ حذف آیتم تصادفی
item = my_set.pop()
9️⃣ ساخت Set Comprehension
squares = {x**2 for x in range(5)}
🔟 حذف آیتمهای تکراری از رشته
unique_chars = set("programming")
> ⚠️ ست ها(set) فوقالعاده سریع هستند (O(1) average lookup)، اما ترتیب را حفظ نمیکنند!
#Set | #PythonTricks | #DataStructures | @LearnPythonicy
👇 بیشتر از کدوم عملیات Set در پروژههات استفاده میکنی؟
✔️ 10 Python Async & Concurrency Tricks You Should Know! ⚡🐍
1️⃣ اجرای تابع async
import asyncio
async def main():
print("Hello Async")
asyncio.run(main())
2️⃣ اجرای همزمان چند Task
async def task(n):
await asyncio.sleep(1)
return n
results = await asyncio.gather(task(1), task(2))
3️⃣ ایجاد Task در پسزمینه
task = asyncio.create_task(task(3))
4️⃣ محدود کردن همزمانی با Semaphore
sem = asyncio.Semaphore(3)
async with sem:
await some_io()
5️⃣ Timeout برای جلوگیری از Hang
await asyncio.wait_for(task(1), timeout=2)
6️⃣ اجرای کد Blocking داخل Async
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(None, blocking_func)
7️⃣ استفاده از ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
8️⃣ استفاده از ProcessPool برای CPU-Bound
from concurrent.futures import ProcessPoolExecutor
9️⃣ مدیریت Race Condition با Lock
lock = asyncio.Lock()
async with lock:
shared_resource += 1
🔟 Async HTTP Requests با aiohttp
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get("https://api.example.com") as resp:
data = await resp.json()
> ⚠️ نکته: Async برای I/O-Bound فوقالعاده است، اما برای CPU-Bound از multiprocessing استفاده کن.
#AsyncIO #Concurrency #Backend #Performance #PythonTricks
👇 تو پروژههات بیشتر با I/O-Bound سروکار داری یا CPU-Bound؟