Python
5 subscribers
14 photos
10 videos
94 links
ف
Download Telegram
Forwarded from Python3
📚 آموزش الگوریتم مرتب‌سازی ادغامی (Merge Sort)

سلام دوستان! امروز قصد داریم یکی از الگوریتم‌های مهم و پرکاربرد در علوم کامپیوتر که در دانشگاه‌ها تدریس می‌شود را به شما آموزش دهیم. این الگوریتم به نام مرتب‌سازی ادغامی (Merge Sort) شناخته می‌شود. بیایید با هم یاد بگیریم چطور این الگوریتم کار می‌کند. 🧠

الگوریتم مرتب‌سازی ادغامی
مرتب‌سازی ادغامی یکی از الگوریتم‌های مرتب‌سازی است که از روش تقسیم و غلبه (Divide and Conquer) استفاده می‌کند. در این روش، لیست به دو نیم تقسیم شده و هر نیمه به صورت جداگانه مرتب می‌شود، سپس دو نیمه مرتب شده به هم ادغام می‌شوند تا یک لیست مرتب نهایی ایجاد شود.

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

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

def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]

merge_sort(left_half)
merge_sort(right_half)

i = j = k = 0

while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1

while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1

while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1

return arr

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

مزایا و معایب
مزایا:
- پیچیدگی زمانی مناسب
- عملکرد قابل پیش‌بینی

معایب:
- نیاز به حافظه اضافی برای لیست‌های نیمه

امیدوارم این آموزش برای شما مفید بوده باشد! تا آموزش بعدی، موفق و پیروز باشید! 🌟

#الگوریتم #مرتب_سازی #برنامه_نویسی #کامپیوتر #آموزش #MergeSort
Forwarded from Python3
🟥الگوریتم مرتب سازی ادغامی(merge sort)
Forwarded from Python3
Forwarded from Python3
آیا می‌دانستید؟ 🤓

اولین کامپیوتر مکانیکی قابل برنامه‌ریزی در جهان توسط کنراد تسوزه (Konrad Zuse) ساخته شد و به نام Z1 شناخته می‌شود. 💻 این شاهکار مهندسی در سال 1938 در آلمان ساخته شد و یکی از اولین تلاش‌ها برای ایجاد یک کامپیوتر دیجیتال واقعی بود.

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

از ویژگی‌های جالب Z1 می‌توان به موارد زیر اشاره کرد:
- استفاده از مموری مکانیکی برای ذخیره داده‌ها 🗄🔧
- قابلیت برنامه‌ریزی با استفاده از نوارهای پانچ 📜🎛
- انجام محاسبات منطقی و ریاضی با استفاده از سیستم دو دویی 🔢🤓

Z1 توسط تسوزه در خانه‌اش و با استفاده از منابع محدودی که در دسترس داشت، ساخته شد. این دستگاه نشان‌دهنده نبوغ و پیشگامی تسوزه در حوزه کامپیوتر بود و راه را برای نسل‌های بعدی کامپیوترها هموار کرد. 👨‍🔬🚀

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

(دانستنی های بیشتر توی کانال ما)

#تاریخچه_کامپیوتر #کنراد_تسوزه #Z1 #کامپیوتر_مکانیکی #نوآوری #دانستنی #علم_و_فناوری
Forwarded from Python3
آیا می‌دانستید؟ 🤓

یکی از نکات بسیار مهم در کار با توابع در پایتون که می‌تواند به شما کمک کند تا با خطاهای کمتری مواجه شوید، استفاده از آرگومان‌های پیش‌فرض (Default Arguments) است. 🌟

آرگومان‌های پیش‌فرض در پایتون
در پایتون، شما می‌توانید برای آرگومان‌های یک تابع مقدار پیش‌فرض تعیین کنید. این کار باعث می‌شود که اگر هنگام فراخوانی تابع مقداری برای این آرگومان‌ها ارسال نشود، مقدار پیش‌فرض استفاده شود. 📝🔧

مثال
def greet(name, message="سلام!"):
print(f"{message}, {name}")

# فراخوانی تابع بدون ارسال آرگومان message
greet("علی")
# خروجی: سلام!, علی

# فراخوانی تابع با ارسال آرگومان message
greet("علی", "صبح بخیر")
# خروجی: صبح بخیر, علی

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

2. افزایش خوانایی و کارایی کد: با استفاده از آرگومان‌های پیش‌فرض، کد شما خواناتر و استفاده از توابع شما راحت‌تر خواهد شد، به خصوص زمانی که توابع پیچیده‌تری دارید. 📖

3. انعطاف‌پذیری بیشتر: شما می‌توانید توابعی بنویسید که در شرایط مختلف و با مقادیر ورودی مختلف به درستی عمل کنند، بدون اینکه نیاز باشد چندین تابع مختلف برای شرایط متفاوت تعریف کنید. 🎛🔄

این نکته ساده اما قدرتمند می‌تواند به شما کمک کند تا کدهای تمیزتر و پایدارتر بنویسید و با خطاهای کمتری مواجه شوید. 🛠🔍

🔻برای نکته های بیشتر اینجا کلیک کن

#پایتون #برنامه‌نویسی #آموزش_پایتون #تابع‌ها #توسعه_دهنده #نکات_برنامه‌نویسی
Forwarded from Python3
📰 اخبار داغ از تورنومنت‌های برنامه‌نویسی در ایران!

1. مسابقات برنامه‌نویسی دانشجویی ایران (ACM ICPC):
- این مسابقات یکی از معتبرترین رقابت‌های برنامه‌نویسی در ایران و جهان است. تیم‌های شرکت‌کننده در این مسابقات باید مسائل پیچیده‌ی الگوریتمی را در زمان محدود حل کنند. برگزاری این مسابقات به صورت منطقه‌ای و ملی انجام می‌شود و تیم‌های برتر به مسابقات جهانی راه می‌یابند.

