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

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

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
💠 ماژول OS

🔺 این ماژول کاربردی برای تعامل با سیستم‌عامل به طور پیش‌فرض روی نسخه های پایتونی وجود داره. در ادامه متدهای کاربردی اون رو بررسی می کنیم.

🔻 os.name -> str
🔘 تشخیص نوع سیستم عامل:
os.name # "nt" # windows
os.name # "posix" # linux or MacOS


🔻 os.getcwd() -> str
🔘 دریافت مسیر فعلی.


🔻os.rename(path, newPath)
🔘 تغییر اسم فایل و دایرکتوری:
os.rename("Path/OldName.md", "Path/NewName.md")
os.rename("Path", "NewPath")


🔻 os.access(path, mode) -> bool
🔘 بررسی سطح دسترسی به یک فایل:
Modes :
— F_OK # find
— R_OK # readable
— W_OK # writable
— X_OK # executable

os.access("idk/os.py", os.R_OK) # True



🔻os.listdir(path) -> list
🔘 دریافت لیست فایل و دایرکتوری ها در مسیر مشخص شده.
🔘 در صورتی که مقداری قرار ندید مسیر فعلی رو در نظر می گیره.
os.listdir(
) # ["file_x", "dir_y"]


🔻os.mkdir(path)
🔘 ایجاد دایرکتوری:
os.mkdir("DPX")
os.listdir() #
["file_x", "dir_y", "DPX"]



🔻os.chdir(path)
🔘 تغییر مسیر فعلی:
os.getcwd() # "Path"

os.chdir("NewPath")
os.getcwd() # "NewPath"



🔻os.environ -> dict
🔘 دریافت متغییر های محیطی سیستم عامل.



🔻os.getlogin() -> str
🔘 دریافت نام کاربری که به سیستم لاگین کرده.
os.getlogin() # "coder"



🔻os.walk(path) => generator
🔘 دریافت محتوای یک دایرکتوری و ساب دایرکتوری ها.
os.walk("Path") # [ (address, [folders], [files]) ]


🔻os.makedirs(path)
این متد مثل متد mkdir برای ایجاد فایل مورد استفاده قرار می گیره. ولی تفاوتی که با متد قبلی داره اینه که در متد قبلی وقتی داخل یک دایرکتوری یک دایرکتوری ایجاد می کنیم، باید دایرکتوری اولی وجود داشته باشه تا دایرکتوری دوم ایجاد بشه ولی تو makedirs این مشکل وجود نداره.
os.listdir() # ["file_x", "dir_y"]

os.mkdir("D1/D2/D3")
# Error : FileNotFoundError

os.makedirs("D1/D2/D3")



🔻os.remove(path)
🔘 حذف فایل.

🔻os.rmdir(path)
🔘 حذف دایرکتوری هایی که محتوایی در آن قرار ندارد.

🔻os.system(command)
🔘 اجرا دستورات سیستمی.


💠 منبع :
◽️ https://docs.python.org/3/library/os.html

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
👍14
💠 ماژول Shutil

🔺 این ماژول برای کار با فایل مورد استفاده قرار می گیره. در ادامه به بررسی متدهای این ماژول می پردازیم.

🔻shutil.copyfile(path, newPath)
🔘 برای کپی فایل
shutil.copyfile("File.txt", "Dir/NewFile.txt")


🔻 shutil.copy(path, newPath)
🔘 این متد عملکرد متد copyfile داره ولی امکان تغییر اسم فایل وجود نداره و فقط کافیه اسم دایرکتوری مورد نظر بنویسید.
shutil.copy("File.txt", "Dir") # copy file "Dir\File.txt"



🔻shutil.copy2(path, newPath)
🔘 این متد دقیقا عملکرد متد copy داره ولی تفاوتی که وجود داره اینه که متادیتا های فایل رو هم انتقال میده.



🔻shutil.copytree(path, newPath)
🔘 کپی تمام محتوای یک دایرکتوری، نکته‌ایی که وجود داره اینه که باید مقداری که به جای newPath قرار میدید آدرس یک دایرکتوری که از قبل وجود نداره باشه.


🔻shutil.rmtree(path)
🔘 برای حذف دایرکتوری به همراه تمام محتوای موجود در اون استفاده میشه.


🔻shutil.move(path, newPath)
🔘 انتقال فایل.

