Python3
200 subscribers
100 photos
6 videos
26 files
518 links
🎓 آموزش و پروژه‌های Python
آموزش‌های کاربردی و پروژه‌های عملی Python برای همه سطوح. 🚀
Download Telegram
سری پنجم: گراف‌ها (Graphs) 🕸️
پارت ۶: تمرین و پروژه عملی 🚀

سلام به همه! 🌟 در این پارت، به پیاده‌سازی یک پروژه عملی و حل تمرین‌ها برای تثبیت مفاهیم گراف‌ها خواهیم پرداخت. این تمرینات به شما کمک می‌کند تا مفاهیم یادگرفته شده را به صورت عملی پیاده‌سازی کنید و درک عمیق‌تری از گراف‌ها پیدا کنید.

پروژه عملی: مسیریابی در نقشه 🗺️

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

مراحل پروژه:

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

2. پیاده‌سازی نمایندگی گراف:
- استفاده از لیست مجاورت برای نمایندگی گراف.
- تعریف کلاس برای گراف و اضافه کردن گره‌ها و یال‌ها.


   class Graph:
def __init__(self):
self.graph = {}

def add_vertex(self, vertex):
if vertex not in self.graph:
self.graph[vertex] = {}

def add_edge(self, u, v, weight):
if u not in self.graph:
self.add_vertex(u)
if v not in self.graph:
self.add_vertex(v)
self.graph[u][v] = weight
self.graph[v][u] = weight # برای گراف بدون جهت

3. پیاده‌سازی الگوریتم‌های مسیریابی:
- استفاده از الگوریتم دیکسترا برای یافتن کوتاه‌ترین مسیر بین دو نقطه.
- پیاده‌سازی الگوریتم دیکسترا:


   import heapq

def dijkstra(graph, start):
distances = {vertex: float('infinity') for vertex in graph.graph}
distances[start] = 0
priority_queue = [(0, start)]

while priority_queue:
current_distance, u = heapq.heappop(priority_queue)

if current_distance > distances[u]:
continue

for neighbor, weight in graph.graph[u].items():
distance = current_distance + weight

if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))

return distances

4. اجرای پروژه:
- تعریف گراف با مکان‌ها و مسیرها.
- یافتن کوتاه‌ترین مسیر بین دو نقطه با استفاده از الگوریتم دیکسترا.


   # تعریف گراف
g = Graph()
g.add_edge('A', 'B', 1)
g.add_edge('A', 'C', 4)
g.add_edge('B', 'C', 2)
g.add_edge('B', 'D', 5)
g.add_edge('C', 'D', 1)

# یافتن کوتاه‌ترین مسیر از 'A' به سایر نقاط
distances = dijkstra(g, 'A')
print(distances)

5. نتیجه‌گیری:
- بررسی نتایج و تحلیل عملکرد الگوریتم.
- افزودن قابلیت‌های اضافی مانند نمایش مسیر کوتاه‌تر.


تمرین‌های تکمیلی ✏️

1. مسئله کوتاه‌ترین مسیر:
- پیاده‌سازی الگوریتم فلوید-وارشال برای یافتن همه‌به‌همه مسیرها در گراف.

2. مدیریت شبکه اجتماعی:
- طراحی سیستمی برای مدیریت شبکه اجتماعی با قابلیت‌های جستجو و نمایش روابط بین کاربران با استفاده از گراف.

3. گراف‌های جهت‌دار:
- پیاده‌سازی و تحلیل الگوریتم‌های جستجو و مسیریابی برای گراف‌های جهت‌دار.


با تکمیل این پروژه و تمرین‌ها، درک شما از گراف‌ها و الگوریتم‌های آن‌ها بهبود خواهد یافت. برای هر سوال یا نیاز به راهنمایی بیشتر، خوشحال می‌شویم که کمک کنیم. موفق باشید! 🌟

(برای بیشتر یاد گفتن اینجا کلیک کن)

#گراف #مسیریابی #الگوریتم_دیکسترا #پروژه_عملی #ساختمان_داده #برنامه_نویسی #آموزش_پایتون
سری پنجم از آموزش ساختمان داده (گراف ها)(graphs)☝️☝️
👍1
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۱: معرفی هشینگ و توابع هش 🔢

سلام به همه! 👋 در این پارت از سری آموزش‌ها، به مبحث هشینگ (Hashing) و توابع هش (Hash Functions) خواهیم پرداخت. هشینگ یکی از تکنیک‌های کلیدی در ساختارهای داده‌ای است که کاربردهای زیادی در زمینه‌های مختلف دارد. بیایید با هم این مبحث مهم و کاربردی را بررسی کنیم.

هشینگ چیست؟ 🤔

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

چرا هشینگ اهمیت دارد؟

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

توابع هش چیست؟ 🧮

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

ویژگی‌های یک تابع هش مناسب:

1. سرعت بالا: تابع هش باید سریع باشد تا عملکرد کلی سیستم تحت تاثیر قرار نگیرد.
2. توزیع یکنواخت: یک تابع هش خوب داده‌ها را به طور یکنواخت در فضای خروجی توزیع می‌کند تا از بروز برخوردها جلوگیری کند.
3. تصادفی بودن: خروجی تابع هش باید به گونه‌ای باشد که به سختی بتوان الگوی مشخصی در آن یافت.

مثال‌هایی از توابع هش معروف:

1. تابع هش مدولار (Modulo Hash Function):
- ساده‌ترین و رایج‌ترین نوع تابع هش.
- فرض کنید کلید ما عدد k باشد. تابع هش برابر با k % m است که m اندازه آرایه است.
- مثال: اگر k = 50 و m = 10 باشد، مقدار هش برابر با 50 % 10 = 0 خواهد بود.

2. تابع هش ضربی (Multiplicative Hash Function):
- از یک مقدار ثابت برای ضرب کلید و سپس استفاده از مدولار برای کاهش مقدار استفاده می‌کند.
- این نوع تابع معمولاً توزیع یکنواخت‌تری دارد.

3. توابع هش رمزنگاری (Cryptographic Hash Functions):
- توابعی مثل SHA-256 که در امنیت اطلاعات استفاده می‌شوند.
- این توابع تضمین می‌کنند که حتی تغییرات کوچک در ورودی، تغییرات بزرگی در خروجی ایجاد می‌کند.


کاربردهای توابع هش 💡

- جداول هش (Hash Tables): استفاده از توابع هش برای دسترسی سریع به داده‌ها در جداول هش.
- جستجو و ذخیره‌سازی: در پایگاه‌های داده و سیستم‌های فایل برای مدیریت سریع داده‌ها.
- امنیت اطلاعات: در رمزنگاری و امضای دیجیتال برای تضمین امنیت و صحت داده‌ها.