2. مسابقات برنامه‌نویسی CodeCup:
- CodeCup که توسط دانشگاه شریف برگزار می‌شود، شامل چالش‌های الگوریتمی و برنامه‌نویسی است که باید در مدت زمان مشخص حل شوند. این مسابقات به صورت آنلاین برگزار می‌شود و شرکت‌کنندگان از سراسر ایران می‌توانند در آن شرکت کنند.

3. مسابقات کدنویسی لیگ کدنویسی ایران (Codeninja):
- Codeninja یک لیگ کدنویسی آنلاین است که در طول سال برگزار می‌شود. این لیگ شامل مسابقات ماهانه است و شرکت‌کنندگان با حل مسائل الگوریتمی و برنامه‌نویسی می‌توانند امتیاز کسب کنند. این مسابقات فرصت خوبی برای تمرین مداوم و ارتقاء مهارت‌های برنامه‌نویسی است.

📅 منتظر چه هستید؟ اگر به برنامه‌نویسی علاقه‌مندید، حتماً در این مسابقات شرکت کنید و مهارت‌های خود را به چالش بکشید! 🖥️🚀

🔻اخبار مهم پایتون در این کانال

#ACM_ICPC #CodeCup #Codeninja #برنامه_نویسی #تورنومنت #ایران #اخبار #TechNews
Forwarded from Python3
📰 اخبار مهم امروز از دنیای پایتون!

1. انتشار نسخه جدید پایتون 3.12.0:
- نسخه جدید پایتون با ویژگی‌های بهبود یافته و رفع باگ‌های مختلف منتشر شد. این نسخه شامل بهبود عملکرد، ارتقاء قابلیت‌های تایپینگ، و اضافه شدن امکانات جدید به استاندارد لایبرری می‌باشد. 🌟🐍

2. محبوبیت روزافزون فریم‌ورک FastAPI:
- FastAPI همچنان به رشد محبوبیت خود ادامه می‌دهد و به یکی از محبوب‌ترین فریم‌ورک‌های پایتون برای ساخت API‌های سریع و کارا تبدیل شده است. توسعه‌دهندگان از سرعت و کارایی بالای این فریم‌ورک بسیار راضی هستند. 🚀📈

3. انتشار Pandas 2.0 با قابلیت‌های جدید:
- تیم توسعه Pandas نسخه 2.0 این لایبرری محبوب داده‌کاوی را منتشر کردند. این نسخه شامل بهبود‌های عمده در عملکرد و امکانات جدید برای تجزیه و تحلیل داده‌ها است. 📊🐼

4. شروع کارگاه‌های آموزشی Django در دانشگاه‌های ایران:
- چندین دانشگاه در ایران کارگاه‌های آموزشی فریم‌ورک Django را برای دانشجویان و علاقه‌مندان برگزار کرده‌اند. این کارگاه‌ها فرصتی عالی برای یادگیری و توسعه مهارت‌های وب است. 🏫🌐

5. استفاده از پایتون در پروژه‌های بزرگ داده کاوی:
- شرکت‌های بزرگ تکنولوژی در حال استفاده گسترده از پایتون در پروژه‌های داده‌کاوی خود هستند. پایتون به دلیل کتابخانه‌های قدرتمند مانند NumPy و SciPy انتخاب اول بسیاری از دانشمندان داده است. 🧠💾

6. افزایش تقاضا برای توسعه‌دهندگان پایتون در بازار کار:
- بازار کار برای توسعه‌دهندگان پایتون بسیار داغ است و تقاضا برای این مهارت‌ها همچنان در حال افزایش است. پایتون به عنوان یک زبان چند منظوره و قدرتمند، در صنایع مختلف مورد استفاده قرار می‌گیرد. 💼📈

7. پروژه‌های متن‌باز پایتون همچنان در حال رشد:
- تعداد پروژه‌های متن‌باز مبتنی بر پایتون روز به روز در حال افزایش است. این پروژه‌ها شامل ابزارها و کتابخانه‌های جدید برای توسعه‌دهندگان و محققان است. 🌍🔓

🔻اخبار مهم پایتون اینجا هست کلیک کن

#Python #پایتون #اخبار_تکنولوژی #FastAPI #Pandas #Django #داده_کاوی #بازار_کار #پروژه_متن_باز
Forwarded from Python3
🔤 آموزش کامل متدهای کار با رشته‌ها در پایتون 🔤

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

1. lower()
این متد تمام حروف رشته را به حروف کوچک تبدیل می‌کند.

text = "Hello, WORLD!"
print(text.lower()) # خروجی: hello, world!

2. upper()
این متد تمام حروف رشته را به حروف بزرگ تبدیل می‌کند.

text = "Hello, world!"
print(text.upper()) # خروجی: HELLO, WORLD!

3. capitalize()
این متد حرف اول رشته را به حروف بزرگ و بقیه را به حروف کوچک تبدیل می‌کند.

text = "hello, world!"
print(text.capitalize()) # خروجی: Hello, world!

4. title()
این متد حرف اول هر کلمه در رشته را به حروف بزرگ تبدیل می‌کند.

text = "hello, world!"
print(text.title()) # خروجی: Hello, World!

5. strip()
این متد فاصله‌های خالی در ابتدای و انتهای رشته را حذف می‌کند.

text = "  hello, world!  "
print(text.strip()) # خروجی: hello, world!

6. startswith()
این متد بررسی می‌کند که آیا رشته با زیررشته‌ی خاصی شروع می‌شود یا نه.

text = "hello, world!"
print(text.startswith("hello")) # خروجی: True

7. endswith()
این متد بررسی می‌کند که آیا رشته با زیررشته‌ی خاصی پایان می‌یابد یا نه.

text = "hello, world!"
print(text.endswith("world!")) # خروجی: True

8. replace()
این متد یک زیررشته را با زیررشته‌ای دیگر در رشته جایگزین می‌کند.