💠 منبع :
◽️ https://docs.python.org/3/library/shutil.html

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
👍15
💢 معرفی میکرو فریمورک‌ فلسک

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

یکی از بهترین‌ میکرو فریمورک‌های پایتون برای کار در حوزه وب میکرو فریمورک Flask است که توسط Armin Ronacher با زبان Python طراحی و نوشته شده است و از سال 2010 تحت لایسنس BSD در انتشار عموم قرار گرفته است.

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

با وجود سادگی، Flask قدرت زیادی دارد و شرکت‌های بزرگی مانند LinkedIn، Netflix و Reddit از آن استفاده کرده‌اند.

ویژگی‌های Flask به طور خلاصه عبارتند از:

- استفاده از الگوی Jinja
- مستندات ساده و جامع
- سازگاری با WSGI
- امکان ساخت کوکی‌هایی با امنیت بالا

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

👤 Maryam

💎 Channel: @DevelopixPython
👍92
HashMaps به بیان ساده:
قرار هست ببینیم associative array چیه، hashmap چیه، چه ارتباطی به dictionary داره، ویژگی هاشون چیه، hash collision چیه، چطور برطرف میشن، نمونه خیلی سادش رو پیاده سازی کنیم و در انتها یه نمونه کامل هم ببینیم ازش.

خب... زمانی که ما یک سری دیتا داریم که به هم مرتبط هستن میتونیم اون ها رو توی یه collection نگهداری کنیم مثلا array. اطلاعاتی مثل تمام نمرات دانش آموزان یک کلاس:
grades = [17, 19, 18, ...]
و با ایندکس های عددی بهشون دسترسی پیدا کنیم:
grades[2]
خیلی هم سریع هستن array ها تو دسترسی چون مستقیم میریم سراغ همون نمره ای که نیاز داریم.
مشکل کجاست؟
مشکل اینه که برای ما سخته حفظ کنیم کدوم ایندکس برای کدوم شخص بوده و ترجیح میدیم که اگه نمره ی شخصی رو میخوایم به جای اینکه یه عدد بی معنی بدیم، اسمش رو بدیم و نمرش رو بگیریم:
grades["ali"]
راه حل چیه؟
اینکه اسمش رو(که بهش میگیم کلید) متصل یا مربوط یا "associate" بکنیم به نمرش.
چطوری؟ مثلا:
grades = [("reza", 17), ("sara", 19), ("ali", 18)]
و بعد هم اینجوری میگیریم:
def get_grade(person_name):
for name, grade in grades:
if name == person_name:
return grade

print(get_grade("ali"))
خیلی بهتر و راحت تر شد الان...
چیزی که ما بالا ساختیم یک پیاده سازی (بد) از associative array بود. چون associate کردیم یک کلید رو به مقدارش. associative array یک abstract هست و میتونه به شکل های مختلف پیاده سازی بشه.

خب... فقط یه مشکلی هست الان:
قبلا که با ایندکس میگرفتیم صاف میرفتیم سراغ خودش، الان مجبوریم که iterate کنیم روشون و دونه دونه بگردیم تا برسیم به اونی که میخوایم. کنده!! (شما مثال های این پست رو با ۱۰۰۰ تا داده مثلا تصور کنید)

راه حل چیه؟
اینکه بیایم "یه جوری" این اسم ها رو map کنیم به ایندکس های عددی تا دوباره بتونیم صاف بریم سراغ اونی که میخوایم و سرعت بهتر بگیریم.

چطور اینکارو بکنیم؟
مثلا بیایم یک فانکشن بنویسیم که از کلیدها عدد تولید کنیم به این صورت که اعداد اسکی متناظر با هر حرف از کلیدمون رو باهم جمع کنیم. یعنی برای sara داریم:
s: 115
a: 97
r: 114
در نتیجه:
"sara" # -> 115 + 97 + 114 + 97 -> 423
این میشه فانکشنش:
def hash_func(string):
return sum(map(ord, string))
حالا یه لیست بسازیم که ۵ تا جای خالی داره:
grades = [None, None, None, None, None]

