| کانال توسعه‌دهندگان پایتون |
6.61K subscribers
38 photos
2 videos
4 files
43 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🔶 ماژول itertools توابعی را در اختیار قرار می‌دهد که به شما امکان ایجاد ایتریتورهای مختلف و کارهایی را که معمولا با استفاده از حلقه‌های while و for انجام می‌شوند، به راحتی و با کمترین کد ممکن را می‌دهد.

🔷 این ماژول همچنین کلاس‌هایی دارد که به شما امکان می‌دهد دو یا چند ایتریتور را ترکیب یا فیلتر کنید، ترتیب عناصر را تغییر دهید و بسیاری از عملیات‌های دیگر را بر روی ایتریتورها انجام دهید.

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


🔸 در ادامه، به توضیح هر یک از اجزای ماژول itertools می‌پردازیم.

#itertools #iterable #iterator #Module

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍4🔥3
🔸 توضیح اجزای ماژول itertools
🔹 پارت یک

🔘 itertools.count(start, step)
🔸 کلاس count یک شمارنده ایجاد می کند که به طور پیش‌فرض از عدد صفر شروع می کند و به طور پیوسته به بی نهایت ادامه پیدا می کند.
🔹این کلاس در پایتون دو پارامتر اختیاری به نام‌های start و step دارد. پارامتر start مشخص می‌کند از کدام عدد باید شروع به تولید دنباله کنیم و پارامتر step تعداد فاصله‌های بین اعداد را تعیین می‌کند.

💡مثال
counter = itertools.count(30, 10)

print(next(counter)) # 30
print(next(counter)) # 40
print(next(counter)) # 50


🔘 itertools.cycle(iterable)
🔸 کلاس cycle یک iterator برای تکرار یک iterable به صورت بی‌نهایت ایجاد می‌کند.
🔹در پایتون، iterable ها نمی‌توانند تکرارپذیر باشند و برای دوباره استفاده از آن‌ها، باید iterable ها را مجدداً تعریف کرد. اما با استفاده از کلاس cycle می‌توانید به سادگی این محدودیت را نادیده بگیرید و iterable را به صورت یک حلقه نامتناهی تکرار کنید.

💡مثال
cycle = itertools.cycle([1, 2])

print(next(cycle)) # 1
print(next(cycle)) # 2
print(next(cycle)) # 1


🔘 itertools.chain(*iterables)
🔸کلاس chain دو یا چند iterable را به عنوان ورودی می‌گیرد و آن‌ها را به صورت پشت سر هم در یک iterator واحد قرار می‌دهد.

💡مثال
iterator = itertools.chain([1, 2, 3], [4, 5, 6])

for item in iterator:
print(item) # 1, 2, ..., 6

#itertools #iterable #iterator #Module

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍3🔥2
🔸 توضیح اجزای ماژول itertools
🔹 پارت دو

🔸 کلاس repeat یک شیء و یک تعداد بار تکرار را به عنوان ورودی می‌گیرد و تکرار این مقدار را به تعداد مشخص شده تولید می‌کند.
🔹اگر به عنوان پارامتر times مقداری داده نشود، شیء داده شده برای بی‌نهایت بار تکرار خواهد شد.

💡مثال
iterator = itertools.repeat("AnyObject", 2)

for item in iterator:
print(item) # AnyObject, AnyObject


🔘 itertools.compress(data, selectors)
🔸کلاس compress یک iterable معمولی و یک iterable از مقادیر بولین با طول برابر (با تعداد مقادیر iterable اولیه) را به عنوان ورودی می‌گیرد و فقط مقادیری را که در مقابل هر مقدار بولینی که در ورودی داده شده است True هستند، در یک iterator تولید می‌کند.


💡مثال
values = ("A", "B", "C")
bools = (True, False, True)

iterator = itertools.compress(values, bools)

for item in iterator:
print(item) # A, C


🔘 itertools.filterfalse(predicate, iterable)
🔸کلاس filterfalse یک iterator و یک تابع پذیرنده گرفته و همانند تابع filter عمل می کند، با این تفاوت که در جایگاه شرط منفی تابع پذیرنده قرار می‌گیرد.

💡مثال
iterator = itertools.filterfalse(
lambda n: n % 2 == 0,
[1, 2, 3, 4, 5]
)

for item in iterator:
print(item) # 1, 3, 5

#itertools #iterable #iterator #Module

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍2🔥2
🔸 توضیح اجزای ماژول itertools
🔹 پارت سه