text = "hello, world!"
print(text.replace("world", "Python")) # خروجی: hello, Python!

9. split()
این متد رشته را بر اساس یک جداکننده خاص جدا کرده و به لیست تبدیل می‌کند.

text = "one, two, three"
print(text.split(", ")) # خروجی: ['one', 'two', 'three']

10. join()
این متد عناصر یک لیست را با استفاده از یک جداکننده خاص به یکدیگر متصل می‌کند.

items = ['one', 'two', 'three']
print(", ".join(items)) # خروجی: one, two, three

11. find()
این متد اولین موقعیت یک زیررشته را در رشته پیدا می‌کند. اگر زیررشته وجود نداشته باشد، -1 برمی‌گرداند.

text = "hello, world!"
print(text.find("world")) # خروجی: 7

12. index()
این متد اولین موقعیت یک زیررشته را در رشته پیدا می‌کند. اگر زیررشته وجود نداشته باشد، خطا برمی‌گرداند.

text = "hello, world!"
print(text.index("world")) # خروجی: 7

13. count()
این متد تعداد تکرار یک زیررشته در رشته را شمارش می‌کند.

text = "hello, world! hello again!"
print(text.count("hello")) # خروجی: 2

14. isnumeric()
این متد بررسی می‌کند که آیا همه کاراکترهای رشته اعداد هستند یا نه.

text = "12345"
print(text.isnumeric()) # خروجی: True

15. zfill()
این متد طول رشته را به طول مشخصی می‌رساند و با اضافه کردن صفر از سمت چپ، رشته را پر می‌کند.

text = "42"
print(text.zfill(5)) # خروجی: 00042

16. swapcase()
این متد حروف بزرگ را به کوچک و حروف کوچک را به بزرگ تبدیل می‌کند.

text = "Hello, World!"
print(text.swapcase()) # خروجی: hELLO, wORLD!

17. format()
این متد رشته‌ها را با استفاده از جایگزینی قالب‌بندی می‌کند.

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

18. rjust()
این متد رشته را به طول مشخصی می‌رساند و از سمت چپ با کاراکتر خاصی پر می‌کند.

text = "42"
print(text.rjust(5, '0')) # خروجی: 00042

19. ljust()
این متد رشته را به طول مشخصی می‌رساند و از سمت راست با کاراکتر خاصی پر می‌کند.

text = "42"
print(text.ljust(5, '0')) # خروجی: 42000

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

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

#Python #Programming #Coding #Strings #Learning #PythonTips
Forwarded from Python3
ساخت کلاس و متدها در پایتون

ابتدا یک کلاس ساده به نام Car تعریف می‌کنیم و چند متد برای آن ایجاد می‌کنیم.

class Car:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year

def start_engine(self):
print(f"The engine of the {self.brand} {self.model} is now running.")

def stop_engine(self):
print(f"The engine of the {self.brand} {self.model} has been turned off.")

def honk(self):
print("Beep beep!")

def display_info(self):
print(f"Car Info: {self.brand} {self.model}, Year: {self.year}")

توضیحشinitit__ یک متد ویژه است که به عنوان سازنده (constructor) کلاس عمل می‌کند و هنگام ایجاد یک شیء از کلاس فراخوانی می‌شود. این متد برای مقداردهی اولیه به متغیرهای نمونه (instance variables) استفاده می‌شود.
- start_engine یک متد معمولی است که پیام شروع به کار موتور را چاپ می‌کند.
- stop_engine یک متد معمولی است که پیام خاموش شدن موتور را چاپ می‌کند.
- honk یک متد معمولی است که صدای بوق را چاپ می‌کند.
- display_info یک متد معمولی است که اطلاعات خودرو را چاپ می‌کند.

استفاده از کلاس و متدها

حال می‌توانیم از کلاس Car استفاده کنیم و متدهای آن را فراخوانی کنیم.

if __name__ == "__main__":
my_car = Car("Toyota", "Corolla", 2020)
my_car.start_engine() # خروجی: The engine of the Toyota Corolla is now running.
my_car.honk() # خروجی: Beep beep!
my_car.display_info() # خروجی: Car Info: Toyota Corolla, Year: 2020
my_car.stop_engine() # خروجی: The engine of the Toyota Corolla has been turned off.

توضیحش

- با استفاده از Car("Toyota", "Corolla", 2020) یک شیء جدید از کلاس Car با نام my_car ایجاد می‌کنیم.
- سپس متدهای مختلف را با استفاده از my_car فراخوانی می‌کنیم.

نکات مهم

1. متدهای یک کلاس همیشه باید حداقل یک پارامتر داشته باشند که به طور معمول self نامیده می‌شود. این پارامتر به شیء فعلی اشاره دارد.
2. شما می‌توانید متدهای کلاس را برای انجام هر عملیاتی که می‌خواهید تعریف کنید. این متدها می‌توانند پارامترهای اضافی داشته باشند و هر عملیاتی را که نیاز دارید انجام دهند.

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

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

#Python #Programming #OOP #Methods #Learning #PythonTips
Forwarded from Python3
📉 بزرگ‌ترین نقص‌های پایتون نسبت به زبان‌های دیگر

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

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

⚠️ بزرگ‌ترین نقص‌های پایتون
1. عملکرد پایین‌تر نسبت به زبان‌های کامپایل‌شده
پایتون به دلیل اینکه یک زبان تفسیرشده (interpreted) است، عموماً نسبت به زبان‌های کامپایل‌شده مانند C++ و Java از عملکرد کمتری برخوردار است. این به معنای سرعت پایین‌تر اجرای برنامه‌ها و مصرف بیشتر منابع سیستم است.

# کد پایتون (مقایسه عملکرد)
def slow_function():
result = 0
for i in range(10000000):
result += i
return result

print(slow_function())

