🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)👨‍💻


@Mtio975
Download Telegram
🧑‍💻PythonDev🧑‍💻 pinned «خوب دوستان لیستی که قراره براتون به شرح زیر هستش من سعی میکنم دوره های انگلیسی رو هم بزارم واسه دوستانی که زبان انگلیسی خوبی دارند و میخواهند دوره های خارجی رو مشاهده کنند دوره ها به شرح زیر هستند 1 ) دوره آموزش پایتون مقدماتی استاد جادی 2) دوره اموزش…»
این آخرین پست درباره موضوع لینوکس و ... هست (با توجه به اتفاقات اخیر)
ببخشید که کمی از بحث دور شدم؛ اما هدف داشتم
خیلی از بچه‌هایی که روی AI کار می‌کنند و خیلی دیگه از توسعه دهنده‌های پایتون که وقت کاستومایز کردن و ... ندارند به جز Ubuntu متاسفانه گزینه دیگری ندارند برای همین وقتی دیدم Ubuntu دیگه رو به افول گذاشته (تمرکزش روی سرور هست و داره تلاش می‌کنه مثل RedHat بتونه از سرور پول در بیاره) ترجیح دادم کمی از موضوع اصلی کانال دور بشم و روی جایگزین‌های Ubuntu صحبت کنم.

توزیع‌های بسیار زیادی رو دوستان معرفی کردند و خودم میشناختم اما موضوع پشتیبانی از فریمورک‌ها و پکیج‌های مورد نیاز AI هم بود و البته سادگی راه‌اندازی توزیع هدف و میزان استیبل بودنش

همه این‌ها من رو رسوند به Rocky Linux :
1- روی کاغذ هیچ توزیعی به اندازه این مورد استیبل نیست (که رایگان هم باشه) از روی RedHat Enterprise ساخته می‌شه و افراد مهمی پشتش هستند ( کسانی که CentOS رو این همه سال توسعه دادند )؛ پشتیبانی ۱۰ ساله هم داره ورژن‌های اصلی.

۲- راه‌اندازیش می‌تونه به اندازه سواد و توانایی شما؛ ساده یا سخت باشه
مثلا من برای راه‌اندازی چون کارت گرافیک Onboard ندارم نمی‌تونستم از نسخه workstation برای نصب استفاده کنم و رفتم سراغ نسخه minimal ترتیب نصب هم برای اینکه به مشکل نخورید :

Rocky linux minimal --> install

tty : --> sudo dnf update

reboot

sudo dnf install group Workstation

nvidia-driver installation (follow cuda installation documentation instructions)

Before Reboot, Disable nouveau

reboot

Install cuda and ...

۲ تا نکته من چون تنبل بودم install group رو استفاده کرد بعد مواردی که بدردم نمی‌خورد رو حذف یا ادیت کردم
cuda, cudnn,
رو از روی داکیومنت اصلی خودشون که سایت nvidia منتشر کرده نصب کردم و بعد از نصب (چون ورژن قدیمی‌ تر رو میخواستم نه آخرین نسخه)
repo
اش رو حذف کردم.

3- پکیج‌هایی که وجود نداره رو توی epel-release, flatpak, rpmfusion قطعا پیدا می‌کنید که خیلی راحت نصب میشه

چندتا توصیه اگر این ویژگی‌ها رو دوست دارید و دستی هم بر آتش دارید یا علاقه به کاستومایز کردن : Xfce رو بجای Gnome استفاده کنید؛ چندتا باگ وجود داره که احتمالا بخاطر تجهیزات من هست (البته بسیار بسیار کمتر از میزان تغییراتی هست که روی Ubuntu باید میدادم تا سخت‌افزارهام کار کنه) و اینکه آزار دهنده نیست.

در نهایت Python3.10 وجود نداره که خب باید کامپایل کنید و نصب کنید؛ اصلا هم سخت نیست دیگه (دیفالت 3.9 نصب هست و روی رپو هم 3.11 وجود داره) من اینطوری نصب کردم :

dnf update

dnf install gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make sqlite-devel xz-devel

wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz

tar xzf Python-3.10.13.tgz

cd Python-3.10.13

./configure --enable-optimizations

