در زبان آلمانی بین دو جمله زیر تفاوت هست:
Shakespeare hat die Geschichte von Hamlet geschrieben.
شکسپیر، داستان هملت را نوشت.
Ein Mann namens Shakespeare schrieb die Geschichte von Hamlet.
مردی به نام شکسپیر، داستان هملت را نوشت.
میگن، شکسپیر اون شخص نیست، بلکه ی اسمه که روی اون شخص گذاشته شده.
اون شخص میتونه هر اسمی داشته باشه.
ولی در انگلیسی این ی بحث لفظی و بی معنیه و تفاوت معنایی بینشون نیست.
به متن زیر دقت کنید:
“Suppose I say to Fat, or Kevin says to Fat, “You did not experience God. You merely experienced something with the qualities and aspects and nature and powers and wisdom and goodness of God.” This is like the joke about the German proclivity toward double abstractions; a German authority on English literature declares, “Hamlet was not written by Shakespeare; it was merely written by a man named Shakespeare.” In English the distinction is verbal and without meaning, although German as a language will express the difference (which accounts for some of the strange features of the German mind).”
Valis, p71 (Book-of-the-Month-Club Edition)
حالا ربطش به برنامهنویسی چیه؟
دو رویکرد بسیار شناخته شده و قابل درک برای انتقال پارامتر در زبانهای برنامهنویسی مختلف، عبارتند از:
pass by reference = بر اساس مرجع
pass by value = بر اساس مقدار
بعنوان مثال، کد زیر رو در نظر بگیرید:
def reassign(lst: list) -> list:
lst = [0, 1]
return lst
def append(lst: list) -> list:
lst.append(1)
return lst
lst = [0]
print(reassign(lst))
print(append(lst))
حالا به این جمله دقت کنید:
«هملت توسط شکسپیر نوشته نشد، بلکه توسط مردی به نام شکسپیر نوشته شد.»
حالا بصورت کد:
a = []
اینجا [] ی لیست تهی و a هم متغیری که به این لیست تهی اشاره داره، ولی a ی لیست تهی نیست.
pass by reference:
در اینصورت، خود متغیر به تابع ارسال میشه و مقدار داخلش هم به تابع ارسال میشه.
مثل ی جعبه که با محتویات داخلش ارسال میشه.
اگه داخل تابع مقدارش رو تغییر بدیم، بیرون تابع هم مقدارش تغییر میکنه.
pass by value:
در اینصورت تابع ی کپی از اون متغیر رو دریافت میکنه که مقادیرش تو ی خونه دیگه حافظه رم نگهداری میشن.
مثل ی سری مدارک که داخل ی جعبه بودن، اومدیم ی کپی ازشون گرفتیم، گذاشتیم داخل ی جعبه دیگه و ارسالش کردیم.
اینجا با تغییر مقادیر داخل تابع، مقادیرش بیرون تابع تغییر نمیکنه.
pass by object reference value(Pythonic):
در اینصورت تابع ی رفرنس به اون آبجکت دریافت میکنه و میتونه به مقادیر اون آبجکت تو حافظه رم دسترسی داشته باشه، ولی خود اون جعبهای که مقادیر توش هستن رو دریافت نمیکنه، بلکه تابع میاد جعبه خودش رو میسازه و ی متغیر جدید برای خودش داره که اینم به همون خونهای که متغیر بیرونی اشاره میکرد اشاره میکنه.
متغیرها متفاوتن، گرچه اسمشون یکی باشه، اما رفرنس هر دو یکیه.
به تصویر بالا، shallow copy دقت کنید تا متوجه بشید چی میگم.
حالا اگه مقادیر رو داخل تابع تغییر بدیم، مقادیر بیرون تابع هم تغییر میکنن.
تو پست بعدی سعی میکنم ی جمع بندی درمورد shallow copy و deep copy صحبت کنم باز.
با تشکر از:
https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/
@osmanmakhtoomdev
Shakespeare hat die Geschichte von Hamlet geschrieben.
شکسپیر، داستان هملت را نوشت.
Ein Mann namens Shakespeare schrieb die Geschichte von Hamlet.
مردی به نام شکسپیر، داستان هملت را نوشت.
میگن، شکسپیر اون شخص نیست، بلکه ی اسمه که روی اون شخص گذاشته شده.
اون شخص میتونه هر اسمی داشته باشه.
ولی در انگلیسی این ی بحث لفظی و بی معنیه و تفاوت معنایی بینشون نیست.
به متن زیر دقت کنید:
“Suppose I say to Fat, or Kevin says to Fat, “You did not experience God. You merely experienced something with the qualities and aspects and nature and powers and wisdom and goodness of God.” This is like the joke about the German proclivity toward double abstractions; a German authority on English literature declares, “Hamlet was not written by Shakespeare; it was merely written by a man named Shakespeare.” In English the distinction is verbal and without meaning, although German as a language will express the difference (which accounts for some of the strange features of the German mind).”
Valis, p71 (Book-of-the-Month-Club Edition)
حالا ربطش به برنامهنویسی چیه؟
دو رویکرد بسیار شناخته شده و قابل درک برای انتقال پارامتر در زبانهای برنامهنویسی مختلف، عبارتند از:
pass by reference = بر اساس مرجع
pass by value = بر اساس مقدار
بعنوان مثال، کد زیر رو در نظر بگیرید:
def reassign(lst: list) -> list:
lst = [0, 1]
return lst
def append(lst: list) -> list:
lst.append(1)
return lst
lst = [0]
print(reassign(lst))
print(append(lst))
حالا به این جمله دقت کنید:
«هملت توسط شکسپیر نوشته نشد، بلکه توسط مردی به نام شکسپیر نوشته شد.»
حالا بصورت کد:
a = []
اینجا [] ی لیست تهی و a هم متغیری که به این لیست تهی اشاره داره، ولی a ی لیست تهی نیست.
pass by reference:
در اینصورت، خود متغیر به تابع ارسال میشه و مقدار داخلش هم به تابع ارسال میشه.
مثل ی جعبه که با محتویات داخلش ارسال میشه.
اگه داخل تابع مقدارش رو تغییر بدیم، بیرون تابع هم مقدارش تغییر میکنه.
pass by value:
در اینصورت تابع ی کپی از اون متغیر رو دریافت میکنه که مقادیرش تو ی خونه دیگه حافظه رم نگهداری میشن.
مثل ی سری مدارک که داخل ی جعبه بودن، اومدیم ی کپی ازشون گرفتیم، گذاشتیم داخل ی جعبه دیگه و ارسالش کردیم.
اینجا با تغییر مقادیر داخل تابع، مقادیرش بیرون تابع تغییر نمیکنه.
pass by object reference value(Pythonic):
در اینصورت تابع ی رفرنس به اون آبجکت دریافت میکنه و میتونه به مقادیر اون آبجکت تو حافظه رم دسترسی داشته باشه، ولی خود اون جعبهای که مقادیر توش هستن رو دریافت نمیکنه، بلکه تابع میاد جعبه خودش رو میسازه و ی متغیر جدید برای خودش داره که اینم به همون خونهای که متغیر بیرونی اشاره میکرد اشاره میکنه.
متغیرها متفاوتن، گرچه اسمشون یکی باشه، اما رفرنس هر دو یکیه.
به تصویر بالا، shallow copy دقت کنید تا متوجه بشید چی میگم.
حالا اگه مقادیر رو داخل تابع تغییر بدیم، مقادیر بیرون تابع هم تغییر میکنن.
تو پست بعدی سعی میکنم ی جمع بندی درمورد shallow copy و deep copy صحبت کنم باز.
با تشکر از:
https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/
@osmanmakhtoomdev
Robert Heaton
Is Python pass-by-reference or pass-by-value? | Robert Heaton
The two most widely known and easy to understand approaches to parameter passing amongst programming languages are pass-by-reference and pass-by-value.
ی کتابخونه عالی که روز منو ساخت!
برای ی پروژه تحت دسکتاپ با پایتون ی کتابخونه لازم داشتم، Tkinter که متن راست به چپ رو پشتیبانی نمیکنه، PySide هم که خیلی سنگینه، ElectronJS هم که مشکلات خودشو داره.
بین اینا و چالشهای هر کدوم مونده بودم که eel به دادم رسید!
مطلب بعدی بصورت خیلی مختصر و مفید میگم این کتابخونه خفن چی هست و چطور میشه باهاش کار کرد.
پس باهام همراه باشین...
@osmanmakhtoomdev
برای ی پروژه تحت دسکتاپ با پایتون ی کتابخونه لازم داشتم، Tkinter که متن راست به چپ رو پشتیبانی نمیکنه، PySide هم که خیلی سنگینه، ElectronJS هم که مشکلات خودشو داره.
بین اینا و چالشهای هر کدوم مونده بودم که eel به دادم رسید!
مطلب بعدی بصورت خیلی مختصر و مفید میگم این کتابخونه خفن چی هست و چطور میشه باهاش کار کرد.
پس باهام همراه باشین...
@osmanmakhtoomdev
👍1😱1
کتابخونه eel چی هست؟
ی کتابخونه پایتون که میاد نقش واسط بین جاوااسکریپت و پایتون رو بازی میکنه.
چطور میتونم کتابخونه eel رو نصب کنم؟
براحتی مثل همه کتابخونههای پایتونی با pip میتونیم نصبش کنیم:
کتابخونه eel چطور کار میکنه؟
در سطح کد: کتابخونه eel میاد نقش واسط بین جاوااسکریپت و پایتون رو بازی میکنه و توابع نوشته شده در این دو زبان رو با هم به اشتراک میذاره.
در سطح اجرا: از chrome یا chromium استفاده میکنه و پنجره دسکتاپی رو برامون نمایش میده.
پس دقت کنید که یا یکی از این دو مرورگر گوگلی رو نصب داشته باشید و یا فایل پورتابل رو تو پوشه بذارید و آدرسش رو به eel بدید.
نمونه کد چی؟
اونم براتون نوشتم تو مطلب بعدی پست میکنم که ایده اولیه رو بدست بیارید و راحتی کار رو ببینید 😊
راستی نحوه پوشه بندی پروژه رو هم میتونید تو عکسی که تو مطلب قبلی پست کردم ببینید.
باهام همراه باشید ❤️🌱...
@osmanmakhtoomdev
ی کتابخونه پایتون که میاد نقش واسط بین جاوااسکریپت و پایتون رو بازی میکنه.
چطور میتونم کتابخونه eel رو نصب کنم؟
براحتی مثل همه کتابخونههای پایتونی با pip میتونیم نصبش کنیم:
pip install eelکتابخونه eel چطور کار میکنه؟
در سطح کد: کتابخونه eel میاد نقش واسط بین جاوااسکریپت و پایتون رو بازی میکنه و توابع نوشته شده در این دو زبان رو با هم به اشتراک میذاره.
در سطح اجرا: از chrome یا chromium استفاده میکنه و پنجره دسکتاپی رو برامون نمایش میده.
پس دقت کنید که یا یکی از این دو مرورگر گوگلی رو نصب داشته باشید و یا فایل پورتابل رو تو پوشه بذارید و آدرسش رو به eel بدید.
نمونه کد چی؟
اونم براتون نوشتم تو مطلب بعدی پست میکنم که ایده اولیه رو بدست بیارید و راحتی کار رو ببینید 😊
باهام همراه باشید ❤️🌱...
@osmanmakhtoomdev
👍1
محتویات فایل main.py
پست بعدی کد جاوااسکریپت خواهد بود.
باهام همراه باشید...
@osmanmakhtoomdev
import os
import eel
# پوشهای که قراره فرانتمون توش باشه رو به eel معرفی میکنیم.
eel.init(f'{os.path.dirname(os.path.realpath(file))}/web')
# از دکوریتور زیر برای اشتراک گذاری این تابع با جاوااسکریپت استفاده میکنیم.
@eel.expose
def py_say_hi(user_name: str) -> None:
# اسمی که زمان فشردن دکمه از سمت جاوااسکریپت ارسال کردیم رو میگیریم و پیام رو براش ارسال میکنیم تا با نام value بتونیم ازش استفاده کنیم و تو label چاپش کنیم.
greetings = f"سلام {user_name} خوش اومدی عزیزم 🤗"
# براتون آشنا نیست؟ آره همون تابعه که تو جاوااسکریپت تعریف کردیم و به اشتراک گذاشتیم.
eel.js_say_hi(greetings)
# سایز پنجره و فایل html اولیه رو تعیین و eel رو استارت میزنیم که بتونه ارتباط رو برقرار کنه.
eel.start("index.html", size=(1000, 600))پست بعدی کد جاوااسکریپت خواهد بود.
باهام همراه باشید...
@osmanmakhtoomdev
محتویات فایل index.html
و تمام، حالا برو حالشو ببر 😍
باهام همراه باشید...
@osmanmakhtoomdev
<!DOCTYPE html>
<html dir="rtl" lang="fa">
<head>
<meta charset="UTF-8">
<noscript>برنامه نمونه</noscript>
<link href="images/python.png" rel="icon" type="image/x-icon">
<link href="css/bootstrap.rtl.min.css" rel="stylesheet">
<noscript src="js/bootstrap.bundle.min.js"></noscript>
<noscript src="js/jquery.min.js"></noscript>
<!-- جاوااسکریپت eel.js رو اضافه میکنیم، فقط دقت کنید که قرار نیست این فایل رو پیدا کنید، ولی نگران نباشید زمان اجرا خودش اضافه میشه 😁 -->
<noscript src="/eel.js"></noscript>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="index.html">اووور</a>
<button aria-controls="top-navbar" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler"
data-bs-target="#top-navbar" data-bs-toggle="collapse" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="top-navbar">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a aria-current="page" class="nav-link active" href="import.html">افزودن کلمات جدید</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- این منو رو گذاشتم ببینید میتونیم از بوت استرپ هم استفاده کنیم برای کارمون-->
<div class="container">
<div class="row">
<div class="col-12">
<div class="mb-3">
<label class="form-label" for="txt_name">نام شما</label>
<input class="form-control" id="txt_name" type="text">
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="mb-3">
<label class="form-label" id="lbl_result">.</label>
</div>
</div>
</div>
<div class="row">
<div class="col-12 text-center">
<div class="mb-3">
<button class="btn btn-primary mb-3" id="btn_say_hello" type="button">سلام کن 😁</button>
</div>
</div>
</div>
</div>
<noscript>
// اینجا اومدیم تابعی که قراره در ادامه تعریف کنیم رو با پایتون به اشتراک گذاشتیم، حالا میتونیم براحتی نتایج رو از سمت پایتون برای این تابع ارسال کنیم که اینجا بهشون دسترسی داشته باشیم.
eel.expose(js_say_hi)
// این تابع قراره از سمت پایتون کال بشه و نتیجه هم با نام value برامون قابل دسترسی هست.
function js_say_hi(value) {
$("#lbl_result").text(value)
}
$(document).ready(function () {
// اینجا هم میایم تعریف میکنیم هر موقع دکمه فشرده شد، تابعی که تو اسکریپت پایتون تعریف کردیم و بوسیله eel با جاوااسکریپت به اشتراک گذاشتیم کال بشه.
$(document).on("click", "#btn_say_hello", function () {
eel.py_say_hi($("#txt_name").val())
})
})
</noscript>
<noscript>
// اینجا هم eel رو آماده میکنیم که ارتباط رو ایجاد کنه.
eel.initialize()
</noscript>
</body>
</html>و تمام، حالا برو حالشو ببر 😍
باهام همراه باشید...
@osmanmakhtoomdev
👍1
استفاده از and و or در مقایسه مقادیر منطقی در پایتون:
وقتی از and در مقایسه استفاده میکنیم باید هر دو طرف True باشن تا نتیجه True بشه در غیر اینصورت نتیجه False میشه.
کلا ۴ حالت داریم:
False and True => False
True and False => False
False and False => False
True and True => True
شاید فکر کنید False and False باید True میشد اما چرا False شد.
به دو صورت میشه این رو توضیح داد:
۱- میتونیم بگیم پایتون کلا خیلی حساسه 😁 و اگه از and استفاده کنیم هیچ جایی از حرفمون نادرست(False) نباشه.
پایتون میاد میبینه اگه سمت چپ and تونست False پیدا کنه دیگه با بقیه کاری نداره و همون False رو نتیجه میده، مثل اولی و سومی، و اگه سمت چپ پیدا نکرد میره سمت راست رو نگاه میکنه و اگه پیدا کرد باز همون False رو نتیجه میده و اگه هیچ جای حرفمون نادرست نبود ناچار میاد حرفمون رو تصدیق میکنه و True رو نتیجه میده 😁.
۲- بصورت ریاضی درنظر بگیریم، یعنی بجای False مقدار عددیش یعنی 0 و بجای True هم 1 رو درنظر بگیریم که میشه:
0 * 1 = 0
1 * 0 = 0
0 * 0 = 0
1 * 1 = 1
اما or کلا متفاوته و دقیقا برعکس and اگر ی جای حرفمون درست بود همونو برمیگردونه.
همون ۴ حالت:
False or True => True
True or False => True
False or False => False
True or True => True
برعکس and که فقط ی حالتش True and True نتیجهاش True بود اینجا فقط ی حالت False or False میشه False و بقیه همه True.
پس وقتی با پایتون صحبت میکنیم باید رو انتخاب کلماتمون دقت کنیم و مراقب باشیم چی داریم میگیم.
باهام همراه باشید...🌺
@osmanmakhtoomdev
وقتی از and در مقایسه استفاده میکنیم باید هر دو طرف True باشن تا نتیجه True بشه در غیر اینصورت نتیجه False میشه.
کلا ۴ حالت داریم:
False and True => False
True and False => False
False and False => False
True and True => True
شاید فکر کنید False and False باید True میشد اما چرا False شد.
به دو صورت میشه این رو توضیح داد:
۱- میتونیم بگیم پایتون کلا خیلی حساسه 😁 و اگه از and استفاده کنیم هیچ جایی از حرفمون نادرست(False) نباشه.
پایتون میاد میبینه اگه سمت چپ and تونست False پیدا کنه دیگه با بقیه کاری نداره و همون False رو نتیجه میده، مثل اولی و سومی، و اگه سمت چپ پیدا نکرد میره سمت راست رو نگاه میکنه و اگه پیدا کرد باز همون False رو نتیجه میده و اگه هیچ جای حرفمون نادرست نبود ناچار میاد حرفمون رو تصدیق میکنه و True رو نتیجه میده 😁.
۲- بصورت ریاضی درنظر بگیریم، یعنی بجای False مقدار عددیش یعنی 0 و بجای True هم 1 رو درنظر بگیریم که میشه:
0 * 1 = 0
1 * 0 = 0
0 * 0 = 0
1 * 1 = 1
اما or کلا متفاوته و دقیقا برعکس and اگر ی جای حرفمون درست بود همونو برمیگردونه.
همون ۴ حالت:
False or True => True
True or False => True
False or False => False
True or True => True
برعکس and که فقط ی حالتش True and True نتیجهاش True بود اینجا فقط ی حالت False or False میشه False و بقیه همه True.
پس وقتی با پایتون صحبت میکنیم باید رو انتخاب کلماتمون دقت کنیم و مراقب باشیم چی داریم میگیم.
باهام همراه باشید...🌺
@osmanmakhtoomdev
👌3👍1
آموزش دادن خیلی عالیه واقعا.
مثلا همین بحث مطلب قبلی تا الان بهش دقت نکرده بودم تا اینکه هنرجوی ۱۳ سالهام برگشت پرسید چرا اینجوری شد نتیجه؟
یا حتی همون هنرجو پرسید آیا import هم ی تابعه تو پایتون؟
ی مورد دیگه هم که امروز برام پیش اومد این بود که داشتم به هنرجو نشون میدادم جای استفاده از if elif else و match case میتونه از دیکشنری هم استفاده کنه.
بعد اومدیم ی ماشین حساب نوشتیم اینجوری، مقدار پیشفرض عدد اول و دوم رو 1 گذاشته بودم، هی میخاستم ریشه دوم بگیرم از تابع لگاریتم که نوشته بودیم خطا میگرفت که تقسیم بر صفر میکنه(چون لگاریتم 1 بر مبنای 1 این مشکل رو داره)، مونده بودم این چه ربطی به اون داره آخه.
بقیه توابع همه ۲ تا عدد میگرفتن از کاربر و فقط ریشه دوم یا همون جذر فقط ی عدد میگرفت و عدد دوم پیشفرض 1 بود.
بعد برداشتن تابع لگاریتم متوجه شدم که وقتی با دیکشنری مینویسم و پرانتز تابع رو هم میذاریم، پایتون میاد تک تک توابع رو ارزیابی میکنه و نتیجه رو نگه میداره!
دو تا راه حل داره این مسئله:
۱- میشه کنترل استثنا نوشت برای توابعی که ممکنه خطا پیش بیاد.
۲- که پیشنهادم هم همینه، میشه تو دیکشنری برای توابع پرانتز نداشت و بعد دیکشنری که میخایم get کنیم اسم کلید رو بیایم پرانتز بذاریم براش.
مثلا کد زیر رو درنظر بگیرین:
تو این کد، دیکشنری commands میاد هر تابعی رو اجرا میکنه و نتیجه رو تو خودش نگه میداره، ما برای جلوگیری از این کار باید بیایم به روش زیر عمل کنیم:
البته باز نیاز به گذاشتن شرط هست😂 اگه جذر بود فقط ی ورودی لازم داره، مگر اینکه کد رو وصلهدار کنیم و برای اونم ی آرگومان سوخته تعریف کنیم و داخل تابع ازش استفاده نکنیم که اینم اصولی نیست.
اگه شما هم راه حلی دارین خوشحال میشم باهام به اشتراک بذارین.😉
باهام همراه باشید...
@osmanmakhtoomdev
مثلا همین بحث مطلب قبلی تا الان بهش دقت نکرده بودم تا اینکه هنرجوی ۱۳ سالهام برگشت پرسید چرا اینجوری شد نتیجه؟
یا حتی همون هنرجو پرسید آیا import هم ی تابعه تو پایتون؟
ی مورد دیگه هم که امروز برام پیش اومد این بود که داشتم به هنرجو نشون میدادم جای استفاده از if elif else و match case میتونه از دیکشنری هم استفاده کنه.
بعد اومدیم ی ماشین حساب نوشتیم اینجوری، مقدار پیشفرض عدد اول و دوم رو 1 گذاشته بودم، هی میخاستم ریشه دوم بگیرم از تابع لگاریتم که نوشته بودیم خطا میگرفت که تقسیم بر صفر میکنه(چون لگاریتم 1 بر مبنای 1 این مشکل رو داره)، مونده بودم این چه ربطی به اون داره آخه.
بقیه توابع همه ۲ تا عدد میگرفتن از کاربر و فقط ریشه دوم یا همون جذر فقط ی عدد میگرفت و عدد دوم پیشفرض 1 بود.
بعد برداشتن تابع لگاریتم متوجه شدم که وقتی با دیکشنری مینویسم و پرانتز تابع رو هم میذاریم، پایتون میاد تک تک توابع رو ارزیابی میکنه و نتیجه رو نگه میداره!
دو تا راه حل داره این مسئله:
۱- میشه کنترل استثنا نوشت برای توابعی که ممکنه خطا پیش بیاد.
۲- که پیشنهادم هم همینه، میشه تو دیکشنری برای توابع پرانتز نداشت و بعد دیکشنری که میخایم get کنیم اسم کلید رو بیایم پرانتز بذاریم براش.
مثلا کد زیر رو درنظر بگیرین:
import math
def calculator():
first_number = 1
second_number = 1
try:
first_number = int(input("Number: "))
except ValueError:
print("Please enter valid integer or float number")
operator = input("Operator(sqrt,+,-,/,*,log,**): ")
if operator in "+ - * ** / log".split():
try:
second_number = int(input("Number: "))
except ValueError:
print("Please enter valid integer or float number")
def add(first_number: int | float, second_number: int | float) -> int | float:
return first_number + second_number
def subtract(first_number: int | float, second_number: int | float) -> int | float:
return first_number - second_number
def square_root(first_number: int | float) -> int | float:
return first_number ** .5
def logarithm(first_number: int | float, second_number: int | float) -> int | float:
return math.log(first_number, second_number)
commands = {
"+": add(first_number, second_number),
"-": subtract(first_number, second_number),
"sqrt": square_root(first_number),
"log": logarithm(first_number, second_number),
}.get(operator, "+" )تو این کد، دیکشنری commands میاد هر تابعی رو اجرا میکنه و نتیجه رو تو خودش نگه میداره، ما برای جلوگیری از این کار باید بیایم به روش زیر عمل کنیم:
commands = {
"+": add,
"-": subtract,
"sqrt": square_root,
"log": logarithm,
}.get(operator, "+" )(first_number, second_number)البته باز نیاز به گذاشتن شرط هست😂 اگه جذر بود فقط ی ورودی لازم داره، مگر اینکه کد رو وصلهدار کنیم و برای اونم ی آرگومان سوخته تعریف کنیم و داخل تابع ازش استفاده نکنیم که اینم اصولی نیست.
اگه شما هم راه حلی دارین خوشحال میشم باهام به اشتراک بذارین.😉
باهام همراه باشید...
@osmanmakhtoomdev
👍1🤔1
جمعه رو واسه خودم خراب کردم 😐
جریان از این قراره که به سرم زد ی اسکریپت پایتون بنویسم از بی حوصلگی.
اومدم ببینم چطور میشه از تلفیق pandas, bs4, requests, asyncio برای scrape گوگل و ریختن و خوندن نتایج جستجو تو و از فایل اکسل استفاده کرد.
گفتم موضوع چی باشه؟
رفتم لیست واحدهای پول کشورهای جهان رو از ویکیپدیا اسکرپ کردم و ریختم تو اکسل، بعد با پانداس اومدم از اکسل دوباره خوندم و یک به یک دادم به گوگل تبدیل کنه به ریال ایران.
چشمتون روز بد نبینه خلاصه 😢
به محض اینکه از دپرسی دربیام اسکریپت و ویدیوی آموزشی رو حتما براتون میذارم.
باهام همراه باشید...
@osmanmakhtoomdev
جریان از این قراره که به سرم زد ی اسکریپت پایتون بنویسم از بی حوصلگی.
اومدم ببینم چطور میشه از تلفیق pandas, bs4, requests, asyncio برای scrape گوگل و ریختن و خوندن نتایج جستجو تو و از فایل اکسل استفاده کرد.
گفتم موضوع چی باشه؟
رفتم لیست واحدهای پول کشورهای جهان رو از ویکیپدیا اسکرپ کردم و ریختم تو اکسل، بعد با پانداس اومدم از اکسل دوباره خوندم و یک به یک دادم به گوگل تبدیل کنه به ریال ایران.
چشمتون روز بد نبینه خلاصه 😢
به محض اینکه از دپرسی دربیام اسکریپت و ویدیوی آموزشی رو حتما براتون میذارم.
باهام همراه باشید...
@osmanmakhtoomdev
شوخی جمعه:
اگه گفتین واحد پول فیلیپین چیه؟
PHP 😂
حالا اگه گفتین هر PHP چند IRR:
771.440
😂😂😂
@osmanmakhtoomdev
اگه گفتین واحد پول فیلیپین چیه؟
PHP 😂
حالا اگه گفتین هر PHP چند IRR:
771.440
😂😂😂
@osmanmakhtoomdev
👍1
داریم در حد توان ی استودیو ساده درست میکنیم که انشاءالله از فردا یا پس فردا شروع کنیم به ضبط :)
هرگونه همراهی، همدلی، نظر، پیشنهاد، انتقاد مفید، دسته گل، جیغ و هورا، بهمون هیجان و انگیزه میده که بتونیم کار با کیفیتی ارائه بدیم.
پس هر کدوم رو خاستین ازمون دریغ نکنید و باهام همراه باشید تا بترکونیم...
@osmanmakhtoomdev
هرگونه همراهی، همدلی، نظر، پیشنهاد، انتقاد مفید، دسته گل، جیغ و هورا، بهمون هیجان و انگیزه میده که بتونیم کار با کیفیتی ارائه بدیم.
پس هر کدوم رو خاستین ازمون دریغ نکنید و باهام همراه باشید تا بترکونیم...
@osmanmakhtoomdev
👍5
امروز اولین ویدیو ضبط شد و بزودی بعد میکس و ادیت منتشرش میکنیم.
باهام همراه باشید...
@osmanmakhtoomdev
باهام همراه باشید...
@osmanmakhtoomdev
🔥1
Forwarded from Sadra Codes
بررسی جوانب پایتون ۳.۱۲
✅ از این به بعد میتونید fstring های تودرتو بنویسید. مثلا:
✅ لایبرری
✅ از این به بعد میتونید تایپ هینت
✅ تمام comprehensionهایی که در بدنه فانکشنها هستن، از لحاظ سرعت اجرا بهینهتر شدن.
✅ ارور مسیجها هم بهینه و هوشمندتر شدن. اگه که بتونن، در محدوده شرایط وسیعتری، سلوشن میدن.
➕ دوتا سینتکس جدید هم اضافه شده به پایتون. یکی
✅ از این به بعد میتونید fstring های تودرتو بنویسید. مثلا:
phrase = f"Hello {f"{name}"}"
# Hello Sadra
بنظرم آنچنان کاربردی نیست و فهمیدنش در نگاه اول یکم سخته. شاید هایلایترها درکش رو راحتتر کنن در آینده ولی یه فیچر جدید که اضافه شده و خوشم اومد، multiline fstring هست که بهتون اجازه میده، اف استرینگ رو در چند خط بنویسید و حسابی expandش کنید. تازه میتونید در بدنهاش، کامنت هم بنویسید:phrase = f"Hello {
name # User.name
}"
# Hello Sadra✅ بهینهسازی سیستم Tokenization. پایتون یه ماژول tokenizer داره که ازش واسه آنالیز و پارس کردن کلمات و حروف ولید پایتون استفاده میکنه. به هر چانک حروف از استرینگ ورودی توکن میگن. اکثر تولهای linting و formatting از این ماژول واسه فرمت و لینت کردن کد پایتون استفاده میکنن. تا نسخه ۳.۱۱، این ماژول به زبان پایتون بود. بدلیل اضافه شدن nested fstring و مولتی لاین fstring، مجبور شدن این ماژول رو بازنویسی کنن و با C نوشتنشن و از لحاظ زمان runtime، سرعتش به شدت رفته بالا. این باعث میشه تمام tool هایی که از tokenizer استفاده میکنن، سریعتر اون ماکروهاشون ران شن.
✅ لایبرری
distutils دیپریکت شده و دیگه توی standard library قرار نداره. از این لایبرری واسه نوشتن و توزیع کردن پکیج پایتون استفاده میشد که به دلیل سرعت پایین و محدودیتهایی که نسبت به پکیج setuptools داشت، ملت همیشه میرفتن سمت setuptools. حتی خود pip هم به setuptools وابسته هست. اگه venv بسازین، میبینید که بصورت دیفالت، setuptools نصبه. یه نکته که هست، setuptools جزو standard library نیست و درواقع از هسته distutils پایتون استفاده میکنه. از اونجا که distutilsی دیگه در کار نیست و pip نسخههای ۲۲.۱ به بالا دیگه وابستگی به setuptools نداره، عملا هیچ ابزار رسمیای واسه توزیع پکیج پایتون هم نخواهیم داشت. این هم خوبه، هم بد.pip (>= 22.1) does not require setuptools to be installed in the environment. setuptools-based (and distutils-based) packages can still be used with pip install, since pip will provide setuptools in the build environment it uses for building a package.حالا یه اتفاق دیگه هم افتاده. اونم اینکه
venv دیگه بخشی از پکیج setuptools نیست. تا امروز بود ولی دیگه نیس. حالا چیکار میشه کرد؟ خب distutils مستقل شده و شما میتونید خودتون setuptools رو pip install کنید و ازش استفاده کنید و واسه venv هم، virtualenv نصب کنید. دیگه کامند زیر کار نمیکنه:❌ python -m venv venv
بطور کلی، از این به بعد هر محیط venv که با virtualenv میسازید، در isolatedترین شکل ممکن قرار دارن و site-packageتون خالی خالیه. حتی wheel هم ندارید. فقط pip رو دارید. این بنظرم ساید خوبشه.✅ از این به بعد میتونید تایپ هینت
kwargs** رو کاستومایز کنید. من خودم همیشه انوتیت میکردم به typing.Any ولی از این به بعد میتونید TypedDict رو بهش انوتیت کنید:from typing import TypedDict, Unpack
class Values(TypedDict):
name: str
age: int
def main(**kwargs: Unpack[Values]): ...
✅ یه تایپ هینت جدید اومده که خیلی خوشم اومد، typing.override هست. این موقعی بدرد میخوره که میخواین تایپ هینت ست کنید واسه متدی که توی subclass قراره اوررایت شه. اگه تغییری توی superclass ایجاد شه و اسم اون متد توی سوپرکلس تغییر کنه، اگه یه سیستم type checking داشته باشین یه چیز مثل mypy، حتما خطا رو میگیره و بهتون نشون میده. این درحالیه که اگه کد رو اجرا کنید، ممکنه خطا نگیرید و اون متد هم override نشه.from typing import override
class A:
def greet(): ...
class B(A):
@override
def greet(): ...
توی این مثال، اگه روزی برسه که اسم متد greet توی سوپرکلس تغییر کنه به greeting، حتما type checker ارور میده ولی اگه annotate نکرده باشید، اروری دریافت نمیکنید و صرفا اون logic درست کار نمیکنه.✅ تمام comprehensionهایی که در بدنه فانکشنها هستن، از لحاظ سرعت اجرا بهینهتر شدن.
✅ ارور مسیجها هم بهینه و هوشمندتر شدن. اگه که بتونن، در محدوده شرایط وسیعتری، سلوشن میدن.
➕ دوتا سینتکس جدید هم اضافه شده به پایتون. یکی
type هست که واسه Type Alias استفاده میشه و دیگری هم Type Parameter هست که یه مدل جدید واسه تعریف فانکشنها و کلسهای جنریک پایتونه. شیوه استفاده ازشون به این شکله:type name = str
type age = int
قبلا باید جنریک فانکشن رو اینجوری تعریف میکردیم:def greet(name: List[str]): ...
ولی الان مینویسیم:type T = List[str]
def greet[T](name: T): ...
این باعث میشه که پرینسیپل DRY آسیب نبینه.👍1🔥1
Forwarded from Python BackendHub
بزرگ ترین تغییر ۳.۱۲ نسبت به ۳.۱۱ که بنظرم صدرا اشاره نکرد بهش PEP 684 بود
A Per-Interpreter GIL
که البته فعلا تو سطح پایتون نیست و python api نداره.
ولی این تغییر تو ۳.۱۳ خودشو خیلی بیشتر نشون میده. جایی که API python اش میاد. طبق PEP 554.
https://peps.python.org/pep-0554/
جایی که ما میتونیم حالا از این تغییراتی که تو ۳.۱۲ انجام شده و API پایتونیش تو ۳.۱۳ هست استفاده کنیم:)
اینکه چیه و چیکار میکنه تو این پست نمیگنجه. توصیه میکنم حتما این دو PEP رو وقت بذارین و بخونید که از بقیه جلوتر باشید تا وقتی ۳.۱۳ اومد بدونید چی باید یاد بگیرید 😁 فقط یک مقایسه میکنم بین sub Interpreter و مولتی پروسس
True Parallelism -> Multiprocess: YES | Subinterpreters: Potential
Isolation -> Multiprocess: HIGH | Subinterpreters: MEDIUM
Overhead -> Multiprocess: HIGH | Subinterpreters: LOW
و توی theory حداقل باید Subinterpreters یک مموری ایزوله و هندل CPU Bound task به صورت بهینه تر رو به ما بدن که باعث میشه پایتون با استفاده از این مفهوم جدید برای real-time processing و streaming data بسیار مناسب تر شه. چرا؟چون میتونید یک subinterpreter داشته باشید که دیتا رو بگیره و یک subinterpreter داشته باشید که دیتا رو پروسس کنه که این ایزوله سازی باعث استفاده بهتر و بهینه تر از ریسورستون میشه و latency رو هم کاهش میده
@ManiFoldsPython
A Per-Interpreter GIL
که البته فعلا تو سطح پایتون نیست و python api نداره.
ولی این تغییر تو ۳.۱۳ خودشو خیلی بیشتر نشون میده. جایی که API python اش میاد. طبق PEP 554.
https://peps.python.org/pep-0554/
جایی که ما میتونیم حالا از این تغییراتی که تو ۳.۱۲ انجام شده و API پایتونیش تو ۳.۱۳ هست استفاده کنیم:)
اینکه چیه و چیکار میکنه تو این پست نمیگنجه. توصیه میکنم حتما این دو PEP رو وقت بذارین و بخونید که از بقیه جلوتر باشید تا وقتی ۳.۱۳ اومد بدونید چی باید یاد بگیرید 😁 فقط یک مقایسه میکنم بین sub Interpreter و مولتی پروسس
True Parallelism -> Multiprocess: YES | Subinterpreters: Potential
Isolation -> Multiprocess: HIGH | Subinterpreters: MEDIUM
Overhead -> Multiprocess: HIGH | Subinterpreters: LOW
و توی theory حداقل باید Subinterpreters یک مموری ایزوله و هندل CPU Bound task به صورت بهینه تر رو به ما بدن که باعث میشه پایتون با استفاده از این مفهوم جدید برای real-time processing و streaming data بسیار مناسب تر شه. چرا؟چون میتونید یک subinterpreter داشته باشید که دیتا رو بگیره و یک subinterpreter داشته باشید که دیتا رو پروسس کنه که این ایزوله سازی باعث استفاده بهتر و بهینه تر از ریسورستون میشه و latency رو هم کاهش میده
@ManiFoldsPython
Python Enhancement Proposals (PEPs)
PEP 554 – Multiple Interpreters in the Stdlib | peps.python.org
CPython has supported multiple interpreters in the same process (AKA “subinterpreters”) since version 1.5 (1997). The feature has been available via the C-API. [c-api] Multiple interpreters operate in relative isolation from one another, which facilit...
ادیت کلیپها رو خودم انجام میدم، سعی میکنم فردا اوکی کنم 😅
👏2
Media is too big
VIEW IN TELEGRAM
خب بچهها بالاخره ویدیوی اول رو آماده کردم و با حجم مناسب اینجا و تو کانال یوتوب آپلود کردم.
این ویدیو معرفی دوره هست و قراره ادامه دار باشه.
مباحثی که صحبت کردیم:
- ویژگیهای دوره
- معرفی مربی دوره
- نحوه استفاده از دوره
باهام همراه باشید... ❤️🌱
@osmanmakhtoomdev
این ویدیو معرفی دوره هست و قراره ادامه دار باشه.
مباحثی که صحبت کردیم:
- ویژگیهای دوره
- معرفی مربی دوره
- نحوه استفاده از دوره
باهام همراه باشید... ❤️🌱
@osmanmakhtoomdev
❤3🔥1🕊1
👎1