2. عدم پشتیبانی از چند هسته‌ای به طور کامل
پایتون به دلیل Global Interpreter Lock (GIL)، نمی‌تواند به طور کامل از قابلیت‌های چند هسته‌ای پردازنده‌ها استفاده کند. این مسئله باعث می‌شود که اجرای همزمان چندین نخ (thread) در پایتون به اندازه‌ای که در زبان‌های دیگر مانند Java یا C++ ممکن است، کارایی نداشته باشد.

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

4. ابعاد بزرگ کتابخانه‌ها و زمان بارگذاری
پایتون به طور کلی دارای کتابخانه‌های زیادی است که می‌تواند زمان بارگذاری و مصرف حافظه برنامه‌ها را افزایش دهد. این مسئله ممکن است برای پروژه‌های بزرگ و پیچیده که نیاز به زمان بارگذاری سریع دارند، مشکل‌ساز باشد.

5. کمبود نوع‌های داده قوی
پایتون به طور پیش‌فرض از نوع‌های داده قوی (strongly-typed) مانند زبان‌های C++ و Java پشتیبانی نمی‌کند. این به معنای آن است که خطاهای نوع داده ممکن است در زمان اجرای برنامه و نه در زمان کامپایل شناسایی شوند.

# مثال از عدم نوع‌گذاری قوی
x = "5"
y = 10
print(x + y) # منجر به خطا در زمان اجرا

6. پشتیبانی محدود از برنامه‌نویسی موبایل و سیستم‌های توکار
پایتون به طور کلی در زمینه برنامه‌نویسی موبایل و سیستم‌های توکار نسبت به زبان‌هایی مانند Java یا C++ محدودیت‌هایی دارد. این به معنای آن است که برای توسعه اپلیکیشن‌های موبایل و سیستم‌های توکار، ممکن است نیاز به استفاده از زبان‌های دیگر باشد.

7. سازگاری کمتر با برخی سیستم‌عامل‌ها
پایتون به دلیل استفاده از محیط‌های اجرایی خاص، ممکن است در برخی سیستم‌عامل‌ها مانند سیستم‌های توکار و سخت‌افزارهای خاص، مشکلاتی در سازگاری داشته باشد. این ممکن است نیاز به پیکربندی و تنظیمات اضافی داشته باشد.

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

🔻[برای یاد گرفتن بیشتر اینجا کلیک کن]🔻
👍1
Forwarded from Python3
پارت ۶: دیکشنری‌ها و مجموعه‌ها در پایتون 📚🐍

در این پارت، به بررسی دو ساختار داده‌ای مهم و پرکاربرد دیگر در پایتون می‌پردازیم: دیکشنری‌ها (Dictionaries) و مجموعه‌ها (Sets). این ساختارها ابزارهایی قوی برای مدیریت داده‌ها به شکلی موثر و بهینه هستند.

۱. دیکشنری‌ها (Dictionaries)

دیکشنری‌ها ساختارهای داده‌ای هستند که داده‌ها را به صورت جفت‌های کلید-مقدار (key-value pairs) ذخیره می‌کنند. این ویژگی باعث می‌شود تا دیکشنری‌ها برای ذخیره و بازیابی داده‌ها با استفاده از کلید‌ها بسیار مفید باشند.

تعریف دیکشنری

دیکشنری‌ها با استفاده از آکولاد {} تعریف می‌شوند:

my_dict = {"name": "Ali", "age": 25, "city": "Tehran"}
print(my_dict) # خروجی: {'name': 'Ali', 'age': 25, 'city': 'Tehran'}

افزودن و حذف عناصر

می‌توانیم عناصر جدید به دیکشنری اضافه کنیم یا عناصر موجود را حذف کنیم:

my_dict["email"] = "[email protected]"  # افزودن عنصر جدید
print(my_dict) # خروجی: {'name': 'Ali', 'age': 25, 'city': 'Tehran', 'email': '[email protected]'}

del my_dict["age"] # حذف عنصر
print(my_dict) # خروجی: {'name': 'Ali', 'city': 'Tehran', 'email': '[email protected]'}

دسترسی به مقادیر دیکشنری

می‌توانیم به مقادیر دیکشنری با استفاده از کلیدها دسترسی پیدا کنیم:

name = my_dict["name"]
print(name) # خروجی: Ali

متدهای پرکاربرد دیکشنری

دیکشنری‌ها دارای متدهای متعددی هستند که کار با آنها را آسان‌تر می‌کنند:

# استفاده از متد get برای دریافت مقدار با کلید، در صورت عدم وجود کلید مقدار پیش‌فرض بازمی‌گرداند
age = my_dict.get("age", "Unknown")
print(age) # خروجی: Unknown

# دریافت لیست کلیدها و مقادیر
keys = my_dict.keys()
values = my_dict.values()
print(keys) # خروجی: dict_keys(['name', 'city', 'email'])
print(values) # خروجی: dict_values(['Ali', 'Tehran', '[email protected]'])

۲. مجموعه‌ها (Sets)

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

تعریف مجموعه

مجموعه‌ها با استفاده از آکولاد {} یا تابع set() تعریف می‌شوند:

my_set = {1, 2, 3, 4, 5}
print(my_set) # خروجی: {1, 2, 3, 4, 5}

my_set = set([1, 2, 3, 4, 5])
print(my_set) # خروجی: {1, 2, 3, 4, 5}

فزودن و حذف عناصر

می‌توانیم عناصر جدید به مجموعه اضافه کنیم یا عناصر موجود را حذف کنیم:

my_set.add(6)   # افزودن عنصر جدید
print(my_set) # خروجی: {1, 2, 3, 4, 5, 6}

my_set.remove(3) # حذف عنصر
print(my_set) # خروجی: {1, 2, 4, 5, 6}

# عملیات‌های مجموعه‌ای