برای دستور بعدی من ۱۴ تا ترد رو در اختیار گذاشتم که سریعتر کامپایل بشه (این عدد رو کمتر می‌تونید بکنید شما)

make -j 14
nproc
make altinstall

بعد هم تست کنید که درست نصب شده باشه.
تا اینجا هنوز هیچکدوم از مشکلات ubuntu رو ندارم و با نصب هیچکدوم از پکیج‌ها هم به مشکل نخوردم (حتی مشکلات و ارورهای بعد از نصب که توی ubuntu وجود داشت رو هم ندارم)
امیدوارم تا چندسال آبنده هم همینطوری بمونه.

جایگزین مناسب برای Ubuntu توی کارهای ما فعلا فقط و فقط Rocky Linux رو می‌تونم تایید کنم.
نصب ورژن خاص پایتون بر روی لینوکس
سوال: من یه پروژه دارم روی ورژن خاصی از پایتون کار میکنه (برای مثال ۳.۸.۱۰) وقتی میام با دستور apt نصب کنم ورژن ۳.۸.۱۷ (آخرین رلیس ورژن) نصب میشه چطوری رلیس های قبلی رو نصب کنم؟
برای این کار شما نیاز به نصب دستی ورژن مورد نظر دارید.
۱) فایل سورس ورژن مورد نظر رو از python.org دانلود می کنید.
۲)در پوشه مورد نظر کانفیگ فایل رو میسازیم
./configure \
--prefix=/opt/python/${PYTHON_VERSION} \
--enable-shared \
--enable-optimizations \
--enable-ipv6 \
LDFLAGS=-Wl,-rpath=/opt/python/${PYTHON_VERSION}/lib,--disable-new-dtags
۳) دستور make
و سپس sudo make install رو اجرا میکنیم.
۴) برای اضافه کردن به path هم دستور زیر رو به فایل
/etc/profile.d/python.sh
اضافه میکنیم.
PATH=/opt/python/<PYTHON-VERSION>/bin/:$PATH
۵) برای نصب pip هم از این فایل میتونید استفاده کنید فقط کافیه با ورژنی که میخواید پیپ داشته باشه این فایل رو اجرا کنید.
https://bootstrap.pypa.io/get-pip.py
🙋معرفی 25 دوره رایگان مقدماتی برای کسانی که قصد دارند در حوزه های زیر شروع به یادگیری کنن:
‏- Web Development
‏- Data Science
‏- DevOps
🌻🚀با توجه به فیدبک های ارزشمندی که در این چند روز دریافت کردم، در ادامه این پست 25 دوره مقدماتی رو خدمت شما عزیزان معرفی شده که امیدوارم مفید و سودمند باشند.
‏تقدیم نگاه شما عزیزان:

‏❯ HTML and CSS
‏⁦ freecodecamp.org/learn/2022/res…⁩

‏❯ JavaScript
‏⁦ scrimba.com/learn/learnjav…⁩

‏❯ Python
‏⁦ cs50.harvard.edu/python/2022/

‏❯ SQL
‏⁦ online.stanford.edu/courses/soe-yd…⁩

‏❯ Java
‏⁦ scaler.com/topics/course/…⁩

‏❯ C#
‏⁦ dotnet.microsoft.com/en-us/learn/cs…⁩

‏❯ C
‏⁦ alison.com/course/diploma…⁩

‏❯ C++
‏⁦ alison.com/course/c-plus-…⁩

‏❯ React
‏⁦ scrimba.com/learn/learnrea…⁩

‏❯ Linux
‏⁦ cybrary.it/instructor/cor…⁩

‏❯ Docker
‏⁦ cognitiveclass.ai/courses/docker…⁩

‏❯ Kubernetes
‏⁦ simplilearn.com/learn-kubernet…⁩

‏❯ DevOps ( احتمالا بعضی بخش ها غیر رایگان )
‏⁦ openclassrooms.com/en/courses/785…⁩

‏❯ CI/CD
‏⁦ simplilearn.com/free-ci-cd-onl…⁩

‏❯ Cyber Security
‏⁦ codered.eccouncil.org/essentials-ser…⁩

‏❯ Data Analysis
‏⁦ cognitiveclass.ai

‏❯ Data Science
‏⁦ learn.saylor.org/course/view.ph…⁩

‏❯ Machine Learning
‏⁦ developers.google.com/machine-learni…⁩