خب حالا الان عددی که از هش کردن(پس یه هش فانکشن ساده بود اون) کلید sara به دست آوردیم و چطور map کنیم به یکی از ایندکس های لیستمون؟ ما که ۴۲۳ تا slot نداریم...
باقی ماندش رو با طول لیستمون حساب کنیم!
اینطوری مطمئن هستیم که داخل اون رنجی که میخوایم هست. پس:
423 % 5 -> 3
کافیه sara و نمرش رو توی ایندکس شماره ۳ ذخیره کنیم:
grades = [None, None, None, ("sara", 19), None]
اگه همین کار رو برای باقی هم بکنیم همچین چیزی میشه:
grades = [
("ali", 18),
None,
None,
("sara", 19),
("reza", 17),
]
(تو پرانتز حواسمون هست که ترتیبش عوض شد...)

الان خوب شد. هر کدوم از نمره هارو بخوایم بگیریم اول اون کلید رو hash میکنیم بعد باقی ماندش رو حساب میکنیم میشه ایندکس مورد نظر. دیگه iteration ای در کار نیست و به time complexity عه O(1) رسیدیم. الان get_grade عه ما اینطوری شد:

def hash_func(string):
return sum(map(ord, string))

def get_grade(person_name):
hash_value = hash_func(person_name)
idx = hash_value % 5
return grades[idx][1]

print(get_grade("reza"))

موقع insert کردن هم دقیقا برعکس همین شکل عمل میکنیم یعنی ابتدا هش میکنیم بعد باقیمانده میگیریم بعد که فهمیدیم کدوم slot برای اون کلید میشه میذاریمش اونجا. درواقع هر چیزی که برای get کردن میگیم برعکسش برای set کردن میشه.

خب ما الان تونستیم associative array رو با کمک hashmap پیاده سازی کنیم :) بریم ادامش...

حالا اگه اسم یکی دیگه از دانشجو ها aras بود چی؟
(پست بعدی)

پست ۱ از ۳

👤 SorousH

💎 Channel: @DevelopixPython
7👍5🔥1
چجوری aras رو اضافه کنیم به grades ؟ چون aras از همون حروفی که sara داره تشکیل شده با هش فانکشنی که ما نوشتیم دوباره بهمون ۴۲۳ میده و اگه باقی مانده بگیریم میشه ۳ یا درواقع همون ایندکسی که برای سارا اختصاص داده شده.
مشکل بوجود اومد... به این مشکل میگن hash collision یا تداخل هش ها!

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

هش فانکشن خوب توی hashmap ها دو تا ویژگی داره:
۱- باید محاسباتش سبک باشه. چون دائما داره برای همه ی کلید ها حساب میشه.
۲- "سعی کنه" مقدار های یونیک تولید کنه تا به hash collision بر نخوریم.

بیایم کمی تغییرش بدیم: علاوه بر اینکه از عدد اسکیشون استفاده میکنیم، بیایم اون عدد رو در جایگاهی که داره(حرف چندمه) ضرب هم بکنیم به این شکل:
def hash_func(string):
hash_value = 0
for i, char in enumerate(string, start=1):
hash_value += ord(char) * i
return hash_value

الان هش collision رو بر طرف کردیم:
for name in ("ali", "sara", "reza", "aras"):
hash_value = hash_func(name)
print(f"{name}: {hash_value} : {hash_value % 5}")
خروجیش میشه:
ali:  628  : 3
sara: 1039 : 4
reza: 1070 : 0
aras: 1076 : 1
ولی همونطور که حدس میزنید باز هم با کلید های مختلف ما به hash collision بر میخوریم... مثلا جای aras بذارید nima ...
چه کنیم؟ بیایم یه هش فانکشن معقول داشته باشیم که سعی کنه با سرعت بالا hash value رو محاسبه کنه (چیزی که الان داریم) ولی اگه collision پیش اومد رفعش کنیم! چطور؟

روش اول، separate chaining :
تو این روش میگه به جای اینکه ما بیایم slot ها رو خالی بذاریم (None) ، بیایم به جاش از لیست خالی استفاده کنیم! هر موقع hash collision داشتیم میایم اضافش میکنیم به لیست.

یعنی اگه ۴ تا دانش آموزش ما باشن: ali, sara, reza, nima
با هش فانکشن جدیدی که نوشتیم slot های ما به این صورت میشن:
grades = [
[("reza", 17), ("nima", 20)],
[],
[],
[("ali", 18)],
[("sara", 19)],
]
مشکل حل شد. الان با اینکه وقتی نمره ی نیما رو بخوایم باید قبلش یه رضا رو هم چک کنیم ولی خیلی جلو افتادیم نسبت به اینکه بخوایم همه رو چک کنیم! یعنی کلی کلید رو محاسبه نمیکنیم فقط اون چندتایی که collision داشتن سرچ میشن. (با تعداد بالا تصور کنید)