مجموعه‌ها دارای متدهای مختلفی برای انجام عملیات‌های مجموعه‌ای هستند:

set1 = {1, 2, 3}
set2 = {3, 4, 5}

# اجتماع
union_set = set1.union(set2)
print(union_set) # خروجی: {1, 2, 3, 4, 5}

# اشتراک
intersection_set = set1.intersection(set2)
print(intersection_set) # خروجی: {3}

# تفاضل
difference_set = set1.difference(set2)
print(difference_set) # خروجی: {1, 2}

تمرین‌ها

1. یک دیکشنری بسازید که شامل اطلاعات کتاب‌های شما باشد (عنوان، نویسنده، سال انتشار) و سپس یک کتاب جدید به آن اضافه کنید.
2. یک مجموعه شامل شماره‌های مختلف ایجاد کنید و سپس مجموعه‌ای دیگر با شماره‌های متفاوت ایجاد کنید. اشتراک و تفاضل این دو مجموعه را محاسبه کنید.
3. یک دیکشنری شامل نام و سن دوستان خود بسازید و سپس سعی کنید نام دوستی که در دیکشنری وجود ندارد را جستجو کنید.

[آموزش های مفید پایتون اینجاست]

#پایتون #آموزش_پایتون #برنامه_نویسی #دیکشنری #مجموعه #کدنویسی
Forwarded from Python3
پارت ۳: استفاده از پایگاه داده

۱. نصب و راه‌اندازی SQLite

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

import sqlite3

۲. اتصال ربات به پایگاه داده

ابتدا باید یک پایگاه داده ایجاد کنیم و سپس به آن متصل شویم. برای این کار، یک فایل پایگاه داده به نام bot_database.db ایجاد می‌کنیم:

conn = sqlite3.connect('bot_database.db')
cursor = conn.cursor()

۳. ایجاد جداول مورد نیاز

جدول‌هایی که نیاز داریم را ایجاد می‌کنیم. برای مثال، جدولی برای ذخیره اطلاعات کاربران:

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
last_name TEXT
)
''')
conn.commit()

۴. ذخیره اطلاعات کاربران

هنگامی که یک کاربر جدید با ربات تعامل می‌کند، اطلاعات او را در پایگاه داده ذخیره می‌کنیم. این کار را می‌توانیم در هندلر دستور /start انجام دهیم:

def start(update: Update, context: CallbackContext) -> None:
user = update.message.from_user
cursor.execute('''
INSERT OR IGNORE INTO users (user_id, username, first_name, last_name)
VALUES (?, ?, ?, ?)
''', (user.id, user.username, user.first_name, user.last_name))
conn.commit()
update.message.reply_text('سلام! به ربات من خوش آمدید.')

۵. بازیابی اطلاعات از پایگاه داده

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

def get_users():
cursor.execute('SELECT * FROM users')
return cursor.fetchall()

۶. به‌روزرسانی و حذف اطلاعات

برای به‌روزرسانی و حذف اطلاعات نیز می‌توانیم توابع مشابهی تعریف کنیم. برای مثال، به‌روزرسانی نام کاربری یک کاربر:

def update_username(user_id, new_username):
cursor.execute('''
UPDATE users
SET username = ?
WHERE user_id = ?
''', (new_username, user_id))
conn.commit()

راه‌اندازی و اجرای ربات

در نهایت، کد کامل ربات با اتصال به پایگاه داده به شکل زیر خواهد بود:

import sqlite3
from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext

TOKEN = 'YOUR_BOT_TOKEN'

conn = sqlite3.connect('bot_database.db')
cursor = conn.cursor()

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
last_name TEXT
)
''')
conn.commit()

def start(update: Update, context: CallbackContext) -> None:
user = update.message.from_user
cursor.execute('''
INSERT OR IGNORE INTO users (user_id, username, first_name, last_name)
VALUES (?, ?, ?, ?)
''', (user.id, user.username, user.first_name, user.last_name))
conn.commit()
update.message.reply_text('سلام! به ربات من خوش آمدید.')

def help_command(update: Update, context: CallbackContext) -> None:
update.message.reply_text('چطور می‌توانم به شما کمک کنم؟')

def echo(update: Update, context: CallbackContext) -> None:
update.message.reply_text(update.message.text)

def main():
updater = Updater(TOKEN)

dispatcher = updater.dispatcher

dispatcher.add_handler(CommandHandler("start", start))
dispatcher.add_handler(CommandHandler("help", help_command))
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))

updater.start_polling()
updater.idle()

if __name__ == '__main__':
main()

این کد رباتی ایجاد می‌کند که به دستورات /start و /help پاسخ می‌دهد و اطلاعات کاربران را در یک پایگاه داده SQLite ذخیره می‌کند. 🎉

امیدوارم از این آموزش لذت برده باشید! برای دیدن آموزش‌های بیشتر، کانال ما را دنبال کنید.
[کانال تلگرام]

#پایتون #آموزش_پایتون #ربات_تلگرام #برنامه_نویسی #python #telegram_bot
Forwarded from Python3
🚀 آموزش تعامل و ارتباط بین توابع در پایتون

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

تعریف توابع مستقل
ابتدا توابع ساده و مستقل را تعریف می‌کنیم. این توابع هر کدام یک وظیفه خاص را انجام می‌دهند. به عنوان مثال:

def add(a, b):
return a + b

def subtract(a, b):
return a - b

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

def calculate(a, b):
sum_result = add(a, b)
subtract_result = subtract(a, b)
return sum_result, subtract_result

result = calculate(10, 5)
print(result) # Output: (15, 5)

ارسال توابع به عنوان آرگومان
در پایتون، توابع می‌توانند به عنوان آرگومان به دیگر توابع ارسال شوند. این ویژگی به ما امکان می‌دهد که رفتار توابع را تغییر دهیم. به عنوان مثال:

def apply_operation(a, b, operation):
return operation(a, b)