هشینگ و توابع هش، ابزارهای قدرتمندی برای مدیریت داده‌ها در سیستم‌های مختلف هستند. در بخش‌های آینده، به بررسی ساختار جداول هش و پیاده‌سازی آن‌ها خواهیم پرداخت و خواهیم دید که چگونه می‌توان از هشینگ برای حل مسائل پیچیده‌تر استفاده کرد.



⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#هشینگ #توابع_هش #جداول_هش #برنامه_نویسی #ساختمان_داده #آموزش_پایتون
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۲: جداول هش (Hash Tables) 📊

سلام به همه! در این پارت از سری آموزشی، به بررسی جداول هش (Hash Tables) خواهیم پرداخت. این ساختار داده‌ای یکی از سریع‌ترین و کارآمدترین روش‌ها برای ذخیره‌سازی و دسترسی به داده‌هاست. در ادامه، به تعریف جداول هش، نحوه کار آن‌ها و پیاده‌سازی یک نمونه ساده می‌پردازیم.

جدول هش چیست؟ 🤔

جدول هش یک ساختار داده‌ای است که از توابع هش برای نگاشت کلیدها به شاخص‌های یک آرایه استفاده می‌کند. این ساختار داده‌ای به ما امکان می‌دهد تا به سرعت داده‌ها را ذخیره، جستجو و حذف کنیم.

اجزای جدول هش:

1. کلید (Key): عنصری که می‌خواهیم در جدول هش ذخیره یا بازیابی کنیم.
2. مقدار (Value): داده‌ای که با کلید مرتبط است.
3. تابع هش (Hash Function): تابعی که کلید را به یک شاخص (Index) در آرایه نگاشت می‌کند.
4. آرایه (Array): ساختار اصلی که داده‌ها را بر اساس شاخص‌های تولید شده توسط تابع هش ذخیره می‌کند.

نحوه کار جدول هش 🛠️

1. محاسبه شاخص: ابتدا تابع هش، کلید را به یک مقدار عددی (شاخص) تبدیل می‌کند.
2. ذخیره‌سازی مقدار: مقدار مرتبط با کلید در محل شاخص محاسبه شده در آرایه ذخیره می‌شود.
3. دسترسی به مقدار: برای بازیابی مقدار مرتبط با یک کلید، همان تابع هش استفاده می‌شود تا شاخص محاسبه شده و مقدار از آن محل بازیابی شود.

مثال ساده از جدول هش 🌟

فرض کنید می‌خواهیم یک سری داده مثل نام افراد و شماره تلفن آن‌ها را ذخیره کنیم.

- کلید: نام فرد
- مقدار: شماره تلفن

class HashTable:
def __init__(self, size):
self.size = size
self.table = [None] * size

def hash_function(self, key):
return len(key) % self.size

def insert(self, key, value):
index = self.hash_function(key)
self.table[index] = value

def search(self, key):
index = self.hash_function(key)
return self.table[index]

# ایجاد جدول هش با اندازه 10
hash_table = HashTable(10)

# درج داده‌ها
hash_table.insert("Alice", "123-4567")
hash_table.insert("Bob", "234-5678")

# جستجو برای داده‌ها
print(hash_table.search("Alice")) # خروجی: 123-4567
print(hash_table.search("Bob")) # خروجی: 234-5678

نحوه پیاده‌سازی یک جدول هش ساده 🚀

در این کد، یک کلاس ساده به نام HashTable داریم که یک آرایه با اندازه مشخص (در اینجا 10) برای ذخیره داده‌ها ایجاد می‌کند. تابع هش به سادگی طول کلید را به عنوان شاخص برای ذخیره‌سازی انتخاب می‌کند (که البته در پروژه‌های واقعی باید توابع هش پیچیده‌تر و کارآمدتری استفاده شود).

عملیات پایه‌ای در جدول هش:

1. درج (Insert): تابع insert، کلید و مقدار را دریافت کرده و با استفاده از تابع هش، مقدار را در محل مناسب در جدول ذخیره می‌کند.
2. جستجو (Search): تابع search، کلید را دریافت کرده و مقدار مرتبط با آن را با استفاده از شاخص محاسبه شده از تابع هش بازیابی می‌کند

در پارت بعدی، به بررسی مشکلات و چالش‌های احتمالی در جداول هش مانند برخوردها (Collisions) خواهیم پرداخت و روش‌های مختلفی برای مدیریت این مشکلات ارائه خواهیم داد.

هشینگ و جداول هش یکی از مهم‌ترین و پرکاربردترین مباحث در دنیای برنامه‌نویسی هستند، و درک درست آن‌ها می‌تواند به بهبود عملکرد سیستم‌ها کمک شایانی کند. پس تا پارت بعدی، به تمرین و بررسی بیشتر این مفاهیم بپردازید!

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#هشینگ #جداول_هش #برنامه_نویسی #ساختمان_داده #آموزش_پایتون
👍1
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۳: مدیریت برخورد (Collisions) در جداول هش

سلام به همه! در پارت قبلی، با جداول هش و نحوه عملکرد آن‌ها آشنا شدیم. یکی از چالش‌های مهم در جداول هش، برخوردها (Collisions) هستند. در این پارت، به بررسی مفهوم برخورد، علت وقوع آن و روش‌های مختلف مدیریت برخورد خواهیم پرداخت.

برخورد (Collision) چیست؟ 🤔

برخورد زمانی رخ می‌دهد که تابع هش، دو کلید مختلف را به یک شاخص مشابه در جدول هش نگاشت می‌کند. در نتیجه، هر دو مقدار مرتبط با این کلیدها باید در یک مکان از آرایه ذخیره شوند که این امر باعث ایجاد مشکل می‌شود.

چرا برخورد رخ می‌دهد؟
1. محدودیت اندازه جدول: اندازه جدول هش معمولاً محدود است و تابع هش نمی‌تواند برای هر کلید یک شاخص منحصربه‌فرد تولید کند.
2. طبیعت تابع هش: تابع هش ممکن است برای کلیدهای مختلف، مقادیر شاخص مشابهی تولید کند.

روش‌های مدیریت برخورد 🛠️

برای حل مشکل برخورد، چندین روش وجود دارد. در این بخش، به دو روش پرکاربرد یعنی زنجیره‌سازی (Chaining) و جستجوی خطی (Linear Probing) خواهیم پرداخت.

روش اول: زنجیره‌سازی (Chaining) 🔗

در روش زنجیره‌سازی، هر شاخص در جدول هش به یک لیست (یا لیست پیوندی) اشاره می‌کند که تمام مقادیر مرتبط با کلیدهایی که به آن شاخص نگاشت شده‌اند را ذخیره می‌کند.

پیاده‌سازی زنجیره‌سازی:

class HashTable:
def __init__(self, size):
self.size = size
self.table = [[] for _ in range(size)]

def hash_function(self, key):
return len(key) % self.size

def insert(self, key, value):
index = self.hash_function(key)
self.table[index].append((key, value))

def search(self, key):
index = self.hash_function(key)
for kvp in self.table[index]:
if kvp[0] == key:
return kvp[1]
return None

# ایجاد جدول هش با زنجیره‌سازی
hash_table = HashTable(10)

# درج داده‌ها
hash_table.insert("Alice", "123-4567")
hash_table.insert("Bob", "234-5678")
hash_table.insert("Charlie", "345-6789")

# جستجو برای داده‌ها
print(hash_table.search("Alice")) # خروجی: 123-4567
print(hash_table.search("Bob")) # خروجی: 234-5678
print(hash_table.search("Charlie")) # خروجی: 345-6789

در این کد، هر شاخص در آرایه به یک لیست اشاره می‌کند که کلید و مقدار را به صورت جفت (Key-Value) ذخیره می‌کند. این روش به خوبی می‌تواند برخوردها را مدیریت کند.

روش دوم: جستجوی خطی (Linear Probing) 🔍

در روش جستجوی خطی، اگر یک برخورد رخ دهد، الگوریتم به دنبال اولین شاخص خالی در آرایه می‌گردد و مقدار جدید را در آنجا ذخیره می‌کند.

پیاده‌سازی جستجوی خطی:

class HashTable:
def __init__(self, size):
self.size = size
self.table = [None] * size

def hash_function(self, key):
return len(key) % self.size

def insert(self, key, value):
index = self.hash_function(key)
while self.table[index] is not None:
index = (index + 1) % self.size
self.table[index] = (key, value)

def search(self, key):
index = self.hash_function(key)
while self.table[index] is not None:
if self.table[index][0] == key:
return self.table[index][1]
index = (index + 1) % self.size
return None

# ایجاد جدول هش با جستجوی خطی
hash_table = HashTable(10)

# درج داده‌ها
hash_table.insert("Alice", "123-4567")
hash_table.insert("Bob", "234-5678")
hash_table.insert("Charlie", "345-6789")

# جستجو برای داده‌ها
print(hash_table.search("Alice")) # خروجی: 123-4567
print(hash_table.search("Bob")) # خروجی: 234-5678
print(hash_table.search("Charlie")) # خروجی: 345-6789

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

مزایا و معایب روش‌ها ⚖️

1. زنجیره‌سازی:
- مزایا: مدیریت ساده‌تر برخوردها، ظرفیت نامحدود (تا حدی).
- معایب: استفاده بیشتر از حافظه به دلیل لیست‌های اضافی.

2. جستجوی خطی:
- مزایا: استفاده بهینه‌تر از حافظه، ساده در پیاده‌سازی.
- معایب: ممکن است منجر به خوشه‌بندی (Clustering) شود که کارایی جستجو را کاهش می‌دهد.
👍1
در پارت بعدی، به بررسی کارایی جداول هش و عوامل مؤثر بر آن می‌پردازیم. همچنین درباره مفهوم بارگذاری (Load Factor) و تأثیر آن بر عملکرد جداول هش بحث خواهیم کرد.

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

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#هشینگ #جداول_هش #برنامه_نویسی #ساختمان_داده #آموزش_پایتون
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۴: کارایی جداول هش (Hash Tables) و عوامل مؤثر بر آن

سلام! در پارت قبلی با روش‌های مدیریت برخورد در جداول هش آشنا شدیم. در این پارت، قصد داریم کارایی جداول هش و عوامل مؤثر بر آن را بررسی کنیم. همچنین به مفهوم بارگذاری (Load Factor) و تأثیر آن بر عملکرد جداول هش خواهیم پرداخت.

کارایی جداول هش 📊

جداول هش به دلیل سرعت بالا در عملیات درج، حذف، و جستجو، یکی از محبوب‌ترین ساختارهای داده‌ای هستند. به طور معمول، این عملیات‌ها در جداول هش دارای زمان اجرای O(1) هستند. اما این زمان اجرا تحت تأثیر عواملی مانند اندازه جدول، کیفیت تابع هش، و روش مدیریت برخورد قرار می‌گیرد.

بارگذاری (Load Factor) و اهمیت آن ⚖️

بارگذاری (Load Factor) یکی از مفاهیم کلیدی در جداول هش است و تأثیر زیادی بر کارایی آن دارد. بارگذاری به این صورت تعریف می‌شود
به عبارت دیگر، بارگذاری نسبت تعداد کلیدهای ذخیره‌شده به اندازه جدول را نشان می‌دهد. اگر این نسبت زیاد باشد، احتمال برخوردها افزایش می‌یابد و کارایی جدول کاهش پیدا می‌کند.

نحوه محاسبه بارگذاری:
فرض کنید یک جدول هش با اندازه 10 داریم و 7 کلید در آن ذخیره شده‌اند

تأثیر بارگذاری بر کارایی جداول هش 📉

- بارگذاری کم (Load Factor کوچک):
اگر بارگذاری جدول کم باشد (مثلاً 0.1 یا 0.2)، بیشتر خانه‌های جدول خالی خواهند بود و احتمال برخورد کاهش می‌یابد. در نتیجه، عملیات‌ها سریع‌تر انجام می‌شوند.

- بارگذاری بالا (Load Factor بزرگ):
اگر بارگذاری بالا باشد (مثلاً 0.8 یا 0.9)، تعداد خانه‌های پر افزایش می‌یابد و احتمال برخورد بیشتر می‌شود. این امر منجر به افزایش زمان جستجو و کاهش کارایی کلی جدول می‌شود.

روش‌های بهینه‌سازی جداول هش 🔧

1. تغییر اندازه جدول (Resizing):
- زمانی که بارگذاری جدول هش به یک مقدار بحرانی برسد (معمولاً 0.7 یا 0.75)، اندازه جدول را افزایش می‌دهند. این فرآیند شامل ایجاد یک جدول جدید با اندازه بزرگ‌تر و انتقال تمام داده‌ها به جدول جدید است.
- پیاده‌سازی تغییر اندازه:

     def resize(self):
new_size = self.size * 2
new_table = [None] * new_size
for item in self.table:
if item is not None:
new_index = self.hash_function(item[0]) % new_size
new_table[new_index] = item
self.size = new_size
self.table = new_table

2. بهبود کیفیت تابع هش:
- انتخاب یک تابع هش مناسب که کلیدها را به‌طور یکنواخت در جدول توزیع کند، می‌تواند برخوردها را کاهش داده و کارایی را افزایش دهد.
- توابع هش باید تا حد امکان یکتایی (Uniformity) و تصادفی‌بودن (Randomness) را رعایت کنند.