🔘 itertools.dropwhile(predicate, iterable)
🔸کلاس dropwhile برای حذف مقادیر اول یک iterable استفاده می‌شود. با دادن یک تابع برای بررسی به عنوان پارامتر اول و یک iterable به عنوان پارامتر دوم، این کلاس مقادیر iterable را از اولین مقداری که تابع داده شده برای آن درست نیست شروع به بازگشت می‌دهد.
🔹تفاوت اصلی بین dropwhile و تابع filter این است که dropwhile اجزای iterable را به ترتیب بررسی می‌کند و تا زمانی که شرط تعیین شده توسط تابع شرطی درست باشد، اجزا را رد می‌کند. ولی filter همه اجزای iterable را بررسی می‌کند و فقط اجزایی که شرط تعیین شده را برآورده می‌کنند را برمی‌گرداند.

💡مثال
iterator = itertools.dropwhile(
lambda x: x < 3,
[1, 2, 3, 4, 5]
)

for item in iterator:
print(item) # 3, 4, 5


🔘 itertools.groupby(iterable, key)
🔸کلاس groupby برای گروه‌بندی مقادیر یک iterable بر اساس یک تابع کلید استفاده می‌شود. با دادن یک iterable به عنوان پارامتر اول و یک تابع کلید به عنوان پارامتر دوم، groupby مقادیر iterable را بر اساس مقداری که تابع کلید برای آن‌ها برمی‌گرداند، گروه‌بندی می‌کند.

💡مثال
dicts = [
{"name": "Mona", "age": 21},
{"name": "Mina", "age": 21},
{"name": "Nima", "age": 23},
{"name": "Sina", "age": 23}
]

iterator = itertools.groupby(
dicts,
key=lambda x: x["age"]
)

for key, group in iterator:
print(key, list(group))

# 21 [{'name': 'Mona', 'age': 21}, {'name': 'Mina', 'age': 21}]
# 23 [{'name': 'Nima', 'age': 23}, {'name': 'Sina', 'age': 23}]


🔘 itertools.islice(iterable, start, stop, step)
🔸کلاس islice برای ساخت یک iterator از یک iterable با طول مشخص استفاده می‌شود.
🔹با دادن یک iterable به عنوان پارامتر اول و حداقل، حداکثر و فاصله‌های بین اندیس‌ها به عنوان پارامتر دوم، سوم و چهارم، islice یک iterator از مقادیر iterable با اندیس‌های مشخص شده ایجاد می‌کند.

💡مثال
iterable = range(10)

for i in itertools.islice(iterable, 1, 8, 2):
print(i) # 1, 3, 5, 7

#itertools #iterable #iterator #Module

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍2🔥2
🔸 توضیح اجزای ماژول itertools
🔹 پارت چهار

🔘 itertools.tee(iterable, n)
🔸تابع tee یک iterable را به عنوان ورودی دریافت می‌کند و چندین iterator مستقل از آن ترتیب را بازگردانده می‌کند.

💡مثال
iterators = itertools.tee([1, 2, 3, 4, 5], 3)

for iterator in iterators:
print(tuple(iterator))

# (1, 2, 3, 4, 5)
# (1, 2, 3, 4, 5)
# (1, 2, 3, 4, 5)


🔘 itertools.pairwise(iterable)
🔸کلاس pairwise یک ترکیب از دو مقدار پشت سر هم در یک iterable را برمی‌گرداند. به عبارت دیگر، این کلاس دو تا دو تا مقادیر iterable را در اختیار می‌گذارد و آن‌ها را به صورت زوج‌هایی از مقادیر متوالی برمی‌گرداند.
🔹استفاده از این کلاس، نیازمند استفاده از نسخه پایتون 3.10 یا بالاتر آن است.

💡مثال
for a, b in itertools.pairwise([1, 2, 3, 4]):
print(f"{a} & {b}")

# 1 & 2
# 2 & 3
# 3 & 4


🔘 itertools.batched(iterable, n)
🔸کلاس batched به شما امکان می دهد تا یک iterable را به دسته های مشخص تقسیم کنید و هر دسته را به صورت یک tuple برگردانید.
🔹استفاده از این کلاس، نیازمند استفاده از نسخه پایتون 3.12 یا بالاتر آن است.

💡مثال
iterator = itertools.batched([1, 2, 3, 4, 5, 6], 2)

for batch in iterator:
print(batch) # (1, 2), (3, 4), (5, 6)

#itertools #iterable #iterator #Module

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍4🔥2
💠 واسط گرافیکی یا GUI امکان ارتباط بین کاربر و دستگاه را فراهم می‌کند و شامل عناصری مانند buttonها، menuها، text boxها و سایر المان‌های گرافیکی است. این واسط به کاربر اجازه می‌دهد تا با استفاده از موس و کیبورد به راحتی با دستگاه ارتباط برقرار کند و کارهای متفاوتی انجام دهد.

💠 در کل، GUI برای افزایش راحتی در استفاده از دستگاه‌های مختلف بسیار مهم است و تقریباً در تمامی دستگاه‌های الکترونیکی مانند تلفن همراه، تبلت، لپ‌تاپ و کامپیوتر به کار می‌رود.

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