اگه دقت کنیم میبینیم هرچی hash collision بیشتر داشته باشیم به رفتار خطی بیشتر نزدیک میشیم.
این روش اول بود که پیاده سازی خیلی ساده ای هم داره. یه مشکلی ریزی داریم اینجا. یه سری فضای خالی الان توی slot های ما بوجود اومده. آیا میتونیم بیایم از این فضاها استفاده کنیم؟


روش دوم، open addressing:
شرایطی و در نظر بگیرید که الان reza و ali و sara ذخیره شدن و ما میخوایم nima رو اضافه کنیم:
grades = [
("reza", 17),
None,
None,
("ali", 18),
("sara", 19),
]
میایم nima رو هش میکنیم ایندکس و پیدا میکنیم میبینیم میشه صفر. و نگاه میکنیم میبینیم پر هست! میایم یه sequence ای تولید میکنیم به اسم probing sequence. به طوری که از همون اون ایندکسی که محاسبه کردیم شروع میشه(اینجا شد صفر برای نیما) و یه دور میزنه:
0 -> 1 -> 2 -> 3 -> 4
اگه برای ali میخواستیم probing sequence چی میشد؟
3 -> 4 -> 0 -> 1 -> 2
و به همین ترتیب میریم جلو تا به جای خالی برسیم. الان برای نیما ایندکس بعدی میشه ۱. خالی هست؟ بله. پس میذاریمش اونجا و تبدیل میشه به:
grades = [
("reza", 17),
("nima", 20),
None,
("ali", 18),
("sara", 19),
]
ما ۳ شکل probe sequence داریم:
1- linear probing
2- quadratic probing
3- double hashing

کاری که بالا کردیم linear probing بود. چون نمیخوام بیشتر از این طولانی بشه دوتای دیگه رو اینجا نمیگم(پیاده سازیش رو در انتها گذاشتم) ولی حدس زدنش سادس. مثلا تو دومی به جای اینکه دونه دونه بره بالا ، با توان های ۲ میره بالا (کمک میکنه که توده ای از کلید ها رو یک جای hash table مون نداشته باشیم پخش بشن) و آخری میگه یه هش دیگه(هش دوم) انجام بدیم برای پیدا کردن ایندکس بعدی!

اینا هر کدوم مزایا و معایبی دارن که میشه کلی دربارشون بحث کرد که کدوم کجا چرا بهتره.

پست تموم شد ولی یه سری نکته های تکمیلی باقی موند:
(پست بعدی و آخر)

پست ۲ از ۳

👤 SorousH

💎 Channel: @DevelopixPython
👍92🔥1
نکته ۱:
دیکشنری توی پایتون نمونه از associative array هست که با hashtable یا hashmap پیاده سازی شده.

نکته ۲:
این پیاده سازی از hashmap چیزی هست که همین الان تو خیلی از زبان ها برای دیکشنری، set ها توی پایتون و برای دیکشنری ها تا قبل از ورژن ۳.۶ توی پایتون استفاده میشده.
به طور کلی hashmap ها ترتیب رو حفظ نمیکنن، همونطور که دیدید ولی از پایتون ۳.۶ به بعد آقای Raymond Hettinger یه پیاده سازی جدیدی برای دیکشنری ها انجام داد به اسم raymond dict. کلیت همینه ولی یه مقدار فرق داره با چیزی که دیدیم که هم کم حجم تره هم باعث میشه ترتیب رو حفظ کنن. اگه علاقه داشتید میتونم بعدا پیاده سازی دیکشنری های جدید پایتون رو هم بگم.

نکته ۳: توی separate chaining میشه به جای لیست از linked list یا binary search tree هم استفاده کرد که باز هم هر کدوم معایب و مزایای خودشون رو دارن.