3. استفاده از روش‌های مدیریت برخورد مناسب:
- انتخاب روش‌های مدیریت برخورد مناسب مانند زنجیره‌سازی یا جستجوی خطی می‌تواند بهبود کارایی را به دنبال داشته باشد. استفاده از زنجیره‌سازی معمولاً در جداول بزرگ‌تر با بارگذاری‌های بالاتر مؤثرتر است.

جمع‌بندی و نکات مهم 📌

- بارگذاری: بارگذاری کم به عملکرد بهینه‌تر جداول هش کمک می‌کند. به همین دلیل، تغییر اندازه جدول زمانی که بارگذاری از حد مجاز فراتر می‌رود، مهم است.
- کیفیت تابع هش: انتخاب تابع هش مناسب با توزیع یکنواخت کلیدها، تأثیر مستقیم بر کارایی جدول دارد.
- روش‌های مدیریت برخورد: بسته به نیاز و شرایط جدول هش، روش‌های مختلفی برای مدیریت برخوردها وجود دارد که انتخاب درست آن‌ها می‌تواند کارایی جدول را بهبود بخشد.


در پارت بعدی، به بررسی کاربردهای پیشرفته هشینگ می‌پردازیم. از جمله هشینگ رمزنگاری (Cryptographic Hashing) و نقشه‌های هش (Hash Maps) که در بسیاری از سیستم‌ها و الگوریتم‌های پیشرفته استفاده می‌شوند.

تا آن زمان، پیشنهاد می‌کنم که تغییر اندازه جداول هش و انتخاب توابع هش مناسب را بیشتر بررسی کنید.

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#هشینگ #جداول_هش #کارایی #بارگذاری #آموزش_پایتون
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۴: کارایی جداول هش (Hash Tables) و عوامل مؤثر بر آن

سلام! در پارت قبلی با روش‌های مدیریت برخورد در جداول هش آشنا شدیم. در این پارت، قصد داریم کارایی جداول هش و عوامل مؤثر بر آن را بررسی کنیم. همچنین به مفهوم بارگذاری (Load Factor) و تأثیر آن بر عملکرد جداول هش خواهیم پرداخت.

کارایی جداول هش 📊

جداول هش به دلیل سرعت بالا در عملیات درج، حذف، و جستجو، یکی از محبوب‌ترین ساختارهای داده‌ای هستند. به طور معمول، این عملیات‌ها در جداول هش دارای زمان اجرای O(1) هستند. اما این زمان اجرا تحت تأثیر عواملی مانند اندازه جدول، کیفیت تابع هش، و روش مدیریت برخورد قرار می‌گیرد.

بارگذاری (Load Factor) و اهمیت آن ⚖️

بارگذاری (Load Factor) یکی از مفاهیم کلیدی در جداول هش است و تأثیر زیادی بر کارایی آن دارد. بارگذاری به این صورت تعریف می‌شود
به عبارت دیگر، بارگذاری نسبت تعداد کلیدهای ذخیره‌شده به اندازه جدول را نشان می‌دهد. اگر این نسبت زیاد باشد، احتمال برخوردها افزایش می‌یابد و کارایی جدول کاهش پیدا می‌کند.

نحوه محاسبه بارگذاری:
فرض کنید یک جدول هش با اندازه 10 داریم و 7 کلید در آن ذخیره شده‌اند

تأثیر بارگذاری بر کارایی جداول هش 📉

- بارگذاری کم (Load Factor کوچک):
اگر بارگذاری جدول کم باشد (مثلاً 0.1 یا 0.2)، بیشتر خانه‌های جدول خالی خواهند بود و احتمال برخورد کاهش می‌یابد. در نتیجه، عملیات‌ها سریع‌تر انجام می‌شوند.

- بارگذاری بالا (Load Factor بزرگ):
اگر بارگذاری بالا باشد (مثلاً 0.8 یا 0.9)، تعداد خانه‌های پر افزایش می‌یابد و احتمال برخورد بیشتر می‌شود. این امر منجر به افزایش زمان جستجو و کاهش کارایی کلی جدول می‌شود.

روش‌های بهینه‌سازی جداول هش 🔧

1. تغییر اندازه جدول (Resizing):
- زمانی که بارگذاری جدول هش به یک مقدار بحرانی برسد (معمولاً 0.7 یا 0.75)، اندازه جدول را افزایش می‌دهند. این فرآیند شامل ایجاد یک جدول جدید با اندازه بزرگ‌تر و انتقال تمام داده‌ها به جدول جدید است.
- پیاده‌سازی تغییر اندازه:

     def resize(self):
new_size = self.size * 2
new_table = [None] * new_size
for item in self.table:
if item is not None:
new_index = self.hash_function(item[0]) % new_size
new_table[new_index] = item
self.size = new_size
self.table = new_table

2. بهبود کیفیت تابع هش:
- انتخاب یک تابع هش مناسب که کلیدها را به‌طور یکنواخت در جدول توزیع کند، می‌تواند برخوردها را کاهش داده و کارایی را افزایش دهد.
- توابع هش باید تا حد امکان یکتایی (Uniformity) و تصادفی‌بودن (Randomness) را رعایت کنند.

3. استفاده از روش‌های مدیریت برخورد مناسب:
- انتخاب روش‌های مدیریت برخورد مناسب مانند زنجیره‌سازی یا جستجوی خطی می‌تواند بهبود کارایی را به دنبال داشته باشد. استفاده از زنجیره‌سازی معمولاً در جداول بزرگ‌تر با بارگذاری‌های بالاتر مؤثرتر است.

جمع‌بندی و نکات مهم 📌

- بارگذاری: بارگذاری کم به عملکرد بهینه‌تر جداول هش کمک می‌کند. به همین دلیل، تغییر اندازه جدول زمانی که بارگذاری از حد مجاز فراتر می‌رود، مهم است.
- کیفیت تابع هش: انتخاب تابع هش مناسب با توزیع یکنواخت کلیدها، تأثیر مستقیم بر کارایی جدول دارد.
- روش‌های مدیریت برخورد: بسته به نیاز و شرایط جدول هش، روش‌های مختلفی برای مدیریت برخوردها وجود دارد که انتخاب درست آن‌ها می‌تواند کارایی جدول را بهبود بخشد.


در پارت بعدی، به بررسی کاربردهای پیشرفته هشینگ می‌پردازیم. از جمله هشینگ رمزنگاری (Cryptographic Hashing) و نقشه‌های هش (Hash Maps) که در بسیاری از سیستم‌ها و الگوریتم‌های پیشرفته استفاده می‌شوند.