#GUI #Tkinter #PyQt #Kivy
#واسطه_گرافیکی #طراحی_واسط_کاربری

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍5🔥3
💠 معرفی مختصر چند واسطه گرافیکی محبوب در پایتون

🔰 تی‌کی‌اینتر (Tkinter): این واسط گرافیکی به صورت پیش فرض در پایتون موجود و استفاده از آن بسیار ساده و آسان است. با استفاده از این واسط گرافیکی می‌توانید برنامه‌های کاربردی مختلفی را طراحی کنید.

🔰 پای کیوتی (PyQt): این واسط گرافیکی بر پایه Qt توسعه داده شده و به‌مراتب قدرتمندتر از Tkinter است. PyQt بسیاری از المان‌های گرافیکی Qt را پوشش می‌دهد و برنامه‌نویسان امکان استفاده از آن‌ها را دارند.

🔰 دبلیوایکس‌پایتون (wxPython): این واسط گرافیکی بر پایه wxWidgets توسعه داده شده است و برای ساخت برنامه‌هایی که به طور خاص برای پلتفرم‌های مختلف طراحی شده‌اند، بسیار مناسب است.

🔰 پای‌جی‌تی‌کی (PyGTK): این واسط گرافیکی بر پایه GTK+ توسعه داده شده است و اجازه می‌دهد تا برنامه‌هایی با ظاهری مدرن و کاربر پسند طراحی کنید.

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

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

#GUI #Tkinter #PyQt #Kivy #PyGTK #wxPython
#واسطه_گرافیکی

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍5🔥3
💠 بررسی مزایا و معایب واسطه‌های گرافیکی محبوب در پایتون

🔰Tkinter
🔺نقاط قوت:
پیاده‌سازی آسان
قابلیت استفاده بر روی تمامی سیستم عامل‌ها
سرعت بالا در اجرای برنامه
مناسب برای پروژه‌های کوچک و ساده

🔻نقاط ضعف:
محدودیت در طراحی واسط کاربری پیشرفته
کیفیت ظاهری پایین‌تر نسبت به واسط‌های گرافیکی پیشرفته‌تر
عدم پشتیبانی از ویژگی‌هایی مانند انیمیشن و حرکت

🔰PyQt & PySide
🔺نقاط قوت:
امکان طراحی واسط کاربری پیشرفته و حرفه‌ای
پشتیبانی از ویژگی‌هایی مانند حرکت، انیمیشن
پشتیبانی از انواع مدیا و قابلیت اجرا بر روی پلتفرم‌های مختلف

🔻نقاط ضعف:
نیاز به یادگیری و استفاده از ساختارهای پیچیده
وزن بالای نرم‌افزار در مقایسه با واسط‌های گرافیکی سبک‌تر

🔰Kivy
🔺نقاط قوت:
قابلیت طراحی واسط کاربری دینامیک و تجربه کاربری خوب
پشتیبانی از تشخیص لمس و ویدئو
کاملاً متن‌باز و قابل استفاده بر روی انوع سیستم‌عامل‌های مختلف

🔻نقاط ضعف:
نیاز به تجربه برنامه‌نویسی با OpenGL
بزرگ بودن بسته نرم‌افزاری
پایین‌بودن سرعت اجرا در مقایسه با واسط‌های دیگر

🔰PyGTK
🔺نقاط قوت:
قابلیت طراحی واسط کاربری بصری
پشتیبانی از چندسکویی و اسکریپتینگ ساده
متن‌باز و قابل استفاده بر روی سیستم‌عامل‌های مختلف

🔻نقاط ضعف:
پشتیبانی از تشخیص لمس ضعیف
دارا بودن بسته نرم‌افزاری بزرگتر نسبت به واسط‌های دیگر

🔰wxPython
🔺نقاط قوت:
قابلیت طراحی واسط کاربری بصری
پشتیبانی از چندسکویی و بسیاری از ابزارهای اضافی
انعطاف‌پذیری و قابلیت گسترش بالا
متن‌باز و قابل استفاده بر روی سیستم‌عامل‌های مختلف

🔻نقاط ضعف:
دارا بودن بسته نرم‌افزاری بزرگتر نسبت به واسط‌های دیگر
سرعت پایین‌تر نسبت به واسط‌های دیگر

🔰PyGame
🔺نقاط قوت:
سادگی استفاده و آموزش برای مبتدیان
ارائه ابزارهایی برای طراحی بازی و کار با صدا و تصویر
امکان استفاده از کتابخانه‌های اضافی برای افزایش قابلیت‌ها

🔻نقاط ضعف:
محدودیت در قابلیت‌های گرافیکی نسبت به برخی واسط‌های گرافیکی دیگر
عدم پشتیبانی از اجزای چندرسانه‌ای پیشرفته مانند ویدئو و سه بعدی
پرفرمنس پایین‌تر در برخی موارد پردازشی و بازی‌های سنگین