result_add = apply_operation(10, 5, add)
result_subtract = apply_operation(10, 5, subtract)
print(result_add) # Output: 15
print(result_subtract) # Output: 5

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

def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)

print(factorial(5)) # Output: 120

توابع داخلی (Nested Functions)
توابع داخلی یا توابع تو در تو، توابعی هستند که داخل توابع دیگر تعریف می‌شوند. این توابع تنها در داخل تابع خارجی قابل دسترسی هستند. به عنوان مثال:

def outer_function(text):
def inner_function():
print(text)
inner_function()

outer_function("Hello from nested function!") # Output: Hello from nested function!

🚩(بزن اینجا تا بیشتر یاد بگیری)🚩

#پایتون #آموزش #برنامه‌نویسی #توابع #تعامل_توابع #کدنویسی
👍1
Forwarded from Linux TV 🐧
تخفیف ویژه
🚀ربات ادر ‌‌گروه به گروه تلگرام 🎉
زبان برنامه نویسی: پایتون 🐍

ویژگی های منحصر به فرد
- اتصال مستقیم به ربات [@SpamBot] 🔥
- کدهای پرسرعت و بهینه با استفاده از تکنولوژی async 🧹
- کانفیگ آسان و راحت 🎛️
- رابط کاربری آسان و پیشرفته
- پشتیبانی آنلاین

🎁 هدیه ویژه: با خرید این سورس، کانفیگ رایگان برای شما انجام می‌شود  🙌

🌟 مزایای این ربات در مقایسه با خرید ممبر:
- استفاده ی نامحدود
- صرفه‌جویی در زمان و هزینه
- افزایش اعضای مفید گروه با کمترین هزینه
عکس های از محیط ربات
تست رایگان: شما همین الان می توانید به آیدی زیر پیام دهید و از دو روز تست رایگان این سورس بهره مند شوید 🎉

🟢 برای اطلاع از قیمت و خرید:
[ @linux7563_def ]
Forwarded from Python3
پارت ۱: معرفی آرایه‌ها 📚📊

سلام دوستان! 🌟 به سری دوم آموزش‌های "ساختمان داده‌ها" خوش آمدید! در این سری، به بررسی دقیق‌تر آرایه‌ها و لیست‌های پیوندی خواهیم پرداخت. پارت اول این سری به آرایه‌ها اختصاص دارد. آماده‌اید؟ شروع کنیم! 🚀

آرایه چیست؟ 🤔

آرایه (Array) یک ساختار داده‌ای است که مجموعه‌ای از عناصر هم‌نوع (مانند اعداد صحیح، اعشار یا کاراکترها) را در یک فضای حافظه پیوسته ذخیره می‌کند. هر عنصر در آرایه با استفاده از یک اندیس (index) قابل دسترسی است.

مثال:
فرض کنید آرایه‌ای به نام arr داریم که ۵ عدد صحیح را ذخیره می‌کند:

arr = [10, 20, 30, 40, 50]

در اینجا، arr[0] مقدار 10 و arr[4] مقدار 50 را برمی‌گرداند.

انواع آرایه‌ها 🧩

1. آرایه‌های یک‌بعدی:
- ساده‌ترین نوع آرایه، که عناصر را به صورت خطی ذخیره می‌کند.
- مثال: arr = [1, 2, 3, 4, 5]

2. آرایه‌های دوبعدی:
- آرایه‌هایی که عناصر را در قالب سطرها و ستون‌ها ذخیره می‌کنند.
- برای نمایش ماتریس‌ها و جداول استفاده می‌شوند.
- مثال:

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

3. آرایه‌های چندبعدی:
- آرایه‌هایی با بیش از دو بعد، که برای نمایش داده‌های پیچیده‌تر به کار می‌روند.
- در مواردی مثل پردازش تصاویر سه‌بعدی یا داده‌های چندبعدی استفاده می‌شوند.

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

1. مزایا 🌟
- دسترسی سریع: با استفاده از اندیس می‌توان به سرعت به هر عنصر دسترسی پیدا کرد. پیچیدگی زمانی دسترسی به عناصر آرایه O(1) است.
- ساده و کاربردی: پیاده‌سازی و استفاده از آرایه‌ها در بسیاری از زبان‌های برنامه‌نویسی ساده است.
- استفاده بهینه از حافظه: حافظه به صورت پیوسته تخصیص داده می‌شود که باعث بهبود کارایی می‌شود.

2. معایب ⚠️
- اندازه ثابت: پس از تعریف آرایه، نمی‌توان اندازه آن را تغییر داد. این موضوع ممکن است باعث هدررفت حافظه یا کمبود فضا شود.
- هزینه بالای درج و حذف: برای درج یا حذف یک عنصر، ممکن است نیاز به جابجایی بسیاری از عناصر باشد که پیچیدگی زمانی O(n) دارد.

کاربردهای آرایه‌ها در برنامه‌نویسی 💻

آرایه‌ها به دلیل سادگی و کارایی بالا، در بسیاری از الگوریتم‌ها و برنامه‌های مختلف کاربرد دارند:

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

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

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

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

#آرایه‌ها #ساختمان_داده‌ها #برنامه‌نویسی #پایتون #آموزش
Forwarded from Python3
پارت ۲: عملیات پایه روی آرایه‌ها 🔄🛠️

سلام دوستان! 🌟 در پارت دوم از سری آموزش‌های "آرایه‌ها و لیست‌های پیوندی"، به بررسی عملیات پایه‌ای که می‌توان روی آرایه‌ها انجام داد، می‌پردازیم. این عملیات شامل درج، حذف، جستجو و به‌روزرسانی عناصر در آرایه‌ها است. همچنین با پیچیدگی زمانی هر عملیات نیز آشنا خواهیم شد. آماده‌اید؟ شروع کنیم! 🚀

۱. درج (Insertion) در آرایه ✏️

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