تا آن زمان، پیشنهاد می‌کنم که تغییر اندازه جداول هش و انتخاب توابع هش مناسب را بیشتر بررسی کنید.

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#هشینگ #جداول_هش #کارایی #بارگذاری #آموزش_پایتون
سری ششم: هشینگ (Hashing) و جداول هش (Hash Tables)
پارت ۶: پروژه عملی و تمرین

در آخرین پارت از این سری، به پیاده‌سازی یک پروژه عملی خواهیم پرداخت که از مفاهیم هشینگ و جداول هش استفاده می‌کند. هدف این است که شما بتوانید آنچه در این سری یاد گرفته‌اید را در یک سناریوی واقعی به کار ببرید. همچنین تمرین‌هایی برای تثبیت مفاهیم ارائه خواهد شد.

پروژه عملی: مدیریت پایگاه داده کلید-مقدار (Key-Value Store)

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

1. تعریف پروژه

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

2. پیاده‌سازی جدول هش

ابتدا یک کلاس HashTable ایجاد می‌کنیم که شامل متدهای اصلی مانند put، get، remove، و containsKey خواهد بود.

class HashTable:
def __init__(self, size=100):
self.size = size
self.table = [None] * size

def hash_function(self, key):
return hash(key) % self.size

def put(self, key, value):
index = self.hash_function(key)
if self.table[index] is None:
self.table[index] = [(key, value)]
else:
for i, (k, v) in enumerate(self.table[index]):
if k == key:
self.table[index][i] = (key, value)
return
self.table[index].append((key, value))

def get(self, key):
index = self.hash_function(key)
if self.table[index] is None:
return None
for k, v in self.table[index]:
if k == key:
return v
return None

def remove(self, key):
index = self.hash_function(key)
if self.table[index] is None:
return
for i, (k, v) in enumerate(self.table[index]):
if k == key:
del self.table[index][i]
return

def containsKey(self, key):
return self.get(key) is not None

3. آزمایش و اجرای پروژه

حال می‌توانید این کلاس را آزمایش کنید:

db = HashTable()

# افزودن داده‌ها
db.put("user1", {"name": "Alice", "email": "[email protected]"})
db.put("user2", {"name": "Bob", "email": "[email protected]"})

# بازیابی داده‌ها
print(db.get("user1")) # Output: {"name": "Alice", "email": "[email protected]"}

# به‌روزرسانی داده‌ها
db.put("user1", {"name": "Alice", "email": "[email protected]"})
print(db.get("user1")) # Output: {"name": "Alice", "email": "[email protected]"}

# حذف داده‌ها
db.remove("user2")
print(db.get("user2")) # Output: None

4. تمرین‌ها و مسائل پیشنهادی

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

2. پیاده‌سازی زنجیره‌سازی (Chaining):
روش زنجیره‌سازی را برای مدیریت برخوردها پیاده‌سازی کنید و آن را با روش‌های دیگر مدیریت برخورد مقایسه کنید.

3. افزودن قابلیت‌های بیشتر:
قابلیت‌هایی مانند شمارش تعداد کلیدها، تعیین بیشترین بارگذاری، و همچنین افزایش خودکار اندازه جدول هش را اضافه کنید.

4. استفاده از توابع هش مختلف:
چندین تابع هش مختلف را آزمایش کرده و تاثیر آن‌ها بر عملکرد جدول هش را بررسی کنید.

⚠️کلیک کن تا بیشتر یاد بگیری⚠️
☝️سری آخر آموزش ساختمان داده (هشتینگ ها و جدول هش)☝️
👍1
ارسال پارامترهای یک کلاس به کلاس دیگر در پایتون 🐍

در پایتون، وقتی می‌خواهید از پارامترهای یک کلاس در کلاس دیگری استفاده کنید، می‌توانید این کار را با استفاده از متدها و سازنده‌ها (Constructors) انجام دهید. در اینجا یک مثال ساده آورده شده است.

مثال: ارسال پارامترهای یک کلاس به کلاس دیگر

class ClassA:
def __init__(self, param1, param2):
self.param1 = param1
self.param2 = param2

class ClassB:
def __init__(self, class_a_instance):
self.param1 = class_a_instance.param1
self.param2 = class_a_instance.param2

def display_params(self):
print(f"Param1: {self.param1}, Param2: {self.param2}")

# ایجاد یک شیء از کلاس A
a = ClassA(10, 20)

# ارسال شیء کلاس A به کلاس B
b = ClassB(a)

# نمایش مقادیر پارامترها در کلاس B
b.display_params()

توضیحات:

1. ClassA:
- این کلاس دو پارامتر param1 و param2 را دریافت کرده و آن‌ها را به عنوان ویژگی‌های (Attributes) شیء ذخیره می‌کند.

2. ClassB:
- این کلاس به عنوان ورودی یک شیء از نوع ClassA دریافت می‌کند و مقادیر param1 و param2 آن شیء را در خودش ذخیره می‌کند.
- متد display_params مقادیر این پارامترها را چاپ می‌کند.

3. نحوه استفاده:
- ابتدا یک شیء از کلاس A با مقادیر خاصی ایجاد می‌شود.
- سپس این شیء به کلاس B ارسال شده و مقادیر آن استخراج و در کلاس B مورد استفاده قرار می‌گیرد.

خروجی:

Param1: 10, Param2: 20

به همین سادگی می‌توانید پارامترهای یک کلاس را به کلاس دیگری ارسال کرده و از آن‌ها استفاده کنید! 😎

⚠️کلیک کن تا بیشتر یاد بگیری⚠️


#Python #برنامه‌نویسی #آموزش_پایتون #کلاس_ها #OOP
1
ارسال پارامترهای یک کلاس به کلاس دیگر در پایتون 🐍

در پایتون، وقتی می‌خواهید از پارامترهای یک کلاس در کلاس دیگری استفاده کنید، می‌توانید این کار را با استفاده از متدها و سازنده‌ها (Constructors) انجام دهید. در اینجا یک مثال ساده آورده شده است.

مثال: ارسال پارامترهای یک کلاس به کلاس دیگر

class ClassA:
def __init__(self, param1, param2):
self.param1 = param1
self.param2 = param2

class ClassB:
def __init__(self, class_a_instance):
self.param1 = class_a_instance.param1
self.param2 = class_a_instance.param2

def display_params(self):
print(f"Param1: {self.param1}, Param2: {self.param2}")

# ایجاد یک شیء از کلاس A
a = ClassA(10, 20)

# ارسال شیء کلاس A به کلاس B
b = ClassB(a)

# نمایش مقادیر پارامترها در کلاس B
b.display_params()

توضیحات:

1. ClassA:
- این کلاس دو پارامتر param1 و param2 را دریافت کرده و آن‌ها را به عنوان ویژگی‌های (Attributes) شیء ذخیره می‌کند.