نکته ۴:
خیلی از نکات گفته نشد به دلیل اینکه نمیخواستم بیشتر از این طولانی بشه. از جمله:
- پایتون علاوه بر key و value خود هش‌ها رو هم نگه داره میکنه. چرا اینکارو میکنه؟
- این hash table عه ما به یه حدی که برسه نیاز داره تا resize بشه تا پرفورمنسش رو حفظ کنه. اگه از یه حدی بیشتر پر باشه تعداد دفعاتی که collision میگیریم بیشتر میشه و دیکشنری یا ست ما کند تر میشه.
- اگه یه کلیدی و delete کردیم تکلیف hashtable چی میشه؟ چطور باید هندل بشه؟

من همه ی انواع implementation هایی که اسمشون اومد رو به صورت کامل پیاده سازی کردم و نکاتی که وقت نشد رو توش گنجوندم. میتونید به عنوان رفرنس بهش یه نگاه بندازید:

* Open Addressing:
- Linear Probing
- Quadratic Probing
- Double Hashing Probing
* Separate Chaining
- With Dynamic Array
- With Linked List
- With Binary Search Tree

ریپازیتوری‌‌ گیت‌هاب:
https://github.com/amirsoroush/Python_Hashmaps

پست ۳ از ۳

👤 SorousH

💎 Channel: @DevelopixPython
👍93🔥2
#سوال
اجرای کدام تابع زمان کمتری نیاز دارد ⁉️

💠 جواب

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3
درود. یه موضوع ساده ولی جالب:
همونطور که میدونید برای تولید اعداد (شبه) رندوم از ماژول random استفاده میکنیم توی پایتون. یکی از ویژگی های الگوریتم هایی که برای تولید اعداد شبه رندوم استفاده میشن این هست که باید سعی کنن به صورت یکنواخت اعداد رو توزیع کنن.
منظورم این هست که به طور مثال اگه خواستید ۱۰ هزار بار بین ۱ و ۲ و ۳ یه عددی رو انتخاب کنید باید بتونه تقریبا ۳۳۳۳ تا ۱ ، ۳۳۳۳ تا ۲ و ۳۳۳۳ تا ۳ انتخاب کنه. اول یه تست بگیریم ببینیم چقدر نزدیک هست:

> from random import randint
> from collections import Counter
>
> Counter((randint(1,3) for _ in range(10_000)))
Counter({2: 3379, 3: 3345, 1: 3276})

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

یه نمونش رو ببینیم:

۱۴۳ نفر در صف برای ورود به هواپیما هستند و هر نفر یک شماره صندلی متفاوت بین ۱ و ۱۴۳ دارد. تعداد صندلی های هواپیما هم دقیقا ۱۴۳ تا است. نفر اول شماره خودش را گم می‌کند و روی یک صندلی تصادفی میشند. از آن موقع به بعد هر کسی روی صندلی خودش می‌نشیند مگر این که فرد دیگری آنجا نشسته باشد و در این صورت روی یک صندلی خالی تصادفی می‌نشیند.
احتمال اینکه نفر ۱۴۳ ام روی صندلی خودش بنشیند چقدر است؟

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



کلیت کار:‌ یک لیستی درست کنید از ۱۴۳ نفر که هر کدوم یه شماره صندلی ای بین ۱ تا ۱۴۳ دستشونه، برای نفر اول یه شماره به صورت رندم انتخاب کنید، بعد از نفر دوم تا آخر چک کنید که آیا صندلیش خالی یا None هست یا پره؟
اگه خالی بود بذاریدش اونجا و اگه پر بود یه شماره رندوم براش انتخاب کنید. در انتها، ما بدست آوردیم که "یک بار"ش چی میشه... آیا نفر آخر میشینه سر جاش یا نمیشینه. این جواب مهم نیست چی باشه، همین تابع رو ۱۰ هزار بار کال کنید و توی Counter بذارید.

احتمالش چقدر شد؟

👤 SorousH

💎 Channel: @DevelopixPython
👍11🔥43
💠 معرفی Mojo برای برنامه‌نویسان پایتون

🌐 خواندن مقاله

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥21👎1
#سوال
خروجی کد زیر چیست ⁉️ (با توضیح)

✍️ *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
انواع سرچ ها روی لیست

خیلی خلاصه چند تا از انواع سرچ ها رو روی لیست باهم ببینیم:

فرض کنید یه لیست نا مرتبی از اعداد داریم به این شکل:
lst = [30, 2, 7, 14, 1, 25, 4, 15, 9]
اگه بخواهیم دنبال عدد ۱۵ بگردیم باید چیکار کنیم؟