#GUI #Tkinter #PyQt #Kivy #PyGTK #wxPython #PyGame
#واسطه_گرافیکی

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍9🔥2
💠 پاسخ به برخی از سوالات مطرح، درمورد واسط های گرافیکی در پایتون

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


کدام گزینه برای طراحی واسط گرافیکی در اندروید مناسب‌تر است؟
✔️ برای طراحی واسط گرافیکی اندروید در پایتون، می‌توانید از Kivy و BeeWare استفاده کنید. هر دو ابزار قابلیت ایجاد برنامه‌های اندرویدی را در پایتون دارند و به شما این امکان را می‌دهند که با استفاده از زبان پایتون، برنامه‌های اندرویدی با ظاهری زیبا و کارایی بالا طراحی کنید.
اما در مقایسه با Flutter که به زبان Dart نوشته شده است، این ابزارها دارای قابلیت‌ها و محبوبیت کمتری در بین توسعه‌دهندگان هستند. بنابراین در صورت امکان استفاده از واسط‌های ذکر شده را به عنوان انتخاب دوم در نظر بگیرید.


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


برای کسی که به‌تازگی در این راه قدم گذاشته است، کدام گزینه را پیشنهاد می‌دهید؟
✔️ برای این‌منظور PyQt گزینه مناسبی است. پای‌کیوتی واسط گرافیکی کارآمدی است که برای شروع کار با آن مستندات جامع و ویدئوهای آموزشی فراوانی وجود دارد. به علاوه، PyQt از Qt پشتیبانی می‌کند که یکی از قدرتمندترین چارچوب‌های واسط گرافیکی است و می‌توانید از ابزارهای طراحی واسط گرافیکی Qt به طور مستقیم در PyQt استفاده کنید.

#GUI #PyQt #wxPython
#واسطه_گرافیکی #واسطه_گرافیکی_اندروید #پاسخ_سوالات

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍5🔥2
📌 بررسی متدهای کاربردی ماژول random

🔶 ماژول random چیست؟
🔸 شرایطی را فرض کنید که نیاز دارید یک مقدار تصادفی تولید کنید و یا یک انتخاب رندوم داشته باشید. در این شرایط می‌توانید از ماژول random استفاده کنید.

🔻 مثلاً قرار هست یک بازی سنگ کاغذ قیچی بنویسید. اینجا تعداد حالت‌هایی که سیستم می‌تواند داشته باشه سه حالت [ سنگ(1)، کاغذ (2)، قیچی(3) ] است. مقادیر تولید شده توسط سیستم باید تصادفی باشد و قرار نیست یک عدد ثابت داده شود و سیستم هر دفعه مثلاً سنگ یا قیچی بدهد. در همچین شرایطی می‌توانیم از random استفاده کنیم.

🔶 متدها :

🔻 random()

▫️ متد random یک عدد float در بازه 0 و 1 تولید می‌کند که هیچ وقت برابر با 1 نیست.
import random
random.random()

🔻 randint()
▫️ متد randint دو پارامتر دریافت می‌کند که بازه تولید عدد تصادفی را مشخص می‌کند.
import random
random.randint(1, 50)
🔺 نکته‌ای که وجود داره اینه که اینجا بین 1 و 50 عدد رندوم تولید می‌کند که شامل عدد 50 هم می‌باشد.

🔻 randrange()
▫️ متد randrange سه پارامتر دریافت می‌کند. شروع (start)، پایان (end) و گام (step) مشخص می کند.

import random

random.randrange(50)
random.randrange(50, 100, 5)

🔺 در این کد یک عدد در بازه 0 تا 50 تولید می‌شود که تعداد گام برابر با یک است. در خط بعد یک عدد در بازه 50 تا 100 تولید می‌شود که تعداد گام برابر با 5 است.

🔺 shuffle
▫️ متد shuffle هم یک متد جالب و کاربردی است که برای به‌هم ریختن ترتیب اجزای دیتاست استفاده می‌شود. مثلا یک لیست به این ترتیب داریم.
[2, 5, 6, 3, 5]
وقتی روی لیست متد shuffle را فراخوانی می‌کنیم مقادیر داخل لیست به طور رندوم جابجا می‌شوند. مثلاً اینجا 2 اول لیست قرار داره ممکن وقتی به‌هم میریزد در ایندکس آخر قرار بگیرد.

import random

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

🔺 نکته‌ای که وجود دارد این است که متد shuffle خروجی ندارد.

🔷 ادامه متدها را در پست بعدی بررسی می‌کنیم ...

#random #randint #randrange #shuffle

👤 black@root

💎 Channel: @DevelopixPython
👍7🔥1
📌 بررسی متد های کاربردی ماژول random
🔘 در ادامه بررسی متد های random، درمورد سایر متد های کاربردی این ماژول صحبت کنیم.