پیچیدگی زمانی: درج در ابتدای آرایه یا میانه آن O(n) است، در حالی که درج در انتها O(1) است.

مثال کد:
def insert(arr, index, value):
if index >= len(arr):
arr.append(value)
else:
arr.insert(index, value)

arr = [10, 20, 30, 40]
insert(arr, 2, 25) # آرایه بعد از درج: [10, 20, 25, 30, 40]
print(arr)

۲. حذف (Deletion) از آرایه

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

پیچیدگی زمانی: حذف از ابتدای آرایه یا میانه آن O(n) است، در حالی که حذف از انتها O(1) است.

مثال کد:
def delete(arr, index):
if index < len(arr):
arr.pop(index)

arr = [10, 20, 30, 40]
delete(arr, 1) # آرایه بعد از حذف: [10, 30, 40]
print(arr)

۳. جستجو (Search) در آرایه 🔍

جستجو به معنای یافتن یک عنصر خاص در آرایه است. دو روش رایج برای جستجو عبارتند از:
1. جستجوی خطی (Linear Search): از ابتدا تا انتها آرایه را برای یافتن عنصر مورد نظر جستجو می‌کنیم.
2. جستجوی دودویی (Binary Search): برای آرایه‌های مرتب، جستجو به روش تقسیم و تسخیر انجام می‌شود.

پیچیدگی زمانی:
- جستجوی خطی O(n) است.
- جستجوی دودویی O(log n) است.

مثال کد (جستجوی خطی):
def linear_search(arr, value):
for i in range(len(arr)):
if arr[i] == value:
return i
return -1

arr = [10, 20, 30, 40]
index = linear_search(arr, 30) # خروجی: 2
print("Index of 30:", index)

۴. به‌روزرسانی (Update) عنصر در آرایه 🔄

به‌روزرسانی به معنای تغییر مقدار یک عنصر خاص در آرایه است. این عملیات بسیار سریع است زیرا فقط به اندیس عنصر مورد نظر نیاز داریم.

پیچیدگی زمانی: به‌روزرسانی O(1) است.

مثال کد:
def update(arr, index, value):
if index < len(arr):
arr[index] = value

arr = [10, 20, 30, 40]
update(arr, 2, 35) # آرایه بعد از به‌روزرسانی: [10, 20, 35, 40]
print(arr)

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

#آموزش #برنامه‌نویسی #ساختمان_داده‌ها
Forwarded from Python3
ادامه پارت ۲: جستجوی دودویی (Binary Search) در آرایه 🔍📈

جستجوی دودویی یکی از کارآمدترین روش‌ها برای یافتن یک عنصر در یک آرایه مرتب‌شده است. این روش از رویکرد "تقسیم و تسخیر" (Divide and Conquer) استفاده می‌کند و پیچیدگی زمانی آن به صورت لگاریتمی است.

چگونه جستجوی دودویی کار می‌کند؟ 🤔

1. ابتدا، عنصر میانی (وسط) آرایه را پیدا کنید.
2. اگر عنصر مورد نظر کمتر از عنصر میانی است، جستجو را در نیمه چپ آرایه ادامه دهید.
3. اگر عنصر مورد نظر بیشتر از عنصر میانی است، جستجو را در نیمه راست آرایه ادامه دهید.
4. اگر عنصر میانی برابر با عنصر مورد نظر است، جستجو به پایان می‌رسد و اندیس آن بازگردانده می‌شود.
5. این فرآیند را تا زمانی که عنصر مورد نظر پیدا شود یا آرایه به بخش‌های کوچکتر تقسیم شود ادامه دهید.

پیچیدگی زمانی 🔄

پیچیدگی زمانی جستجوی دودویی O(log n) است، که بسیار سریع‌تر از جستجوی خطی با پیچیدگی O(n) است، به شرطی که آرایه مرتب باشد.

مثال کد:
در اینجا یک پیاده‌سازی از جستجوی دودویی در پایتون آمده است:

def binary_search(arr, value):
low = 0
high = len(arr) - 1

while low <= high:
mid = (low + high) // 2

if arr[mid] == value:
return mid
elif arr[mid] < value:
low = mid + 1
else:
high = mid - 1

return -1 # در صورتی که عنصر پیدا نشود

arr = [10, 20, 30, 40, 50, 60]
index = binary_search(arr, 40) # خروجی: 3
print("Index of 40:", index)

در این مثال، ابتدا آرایه مرتب شده arr داریم. سپس از تابع binary_search برای یافتن عنصر 40 استفاده می‌کنیم. این تابع مقدار 3 را که اندیس عنصر 40 است، بازمی‌گرداند.

نکات مهم در مورد جستجوی دودویی ⚠️

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

جمع‌بندی 🎯

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

با این توضیحات، پارت ۲ تکمیل شد. در پارت بعدی به بررسی لیست‌های پیوندی تک‌پیوندی خواهیم پرداخت.

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

#آرایه‌ها #جستجوی_دودویی #ساختمان_داده‌ها #برنامه‌نویسی #پایتون #آموزش
Forwarded from Python3
پارت ۳: لیست‌های پیوندی تک‌پیوندی 🔗📘

سلام دوستان! 🌟 در پارت سوم از سری آموزش‌های "آرایه‌ها و لیست‌های پیوندی"، به بررسی یکی از ساختارهای داده‌ای مهم به نام لیست‌های پیوندی تک‌پیوندی (Singly Linked Lists) می‌پردازیم. لیست‌های پیوندی یک ساختار داده‌ای قدرتمند و منعطف هستند که در بسیاری از کاربردهای برنامه‌نویسی استفاده می‌شوند. بیایید شروع کنیم! 🚀

لیست پیوندی تک‌پیوندی چیست؟ 🤔