2. ClassB:
- این کلاس به عنوان ورودی یک شیء از نوع ClassA دریافت می‌کند و مقادیر param1 و param2 آن شیء را در خودش ذخیره می‌کند.
- متد display_params مقادیر این پارامترها را چاپ می‌کند.

3. نحوه استفاده:
- ابتدا یک شیء از کلاس A با مقادیر خاصی ایجاد می‌شود.
- سپس این شیء به کلاس B ارسال شده و مقادیر آن استخراج و در کلاس B مورد استفاده قرار می‌گیرد.

خروجی:

Param1: 10, Param2: 20

به همین سادگی می‌توانید پارامترهای یک کلاس را به کلاس دیگری ارسال کرده و از آن‌ها استفاده کنید! 😎

⚠️کلیک کن تا بیشتر یاد بگیری⚠️


#Python #برنامه‌نویسی #آموزش_پایتون #کلاس_ها #OOP
ارسال پارامترهای یک کلاس به چهار کلاس دیگر برای انجام معادلات مختلف 🧮

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

مثال: ارسال پارامترها به چهار کلاس مختلف

class ClassA:
def __init__(self, num1, num2, num3):
self.num1 = num1
self.num2 = num2
self.num3 = num3

class Addition:
def __init__(self, class_a_instance):
self.result = class_a_instance.num1 + class_a_instance.num2 + class_a_instance.num3

def get_result(self):
return f"جمع اعداد: {self.result}"

class Multiplication:
def __init__(self, class_a_instance):
self.result = class_a_instance.num1 * class_a_instance.num2 * class_a_instance.num3

def get_result(self):
return f"ضرب اعداد: {self.result}"

class Average:
def __init__(self, class_a_instance):
self.result = (class_a_instance.num1 + class_a_instance.num2 + class_a_instance.num3) / 3

def get_result(self):
return f"میانگین اعداد: {self.result}"

class MaxValue:
def __init__(self, class_a_instance):
self.result = max(class_a_instance.num1, class_a_instance.num2, class_a_instance.num3)

def get_result(self):
return f"بیشترین عدد: {self.result}"

# ایجاد یک شیء از کلاس A
a = ClassA(10, 20, 30)

# ارسال شیء کلاس A به کلاس‌های مختلف و انجام عملیات
addition = Addition(a)
multiplication = Multiplication(a)
average = Average(a)
max_value = MaxValue(a)

# نمایش نتایج
print(addition.get_result())
print(multiplication.get_result())
print(average.get_result())
print(max_value.get_result())

توضیحات:

1. ClassA:
- این کلاس سه عدد num1، num2 و num3 را دریافت کرده و آن‌ها را به عنوان ویژگی‌های شیء ذخیره می‌کند.

2. Addition:
- این کلاس مجموع سه عدد را محاسبه کرده و نتیجه را در ویژگی result ذخیره می‌کند.
- متد get_result نتیجه جمع را بازمی‌گرداند.

3. Multiplication:
- این کلاس ضرب سه عدد را محاسبه کرده و نتیجه را در ویژگی result ذخیره می‌کند.
- متد get_result نتیجه ضرب را بازمی‌گرداند.

4. Average:
- این کلاس میانگین سه عدد را محاسبه کرده و نتیجه را در ویژگی result ذخیره می‌کند.
- متد get_result نتیجه میانگین را بازمی‌گرداند.

5. MaxValue:
- این کلاس بیشترین عدد از بین سه عدد را محاسبه کرده و نتیجه را در ویژگی result ذخیره می‌کند.
- متد get_result بیشترین عدد را بازمی‌گرداند.

خروجی:

جمع اعداد: 60
ضرب اعداد: 6000
میانگین اعداد: 20.0
بیشترین عدد: 30

این کد به طور واضح نشان می‌دهد که چگونه می‌توان پارامترهای یک کلاس را به کلاس‌های مختلف ارسال کرد و عملیات‌های مختلفی روی آن‌ها انجام داد. 🚀

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#Python #برنامه‌نویسی #آموزش_پایتون #کلاس_ها #OOP #معادلات_ریاضی
ارسال خروجی کلاس‌ها به یک کلاس جدید برای انجام عملیات‌های بیشتر 🧩

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

مثال: ارسال خروجی کلاس‌ها به یک کلاس جدید

class ClassA:
def __init__(self, num1, num2, num3):
self.num1 = num1
self.num2 = num2
self.num3 = num3

class Addition:
def __init__(self, class_a_instance):
self.result = class_a_instance.num1 + class_a_instance.num2 + class_a_instance.num3

def get_result(self):
return self.result

class Multiplication:
def __init__(self, class_a_instance):
self.result = class_a_instance.num1 * class_a_instance.num2 * class_a_instance.num3

def get_result(self):
return self.result

class Average:
def __init__(self, class_a_instance):
self.result = (class_a_instance.num1 + class_a_instance.num2 + class_a_instance.num3) / 3

def get_result(self):
return self.result

class MaxValue:
def __init__(self, class_a_instance):
self.result = max(class_a_instance.num1, class_a_instance.num2, class_a_instance.num3)

def get_result(self):
return self.result

class FinalOperations:
def __init__(self, addition, multiplication, average, max_value):
self.sum_result = addition
self.mul_result = multiplication
self.avg_result = average
self.max_result = max_value

def final_sum(self):
# جمع نتایج مختلف
return f"جمع نهایی نتایج: {self.sum_result + self.mul_result + self.avg_result + self.max_result}"

def final_multiplication(self):
# ضرب نتایج مختلف
return f"ضرب نهایی نتایج: {self.sum_result * self.mul_result * self.avg_result * self.max_result}"

# ایجاد یک شیء از کلاس A
a = ClassA(10, 20, 30)

# انجام عملیات در کلاس‌های مختلف
addition = Addition(a).get_result()
multiplication = Multiplication(a).get_result()
average = Average(a).get_result()
max_value = MaxValue(a).get_result()

# ارسال نتایج به کلاس FinalOperations
final_ops = FinalOperations(addition, multiplication, average, max_value)

# نمایش نتایج نهایی
print(final_ops.final_sum())
print(final_ops.final_multiplication())

توضیحات:

1. ClassA:
- سه عدد به عنوان ورودی می‌گیرد و آن‌ها را در خود ذخیره می‌کند.

2. Addition، Multiplication، Average، MaxValue:
- این کلاس‌ها عملیات‌های مختلفی روی اعداد انجام داده و نتیجه را برمی‌گردانند.

3. FinalOperations:
- این کلاس چهار خروجی از کلاس‌های قبلی را به عنوان ورودی می‌گیرد.
- دارای متدهای final_sum و final_multiplication است که روی این نتایج عملیات‌های جدیدی انجام می‌دهد.
- final_sum تمام نتایج را با هم جمع می‌کند.
- final_multiplication تمام نتایج را در هم ضرب می‌کند.