🔻 seed()
▫️متد seed یک متد کاربردی است که اگر بخواهیم خیلی ساده توضیح دهیم، فرض کنید برای مثال پنج عدد رندوم تولید کردید و در طول اجرا برنامه می‌خواهید آن پنج عدد رندوم حفظ شوند و تغییری نکنند. مقداری که متد seed می تواند دریافت کند int, float, str, bytes یا bytearray می‌تواند باشد.

import random as rnd

rnd.seed(3)
rnd.ranint(1, 10)
rnd.ranint(1, 10)

rnd.seed(3)
rnd.ranint(1, 10)
rnd.ranint(1, 10)

🔹 نکته‌ای که وجود دارد این است که باید حتما یک مقدار برای seed قرار داده شود تا عمل کند و در صورتی که مقدار را None قرار بدهید (زمانی که هیچ مقداری قرار داده نشود) زمان سیستم مدنظر قرار می‌گیرد.

🔻 choice()
▫️متد choice برای انتخاب یک آیتم رندوم از یک دیتای sequence type است «دیتا های sequence شامل list, tuple و str می باشد»
import random as rnd

rnd.choice([2, 3, 4, 5])
rnd.choice("hello")
rnd.choice((2, 4, 2, 5))

🔹 نکته ای که وجود دارد این است که اگر مقدار خالی پاس داده شود، IndexError برگشت داده می‌شود.

🔻 sample
▫️ متد sample برای دریافت چند آیتم از یک دیتای sequence type می باشد. در متد choice ما فقط یک آیتم رندوم دریافت می‌کردیم، ولی در sample چند آیتم می توانیم دریافت کنیم.
import random as rnd
rnd.sample([1, 2, 3, 4], 2)

🔹 نکته ای که وجود دارد این است که متد sample دو پارامتر دریافت می کند (دیتا و تعداد)، که خروجی لیست می باشد. تا ورژن 3.11 مقدار set هم دریافت و تبدیل به لیست می کرد، ولی بعد از 3.11 امکان قرار دادن مقدار set وجود ندارد.

🔻 uniform()

▫️ آخرین متد uniform است که دو پارمتر دریافت می کند و بین بازه داده شده عدد رندوم از نوع float تولید می کند.
import random as rnd

print(rnd.uniform(1,10)) # 8.60002033646411

#random #sample #choice #seed #uniform

👤 black@root

💎 Channel: @DevelopixPython
👍4🔥1
💎 بررسی متد های رشته 💎

🧨 تو این پست قراره راجب تمام متدهای_رشته صحبت کنیم و از پر کاربردترین هاش شروع کنیم تا اونهایی که کاربرد زیادی ندارن.

🔷 join()

🔻 متد join زمانی استفاده میشه که قرار یک لیست رو تبدیل به یک رشته کنیم.
مقداری که متد join دریافت می کنه یک iterable است و در صورتی که مقداری غیر رشته ی قرار بدیم TypeError بر می گردونه که شامل bytes هم میشه.

data = ["python", "php", "js"]
print(",".join(data)) # python, php, js

🔸 از اونجایی که join یک متد برای str پس باید یک نمونه ی از کلاس str ایجاد کنیم و به وسیله اون نمونه می توانیم به متد های str دسترسی داشته باشیم. در قسمت print من نمونه ای از کلاس str ایجاد کردم و مقدارش برابر با "," که این به معنای این است، ایتم های یک لیست به وسیله مقدار داده شده از هم جدا شوند مثلا اگر به جای "," بزارید "-" :
python-php-js

🔹 lower() & casefold()
🔻 متد lower و casefold هر دو برای تبدیل حروف بزرگ به کوچک استفاده میشن. مثلا برای تبدیل HELLO به hello می توانید از هر دوی این متد ها استفاده کنید اما تفاوتی که وجود داره این که متد casefold نسبت به lower دقیق تره یعنی یک سریع کارکتر هایی مثل unicode که lower به درستی نمی تونه ساپورت کنه ولی casefold به راحتی این کار انجام میده.

print("HELLO".casefold()) # hello
print("HELLO".lower()) # hello

🔹 upper()
🔻 دقیقا برعکس متد بالایی عمل می‌کنه و برای تبدیل حروف کوچک به بزرگ مورد استفاده قرار می گیرد.
print("hello".upper()) # HELLO

🔹 startswith() & endswith()
🔻 اگر می خواهید بررسی کنید که شروع یا پایان یک رشته برابر با مقدار مورد نظرتون است، می توانید از این دو متد استفاده کنید.
text = "Hello, I'm black9root"

text.startswith("Hello") # True
text.endswith("black") # False


🔹 split()
▫️متد split برای تبدیل رشته به لیست مورد استفاده قرار می گیرد. این متد دو پارامتر دریافت می کند پارامتر اول بر چه اساسی جدا کند و دوم تعداد جداسازی ها.
print("py,php,cpp".split(",")) # ["py", "php", "cpp"]