‏❯ Deep Learning
‏⁦ introtodeeplearning.com

‏❯ Excel
‏⁦ simplilearn.com/learn-business…⁩

‏❯ PowerBI
‏⁦ learn.microsoft.com/en-us/users/co…⁩

‏❯ Tableau
‏⁦ tableau.com/learn/training

‏❯ MongoDB
‏⁦ learn.mongodb.com

‏❯ Kafka
‏⁦ developer.confluent.io/courses/

‏❯ Redis
‏⁦ university.redis.com
✔️ سوال: best practice‌ها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرم‌افزار پایتونی چیه؟

ابزارهای زیادی واسه این‌کارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:


Dependency Management System

برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از Poetry استفاده کنید، چون ابزار بسیار قدرتمندی هست، کار باهاش بسیار راحته (خیلی شبیه به Cargo در زبان Rust هست)، کامیونیتی بزرگی داره، به راحتی محیط dev و prod رو میتونید مدیریت کنید، مستندات بسیار خوب و روانی داره، در سریع ترین زمان ممکن میتونید پروژه رو در PyPI منتشر کنید و همچنین پروژه⁧های معروفی از جمله Rich (کتابخونه⁧ای که خود pip هم ازش برای رنگی کردن progress barها استفاده میکنه) از اون استفاده میکنن، که همین نشون میده چقدر کاربردی هست.
همچنین build و run هم توسط Poetry انجام میشه

- منابع آموزشی:

1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/

2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs

3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/


Linting & Type Checking

برای Linting ابزارهای flake8 و pylint از معروف ترین⁧ها هستن، هر یک رو میتونید شدت سخت گیریشون رو تنظیم کنید، به راحتی همراه با Poetry تنظیماتشون در یک فایل قرار میگیره و نیاز به نگه داشتن فایل⁧های متفاوت برای هر کدوم ندارید. به نظرم خود flake8 به تنهایی نیازتون رو برطرف میکنه. اگر از PyCharm استفاده کنید یک Linter به صورت Built-in در اختیارتون میذاره که خوبه و کارتون رو راه میندازه.

اگر عادت دارید کدهای خودتون رو Annotate کنید و زیاد از Type Hint ها استفاده میکنید، استفاده از MyPy به عنوان یک static type checker به شما کمک میکنه ایرادات موجود در کلاس ها، توابع و ... رو پیدا کنید و بتونید typeهای دقیق تری استفاده کنید. همچنین ابزار Pyright که توسط مایکروسافت توسعه داده میشه، در VSCode به صورت integrated با افزونه Pylance کار میکنه و اگر از VSCode استفاده میکنید پیشنهاد میکنم حتما افزونه Pylance رو نصب کنید. PyCharm هم یک Type Checker داره ولی هنوز توانمندی Pylance و MyPy رو نداره.


- منابع آموزشی:

1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html

2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html


Code Formatting

برای مرتب و organize کردن importها از isort استفاده کنید، هم به صورت CLI در دسترس هست و هم یک API داره که میتونید در کد پایتون استفاده کنید. یک code formatter بسیار معروف که در اکثر پروژه⁧ها استفاده میشه Black هست، زیر نظر PSF (یا Python Software Foundation) و برنامه نویسای با تجربه و کار کشته ای همچون آقای Łukasz Langa (ریلیس منیجر پایتون 3.9) توسعه داده میشه، با دیگر ابزار ها مثل isort سازگار هست، با PEP8 سازگاره و کلی قابلیت مزیت دیگه داره که حقیقتا اینجا جا نمیشن :)

- منابع آموزشی:

1. داکیومنت isort
https://pycqa.github.io/isort/

2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html

3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y

* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنت⁧هاشون هست.


Testing

دو کتابخونه Pytest و unittest (در stdlib موجود هست) در تست نویسی پروژه ها استفاده میشن، برای تست کردن پروژه در environmentهای متفاوت از ابزار tox استفاده میشه و باهاش میتونید در نسخه های متفاوتی از پایتون کدتون رو تست کنید.


- منابع آموزشی:

1. یک مقاله جامع درباره تست نویسی، انواع آن و روش⁧های مورد استفاده در پایتون
https://realpython.com/python-testing/