1- Linear search(not optimized)
میتونیم از ایندکس شماره صفر شروع کنیم و تک تک تا انتها بریم جلو و اعداد رو نگاه کنیم ببینیم ۱۵ داخلشون هست یا نه. این درواقع کاری هست که پایتون انجام میده زمانی که شما از in استفاده میکنید. چون اعداد ترتیبی ندارن کار دیگه ای نمیشه کرد.
________________________________________
اگه اعداد مرتب بودن چی؟
lst = [1, 2, 4, 7, 9, 14, 15, 25, 30]

2- Linear search(optimized)
فرض کنیم میخواهیم دنبال عدد ۵ بگردیم. دوباره میتونیم شروع کنیم تک تک اعداد رو مقایسه کنیم، ولی بعد از اینکه به عدد ۷ رسیدیم، میتونیم دیگه ادامه ندیم. چون اعداد مرتب هستن، حتما توی اعداد بزرگتر از ۷ هم نخواهد بود. بهتر شد اینجا.

3- Jump search
میتونیم به جای اینکه تک تک به جلو بریم و اعداد رو، چند تا چند تا جلو بریم و بپریم اصطلاحا (jump search).
فرض کنید دنبال عدد ۲۵ میگردیم. میتونیم اعداد رو ۲ تا ۲ تا جلو بریم، یعنی اول ایندکس شماره ۰ (یا عدد ۱) و نگاه میکنیم، بعد میریم ایندکس شماره ۲ (یا عدد ۴)، بعد ایندکس شماره ۴ (یا عدد ۹) و تا آخر، هر جا که دیدیم عدد ایندکس مورد نظر بزرگتر از عدد مقصود ماست، یعنی به اون تیکه از لیست که ممکنه عدد هدف داخلش باشه رسیدیم، فقط کافیه داخل اون رو به صورت linear نگاه کنیم. برای پیدا کردن عدد ۲۵ ، فقط ۶ تا مقایسه لازم بود. (تو حالت خطی ۸ تا). حالا این jump ما چقدر باشه خوبه؟ محاسبات نشون میده که رادیکال n بهترین گام هست. ( n تعداد آیتم های داخل لیست هست)

4- Binary search
کافیه توی هر مرحله لیستمون رو به دو قسمت تقسیم کنیم، و آیتم هدف رو با آیتم وسطی مقایسه کنیم، اگه کوچیکتر بود، دیگه فقط توی اون نیمه ی سمت چپ دنبالش میگردیم، اگه بزرگتر بود توی نیمه ی سمت راست.

5- Interpolation search
خیلی شبیه binary search هست با این تفاوت که اونجا نقطه ای که لیست ما رو تقسیم میکرد و دقیقا وسط لیست میگرفتیم، ولی اینجا با استفاده از این فرمول، اون نقطه رو بدست میاریم:
mid = low + ((key - arr[low]) * (high - low) / (arr[high] - arr[low]))

low = کوچکترین ایندکس
high = بزرگترین ایندکس
key = آیتم هدف

این فرمول نقطه ی تقسیم رو مایل به چپ یا راست پیدا میکنه، نزدیک تر به آیتم هدف. ولی برای اینکه interpolation search بتونه خیلی سریع عمل کنه، باید لیست ما به صورت یکنواخت توزیع شده باشه.

6 - Exponential search
توی این روش که برای لیست های خیلی بزرگ کاربرد داره، از ابتدا شروع میکنیم به گشتن، ولی گام های ما به صورت exponential هست (توان های ۲):
0, 1, 4, 9, 16, 25, ...
وقتی که آیتمی پیدا کردیم که از آیتم هدف ما بزرگتر بود، میایم اون تیکه رو دوباره فقط جست و جو میکنیم(مثل jump search) ولی دیگه این جست و جو خطی نیست بلکه روش binary search انجام میدیم.


نکته: این الگوریتم ها بسته به شرایط الگوریتم های خیلی بهتری هستن از کاری که پایتون انجام میده. به پایتون حتی اگه لیست مرتب شده هم بدید باز تک تک سرچ میکنه. ولی خب نکته اینجاست که اون با C پیاده سازی شده و احتمالا توی خیلی از پیاده سازی های pure python از الگوریتم هایی با time complexity بهتر سریعتر باشه.