print("python php cpp".split(maxsplit=1)) # ["py", "php cpp"]

🔸 در این تیکه کد مقادیر بر اساس "," از هم جدا شدند و اگه مقداری قرار نگیرد برای اساس فاصله از هم جدا می شود. همچنین می توانید با پارامتر maxsplit مشخص کنید چند آیتم جدا شود.

#string_method #lower #replace #split #join #upper #casefold

#متدهای_رشته

👤 black@root

💎 Channel: @DevelopixPython
👍3🔥1
💠 یادگیری نظارت شده

🌀 با یادگیری نظارت شده نوعی هوش مصنوعی ابداع شد که درنتیجه آن halcin کشف شد.

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

🔹 محققان ساختار مولکولی‌ را به هوش مصنوعی ارائه کردند که شاخصه آن‌ها میزان اثر بخشی آنها بود؛ سپس با توجه به ترکیبات جدید هوش مصنوعی اثر بخشی آنتی‌بیوتیک ها را برآورد می‌کرد.

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

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

🔸 برای این منظور، یک سری تصویر به هوش مصنوعی آموزش داده می‌شد تا یاد بگیرد که هر تصویر را با عنوانی مناسب مرتبط سازد. برای مثال تصویر یک گربه را با عنوان (گربه) مرتبط سازد. با توجه به اینکه رابطه بین تصویر‌ها و عنوان‌ها رمزگذاری شده بود، هوش مصنوعی قادر بود تصویر های جدید را به نحو صحیح شناسایی کند.

#Artificial_intelligence #AI #Deep_learning

👤 Dark Dante

💎 Channel: @DevelopixPython
👍9🔥2
⭕️ Binary Searching

🔻 یک الگوریتم جستجوی سریع در لیست های مرتب شده است که در آن به‌جای اینکه تمام آیتم های یک لیست را بررسی کنیم، فقط نصف آیتم‌ها را بررسی می کنیم تا آیتم موردنظر را پیدا کنیم.

🔻 این الگوریتم فقط مختص پایتون نیست و در سایر زبان ها نیز قابل پیاده‌سازی است. نکته‌ای که وجود دارد این است که حتما باید لیست sort (مرتب) شده باشد و در غیر اینصورت این متد کاربردی ندارد.

🔷 در حالت عادی برای بررسی وجود داشتن یا نداشتن یک آیتم در یک لیست (غیر از متدهایی که وجود دارد) روی لیست حلقه for پیاده سازی می‌کنید و تمام موارد موجود داخل لیست بررسی می‌شود که در این حالت روند به کندی پیش میرود و البته دیتاهایی که معمولا ما با آن‌ها سروکار داریم آن‌چنان بزرگ نیستند ولی برای دیتاهای خیلی بزرگ این روش اصلا بهینه نیست، چون تمام آیتم‌ها را بررسی می‌کند و اگر این لیست یک میلیارد آیتم داشته باشد و آیتم مورد نظر ما دقیقا وسط لیست قرار گرفته باشد باید 500 میلیون آیتم بررسی کند تا به مقدار درست برسد که این اصلا بهینه نیست و performance را به شدت پایین می‌آورد. حتی استفاده از متدهایی که وجود دارد برای این کار با این حجم از دیتا اصلا کار درستی نیست و به شدت روی performance تاثیر می‌گذارد و اگر این حالت به صورت binary searching پیاده سازی کنید دقیقا از وسط شروع می‌کند و خیلی سریع‌تر به جواب می‌رسید.

🔴 نحوه استفاده از Binary searching:

🔸 ابتدا سه متغیر تعریف می کنیم.
first = 0 # نقطه شروع لیست
last = len(lys)-1 # نقطه پایان لیست
index = -1 # ایندکس آیتم در صورت وجود، که پیش فرض وجود نداره

🔸 سپس یک حلقه بی‌نهایت ایجاد می‌کنیم و تا زمانی که first از last کمتر و مساوی باشد و مقدار index برابر -1 باشد این حلقه اجرا می‌شود و زمانی که index مقدارش عوض شود یعنی آیتم پیدا شده و نیاز به ادامه نیست.
while (first <= last) and (index == -1)

🔸 سپس مقدار first + last و تقسیم به 2 بدون قسمت اعشار که با این کار به جای اینکه از ابتدای لیست شروع کند از وسط لیست شروع می کند.

mid = (first + last) // 2 

if lys[mid] == val:
index = mid

elif val < lys[mid]:
last = mid - 1

else:
first = mid + 1

🔸 در شرط‌های ایجاد شده بررسی می کنیم که مقدار اگر برابر با val بود، index برابر با mid شود. اگر val کمتر از مقدار آن ایندکس بود، مقدار last برابر با mid - 1 شود. و اگر مقدار val بیشتر از آن بود، first برابر با mid + 1 شود. با این روش فقط نصف ایتم ها را بررسی می کنیم.