2. ویدیو درباره unittest در پایتون
- آقای ned batchelder:
https://m.youtube.com/watch?v=FxSsnHeWQBY
- آقای Corey Schafer:
https://www.youtube.com/watch?v=6tNS--WetLI


* همچنین اگر از Git در پروژه خودتون استفاده میکنید، پیشنهاد میکنم از pre-commit حتما استفاده کنید و تمام این ابزارهای گفته شده رو automate کنید تا در هربار commit کردن، قبل از اینکه commit انجام بشه، این ابزارها روی کدتون اجرا بشن و اگر اشکالی در کدتون وجود داره پیدا بشه و اون رو برطرف کنید و دوباره commit کنید.

وبسایت pre commit:
https://pre-commit.com/
✔️ What is if __name__ == "__main__":?
اول از همه، همه چیز توی پایتون یه آبجکته، زیاد شنیدیم و کلیشه شده ولی جداً یه سری آبجکتا رو نمی‌شناسیم.

یکی از اون تایپ‌ها ModuleType هست.

هر فایلی که سورس کد پایتون توش باشه، رو بهش میگیم ماژول؛ چرا؟ چون پایتون اون رو میگیره، یه آبجکت براش توی مموری درست میکنه.

چرا؟ خب یکی از دلایل منطقی‌ش اینه که هر ماژول یه namespace باید داشته باشه (هر چند راحت‌تره بگیم هر ماژول یه namespace عه)
خب namespace‌ها توی پایتون چی هستن؟ خیلی ساده‌ست :) همه‌شون دیکشنری‌اند (البته داندر slots قضیه‌اش فرق میکنه)

هر ماژول هم یکی از پایه‌ای‌ ترین نیاز هاش اینه که namespace داشته باشه تا کلاس‌ها و توابع و متغیر‌ها رو در دسترس ما قرار بده.

پس تا اینجا هر ماژول تبدیل به یه آبجکت میشه و یه namespace محسوب میشه. (اگه نمیشد که منتغی میشد 😂)

import types

print(type(types)) -> <class 'module'>
print(isinstance(types, types.ModuleType)) -> True

میدونی سیستم ایمپورت کردن توی پایتون چجوری کار میکنه؟

اول دنبال فایل میگرده
بعدش لودش میکنه (آبجکتش رو درست میکنه)
بعد کاملا رانش میکنه تا چیزای داخلش رو توی مموری بسازه (همون دیکشنری یا namespaceاش رو populate کنه.)

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

باید چه کار کنیم؟

هر ModuleType یه اسمی داره، فایلی اصلی که پایتون اول رو ران میکنه اسمش میشه main، اسم هم توی خود namespace عه ماژول ذخیره میشه توی name

اما دیگر ماژول‌هایی که ایمپورت میشن اسمشون میشه اسم همون فایل‌شون

hola.py
hello.py

# inside hola.py
print(name)

# inside hello.py
import hola

# run hello.py
output: hola

پایتون یه شرط معروفی داره که صورت سوال ماست:
الان میدونیم معنیش چیه
if __name__ == "__main__":

داره میگه اگه ماژولی که ران میکنی اسمش main هست کدای زیرش رو اجرا کن

که الان میدونیم که وقتی ماژول ایمپورت میشه اسمش اسم فایلشه و داندر مین نیست و این شرط غلط میشه و کدای زیرش اجرا نمیشن

حالا میگیم اجرا نمیشن، اما کامپایل که میشن، پس اگه توی بلوک کد این if تو SyntaxError داشته باشی ارورش رو موقع ایمپورت کردنش می‌بینی.