در آینده سعی میکنم بیشتر درمورد time complexity ی هرکدوم از این انواع سرچ و اینکه کجا کدوم بهتره استفاده بشه صحبت کنیم.

👤 SorousH

💎 Channel: @DevelopixPython
🔥12👍6
Forwarded from Developix Support
📌 اگر دنبال تبدیل شدن به یک برنامه‌نویس مطرح در دنیای فریلنسری و کسب درآمد بیشتر هستی، شرکت در این کارگاه رو از دست نده!

💻 کارگاه تجارت بین‌المللی برای برنامه‌نویس‌ها؛
(فریلنسرینگ حرفه‌ای در مقیاس جهانی)

🗓 زمان: 30 شهریور تا 6 مهر 1402
حضوری و آنلاین
(2 جلسه حضوری و 5 جلسۀ آنلاین)

📝 اطلاعات بیشتر و ثبت‌نام
🔻و یا برای کسب اطلاعات بیشتر کافیه به آی‌دی ما پیام بدی!

🆔 @MaktabSharif_Admin

🌐 وبسایت |📱کانال تلگرام | 📲 اینستاگرام
👎5👍1
.pythonrc

درست مثل
.nanorc
.bashrc
.vimrc
...
و بقیه فایل های مشابه، یه pythonrc هم داریم که به همون منظور ایجاد شده. قرار هست از قبل از startup عه REPL خونده و اجرا بشه.
استفاده های مختلفی میشه کرد: مثلا اگه همیشه وقتی REPL رو باز میکنید یه سری کتابخونه رو import میکنید، میتونید یک بار اینجا import کنید و دیگه هربار اینکار رو نکنید.
یا مثلا اگه یه سری helper فانکشن برای خودتون نوشتید میتونید یکبار اینجا تعریفش کنید و هروقت که REPL رو باز کردید در دسترس شما هست.
یه کار جالب دیگه اینکه میتونیم built-in فانکشن help رو با inspect که توی rich هست عوض کنیم:
from functools import partial
from rich import inspect, pretty

help = partial(inspect, help=True)
pretty.install()

حالا باید environment variable عه PYTHONSTARTUP رو هم ست کنیم که به فایل
.pythonrc
اشاره کنه.
الان وقتی روی آبجکتی بزنید ورژن rich استفاده میشه.

منبع

👤 SorousH

💎 Channel: @DevelopixPython
👍8🔥2
Conditional breakpoint

فرض کنید همچین کدی داریم:
for i in range(100):
print(i)

و دوباره فرض کنید زمانی که i میشه ۹۰ یه مشکلی بوجود میاد. میخواهیم برنامه رو دیباگ کنیم. چه کنیم؟ break point بذاریم سمت چپ for loop.
ولی موضوع این هست که دیباگر وقتی ران میشه همون ابتدا کنار for loop متوقف میشه و ما باید دستی جلو ببریم. تو این حالت i مساوی ۰ هست. منطقی نیست که ۹۰ بار روی next بزنیم تا برسیم به اون حالتی که i برابر ۹۰ میشه.

خوشبختانه یه چیزی به اسم conditional breakpoint وجود داره که میتونید بهش یه expression عه boolean بدید و دیباگر فقط زمانی متوقف میشه که اون expression درست باشه.
توی ادیتور دلخواهتون بعد از اینکه break point گذاشتین، راست کلیک کنید روش و edit رو بزنید (یا هر اسم دیگه ای که داره) و توی اون پنجره ای که باز میشه بنویسید:
i == 90
حالا با زدن دکمه دیباگ فقط زمانی متوقف میشه که این شرط درست باشه.

👤 SorousH

💎 Channel: @DevelopixPython
👍17🔥42
#سوال
خروجی کد زیر چیست ⁉️

✍️ *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13👎1🔥1
| کانال توسعه‌دهندگان پایتون |
#سوال خروجی کد زیر چیست ⁉️ ✍️ *ژنرال* 💎 Channel: @DevelopixPython
💠 جواب سوال : True

🔺در بسیاری از موارد اعداد با اعشار نیمه به سمت بالا گرد می‌شوند.
🔺اما در زبان‌های برنامه‌نویسی مانند پایتون، تابع round به نحوی عمل می‌کند که ممکن است منجر به نتایج غیرمنتظره شود.
🔺به‌ویژه وقتی اعشار عدد برابر با 0.5 باشد، تابع round به سمت عدد صحیح زوج تقریب زده می‌شود.