🔸 این حالت فقط روی اعداد قابل پیاده سازی است.

#Algorithm #Binary_searching
#الگوریتم

👤 black@root

💎 Channel: @DevelopixPython
👍5🔥1
💠 یادگیری بدون نظارت

🌀 در شرایطی که سازندگان فقط یک سری داده دارند و قصد دارند به نتایجی برسند که بی‌شک مفید باشند، از یادگیری بدون نظارت استفاده می کنند.

🔸 با‌ توجه به وجود اینترنت و دیجیتال شدن اطلاعات کسب‌و‌کارها، سازمان‌های دولتی و محققان بسیار راحت‌‎تر از گذشته به انبوهی از داده ها و بازار ها اطلاعات بیشتری از مشتریان در اختیار دارند، بیولوژیست ها به داده‌های بیشتری درباره DNA دسترسی دارند و مدیران باک‌ها از فعالیت‌های مالی بیشتری در فایل های خود خبر دارند.

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

🔸 در یادگیری نظارت نشده، داده‎های نمونه فقط شامل ورودی هستند. برای مثال خدمات ویدئویی چون Netflix از الگوریتم هایی استفاده می کنند تا مجموعه مشتریانی را پیدا کنند که عادت آن‌ها برای تماشا فیلم مشابه یکدیگر است تا بتوانند خدمات مستمری به مشتریان مزبور ارائه کنند. اما تنظیم دقیق چنین الگوریتمی می‌تواند پیچیده باشد؛ زیرا بیشتر مردمی که سلیقه های گوناگون دارند معمولاً به چندین گروه تقسیم می‌شوند.

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

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

#Artificial_intelligence #Deep_learning #AI

👤 Dark Dante

💎 Channel: @DevelopixPython
👍9
💠 یکی از کاربردهای Bitwise Operators

🌀 اگرچه در زبان‌های سطح پایین‌تر استفاده از Bitwise operatorها مرسوم هستش، در پایتون کمتر نیاز به حل مشکل با استفاده از آن‌ها می‌شود و عموماً از جایگزین‌های highlevel تری استفاده می‌کنیم. ولی دانستن اینکه چه کاری انجام می‌دهند، در برخی موارد می‌تواند مفید باشد.

🔰 فرض کنید می‌خواهیم با یک regex ساده یک عبارت را match کنیم:

import re
print(re.search("ABC.", "abc\n"))

🔸 مچ نشد! حالا کافی است به عنوان flag عدد ۱۸ داده شود:

print(re.search("ABC.", "abc\n", flags=18))

🔹 مچ شد! در واقع با دادن عدد ۱۸ به آن، گفته شد که حساس به حروف بزرگ و کوچک نباشد و کاراکتر‌هایی که مربوط به رفتن به لاین بعد می‌شوند را نقطه در نظر بگیرد. اما چطور با دادن عدد ۱۸ این اتفاق افتاد؟

🔸 موضوع اینجاست که یک سری flag از پیش تعریف شده داریم که توان‌های عدد ۲ هستند:

TEMPLATE = 1 -> 00000001
IGNORECASE = 2 -> 00000010
LOCALE = 4 -> 00000100
MULTILINE = 8 -> 00001000
DOTALL = 16 -> 00010000

🔹 ما درواقع بین IGNORECASE و DOTALL عملگر OR را گذاشتیم که شد: 00010010 (یا همان ۱۸)

🔸 حالا اگر کسی عدد ۱۸ را به ما بدهد، چگونه می‌توان فهمید کدام فلگ‌ها استفاده شدند؟ از عملگر AND استفاده می‌کنیم:
TEMPLATE = 1
IGNORECASE = 2
LOCALE = 4
MULTILINE = 8
DOTALL = 16

flag = 18

if flag & TEMPLATE:
print("Has TEMPLATE flag")

if flag & IGNORECASE:
print("Has IGNORECASE flag")

if flag & DOTALL:
print("Has DOTALL flag")

🔹 به جای پاس دادن عدد ۱۸، می‌توانیم به راحتی از عملگر "|" استفاده کنیم و هیچ مقداری را حفظ نکنیم:

print(re.search("ABC.", "abc\n", flags=IGNORECASE | DOTALL))

🔸 نکته‌ی مفید این بود که با استفاده از یک عدد، توانستیم این اطلاعات را منتقل کنیم.


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

EVENT_READ = (1 << 0)
EVENT_WRITE = (1 << 1)

🔸 اگر مقدار ماسک ۳ باشد، به معنی آن است که سوکت آماده برای خواندن و نوشتن است (همزمان قابلیت خواندن و نوشتن دارد). اگر مقدار ماسک ۲ باشد، سوکت فقط برای نوشتن آماده است و اگر ۱ باشد، سوکت فقط برای خواندن آماده است.

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

👤 SorousH

💎 Channel: @DevelopixPython
👍7🔥1
📌 Pass By Reference & Value