ایمپورت کردن چیزی نیست که «ما» بخوایم روی بهینه‌کردنش وقت بذاریم چون جدا نمیتونیم، اما اگه خود پایتون بهینه‌اش کنه تاثیری خوبی رو می‌بینیم. البته نه توی چیزای کوچیک، یه اپلیکیشنی که خیلی ایمپورت زیادی داره توش مشخص میشه و حتی بهتر اگه یه اپلیکیشنی به بزرگی اینستاگرام اون جاست که این بهینه‌سازی میتونه ساعت‌‌ها کار رو سریع‌تر کنه، چجوری؟
یه سیستمی دارن توی پایتون ۳.۱۲ روش کار میکنن به اسم Lazy Imports، چطوری کار میکنه؟ وقتی ایمپورت‌‌ها تنبل بشن، دیگه همون اول اول همه‌شون evaluate نمیشن، کداشون execute نمیشه و ... و وقتی که نیاز شد، اون ماژول کداش execute میشه. خب چقدر تاثیر میذاره؟‌
همه میدونیم که اینستاگرام از پایتون و جنگو استفاده میکنه، شرکت متا (فیس‌بوک) یه پیاده‌سازی پایتون داره به اسم Cinder این برای اینستاگرام بهینه شده مثلا garbage collector اش خاموشه و جدیدا مقاله‌ای منتشر کردن که گفتن ما ایمپورت‌هارو کاملا lazy کردیم.

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

پایتون به اندازه‌ کافی سریعه، اما optimization باعث میشه که سریع‌تر بشه به این چیزا میگن بهینه‌سازی
✔️ استیبل بودن یا نبودن یک الگوریتم مرتب سازی

یکی از دسته بندی های موجود برای الگوریتم هایsort کردن، فاکتور stable بودن یا نبودن هست. به طور خلاصه به الگوریتمی میگن stable که:

موقع sort کردن یک لیست، اگه ۲ تا آیتم مساوی هم بودن، دقیقا به همون ترتیبی که توی لیست اولیه بودن، توی لیست مرتب شده هم ظاهر بشن.

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

lst = [
("Ashkan",17),
("Bahar",18),
("Sorena",17)
]
یک راه مرسوم اینه که به این روش sort رو انجام بدیم:
lst.sort(key=lambda x: (x[1], x[0]))
کاملا درسته و هیچ اشکالی نداره. بیشتر میخواستیم درباره موضوع پست صحبت کنیم.

آیا میتونیم فقط بیایم بر اساس آیتم دوم sort ش کنیم؟ این که خود لیست بر اساس حروف الفبا مرتب شده آیا کمکی میکنه؟ یعنی:
lst.sort(key=lambda x: x[1])
اگه بدونیم الگوریتمی که استفاده شده stable هست بله میتونیم و گارانتی هست که آیتم های مساوی به همون ترتیب در خروجی قرار میگیرن، و چون در حال حاضر بر اساس حروف الفبا مرتب شده هستن، اون افرادی که نمره ی برابر دارن اتوماتیک بر اساس حروف الفبا هم مرتب هستن.

خروجی هردو:
[
('Ashkan', 17),
('Sorena', 17),
('Bahar', 18)
]
پایتون از Tim Sort استفاده میکنه و stable هست.


چند تا از الگوریتم های مرتب سازی استیبل:
• Insertion Sort
• Merge Sort
• Bubble Sort
• Tim Sort
و نقطه‌ی مقابلشون:
• Heap Sort
• Selection Sort
• Quick Sort
دوستان ترم یک که ورودی های جدید دانشگاه هستند دوره های که براتون قرار میدم این دوره ها مفاهیم و مبانی برنامه نویسی و الگوریتم رو حتما استفاده کنید در درک مسائل الگوریتم و برنامه نویسی بهتون کمک میکنند
🧑‍💻PythonDev🧑‍💻
https://ocw.sharif.edu/course/id/522
خلاقیت الگوریتمی و برنامه نویسی پایتون
این دوره های که براتون قرار دادم بعضی هاشون دارای تمرین و یادداشت هستند و پاسخ نامه هر تمرین بعد از هر تمرین که حل شده به صورت فایل و به طور کامل و جامع توضیحات داده شده هستند
🧑‍💻PythonDev🧑‍💻
https://www.daneshjooyar.com/learn-algorithm/
الگوریتم و فلوچارت این طوره کاملا رایگان می باشد و دارای گواهی پایان دوره هم می باشد
🧑‍💻PythonDev🧑‍💻
https://quera.org/college/landpage/14471/programming-gateway
دوره دروازه ورود به دنیای برنامه نویسی سایت کوئرا سرفصل های دوره در سایت به طور کامل هستند و دوره دارای مدرک معتبر پایان دوره می باشد
🧑‍💻PythonDev🧑‍💻
https://quera.org/college/landpage/2572/programming-basics-course
دوره مبانی برنامه نویسی و تفکر الگوریتمی کوئرا