یک لیست پیوندی تک‌پیوندی مجموعه‌ای از نودها (Node) است که هر نود شامل دو بخش است:
1. داده (Data): مقداری که می‌خواهیم در لیست ذخیره کنیم.
2. اشاره‌گر (Pointer): اشاره‌گری که به نود بعدی در لیست اشاره می‌کند.

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

تفاوت لیست پیوندی با آرایه‌ها ⚖️

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

پیاده‌سازی لیست پیوندی تک‌پیوندی در پایتون 🛠️

در اینجا یک پیاده‌سازی ساده از لیست پیوندی تک‌پیوندی در پایتون آمده است.

class Node:
def __init__(self, data):
self.data = data # ذخیره داده
self.next = None # اشاره‌گر به نود بعدی

class LinkedList:
def __init__(self):
self.head = None # سر لیست (شروع لیست)

def insert_at_end(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node

def display(self):
current = self.head
while current:
print(current.data, end=" -> ")
current = current.next
print("None")

# مثال استفاده
ll = LinkedList()
ll.insert_at_end(10)
ll.insert_at_end(20)
ll.insert_at_end(30)
ll.display() # خروجی: 10 -> 20 -> 30 -> None

در این پیاده‌سازی:
- کلاس Node یک نود ساده را تعریف می‌کند که شامل داده و اشاره‌گر به نود بعدی است.
- کلاس LinkedList ساختار لیست پیوندی را تعریف می‌کند و شامل متدهایی برای اضافه کردن نود در انتهای لیست (insert_at_end) و نمایش لیست (display) است.

مزایا و معایب لیست‌های پیوندی تک‌پیوندی ⚠️

1. مزایا 🌟
- افزایش و کاهش اندازه پویا: لیست پیوندی می‌تواند به راحتی گسترش یا کوچک شود.
- درج و حذف سریع‌تر: عملیات درج و حذف بدون نیاز به جابجایی سایر عناصر انجام می‌شود.
- استفاده بهینه از حافظه: برای ذخیره داده‌ها به همان اندازه حافظه استفاده می‌شود که مورد نیاز است.

2. معایب ⚠️
- دسترسی خطی: برای دسترسی به یک عنصر خاص باید از ابتدای لیست شروع کنید، که می‌تواند زمان‌بر باشد.
- استفاده بیشتر از حافظه: هر نود به یک اشاره‌گر اضافی نیاز دارد که حافظه بیشتری مصرف می‌کند.

نتیجه‌گیری 🎯

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

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

#لیست_پیوندی #برنامه‌نویسی #ساختمان_داده‌ها #پایتون #آموزش
Forwarded from Python3
پارت ۴: عملیات پایه روی لیست‌های پیوندی تک‌پیوندی 🔄🔗

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

۱. درج (Insertion) در لیست پیوندی ✏️

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

پیچیدگی زمانی:
- درج در ابتدای لیست O(1) است.
- درج در انتهای لیست O(n) است (زیرا باید تا انتهای لیست پیمایش کنیم).
- درج در وسط لیست O(n) است (زیرا باید محل دقیق درج را پیدا کنیم).

مثال کد:
class LinkedList:
def __init__(self):
self.head = None

def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node

def insert_at_end(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node

def insert_after(self, prev_node, data):
if prev_node is None:
print("Previous node must be in the list.")
return
new_node = Node(data)
new_node.next = prev_node.next
prev_node.next = new_node

ll = LinkedList()
ll.insert_at_beginning(10)
ll.insert_at_end(20)
ll.insert_after(ll.head, 15) # درج 15 بعد از نود 10
ll.display() # خروجی: 10 -> 15 -> 20 -> None

۲. حذف (Deletion) از لیست پیوندی

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

پیچیدگی زمانی:
- حذف از ابتدای لیست O(1) است.
- حذف از انتهای لیست O(n) است.
- حذف از وسط لیست O(n) است.

مثال کد:
class LinkedList:
def delete_node(self, key):
current = self.head

if current and current.data == key:
self.head = current.next
current = None
return

prev = None
while current and current.data != key:
prev = current
current = current.next

if current is None:
return

prev.next = current.next
current = None

ll = LinkedList()
ll.insert_at_end(10)
ll.insert_at_end(20)
ll.insert_at_end(30)
ll.delete_node(20) # حذف نود با مقدار 20
ll.display() # خروجی: 10 -> 30 -> None

۳. جستجو (Search) در لیست پیوندی 🔍

جستجو به معنای یافتن یک نود خاص در لیست پیوندی است. برای این کار باید از ابتدا تا انتهای لیست پیمایش کنیم تا نود مورد نظر را پیدا کنیم.

پیچیدگی زمانی: جستجو در لیست پیوندی O(n) است.

مثال کد:
class LinkedList:
def search(self, key):
current = self.head
while current:
if current.data == key:
return True
current = current.next
return False

ll = LinkedList()
ll.insert_at_end(10)
ll.insert_at_end(20)
ll.insert_at_end(30)
found = ll.search(20) # خروجی: True
print("Found 20:", found)

۴. به‌روزرسانی (Update) نود در لیست پیوندی 🔄

به‌روزرسانی به معنای تغییر مقدار یک نود خاص در لیست پیوندی است. برای این کار باید نود مورد نظر را پیدا کرده و داده آن را تغییر دهیم.

پیچیدگی زمانی: به‌روزرسانی O(n) است.
Forwarded from Python3
مثال کد:
class LinkedList:
def update(self, old_data, new_data):
current = self.head
while current:
if current.data == old_data:
current.data = new_data
return True
current = current.next
return False

ll = LinkedList()
ll.insert_at_end(10)
ll.insert_at_end(20)
ll.insert_at_end(30)
updated = ll.update(20, 25) # تغییر مقدار نود 20 به 25
ll.display() # خروجی: 10 -> 25 -> 30 -> None

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

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

#لیست_پیوندی #برنامه‌نویسی #ساختمان_داده‌ها #پایتون #آموزش
پ