🟢به عنوان مثال، در اینجا وقتی شما عدد 3.5 را به تابع round می‌دهید، انتظار دارید که به 4 گرد شود، اما این تابع باتوجه به قواعد خودش به سمت عدد زوج عدد تقریب می‌زند و خروجی نهایی 4 می‌شود.

🟢به همین دلیل، توصیه می‌شود در مواردی که نیاز به گرد کردن اعداد با اعشار کاملا دقیق دارید از از راه های دیگری استفاده کنید تا از اینگونه مشکلات جلوگیری کنید.
🟢مثلا می‌توانید از توابعی مانند math.floor برای گرد کردن به سمت پایین و math.ceil برای گرد کردن به سمت بالا استفاده کنید تا نتایج دقیق‌تری به دست آورید.

🟡 برای اطلاعات بیشتر و مطالعه در این مورد، می‌توانید به این منبع مراجعه کنید.

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18👎1
This media is not supported in your browser
VIEW IN TELEGRAM
📌 دوره آنلاین سئو برای مدیران، آخرین روز ثبت‌نام با تخفیف ویژه

🔘 استراتژی سئو
🔘 مدیریت فرآیندهای سئو
🔘 گزارشات سئو
🔘 ارزیابی و نظارت بر فرآیندهای سئو
🔘 اشتباهات سئو
🔘 قراردادهای سئو


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

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

اطلاعات بیشتر و ثبت‌نام در ایسمینار:
🌐 eseminar.tv/wb116105

کد تخفیف: talebi

فقط امروز و فردا، به جای 5 میلیون تومان فقط با 2 میلیون تومان در این دوره آنلاین شرکت کنید.

هدایای شرکت در دوره:
🔘 حداقل 2 میلیون تومان رپورتاژ در تریبون
🔘 اکانت 6 ماهه جت‌سئو به ارزش 1.200.000 تومان
🔘 اکانت یک سالۀ سازمانی میزیتو به ارزش 2.900.000 تومان
🔘 یک جلد کتاب سئو 2022+2023 امضاء شده.

فقط امروز

☑️ @kar_kasb
👎6👍2
Forwarded from Developix Support
This media is not supported in your browser
VIEW IN TELEGRAM
دایناسورها در حال خرید در تهران 🤯

⚡️هیچ‌وقت فکرشو میکردی که همچین تصویری رو ببینی؟

⚡️از آینده به تو سلام 😁

💠این تصویر با استفاده از یک ابزار جدید در تلگرام ساخته شده که هر متنی بهش بدی رو تبدیل به عکس میکنه!

همین‌الان بهش پبام بده تا عکسش رو برات بفرسته😇

فقط کافیه بزنی رو آیدی زیر و شروع کنی 😉👇🏻
@aiolearn_artbot

🌀هوش‌مصنوعی با پیشرفت فوق‌العادش داره همه دنیار رو فرا میگیره 😉🤯
👎271
💠 معرفی کتاب 💠
💎 Django Design Patterns and Best Practices

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

📖 سرفصل‌های کتاب عبارتند از:

1️⃣ جنگو و الگو‌ها
2️⃣ طراحی برنامه
3️⃣ مدل‌ها
4️⃣ ویوها و URLها
5️⃣ قالب‌ها
6️⃣ رابط ادمین
7️⃣ فرم‌ها
8️⃣ کار کردن به صورت ناهمزمان
9⃣ ایجاد APIها
🔟 سر و کار داشتن با کد میراثی
1⃣1⃣ تست کردن و دیباگ کردن
2⃣1⃣ امنیت
3⃣1⃣ آمادگی برای محیط پروداکشن

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

#معرفی_کتاب

👤 MHReza

💎 Channel: @DevelopixPython
👍10👎1
Django Design Patterns and Best Practices, 2nd Edition.pdf
4.9 MB
📥 دانلود کتاب

📚 Django Design Patterns and Best Practices

👤 MHReza

💎 Channel: @DevelopixPython
👍12👎1
🔸دیتا استراکچرهای پایتون در یک نگاه

🔗 Source

👤 MHReza

💎 Channel: @DevelopixPython
👍17🔥32