خروجی:

جمع نهایی نتایج: 6080.0
ضرب نهایی نتایج: 10800000000.0

با این روش، می‌توانید خروجی‌های چندین کلاس را به یک کلاس جدید ارسال کنید و عملیات‌های مختلفی روی این داده‌ها انجام دهید. این روش به شما امکان می‌دهد که کدتان را مدولارتر و قابل استفاده مجدد کنید. 🚀

⚠️کلیک کن تا بیشتر یاد بگیری⚠️

#Python #برنامه‌نویسی #آموزش_پایتون #کلاس_ها #OOP #مدولاریت_کد
شرمنده دوستان این چند روزه مریض شده بودم حالم خوب نبود از این به بعد دوباره هر شب پست میزارم
سلام دوستان عزیز! 👋

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

برای بوست کانال، کافیست روی لینک زیر کلیک کنید و ما را به لیست کانال‌های بوست شده‌ی خود اضافه کنید:
[لینک بوست کانال]

ممنونیم از همراهی و حمایت شما! 🌟

#بوست #حمایت #پایتون #آموزش_پایتون #برنامه_نویسی
👍4
Forwarded from Linux TV 🐧
از پروژه های جدید گیتهاب گرفته تا ۱۰ تا شرکت هاستینگ رایگان ، سورس های پابلیک رایگان و سایت های دارک وب و پروفایل و والپیپر و اخبار لینوکس🫶

تلویزیون بدون تبلیغ لینوکس 🐧
تازه تاسیس
@linux7563_tv
3
🚀 آموزش فریمورک Pyramid - پارت 1: مقدمه و نصب

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

🎯 اهداف پارت 1:
- معرفی فریمورک Pyramid
- نصب و پیکربندی اولیه
- ایجاد اولین برنامه وب ساده

1️⃣ نصب و پیکربندی
برای شروع کار با Pyramid، ابتدا باید آن را نصب کنیم. این کار را می‌توان با استفاده از pip انجام داد.

pip install "pyramid==2.0"

> 💡 نکته: بهتر است از یک محیط مجازی (virtual environment) استفاده کنید تا وابستگی‌های پروژه‌تان جدا از دیگر پروژه‌ها باشد.

برای ایجاد یک محیط مجازی:

python -m venv myenv
source myenv/bin/activate # برای کاربران لینوکس یا مک
myenv\Scripts\activate # برای کاربران ویندوز

سپس Pyramid را نصب کنید.

2️⃣ ایجاد اولین پروژه Pyramid
بعد از نصب Pyramid، حالا می‌خواهیم یک پروژه جدید ایجاد کنیم. با استفاده از دستورات زیر می‌توانید یک پروژه جدید به نام myproject بسازید:

pcreate -s starter myproject

🎉 این دستور یک پروژه جدید با یک ساختار پیش‌فرض ایجاد می‌کند که شامل فایل‌های پیکربندی، یک برنامه نمونه و دیگر فایل‌های ضروری است.


📢 برای دیدن ادامه آموزش‌ها به کانال ما بپیوندید: [python3]

#پایتون #آموزش_پایتون #برنامه‌نویسی #Pyramid #وب #توسعه_وب
🚀 آموزش فریمورک Pyramid - پارت 2: ایجاد View و Template

🎯 اهداف پارت 2:
- معرفی مفهوم View و Template در Pyramid
- ایجاد یک View ساده
- استفاده از Template برای نمایش داده‌ها

1️⃣ آشنایی با View در Pyramid
در فریمورک Pyramid، View به بخشی از برنامه شما اشاره دارد که وظیفه پردازش درخواست‌های ورودی و تولید پاسخ را بر عهده دارد. به عبارت دیگر، View جایی است که منطق برنامه‌نویسی شما در آن قرار دارد.

🔹 برای ایجاد یک View، باید یک تابع یا کلاس تعریف کنید که درخواست‌های HTTP را دریافت کند و پاسخ مناسب را برگرداند.

2️⃣ ایجاد اولین View
بیایید یک View ساده ایجاد کنیم که یک متن ساده "Hello, Pyramid!" را برگرداند. برای این کار، به فایل __init__.py بروید و یک View جدید به شکل زیر اضافه کنید:

from pyramid.response import Response
from pyramid.view import view_config

@view_config(route_name='home')
def my_view(request):
return Response('Hello, Pyramid!')

🔍 توضیح کد:
- @view_config: این دکوراتور به Pyramid می‌گوید که این تابع یک View است و باید به درخواست‌های مربوط به مسیر home پاسخ دهد.
- Response: کلاس Response برای ساختن پاسخ‌های HTTP استفاده می‌شود.

3️⃣ تعریف مسیر (Route)
برای اینکه View ما کار کند، نیاز داریم که یک مسیر (Route) برای آن تعریف کنیم. مسیرها به درخواست‌ها این امکان را می‌دهند که به View مناسب هدایت شوند.

🔸 به فایل __init__.py بروید و کد زیر را برای تعریف مسیر اضافه کنید:

def main(global_config, **settings):
config = Configurator(settings=settings)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()

🔍 توضیح کد:
- config.add_route('home', '/'): این خط مسیر home را به آدرس / (صفحه اصلی) نگاشت می‌کند.
- config.scan(): این متد تمام Viewهایی که با @view_config تعریف شده‌اند را پیدا می‌کند.

4️⃣ آشنایی با Template در Pyramid
Templates (قالب‌ها) به شما این امکان را می‌دهند که محتوا و داده‌ها را از View به شکل HTML به کاربران نمایش دهید. در Pyramid، از قالب‌هایی مانند Jinja2 یا Chameleon استفاده می‌شود.

🔹 در این مثال، ما از قالب Chameleon استفاده می‌کنیم. ابتدا باید آن را نصب کنید:

pip install pyramid_chameleon

5️⃣ استفاده از Template برای نمایش داده‌ها
بیایید View قبلی را تغییر دهیم تا از یک Template برای نمایش داده‌ها استفاده کنیم. init__init__.py بروید و کد را به شکل زیر تغییر دهید:

from pyramid.view import view_config

@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
return {'name': 'Pyramid'}

🔍 توضیح کد:
- renderer='templates/mytemplate.pt': این قسمت به Pyramid می‌گوید که از قالب mytemplate.pt برای رندر کردن View استفاده کند.
- return {'name': 'Pyramid'}: داده‌ای که به قالب ارسال می‌شود.

6️⃣ ایجاد فایل Template
حالا فایل قالب را ایجاد کنید. به مسیر templates/ بروید و فایل mytemplate.pt را ایجاد کنید و محتوای زیر را در آن قرار دهید:

<html>
<head>
<title>My Pyramid App</title>
</head>
<body>
<h1>Hello, ${name}!</h1>
</body>
</html>

🔍 توضیح کد:
- ${name}: متغیری که از View به قالب ارسال شده و جایگزین می‌شود.

🎉 حالا اگر برنامه را اجرا کنید، باید پیامی با متن "Hello, Pyramid!" را در صفحه اصلی ببینید که از طریق یک Template رندر شده است.



📢 برای دیدن ادامه آموزش‌ها به کانال ما بپیوندید: [python3]

#پایتون #آموزش_پایتون #برنامه‌نویسی #Pyramid #وب #توسعه_وب
🚀 آموزش فریمورک Pyramid - پارت 3: مدیریت فرم‌ها و ارتباط با دیتابیس

🎯 اهداف پارت 3:
- ایجاد و مدیریت فرم‌ها در Pyramid
- معرفی دیتابیس و نحوه اتصال آن به برنامه
- ذخیره‌سازی داده‌های فرم در دیتابیس

1️⃣ ایجاد فرم در Pyramid
فرم‌ها بخش مهمی از هر برنامه وب هستند، زیرا به کاربران امکان می‌دهند تا داده‌هایی را به برنامه ارسال کنند. در این بخش، از deform استفاده می‌کنیم که یک کتابخانه قدرتمند برای مدیریت فرم‌ها در Pyramid است.

🔹 ابتدا باید deform و colander (که برای اعتبارسنجی داده‌ها استفاده می‌شود) را نصب کنید:

pip install deform colander

2️⃣ تعریف یک فرم ساده
برای تعریف یک فرم، باید از کتابخانه‌های colander و deform استفاده کنیم. در اینجا یک فرم ساده برای دریافت نام و ایمیل کاربر ایجاد می‌کنیم.

🔸 یک فایل جدید به نام forms.py در پوشه پروژه خود ایجاد کنید و کد زیر را در آن قرار دهید:

import colander
import deform

class ContactForm(colander.MappingSchema):
name = colander.SchemaNode(colander.String(), validator=colander.Length(min=2), title="Name")
email = colander.SchemaNode(colander.String(), validator=colander.Email(), title="Email")

def create_contact_form():
schema = ContactForm()
form = deform.Form(schema, buttons=('submit',))
return form

🔍 توضیح کد:
- ContactForm: این کلاس ساختار فرم را مشخص می‌کند و شامل دو فیلد name و email است.
- create_contact_form(): این تابع فرم را ایجاد می‌کند و آماده استفاده در View می‌کند.

3️⃣ نمایش فرم در View
حالا باید فرم را در View نمایش دهیم و داده‌های ارسال شده را پردازش کنیم. برای این کار، به فایل __init__.py بروید و کد زیر را اضافه کنید:

from pyramid.view import view_config
from .forms import create_contact_form

@view_config(route_name='contact', renderer='templates/contact.pt')
def contact_view(request):
form = create_contact_form().render()

if request.iss.onethod == 'POST':
controls = request.POST.items()
try:
appstruct = create_contact_form().validate(controls)
# اینجا می‌توانید داده‌ها را ذخیره کنید
except deform.ValidationFailure as e:
form = e.render()

return {'form': form}

🔍 توضیح کد:
- form.render(): فرم را به HTML تبدیل می‌کند.
- validate(): داده‌های ارسال شده را اعتبارسنجی می‌کند و در صورت معتبر بودن، داده‌ها را برمی‌گرداند.

4️⃣ ایجاد قالب (Template) فرم
برای نمایش فرم، یک فایل جدید به نام contact.pt در پوشه templates ایجاد کنید و کد زیر را در آن قرار دهید:

<html>
<head>
<title>Contact Us</title>
</head>
<body>
<h1>Contact Us</h1>
<form method="POST">
${form}
<button type="submit">Submit</button>
</form>
</body>
</html>

🔍 توضیح کد:
- ${form}: فرم را در قالب HTML نمایش می‌دهد.

5️⃣ اتصال به دیتابیس
برای ذخیره‌سازی داده‌های فرم، نیاز به اتصال برنامه به یک دیتابیس داریم. در این مثال از SQLAlchemy استفاده می‌کنیم.

🔹 ابتدا SQLAlchemy را نصب کنید:

pip install sqlalchemy

6️⃣ تنظیمات دیتابیس
برای اتصال به دیتابیس، به فایل __init__.py بروید و کد زیر را برای پیکربندی دیتابیس اضافه کنید:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

def db_setup():
engine = create_engine('sqlite:///mydatabase.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
return DBSession()

session = db_setup()

🔍 توضیح کد:
- create_engine: اتصال به دیتابیس SQLite را ایجاد می‌کند.
- sessionmaker: یک session برای ارتباط با دیتابیس ایجاد می‌کند.

7️⃣ تعریف مدل دیتابیس
حالا باید یک مدل برای ذخیره‌سازی داده‌های فرم در دیتابیس ایجاد کنیم. یک فایل جدید به نام models.py ایجاد کنید و کد زیر را در آن قرار دهید:

from sqlalchemy import Column, Integer, String
from . import Base

class Contact(Base):
__tablename__ = 'contacts'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(50))

🔍 توضیح کد:
- Contact: این کلاس ساختار جدول دیتابیس را مشخص می‌کند.
8️⃣ ذخیره‌سازی داده‌ها در دیتابیس
در نهایت، باید داده‌های فرم را در دیتابیس ذخیره کنیم. به View contact_view برگردید و کد زیر را اضافه کنید:

from .models import Contact

@view_config(route_name='contact', renderer='templates/contact.pt')
def contact_view(request):
form = create_contact_form().render()

if request.iss.onethod == 'POST':
controls = request.POST.items()
try:
appstruct = create_contact_form().validate(controls)
new_contact = Contact(name=appstruct['name'], email=appstruct['email'])
session.add(new_contact)
session.commit()
except deform.ValidationFailure as e:
form = e.render()

return {'form': form}

🔍 توضیح کد:
- new_contact: یک شیء جدید از کلاس Contact ایجاد می‌کند و داده‌ها را ذخیره می‌کند.
- session.add(): شیء جدید را به session اضافه می‌کند.
- session.commit(): تغییرات را در دیتابیس اعمال می‌کند.

🎉 حالا شما یک فرم کاربردی دارید که داده‌ها را می‌گیرد و در دیتابیس ذخیره می‌کند!


📢 برای دیدن ادامه آموزش‌ها به کانال ما بپیوندید: [python3]

#پایتون #آموزش_پایتون #برنامه‌نویسی #Pyramid #وب #توسعه_وب
👍1