🔻 ارجاع بر اساس مقدار (pass by value) و ارجاع بر اساس مرجع (pass by reference) دو مفهومی است که معمولا در مباحث تابع مطرح می شود. اما معمولا در دوره های پایتون درباره‌ی این دو مفهموم صحبت نمیشه ولی بهتره که با این دو مفهموم آشنا باشیم.

🔺 قبل از اینکه شروع کنیم باید پیش زمینه‌ای از چگونگی قرار گیری متغیر در حافظه رم داشته باشیم.

🔺 در زبان پایتون زمانی که یک متغیر تعریف می‌کنیم یک آدرس در حافظه‌ی رم به متغیر اختصاص داده می‌شود و مقدار متغیر در آن آدرس قرار می گیرد که شما می توانید با استفاده از تابع id آدرس متغیر رو پیدا کنید. برای مثال :

Var = 20
print(id(Var)) # Output : 94587526803432

🔸 نکته‌ ای که وجود دارد این است که آدرس متغیر در حافظه رم ثابت نیست و با هر بار اجرای برنامه، مقدار عوض می شود.

🔺 در زبان های سطح پایین مثل C شما می توانید با استفاده از آدرس متغیر مقدار آن را در حافظه تغییر بدید ولی در زبان های سطح بالا مثل پایتون امکان تغییر مقدار متغیر با استفاده از آدرس آن در حافظه رم وجود نداره.
برای مثال : در زبان C++ می توانید با تعریف یک پوینتر (pointer) مقدار آدرس را عوض کنید.

int age = 10; 
int *address = &age;
*address = 15;
cout << age; // برای چاپ مقدار


🔸 در خط اول یک متغیر از نوع اعداد صحیح ایجاد کردیم و مقدار رو برابر با 10 قرار دادیم؛ بعد یک متغیر پوینتر (برای ذخیره آدرس متغییر) ایجاد کردم سپس آدرس (علامت & مانند تابع id عمل می کنه) متغییر age را در address ذخیره کردم و در لاین بعد مقدار متغیر را به طور غیر‌مستقیم تغییر دادم یعنی به جای نوشتن :
age = 15

به طور غیر مستقیم با استفاده از آدرس متغیر در حافظ رم مقدار متغیر را تغییر دادم.

🔻 با گفتن موارد بالا وقتشه بریم سراغ مطلب اصلی. در زبان های سطح پایین به دو صورت می‌توانید به تابع مقدار ارسال کنید:
1️⃣ مقدار متغیر را ارسال کنید (pass by value).
2️⃣ آدرس متغیر را ارسال کنید (pass by reference).

🔸 در حالت اول شما کپی از متغیر را ارسال می کنید، در واقع یک متغیر در حافطه رم ایجاد می شود. از اونجایی که پایتون از این روش برای ارسال متغیر به سمت تابع استفاده نمی‌کنه مجبوریم مثال از C++ بزنیم تا این موضوع رو درک کنید.

int age = 10;
cout << &age; // output 94587526803432

int hello(age){
cout<<&age; // output 94503976803514
}

hello(age);

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

🔸 در حالت دوم شما آدرس متغیر را ارسال می کنید که تغییرات اعمال شده مستقیما روی متغیر اصلی صورت می‌گیرد.

🔻 روشی که پایتون برای ارسال مقدار به سمت تابع استفاده می‌کند به صورت pass by reference است.
برای مثال :
li = ['python', 'php', 'java']

def change(li:list):
li[0] = "None"

change(li)
print(li) # ['None', 'php', 'java']

🔸 از اونجایی که پایتون به صورت pass by reference عمل می‌کند، آدرس لیست به سمت تابع ارسال می‌شود که هر تغییر صورت بگیرد روی متغیر global صورت می‌گیرد.
به این مثال توجه کنید :
age = 10

def change(num):
age = 50

change(age)
print(age) # 10

🔸 در این تیک کد مقدار age داخل تابع تغییر کرده ولی زمانی که مقدار متغیر را پرینت می‌گیریم هیچ تغییری صورت نگرفته 🤔 اما چرا ؟
قبل از پاسخ دادن به این سوال باید یک چیز را بررسی کنیم در مثال اولی که برای حالت دوم مطرح کردیم یک لیست به سمت تابع ارسال می شود که لیست یک دیتاتایپ mutable (تغییر پذیر) و در مثال دوم اعداد صحیح یک دیتا تایپ immutable (تغییر ناپذیر) است.

🔹 پس در پاسخ به این سوال می‌توان گفت مقداری که به سمت توابع ارسال می‌شود، در صورتی که mutable باشد تغییرات روی متغییر ارسالی اعمال می شود و در غیراینصورت تغییر روی متغییر صورت نمی‌گیرد.

#pass_by_reference #pass_by_value

👤 black@root

💎 Channel: @DevelopixPython
👍3