هویت شیء در پایتون :
در پایتون، هر شیء ایجادشده بهطور منحصربهفرد مشخص میشه.
پایتون تضمین میکنه که هیچ دو شیء شناسه یکسانی ندارند.
تابع id () داخلی، برای شناسایی شناسه شیء استفاده میشه.
به مثال توجه کنید.
#Fxl
در پایتون، هر شیء ایجادشده بهطور منحصربهفرد مشخص میشه.
پایتون تضمین میکنه که هیچ دو شیء شناسه یکسانی ندارند.
تابع id () داخلی، برای شناسایی شناسه شیء استفاده میشه.
به مثال توجه کنید.
#Fxl
خروجی :
ما b = a، a و b رو هر دو به یک شیء یکسان اختصاص میدیم.
وقتی تابع id () رو بررسی میکنیم ، همون شماره رو برمیگردونه.
ما a رو به 500 واگذار میکنیم. و بعد به شناسه جدید شیء اشاره کرد.
#Fxl
ما b = a، a و b رو هر دو به یک شیء یکسان اختصاص میدیم.
وقتی تابع id () رو بررسی میکنیم ، همون شماره رو برمیگردونه.
ما a رو به 500 واگذار میکنیم. و بعد به شناسه جدید شیء اشاره کرد.
#Fxl
بنظرم به جای Makefile از justfile استفاده کنید بهتره, به دو دلیل:
۱. مولتی پلتفورمه
۲. خیلی سینتکس بهتری داره
تو هر پروژه ای, بنظرم باید کامندی وجود داشته باشه که:
۱. دیتا سپل جنریت کنه برای تست دستی
۲. دیتابیس رو ریست کنه با دیتای جدید
۳. تیبلا رو مجدد بسازه
۴. ماگریتی که نوشتین رو بتونه تست کنه
۵. اینستال پروژه هندل شه
۶. برای ران تست هم کامند جدا باید باشه
همیشه ترجیح میدم از poetry استفاده کنم چون خودش پکیج میسازه برام و lockfile داره و میتونم توش خودم پکیج بسازم که به صورت live از روش بخونه و آپدیتش کنه (مثل shared library بین سرویسا)
Justfile: https://github.com/casey/just
برای تست ماگریشنتون:
۱. باید تیبل هاتون رو پاک کنید
۲. باید برید برنچی که ازش برنچ میگیرین مثلا dev
۳. دیتابیس رو بسازید با اون برنچ و migration هایی که بوده اونجا رو اسکیپ کنید
۴. برگردین برنچی که کار میکردین روش
۵. ماگریشن رو حالا ران کنید تا اخرین نسخه
۶. دیتابیسو چک کنید ببینید چه بلایی اوردین سره دیتابیس :))
بهتره خودکار انجام شه کل این پروسس با یک کامند
۱. مولتی پلتفورمه
۲. خیلی سینتکس بهتری داره
تو هر پروژه ای, بنظرم باید کامندی وجود داشته باشه که:
۱. دیتا سپل جنریت کنه برای تست دستی
۲. دیتابیس رو ریست کنه با دیتای جدید
۳. تیبلا رو مجدد بسازه
۴. ماگریتی که نوشتین رو بتونه تست کنه
۵. اینستال پروژه هندل شه
۶. برای ران تست هم کامند جدا باید باشه
همیشه ترجیح میدم از poetry استفاده کنم چون خودش پکیج میسازه برام و lockfile داره و میتونم توش خودم پکیج بسازم که به صورت live از روش بخونه و آپدیتش کنه (مثل shared library بین سرویسا)
Justfile: https://github.com/casey/just
برای تست ماگریشنتون:
۱. باید تیبل هاتون رو پاک کنید
۲. باید برید برنچی که ازش برنچ میگیرین مثلا dev
۳. دیتابیس رو بسازید با اون برنچ و migration هایی که بوده اونجا رو اسکیپ کنید
۴. برگردین برنچی که کار میکردین روش
۵. ماگریشن رو حالا ران کنید تا اخرین نسخه
۶. دیتابیسو چک کنید ببینید چه بلایی اوردین سره دیتابیس :))
بهتره خودکار انجام شه کل این پروسس با یک کامند
🥚 ایسترگها (Easter egg) و سیکرتهای جالب پایتون!
1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.
$
$
3️⃣ - اگه حوصلتون سر رفته و میخواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میمها و جکهای دنیای خودمون.
$
6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!
=> منبع اصلی این پست در Medium
1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.
$
python -m hello
Hello World!
2️⃣ - برای چاپ کردن ذن پایتون، کافیه ماژول this
رو ایمپورت کنید و یه لیست از استعارههای بامفهوم برنامهنویسی رو واستون چاپ میکنه.$
python -c 'import this'
👈
ماژول ذن this.py در ریپازیتوری CPython3️⃣ - اگه حوصلتون سر رفته و میخواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میمها و جکهای دنیای خودمون.
$
python -c 'import antigravity'
4️⃣
- اگه میخواید از فیچرهایی که قراره در آینده به پایتون اضافه شه استفاده کنید، میتونید از future است
فاده کنید. مثلا توی پایتون۲، پرینت یه تابع نبود ولی اگه ماژول زیر رو ایمپورت میکردید، مفسر پایتون۲ از این به بعد به دید یه فانکشن به print
نگاه میکرد و باید از پرانتز جلوی پرینت استفاده میکردید.#!/usr/bin/python2
from future import print_function
حالا نکته جالبش اینجاس که ما توی تقریبا تمام زبان هایی که بیسشون C هست، از {} بعنوان تعیین اسکوپ فانکشن، شروط، کلسها و.. استفاده میکنیم که توی پایتون به این شکل نیست و block-indentation مهمه. حالا اگه سعی کنید braces
رو از future ایم
پورت کنید میاد و اینجوری بهتون تیکه میندازه..>>> from future import braces
SyntaxError: not a chance
5️⃣ - میدونستید میشه هش بینهایت و Not-a-numbert رو توی پایتون نشون داد..؟! جالبه نه؟>>> hash(float('inf'))
314159
>>> hash(float('nan'))
0
👈 اینجا جاییه که بعنوان دوتا ثابت در کدبیس CPython تعریف شدن6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!
>>> 1 != 0
True
>>> from future import barry_as_FLUFL
>>> 1 != 0
SyntaxtError: with Barry as BDFL, use '<>' instead of '!='
>>> 1 <> 0
True
>>> 2 <> 2
False
شاید واستون جالب باشه ولی این قضیه بعد از اینکه Maintain پروژه پایتون توسط Guido به Barry داده شد، رواج پیدا کرد. واسش حتی PEP401 هم نوشتن که من (شخصا) موجودیتش رو درک نکردم ولی ارزش خوندن داره و نکات جالبی درباره تاریخچه پایتون میگه. :)=> منبع اصلی این پست در Medium
Medium
7 Easter Eggs in Python
Countless Ways to Entertain Yourself at Home
🧑💻PythonDev🧑💻
خروجی : ما b = a، a و b رو هر دو به یک شیء یکسان اختصاص میدیم. وقتی تابع id () رو بررسی میکنیم ، همون شماره رو برمیگردونه. ما a رو به 500 واگذار میکنیم. و بعد به شناسه جدید شیء اشاره کرد. #Fxl
خب شبتون بخیر دوستان شنیدم که تو شهر متغیر ها دارید میچرخید 😆
اومدم یه درس کوچولو بهتون بدم و در عین حال که ساده هست میتونه جذاب هم باشه.
بحث عملگر ها) Operators(:از اسم بحث مشخصه که قراره کلی محاسبات داشته باشیم.
عملگر ها در اصل برای پردازش های حسابی و منطقی استفاده میشود.
عملگر ها سمبل هایی هستن که برای محاسبات و ریاضیات بیشتر مورد استفاده قرار میگیرن.
شما برای به جمع رسوندن 2 عدد صحیح نیاز دارید از یک عملگر استفاده کنید.
این عملگر چی میتونه باشه؟ یک + آره با یک + میتونید دو عدد رو به جمع برسونید
پس عملگرها در پایتون بر اساس تعاریف بالا شامل:
+
-
*
/
هستند اما تعداد و دایره عملگر ها فقط به این 4 تا محدود نمیشه.
درواقع ما انواع عملگر داریم که شامل موارد زیر هستن :
1.عملگر های حسابی
2.عملگر های مقایسه ای
3.عملگر های منطقی
4.عملگر های بیتی
5.عملگر های خاص
6.عملگر های تخصیص
در این درس فقط مورد اول و دوم رو قراره کار بکنیم و مابقی رو در جلسات آینده کار خواهیم کرد.
**بیایین پست بعدی بریم واس روستای عملگرها تو شهر متغیر ها یه هوایی تازه کنیم
#Operators
#Sxl
اومدم یه درس کوچولو بهتون بدم و در عین حال که ساده هست میتونه جذاب هم باشه.
بحث عملگر ها) Operators(:از اسم بحث مشخصه که قراره کلی محاسبات داشته باشیم.
عملگر ها در اصل برای پردازش های حسابی و منطقی استفاده میشود.
عملگر ها سمبل هایی هستن که برای محاسبات و ریاضیات بیشتر مورد استفاده قرار میگیرن.
شما برای به جمع رسوندن 2 عدد صحیح نیاز دارید از یک عملگر استفاده کنید.
این عملگر چی میتونه باشه؟ یک + آره با یک + میتونید دو عدد رو به جمع برسونید
پس عملگرها در پایتون بر اساس تعاریف بالا شامل:
+
-
*
/
هستند اما تعداد و دایره عملگر ها فقط به این 4 تا محدود نمیشه.
درواقع ما انواع عملگر داریم که شامل موارد زیر هستن :
1.عملگر های حسابی
2.عملگر های مقایسه ای
3.عملگر های منطقی
4.عملگر های بیتی
5.عملگر های خاص
6.عملگر های تخصیص
در این درس فقط مورد اول و دوم رو قراره کار بکنیم و مابقی رو در جلسات آینده کار خواهیم کرد.
**بیایین پست بعدی بریم واس روستای عملگرها تو شهر متغیر ها یه هوایی تازه کنیم
#Operators
#Sxl
مورد اول:
عملگر های حسابی که شامل
+ برای جمع استفاده میشه
-برای منها کردن و کم کردن
* برای ضرب کردن
/ برای تقسیم کردن استفاده میشه
// برای خارج قسمت
% برای باقی مانده
برای توان استفاده میشه
بیایید برای مثال:
2 + 2
3 - 2
6 * 3
9 / 3
9 // 3
9 % 6
2 2
این عملگر هارو اگر با متغیر ها تلفیق کنید چه شود!!!
مثلا:
Input:
X = 10
Y = 20
Print (X * Y)
Output= 200
دوتا متغیر تعریف کردیم به اسم های X و Y برای هر دو متغیر 2 عدد لحاظ کردیم با عملگر = یعنی برابری دادیم اون عدد رو با اون متغیر بعد اومدیم پرینت گرفتیم)چاپ گرفتیم( ضرب این 2 متغیر رو.
یا به این مثال توجه کنید:
A = 100
B = 10
Print (A / B)
Output : 100
بریم برای پست بعدی.
#Operators
#python
#Sxl
عملگر های حسابی که شامل
+ برای جمع استفاده میشه
-برای منها کردن و کم کردن
* برای ضرب کردن
/ برای تقسیم کردن استفاده میشه
// برای خارج قسمت
% برای باقی مانده
برای توان استفاده میشه
بیایید برای مثال:
2 + 2
3 - 2
6 * 3
9 / 3
9 // 3
9 % 6
2 2
این عملگر هارو اگر با متغیر ها تلفیق کنید چه شود!!!
مثلا:
Input:
X = 10
Y = 20
Print (X * Y)
Output= 200
دوتا متغیر تعریف کردیم به اسم های X و Y برای هر دو متغیر 2 عدد لحاظ کردیم با عملگر = یعنی برابری دادیم اون عدد رو با اون متغیر بعد اومدیم پرینت گرفتیم)چاپ گرفتیم( ضرب این 2 متغیر رو.
یا به این مثال توجه کنید:
A = 100
B = 10
Print (A / B)
Output : 100
بریم برای پست بعدی.
#Operators
#python
#Sxl
مورد دوم :
عملگر های مقایسه ای هستن که شامل:
> بزرگتر از
< کوچکتر از
== مساوی است با
!= نامساوی
=<کوچکتر مساوی
=>بزرگتر مساوی
از اسم این عملگر ها معلومه که کارشون کلا مقایسه هست مثلا مقایسه 2 عدد باهم.مثلا در قسمت شرط دهی مینویسیم اگر فلان مورد برابر با فلان مورد باشد فلان چیز رو پرینت کن یا اگر فلان عدد بزرگتر از فلان عدد باشد بهمان چیز رو چاپ کن
در پست های بعدی با مثال های تحلیلی و کاربردی درسارو تکمیل تر میکنیم.
اینجا یه لینکی از عملگرها در پایتون میزارم براتون که بتونید یه مطالعه ای هم داشته باشید.
https://www.w3schools.com/python/python_operators.asp
یه مقاله خوبم براتون آوردم که میتونه براتون مفید باشه:
Operators in Python:
https://www.linkedin.com/pulse/operators-python-dharan-kumar-bera?utm_source=share&utm_medium=member_android&utm_campaign=share_via
#Sxl
عملگر های مقایسه ای هستن که شامل:
> بزرگتر از
< کوچکتر از
== مساوی است با
!= نامساوی
=<کوچکتر مساوی
=>بزرگتر مساوی
از اسم این عملگر ها معلومه که کارشون کلا مقایسه هست مثلا مقایسه 2 عدد باهم.مثلا در قسمت شرط دهی مینویسیم اگر فلان مورد برابر با فلان مورد باشد فلان چیز رو پرینت کن یا اگر فلان عدد بزرگتر از فلان عدد باشد بهمان چیز رو چاپ کن
در پست های بعدی با مثال های تحلیلی و کاربردی درسارو تکمیل تر میکنیم.
اینجا یه لینکی از عملگرها در پایتون میزارم براتون که بتونید یه مطالعه ای هم داشته باشید.
https://www.w3schools.com/python/python_operators.asp
یه مقاله خوبم براتون آوردم که میتونه براتون مفید باشه:
Operators in Python:
https://www.linkedin.com/pulse/operators-python-dharan-kumar-bera?utm_source=share&utm_medium=member_android&utm_campaign=share_via
#Sxl
W3Schools
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
This media is not supported in your browser
VIEW IN TELEGRAM
بدون نوشتن کد، دادههاتُ توی پایتون تحلیل کن
کتابخونه Bamboolib از اون کتابخونههایی هست با این کتابخونه هر کسی میتونه بدون برنامهنویسی، دادههاش رو با پایتون تحلیل کنه.
این کتابخونه خودش کدهارو به صورت خودکار تولید میکنه که با خوندن این کدها، میتونیم حتی کدنویسی رو یاد بگیریم.
در اصل کتابخونه Bamboolib یک GUI برای Pandas هست که با Jupyter Notebook میشه ازش استفاده کرد.
https://pypi.org/project/bamboolib/
https://bamboolib.8080labs.com/
https://towardsdatascience.com/bamboolib-one-of-the-most-useful-python-libraries-you-have-ever-seen-6ce331685bb7
https://medium.com/analytics-vidhya/bamboolib-a-gui-for-pandas-e5109f7bccff
کتابخونه Bamboolib از اون کتابخونههایی هست با این کتابخونه هر کسی میتونه بدون برنامهنویسی، دادههاش رو با پایتون تحلیل کنه.
این کتابخونه خودش کدهارو به صورت خودکار تولید میکنه که با خوندن این کدها، میتونیم حتی کدنویسی رو یاد بگیریم.
در اصل کتابخونه Bamboolib یک GUI برای Pandas هست که با Jupyter Notebook میشه ازش استفاده کرد.
https://pypi.org/project/bamboolib/
https://bamboolib.8080labs.com/
https://towardsdatascience.com/bamboolib-one-of-the-most-useful-python-libraries-you-have-ever-seen-6ce331685bb7
https://medium.com/analytics-vidhya/bamboolib-a-gui-for-pandas-e5109f7bccff
🔮 برای آینده کُد بنویس
🎓به مناسبت روز دانشجو🎓
😉 ۲۰ ٪ تخفیف روی همه دورههای کوئراکالج
🙈 ۲۰ ٪ شارژ حساب کوئرایی بعد از ثبتنام
🗓 از ۱۱ تا ۱۶ آذر ماه
💎 مسیرهای یادگیری:
🔘مسیر Python - Django
🔘مسیر php- Laravel
🔘مسیر Golang
🔘مسیر Front-End
🔘مسیر Machine Learning
🔘مسیر المپیاد
🔘دورههای عمومی(Git-Linux-Database-NoSQL)
✅ در کنار هم، پیش به سوی برنامهنویس شدن:
🔗 https://quera.org/r/ce8yr
➖➖➖➖➖➖➖
#Quera #Quera_College
@Quera_ir
🎓به مناسبت روز دانشجو🎓
😉 ۲۰ ٪ تخفیف روی همه دورههای کوئراکالج
🙈 ۲۰ ٪ شارژ حساب کوئرایی بعد از ثبتنام
🗓 از ۱۱ تا ۱۶ آذر ماه
💎 مسیرهای یادگیری:
🔘مسیر Python - Django
🔘مسیر php- Laravel
🔘مسیر Golang
🔘مسیر Front-End
🔘مسیر Machine Learning
🔘مسیر المپیاد
🔘دورههای عمومی(Git-Linux-Database-NoSQL)
✅ در کنار هم، پیش به سوی برنامهنویس شدن:
🔗 https://quera.org/r/ce8yr
➖➖➖➖➖➖➖
#Quera #Quera_College
@Quera_ir
دوستانی که میپرسن چطور من sql یاد گرفتم:
۱. اولا هیچ query رو اخیرا دیگه رو اول تو orm به صورت کد نمینویسم مگه اینکه یک چیز خیلی ابتدایی باشه. اول همیشه با دیتابیس مینویسم بعد میام رو orm معادلشو مینویسم. این عادتو حتما ترک بدین و به محیط دیتابیس عادت کنید.
۲. کتاب خاصی نخوندم. اگه کسی میشناسه معرفی کنه بقیه هم استفاده کنند. ولی با کتاب خواندن حداقل تو این مورد به جایی نمیرسید. باید تمرین کنید. بیشتر داک خوندم یا مقاله یا تحقیق کردم رسیدم به یک چیزی.
۳. همین query هایی که طی روز مینویسید تلاش کنید بهینه و با ۱ هیت بنویسید. با ۱ هیت نوشتن دلیل بر این نمیشه که query بهینه شد. explain و analyze رو بزنید ببینید چه اتفاقی داره میفته. با مفاهیم داخل دیتابیس آشنا باشین. بدونید cost estimate و execution plan وactual time و rows and width و buffers چیه. صرفا سریع ران شدن هم دلیل بر آپتیمایز بودن یک query نیست. ممکنه مموری خیلی زیادی مصرف کنه. پس متریک های دیتابیس رو یاد بگیرین. و کار کردن باهاش رو. مثل یک زمین بازی میمونه هرچی بیشتر توش بازی کنید بیشتر یاد میگیرین.
آیا مهمه؟
صد در صد 🙂 اخیرا دیدم تو community پایتون خیلی مانور میرن رو اینکه پایتون رو بشدت دیپ شن. بد نیستا ولی اولویت بندی کنید از بقیه چیزا غافل نشید. خیلیا که با orm کار میکنن اگه ۵ تا سوال sql ازشون بپرسن بلد نیستن چون تو عمرشون زیاد تو دیتابیس نچرخیدن و سرو کله نزدن.
۱. اولا هیچ query رو اخیرا دیگه رو اول تو orm به صورت کد نمینویسم مگه اینکه یک چیز خیلی ابتدایی باشه. اول همیشه با دیتابیس مینویسم بعد میام رو orm معادلشو مینویسم. این عادتو حتما ترک بدین و به محیط دیتابیس عادت کنید.
۲. کتاب خاصی نخوندم. اگه کسی میشناسه معرفی کنه بقیه هم استفاده کنند. ولی با کتاب خواندن حداقل تو این مورد به جایی نمیرسید. باید تمرین کنید. بیشتر داک خوندم یا مقاله یا تحقیق کردم رسیدم به یک چیزی.
۳. همین query هایی که طی روز مینویسید تلاش کنید بهینه و با ۱ هیت بنویسید. با ۱ هیت نوشتن دلیل بر این نمیشه که query بهینه شد. explain و analyze رو بزنید ببینید چه اتفاقی داره میفته. با مفاهیم داخل دیتابیس آشنا باشین. بدونید cost estimate و execution plan وactual time و rows and width و buffers چیه. صرفا سریع ران شدن هم دلیل بر آپتیمایز بودن یک query نیست. ممکنه مموری خیلی زیادی مصرف کنه. پس متریک های دیتابیس رو یاد بگیرین. و کار کردن باهاش رو. مثل یک زمین بازی میمونه هرچی بیشتر توش بازی کنید بیشتر یاد میگیرین.
آیا مهمه؟
صد در صد 🙂 اخیرا دیدم تو community پایتون خیلی مانور میرن رو اینکه پایتون رو بشدت دیپ شن. بد نیستا ولی اولویت بندی کنید از بقیه چیزا غافل نشید. خیلیا که با orm کار میکنن اگه ۵ تا سوال sql ازشون بپرسن بلد نیستن چون تو عمرشون زیاد تو دیتابیس نچرخیدن و سرو کله نزدن.
پست امروز رو با دو سوال سطح سخت SQL شروع میکنم:
شما فرض کنید مقداری تراکنش یا سفارشات داخل یک دیتابیس روزانه دارین, به همراه قیمتی که فروخته شدن و مقدارشون و زمان فروخته شدنشون, مثلا:
id product_id product_amount total_price created_at
1 1 20 100,000 ...
۱. یک query بزنید که تغییر قیمت رو به صورت روزانه به ازای تمام record ها دربیاره. و البته میانگین قیمت اون روز 🙂 با فرض اینکه فقط برای یک product id رو میخواین در بیارین (product_id = 1). تغییرات قیمت یعنی مثلا امروز پروداکت id=1 به ازای هر یک دونه اش ۱۰۰ تومن بوده میانگینش, فردا شده ۹۹ تومن, پس ۱ تومن کم شده. اینو باید تو query اول به دست بیارین. که میشه -۱ مثلا. یا میتونه مثبت هم باشه. یعنی نسبت به روز قبلش باید حساب کنید ارزون شده یا گرون و چقدر؟.
۲. تیمی که سفارشات رو حاضر میکنه سفارشات رو export میگیره. همچنین داخل مغازه هم سفارشاتی میرسه. سپس مجددا دیتا رو ایمپورت میکنه. حالا تیم میخواد یک import به برنامه بده که اگه سفارش وجود داشت با مقادیر جدیدی که داخل اکسل داده آپدیتش کنه و اگه وجود نداشت بسازش. و در آخر بعد از ایمپورت متوجه شه چه سفارشاتی آپدیت شده و چه سفارشاتی ساخته شده. این رو با 1 query بنویسید.
راهنمایی: دیتابیسمون PostgreSQL هست.وقتی تو رزومتون میزنید PostgreSQL بلدین یعنی دقیقا همچین Query هایی رو باید باهاشون آشنا باشین!
راهنمایی دوم:این دو query خیلی کوتاه و خوانا هستند!
شما فرض کنید مقداری تراکنش یا سفارشات داخل یک دیتابیس روزانه دارین, به همراه قیمتی که فروخته شدن و مقدارشون و زمان فروخته شدنشون, مثلا:
id product_id product_amount total_price created_at
1 1 20 100,000 ...
۱. یک query بزنید که تغییر قیمت رو به صورت روزانه به ازای تمام record ها دربیاره. و البته میانگین قیمت اون روز 🙂 با فرض اینکه فقط برای یک product id رو میخواین در بیارین (product_id = 1). تغییرات قیمت یعنی مثلا امروز پروداکت id=1 به ازای هر یک دونه اش ۱۰۰ تومن بوده میانگینش, فردا شده ۹۹ تومن, پس ۱ تومن کم شده. اینو باید تو query اول به دست بیارین. که میشه -۱ مثلا. یا میتونه مثبت هم باشه. یعنی نسبت به روز قبلش باید حساب کنید ارزون شده یا گرون و چقدر؟.
۲. تیمی که سفارشات رو حاضر میکنه سفارشات رو export میگیره. همچنین داخل مغازه هم سفارشاتی میرسه. سپس مجددا دیتا رو ایمپورت میکنه. حالا تیم میخواد یک import به برنامه بده که اگه سفارش وجود داشت با مقادیر جدیدی که داخل اکسل داده آپدیتش کنه و اگه وجود نداشت بسازش. و در آخر بعد از ایمپورت متوجه شه چه سفارشاتی آپدیت شده و چه سفارشاتی ساخته شده. این رو با 1 query بنویسید.
راهنمایی: دیتابیسمون PostgreSQL هست.وقتی تو رزومتون میزنید PostgreSQL بلدین یعنی دقیقا همچین Query هایی رو باید باهاشون آشنا باشین!
راهنمایی دوم:این دو query خیلی کوتاه و خوانا هستند!
🧑💻PythonDev🧑💻
پست امروز رو با دو سوال سطح سخت SQL شروع میکنم: شما فرض کنید مقداری تراکنش یا سفارشات داخل یک دیتابیس روزانه دارین, به همراه قیمتی که فروخته شدن و مقدارشون و زمان فروخته شدنشون, مثلا: id product_id product_amount total_price created_at 1 1 …
سید جواب سوال یک رو داد. اما چطوری جواب سوالا رو بدیم؟بحث میزان آشنایی با SQL و PostgreSQL هست. با توابع و window function ها اشنایی داشته باشیم. چیزایی که میتونه PostgreSQL رو خاص کنه.
اولین سوال چیه؟سوال راجب Financial analysis هست. اگه با LAG آشنا باشین دقیقا کاربرد اساسیش همینه. هرجایی که comparision و analysis بر اساس دیتا های قبلی و بعدی باشه میتونیم از lag استفاده کنیم. برای Performance Metric هم خیلی به درد میخوره! یا برای آنالیز Sequence ای از دیتا ها. مثلا آنالیز کن کاربر هایی که ۵ تا سفارش دادن ایا هر سفارششون بزرگ تر از سفارش قبل هست یا نه؟ (مثلا سفارش پنجیمشون بزرگ تر از چهارمیه؟) کل این با یک queryبدست میاد. معمولا هم خیلی خوانایی بالایی داره. یک نکته دیگه این سوال استفاده از cte هست چون اول باید دیتا رو batch کنیم (سفارشات هر روز رو)و بعد آنالیزشون کنیم. طبق جواب سید:
سوال دوم. خب مشخصه از ما mass operation میخواد. مثل mass insert. اگه نمیگفت آپدیت شدن یا ساخته شدن رو نشون بده اونوقت از upsert استفاده میکردیم. upsert یعنی اگه وجود داره update کن اگه نه insert. پس باید upsert رو به نوعی خودمون بسازیم. upsert چیکار میکنه دقیقا؟اول سعی میکنه insert کنه بعد اگه conflict به وجود اومد update میکنه. همینو کافیه خودمون بنویسیم و در نهایت بگیم که ایا اپسرت شده یا ایسنرت. نکته خیلی مهم تر هم اینه که RETURNING داشته باشیم. خیلی مفیده این. به شما میگه چه دیتایی رو آپدیت کردین
که طبق تابعی که نوشتم میتونید متوجه شین update بوده یا insert.
نکته مهم سوال اینه که
۱. با upsert آشنا باشین
۲. با returning آشنا باشین
۳. با on conflict آشنا باشین
اولین سوال چیه؟سوال راجب Financial analysis هست. اگه با LAG آشنا باشین دقیقا کاربرد اساسیش همینه. هرجایی که comparision و analysis بر اساس دیتا های قبلی و بعدی باشه میتونیم از lag استفاده کنیم. برای Performance Metric هم خیلی به درد میخوره! یا برای آنالیز Sequence ای از دیتا ها. مثلا آنالیز کن کاربر هایی که ۵ تا سفارش دادن ایا هر سفارششون بزرگ تر از سفارش قبل هست یا نه؟ (مثلا سفارش پنجیمشون بزرگ تر از چهارمیه؟) کل این با یک queryبدست میاد. معمولا هم خیلی خوانایی بالایی داره. یک نکته دیگه این سوال استفاده از cte هست چون اول باید دیتا رو batch کنیم (سفارشات هر روز رو)و بعد آنالیزشون کنیم. طبق جواب سید:
WITH DailyPrices AS (
SELECT DATE(created_at) AS date, AVG(total_price / product_amount) AS average_price
FROM orders WHERE product_id = 1 GROUP BY DATE(created_at)
)
SELECT
date,
average_price,
average_price - LAG(average_price) OVER (ORDER BY date) AS price_change
FROM
DailyPrices;
سوال دوم. خب مشخصه از ما mass operation میخواد. مثل mass insert. اگه نمیگفت آپدیت شدن یا ساخته شدن رو نشون بده اونوقت از upsert استفاده میکردیم. upsert یعنی اگه وجود داره update کن اگه نه insert. پس باید upsert رو به نوعی خودمون بسازیم. upsert چیکار میکنه دقیقا؟اول سعی میکنه insert کنه بعد اگه conflict به وجود اومد update میکنه. همینو کافیه خودمون بنویسیم و در نهایت بگیم که ایا اپسرت شده یا ایسنرت. نکته خیلی مهم تر هم اینه که RETURNING داشته باشیم. خیلی مفیده این. به شما میگه چه دیتایی رو آپدیت کردین
INSERT INTO product_order (id, user_id, product_id, product_amount, total_price, status)
VALUES
(UUID..., 'txn1001', 1, 1.5, 15000, "DONE"),
(UUID..., 'txn1002', 1, 2.0, 20000, "DONE"),
(UUID..., 'txn1003', 1, 0.75, 7500, "DONE")
ON CONFLICT (id)
DO UPDATE SET
status = EXCLUDED.status,
RETURNING id, user_id, product_id, product_amount, total_price, status
CASE WHEN xmax::text::int > 0 THEN 'Update' ELSE 'Insert' END AS operation_type;
که طبق تابعی که نوشتم میتونید متوجه شین update بوده یا insert.
نکته مهم سوال اینه که
۱. با upsert آشنا باشین
۲. با returning آشنا باشین
۳. با on conflict آشنا باشین
یک سری نظرا رو شنیدم. من نظره خودمو میگم که بیشتر بحث کنیم, ببینید وقتی conflict وجود داره چند اشتباه ممکنه دو طرف بکنند که بهتره بررسیشون کنیم:
۱. اینپوت شما همیشه باید خیلی با ارزش باشه. با ارزش بودن به این دلیل نیست که حتما قبول شه. به این دلیله که شنیده شه و حتی راجبش بحث شه یا جلسه گذاشته شه. غیر این باشه محیطی نیست که توش بتونید پیشرفت کنید. ممکنه همه input هاتونم ریجکت شه و این موضوعو نباید سوءبرداشت شخصی ازش داشته باشین. پس اگه جای تصمیم گیرنده هستین این حس با ارزش بودن اینپوت و شنیدنشو منتقل کنید. فیدبک ها همیشه باعث بهتر شدن یک سیستم میشن.
۲. همیشه فکر میکنن ۲ تا نقطه مقابل هم وجود داره تو conflict در صورتی که اصلا اینطور نیست. مثلا کارفرما میگه اقا من این پروداکتو باید تا فلان روز برسونم سریع کدشو بزن. شمام میگی نه ریفکتور میخواد اصولی نیست. منتهی تو این سناریو یک راه حل سومی هست: که شما با اون فرد بشینی مذاکره کنی و بحث کنی. ممکنه یک نقطه وسط برسین. در درجه اول باید درک کنید طرف مقابل چی میگه. در درجه دوم راهکار خودتونو به نحوی بچرخونید که با هدف اون همسو باشه. مثلا این arguement اش این میشه که اقا من باید رو هر فیچر جدید دستی تست کنم که کار میکنه. من argue میکنم که اگه تست خودکار بنویسم وقت کمتری مصرف میکنم. پس نظرت چیه شرط ببندیم برای این فیچر جدید که من سریعتر میرسونم با داشتن تست؟ سرعت توسعه منو بیشتر میکنه. یا مثلا بگین اقا من این قسمت جدیدی که دارم اضافه میکنم رو تمیز کد میزنم. کاری ندارم به بقیه. و کارمو هم سریع تر میرسونم. ممکنه کد consistent نشه و یک دفعه خیلی متفاوت شه ولی بهترین راه کاره. اینطوری هم کارو سریع میرسونم هم کم کم ریفکتور میشه با فیچر های جدید تری که اضافه میکنیم به این پروژه.
۳. سطح علمی طرف مقابل رو در نظر نمیگیرین و یا pros یا cons رو خوب نمیگن. من به عنوان یک مهندس نرم افزار وظیفه دارم long time side effect این کار اشتباهو بگم. که تصمیم گیرنده درک بهتری داشته باشه. از حرفام با سند و مدرک و مقاله دفاع کنم. صرفا حرف شما به تنهایی ممکنه اعتبار نداشته باشه. همیشه وقتی یک بحثی میکشین وسط یادتون باشه هم pros باید گفته شه هم cons که شنونده احساس نکنه شما دارین احساسی تصمیم میگیرین و منطقی تصمیم گرفته شه.
۴. سعی کنید brain storming کنید. سعی کنید حوادث رو ارتباط بدین با مشکلی که دارین. مثلا بگین فلان باگ و فلان باگ و فلان باگ به وجود اومد چون اینکارا رو نکردیم. پس بهتره بکنیم. هیچوقت یارکشی نکنید. بگید فلانی همیشه conflict منو رد میکنه یا فلان. این بد ترین چیزیه تو یک تیم. یادتون باشه اینپوتتون قرار نیست همیشه قبول شه. ولی باید با ارزش باشه. یک کامنتی خیلی قشنگ نوشتن: قاتل کار تیمی miscommunicationعه! و برعکسش هم صدق میکنه. برای همین brain storming خیلی میتونه مفید باشه.
۵. از دنیای فانتری فاصله بگیرین. واقعبین باشید. مثلا دیدم برنامه نویسا یک فریم ورک یا یک فیچر اصلا به دردشون نمیخورد ولی اضافه کردن چرا؟چون خوششون میاد. چون میخوان یادش بگیرن. این بد ترین کاریه که میتونید تو یک محیط حرفه ای کنید. یا مثلا میرن premature optimization انجام میدن و وقتشونو هدر میدن برای جایی که اصلا نیازی نبوده. یا بیش از حد کلین کد میزنن رو پروداکتی که requirement اش روز به روز تغییر میکنه. پس همیشه سعی کنید از دید model business پروداکتتون به محصولتون نگاه کنید تا بهترین کد هارو بنویسید 🙂 خیلی وقتا دلیل conflict همینه که یکی از دو طرف تو دنیای فعلی نیست.
۱. اینپوت شما همیشه باید خیلی با ارزش باشه. با ارزش بودن به این دلیل نیست که حتما قبول شه. به این دلیله که شنیده شه و حتی راجبش بحث شه یا جلسه گذاشته شه. غیر این باشه محیطی نیست که توش بتونید پیشرفت کنید. ممکنه همه input هاتونم ریجکت شه و این موضوعو نباید سوءبرداشت شخصی ازش داشته باشین. پس اگه جای تصمیم گیرنده هستین این حس با ارزش بودن اینپوت و شنیدنشو منتقل کنید. فیدبک ها همیشه باعث بهتر شدن یک سیستم میشن.
۲. همیشه فکر میکنن ۲ تا نقطه مقابل هم وجود داره تو conflict در صورتی که اصلا اینطور نیست. مثلا کارفرما میگه اقا من این پروداکتو باید تا فلان روز برسونم سریع کدشو بزن. شمام میگی نه ریفکتور میخواد اصولی نیست. منتهی تو این سناریو یک راه حل سومی هست: که شما با اون فرد بشینی مذاکره کنی و بحث کنی. ممکنه یک نقطه وسط برسین. در درجه اول باید درک کنید طرف مقابل چی میگه. در درجه دوم راهکار خودتونو به نحوی بچرخونید که با هدف اون همسو باشه. مثلا این arguement اش این میشه که اقا من باید رو هر فیچر جدید دستی تست کنم که کار میکنه. من argue میکنم که اگه تست خودکار بنویسم وقت کمتری مصرف میکنم. پس نظرت چیه شرط ببندیم برای این فیچر جدید که من سریعتر میرسونم با داشتن تست؟ سرعت توسعه منو بیشتر میکنه. یا مثلا بگین اقا من این قسمت جدیدی که دارم اضافه میکنم رو تمیز کد میزنم. کاری ندارم به بقیه. و کارمو هم سریع تر میرسونم. ممکنه کد consistent نشه و یک دفعه خیلی متفاوت شه ولی بهترین راه کاره. اینطوری هم کارو سریع میرسونم هم کم کم ریفکتور میشه با فیچر های جدید تری که اضافه میکنیم به این پروژه.
۳. سطح علمی طرف مقابل رو در نظر نمیگیرین و یا pros یا cons رو خوب نمیگن. من به عنوان یک مهندس نرم افزار وظیفه دارم long time side effect این کار اشتباهو بگم. که تصمیم گیرنده درک بهتری داشته باشه. از حرفام با سند و مدرک و مقاله دفاع کنم. صرفا حرف شما به تنهایی ممکنه اعتبار نداشته باشه. همیشه وقتی یک بحثی میکشین وسط یادتون باشه هم pros باید گفته شه هم cons که شنونده احساس نکنه شما دارین احساسی تصمیم میگیرین و منطقی تصمیم گرفته شه.
۴. سعی کنید brain storming کنید. سعی کنید حوادث رو ارتباط بدین با مشکلی که دارین. مثلا بگین فلان باگ و فلان باگ و فلان باگ به وجود اومد چون اینکارا رو نکردیم. پس بهتره بکنیم. هیچوقت یارکشی نکنید. بگید فلانی همیشه conflict منو رد میکنه یا فلان. این بد ترین چیزیه تو یک تیم. یادتون باشه اینپوتتون قرار نیست همیشه قبول شه. ولی باید با ارزش باشه. یک کامنتی خیلی قشنگ نوشتن: قاتل کار تیمی miscommunicationعه! و برعکسش هم صدق میکنه. برای همین brain storming خیلی میتونه مفید باشه.
۵. از دنیای فانتری فاصله بگیرین. واقعبین باشید. مثلا دیدم برنامه نویسا یک فریم ورک یا یک فیچر اصلا به دردشون نمیخورد ولی اضافه کردن چرا؟چون خوششون میاد. چون میخوان یادش بگیرن. این بد ترین کاریه که میتونید تو یک محیط حرفه ای کنید. یا مثلا میرن premature optimization انجام میدن و وقتشونو هدر میدن برای جایی که اصلا نیازی نبوده. یا بیش از حد کلین کد میزنن رو پروداکتی که requirement اش روز به روز تغییر میکنه. پس همیشه سعی کنید از دید model business پروداکتتون به محصولتون نگاه کنید تا بهترین کد هارو بنویسید 🙂 خیلی وقتا دلیل conflict همینه که یکی از دو طرف تو دنیای فعلی نیست.
This media is not supported in your browser
VIEW IN TELEGRAM
آپدیت جدید VsCode یک سری فیچر جدید اضافه کرده که به نظرم اونی که مهمتره ( شاید ) این floating window عه. :)
یک فیلترشکن خوب که همین الان خودم بهش وصل ام warp کلاودفلر عه. روش استفاده اش داخل لینوکس:
۱. اگه لینوکستون دبیان بیس و خانواده اوبنتو و پکیج منیجرتون apt هست دستور زیر رو ران کنید:
اگه نیست دنبال پکیجی به نام cloudflare-warp بگردید یا به این لینک سر بزنید.
بعد از نصب (دیگه لینوکس فرقی نداره چی باشه) اون با دستور زیر میتونید اجراش کنید:
اگه اجرا نشد و به ارور
خوردید دستور زیر اجرا کنید تا اوکی بشه:
بعدش دوباره با دستور warp-cli connect اجراش کنید و باید کار کنه.
اگه وصل شد که تبریک میگم، اگه نشد که نمیدونم واقعا برای من رو نت همراه اول اوکی. میتونید با این دستور و گشتن دنبال warp=on بفهمید درست کار میکنه یا نه.
الان یک اشتراک ۱ گیگی رایگان دارید که داره کار میکنه ولی خوب یک گیگ کمه خدایی. از این ربات (@generatewarpplusbot ) یکدونه لاینسنس بگیرید و با دستور زیر واردش کنید. قبلش با دستور warp-cli disconnect دیسکانکت شید.
دوباره کانکت بشید و چک کنید warp=on هستش یا نه :). اگه بود لذت ببرید.
نکته: با این ابزار هنوز برای دنیا دارید از ایران میایید ولی خوب دیگه فیلترینگ ندارید.
برای ویندوز، مک، آیفون، اندروید هم به این لینک سر بزنید.
با نت همراه اول تست کردم اوکیه. بقیه رو نمیدانم.
۱. اگه لینوکستون دبیان بیس و خانواده اوبنتو و پکیج منیجرتون apt هست دستور زیر رو ران کنید:
bash
sudo apt install cloudflare-warp
اگه نیست دنبال پکیجی به نام cloudflare-warp بگردید یا به این لینک سر بزنید.
بعد از نصب (دیگه لینوکس فرقی نداره چی باشه) اون با دستور زیر میتونید اجراش کنید:
warp-cli connect
اگه اجرا نشد و به ارور
Error: "Unable to connect to CloudflareWARP daemon. Maybe the daemon is not running?"
خوردید دستور زیر اجرا کنید تا اوکی بشه:
sudo systemctl enable --now warp-svc.service
بعدش دوباره با دستور warp-cli connect اجراش کنید و باید کار کنه.
اگه وصل شد که تبریک میگم، اگه نشد که نمیدونم واقعا برای من رو نت همراه اول اوکی. میتونید با این دستور و گشتن دنبال warp=on بفهمید درست کار میکنه یا نه.
curl https://www.cloudflare.com/cdn-cgi/trace/
الان یک اشتراک ۱ گیگی رایگان دارید که داره کار میکنه ولی خوب یک گیگ کمه خدایی. از این ربات (@generatewarpplusbot ) یکدونه لاینسنس بگیرید و با دستور زیر واردش کنید. قبلش با دستور warp-cli disconnect دیسکانکت شید.
warp-cli set-license <your-warp-plus-license-key>
دوباره کانکت بشید و چک کنید warp=on هستش یا نه :). اگه بود لذت ببرید.
نکته: با این ابزار هنوز برای دنیا دارید از ایران میایید ولی خوب دیگه فیلترینگ ندارید.
برای ویندوز، مک، آیفون، اندروید هم به این لینک سر بزنید.
با نت همراه اول تست کردم اوکیه. بقیه رو نمیدانم.
Cloudflare Docs
Linux desktop client · Cloudflare WARP client docs
You have two ways of installing WARP on Linux, depending on the distro you are using:
🧑💻PythonDev🧑💻
یک فیلترشکن خوب که همین الان خودم بهش وصل ام warp کلاودفلر عه. روش استفاده اش داخل لینوکس: ۱. اگه لینوکستون دبیان بیس و خانواده اوبنتو و پکیج منیجرتون apt هست دستور زیر رو ران کنید: bash sudo apt install cloudflare-warp اگه نیست دنبال پکیجی به نام cloudflare…
لاینسنس رباتی که گفتم حدود ۲۳ پتابایت حالا حالا تموم نمیشه.
Duck typing, Dynamic Protocol
رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمیدونند
Duck typing
:If it looks like a duck and quacks like a duck, it’s a duck.چیزی که این جمله سعی داره بگه اینه که؛
برای ما مهم نیست object کدوم کلاس هستی اگر این متدها و فانکشنالیتی ها رو داری عضوی از ما هستی.
ما برنامه نویسها همیشه
Duck type mode
هستیم بصورت پیشفرض؛ برای ما فرقی نمیکنه طرف رشته کامپیوتر خونده یا حقوق و حسابداری و ... یا اصلا درس نخونده برای ما مهم هست که طرف توانایی کد زدن داشته باشه و اگر بتونه این کار رو به خوبی انجام بده بهش لقب برنامه نویس میدیم.
پس توی
Duck typing
اولویت متدها هستند و نه خروجی isinstance
🧑💻PythonDev🧑💻
Duck typing, Dynamic Protocol رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمیدونند Duck typing :If it looks like a duck and quacks like a duck, it’s a duck. چیزی که این جمله سعی داره بگه اینه که؛ برای ما مهم نیست object…
Dynamic Protocol
هم از همین مفهموم استفاده میکنه؛ اگر یادتون باشه قبلا راجب پروتوکل مربوط به Sequence صحبت کردیم و گفتیم که اگر یک
class
متدهای __len__, __getitem__
رو داشته باشه میتونیم بعنوان
Sequence Protocol
رو رعایت میکنه و پایتون میتونه مثل Sequence
باهاش رفتار کنه و برخی از فانکشنالیتیهایی که پیاده سازی هم نکردیم رو بهش بده.Dynamic Protocol
ی قدم جلوتر میره و میگه اگر قرار نیست
len
اون آبجکت رو بگیری پس نیازی نیست توی اون کلاس حتی __len__
رو پیاده سازی کنی و صرف وجود __getitem__
من بهت یک سری ویژگیهای Sequence
رو میدم؛ ویژگیهایی که فقط به __getitem__
نیاز داره و نه چیز دیگه.توی مثال تصویر قبل؛ من هیچوقت
__iter__
رو پیادهسازی نکردم اما میتونم روی dp
از for loop
استفاده کنم؛ به لطف Duck typing, Dynamic Protocol
پایتون از
__getitem__
استفاده میکنه و با شروع از اندیس 0
میتونه کار __iter__
رو انجام بده و for loop
بهمون خروجی خواهد داد.برای
in
هم موضوع همین هست؛ توی کد قبلی من هیچوقت __contain__
رو پیادهسازی نکردم اما 9 in dp
خروجی میده (اینبار هم پایتون از
__getitem__
بعنوان fallback
برای __contain__
استفاده میکنه)بحثی که پیش میاد اینه که؛ آیا این موضوع اتفاق خوبی هست ؟
نه همیشه؛ خیلی وقتها میشه نسخه
optimize
شده تری رو نوشت مثلاْ توی کد قبلی اگر من لیست رو بصورت sort
قرار باشه داشته باشم همیشه میتونم بجای __contain__
که خود پایتون بهم میده و linear search
هست که مرتبه زمانی O(n)
داره از Binary Search
استفاده کنم و مرتبه زمانی رو تا O(log n)
کاهش بدم.اما تا وقتی نیازی به بهبود ندارم؛ هیچوقت
__contain__
یا ... رو خودم پیادهسازی نمیکنم و از آنچه که پایتون بهم ارائه میده استفاده میکنم (اینطوری نه نیاز به تست هست؛ نه باگ ازش در میاد و کد تمیزتری هم خواهم داشت)استفاده نادرست از تابع super().init(root) در کلاس MyownDataset است. برای حل این مشکل باید نام تابع init را به صورت صحیح و با حروف بزرگ درست کنید. تابع init دستوری است که هنگام ایجاد شیء از یک کلاس فراخوانی میشود و باید به صورت init(self, root) تعریف شود.