Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
260 - Telegram Web
Telegram Web
🧑‍💻PythonDev🧑‍💻 pinned «https://www.tgoop.com/milldeofDeeplearning هوش مصنوعی، یادگیری ماشین و یادگیری عمیق موضوع اصلی کانال این یک بلاگ شخصی با طرز تفکر شخصی هست. Core Python : @Mtio975 به زودی تجربیات خودم در این زمینه رو براتون منتشر میکنم»
سوال نخ‌نمای مصاحبه‌های پایتون!
فرق آبجکت mutable با immutable چیست؟
یادتون باشه تایپ‌های معمولی که انسان برای انتقال مفاهیم استفاده‌ می‌کنه یعنی int و float و string بعلاوه tuple‌ها اینها همگی immutable  هستند بصورت خیلی ساده یعنی متدی روی این objectهای call نمی‌شه که شکل‌شون رو عوض کنه.(جلوتر می‌فهمید)

بقیه‌ی انواع تایپ داده‌ها mutable هستند این‌ها رو انسان برای انتقال مفاهیم استفاده نمی‌کنه مثل dict , list و set. یعنی موقع حرف زدن که ساختار دیکشنری و مجموعه و لیست که نمی‌سازیم موقع حرف زدن با عدد یعنی float , int و کلمات یعنی string حرف می‌زنیم.

در اصطلاح به int, float, string, bool می‌گن primitive type یعنی تایپ‌های اولیه.
پس یادتون باشد primitive type + tuple میشه immutable.

اما اینکه dict, list, set میگن mutable هستند یعنی چی؟ یعنی تغییرپذیرند. یعنی اینکه یک لیست اگر عضوی هم بهش اضافه کنیم بازم همون object هست آن شی قبلی حذف نمیشه یه شی دیگه به جاش تولید بشه به زبان پایتونی id آن object ثابت می‌مونه.
👍2
کات کلیدی و مفید Zen of python از تیم پیترز برای برنامه نویسی بهینه و عالی

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

pyfarsi@ubuntu:~$ python3

>>> import this

1. انتخاب یک عنوان مناسب برای هرجایی مثل کلاس ها , وریبل ها و توابع و...
2. زیبانویسی بهتر از زشت نوشتن کدها است با رعایت قواعد و پیشنهادات
3. سادگی بهتر از پیچیدگی است.
4. صریح بودن بهتر از تودرتو بودن است
5. پیچیدگی بهتر از پیچیده کردن است.


1. Beautiful is better than ugly.
2. Explicit is better than 3. implicit.
4. Simple is better than complex.
5. Complex is better than complicated.
6. Flat is better than nested.
8. Sparse is better than dense.
Readability counts.
9. Special cases aren't special enough to break the rules.
10. Although practicality beats purity.
11. Errors should never pass silently.
12. Unless explicitly silenced.
13. In the face of ambiguity, refuse the temptation to guess.
14. There should be one-- and preferably only one --obvious way to do it.
15. Although that way may not be obvious at first unless you're Dutch.
16. Now is better than never.
Although never is often better than *right* now.
17. If the implementation is hard to explain, it's a bad idea.
18. If the implementation is easy to explain, it may be a good idea.
19. Namespaces are one honking great idea -- let's do more of those!


منبع: https://www.python.org/dev/peps/pep-0020/
یکی از صحبت‌هایی که خیلی میشه
Rust vs Go
هست، به خود منم بسیار گفتند و چون از کانال هم ازم پرسیده شده لازم دونستم چندتا نکته رو همین ابتدای مسیری بگم :

۱- اگر این اولین زبان برنامه‌نویسی شما هست (یا اینکه میخواهید برای درآمدزایی تا ۶ ماه آینده) قطعا اشتباه اومدید.

۲- خیلی‌ها گفتند که Go قویتره و بنچمارک‌هاش رو ببین تو یوتیوب و ... که خب این خودش چندتا نکته هست :

۲-۱) من از خیلی از بچه‌ها درخواست کردم که بنچمارکی که دیدند رو برای من هم بفرستند، نکته مشترک همگی این موارد web-development بود و همگی فقط cpu رو مقایسه می‌کردند (۲ مورد روی شبکه هم گذارش می‌دادند)
Golang
برای توسعه وب ساخته شده، و این بهینه ترین بنچمارکی هست که براش می‌شه گرفت. اما روی
Rust
میشه ازش برای توسعه وب هم استفاده کرد (یکی از کاربردهاش)

۲-۲) زبان برنامه Go اولین release خودش رو سال 2012 داشته و گوگل پشتش هست. درحالی که Rust ورژن ۱ رو سال 2015 داده و حامی مالی داره که اصلی Mozilla هست همین یعنی Rust کمتر فرصت توسعه داشته.

۲-۳) زبان Rust فقط به چندتا کاربرد محدود نمیشه، تنها زبانی هست که بعد از C, Assembly به linux kernel رسیده، که احتمالاً بخاطر مدلی هست که با ارور برخورد می‌کنه (توی همین بحث ارور Go قطعاً به safety ایی که Rust داره نمیرسه چون میشه ارور رو ندیده گرفت)
با Rust می‌تونید دیتابیس، انجین بازی، کد فضاپیما و .... بنویسید.

۲-۴) اگر از وب بگذریم چون خیلی fair نیست یعنی Rust سریعترین زبان موجود هست ؟
خیر
چونکه Zig بسیار سریعتر از Rust هست. اما من چندتا مشکل باهاش دارم :
- اینکه syntax خیلی شبیه به java داره
- به راحتی نمیشه آنچه که با zig نوشته شده رو تبدیل به پایتون کرد، مهمترین دلیلی که از پایتون اومدیم سراغ rust

در نهایت Rust برای من چیزی شبیه به پایتون اپتیمایز شده هست، کاربردهای بسیاری داره و توی زمینه‌های مختلف می‌تونه ورود بزنه (اخیراً توی کارهای هوش مصنوعی و دیتاساینس هم اومده)

سرعت اجرا خیلی سریعی داره ولی سرعت توسعه‌اش شاید به همون نسبت نباشه.
با همه این‌ها و با توجه به اینکه من در وحله اول توسعه دهنده پایتون هستم، یهترین زبان برنامه‌نویسی دوم برای من Rust هست.
2👍1
نقشه ذهن برای یادگیری پایتون
سلام دوستان امروز می خواهیم درباره ی dunder new صحبت کنیم ، dunder new یک special method (یک class method هم هست پس اولین مقدارش خود کلاسه)

در پایتون هست که در واقع سازنده اصلی نمونه ها از کلاس این متد هست :)

خیلی جاها شنیدیم کهconstructor ، dunder init  هست ولی dunder init فقط یک initializer  هست و در واقع constructor اصلی dunder new هست

جالبه بدونید که dunder new قبل از ساخته شدن کامل  یک نمونه کلاس و حتی قبل از dunder init کال میشه :)

اگر می خواهیم dunder new رو برای خودمون تغییر بدیم باید حواسمون باشه که این کار رو انجام بدیم
return super().new(cls)
تا ی
ک نمونه از اون کلاس ساخته بشه ساخته بشه
خب حالا بریم حرفمون رو اثبات کنیم :

class Test:
   
    def init(self):
        print("Hi i'm in dunder init")
   
    def new(cls):
       print("Hi i'm in dunder new")
       return super().new(cls)

t1 = Test()
print(t1)

#output
Hi i'm in dunder new                                                                                                                         
Hi i'm in dunder init
<main.Test o
bject at 0x7f7371425748>                                                                                                     


     خب الان براتون سوال میشه که اصلا این dunder new به چکاری میاد؟ یا چجوری تونستیم که خود کلاس رو به کلاسی که ازش ارث برده بفرستیم در صورتی که هنوز خود کلاس ایجاد نشده !
خب بریم که به سوالات جواب بدیم :)

برای سوال اول بعضی موقع ها هست ما می خواهیم قدرت بیشتری رو در ساختن نمونه های کلاسمون رو داشته باشیم یا در واقع اصلا نگذاریم  اون نمونه از کلاس تشکیل بشه
مثل این مثال :

class Person:
   
    def init(self, age, name):
        self.age = age
        self.name = name
       
    def new(cls, age, name):
       if age == 16 and name == 'parsa':
           return None
       return super().new(cls)

p1 = Person(16 , 'parsa')
print(p1)

#output
None


  خب در مثال
بالا ما گفتیم که قبل از اینکه نمونه از کلاس رو بسازی بیا و چک کن اگر سن اون آدم 16 و اسم اون parsa بود این  نمونه از کلاس رو نساز ( در واقع  با مقدار 16 و parsa   اون شی آدم نیست!)
البته این مثال برای طنز قضیه بود :)

خب حالا می رسیم به سوال دوم در پایتون متد type علاوه بر تشخیص یک شی وظیفه ایجاد کلاس رو هم داره (جالبه نه؟)

و موقعی که  داریم خود کلاس رو  وقتی ایجاد نشده به کلاسی که ازش ارث برده می فرستیم در واقع همون تایپ هست که این کار رو انجام میده

برای ایجاد یک کلاس با متد type اینگونه عمل می کنیم

my_class = type('Class_name', (), {})

print(my_class)

#output
<class 'main.Class_name'>    
 

  خب دیدن چه با حال بود :)  در قسمت اول اسم کلاس و در قسمت بعد  یک تاپل هست که کلاس هایی که قراره ازشون ارث ببره
و در قسمت آخر هم یک دیکشنری هست که خصوصیات اون کلاس رو به همراه داره
به همین راحتی !

اگر مفید بود به اشتراک بگذارید :)
👍1
نحوه ذخیره کردن slug تو یکی از پکیج های معروف جنگویی رو با هم ببینیم.
🧑‍💻PythonDev🧑‍💻
نحوه ذخیره کردن slug تو یکی از پکیج های معروف جنگویی رو با هم ببینیم.
1. if self._state.adding and not self.slug:
- قسمت اول چک کردن یعنی self._state.adding اگر در حال ساختن یک شی جدید در دیتابیس باشیم مساوی با True هستش همچنین اسلاگ هم باید None باشه.

2. self.slug = self.slugify(self.name)
- این خط یک slug جدید را بر اساس فیلد name با استفاده از تابع slugify تولید می‌کند.

3. using = kwargs.get("using" or router.db_for_write(type(self), instance=self))
- این خط مشخص می‌کند که داده‌ها باید در کدام پایگاه داده ذخیره شوند، با استفاده از router.db_for_write.
(درباره B router بعدا توضیح میدم)

4. kwargs["using"] = using
- این خط، پارامتر using را در kwargs قرار می‌دهد تا در ادامه به super().save منتقل شود.

5. try: ... except IntegrityError:
- این بلوک try/except یک تراکنش atomic را برای ذخیره داده‌ها ایجاد می‌کند.
- اگر خطای IntegrityError (مانند تکراری بودن slug) رخ دهد، بلوک except اجرا می‌شود.

6. slugs = set(...)
- در صورت رخ دادن `IntegrityError`، این خط تمام `slug`‌های موجود در پایگاه داده که اولشون شبیه به اسلاگ ما هستش رو بازیابی می کنه.

7. while True: ... i += 1
- این حلقه یک slug جدید تولید می‌کند تا زمانی که یک slug منحصر به فرد پیدا شود.- slug جدید با افزودن یک شماره انتهایی به slug قبلی تولید می‌شود (مانند my-slug-1, my-slug-2, و غیره).

8. return super().save(*args, **kwargs)
- بعد از یافتن یک slug منحصر به فرد، شیء با فراخوانی متد save پایه ذخیره می‌شود.

9. else: return super().save(*args, **kwargs)
- اگر شیء در حال به‌روزرسانی است (نه ایجاد)، متد save پایه بدون هیچ تغییری فراخوانی می‌شود.

این کد به این دلیل طراحی شده است تا یک slug منحصر به فرد برای هر شی ایجاد کند، حتی اگر نام‌های مشابهی در پایگاه داده وجود داشته باشد. همچنین از تراکنش‌های اتمیک برای حفظ یکپارچگی داده‌ها در طول عملیات ذخیره‌سازی استفاده می‌کند.
چند تا سوال خوب تو سطح میدلول به بالا برای Back-end developer(python & django)

1. چگونه از race condition در برنامه‌های چند نخی (multi-threaded) یا چند کاربره (multi-user) جلوگیری می‌کنید؟ از چه تکنیک‌ها یا ابزارهایی استفاده می‌کنید؟

این سوال از متقاضی می‌خواهد تا درک خود را از مفهوم race condition و راه‌حل‌های آن نشان دهد. او باید به مواردی مانند قفل‌ها (locks)، عبارات F در Django ORM، عملیات‌های اتمیک (atomic) و همچنین استفاده از سیستم‌های صف (queuing systems) اشاره کند.

2. برای بهینه‌سازی پرس‌وجوهای پایگاه‌داده در Django چه تکنیک‌هایی را پیشنهاد می‌کنید؟ مزایا و معایب هر یک را توضیح دهید.

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه بهینه‌سازی پرس‌وجوهای پایگاه‌داده در Django نشان دهد. او باید به مواردی مانند ایندکس‌گذاری، انتخاب صحیح فیلدها، استفاده از select_related و prefetch_related، و همچنین کش‌کردن (caching) اشاره کند.

3. چگونه می‌توانید از حملات (Cross-Site Scripting یا XSS) و حملات (Cross-Site Request Forgery یا CSRF) در برنامه Django خود جلوگیری کنید؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه امنیت وب و جلوگیری از حملات رایج نشان دهد. او باید به مواردی مانند استفاده از django.utils.html.escape برای خروجی‌های HTML، تنظیمات SECURE_BROWSER_XSS_FILTER و `X_FRAME_OPTIONS`، استفاده از توکن‌های CSRF در Django، و همچنین تکنیک‌های دیگر مانند اعتبارسنجی ورودی‌ها اشاره کند.

4. چگونه از یک وضعیت deadlock در برنامه‌های چند نخی یا چند کاربره جلوگیری می‌کنید؟ راه‌حل‌های پیشنهادی شما برای مدیریت deadlock چیست؟

این سوال از متقاضی می‌خواهد تا درک خود را از مفهوم deadlock و راه‌حل‌های آن نشان دهد. او باید به مواردی مانند جلوگیری از اشتراک منابع، اولویت‌بندی درخواست‌ها، استفاده از الگوریتم‌های پیشگیری از deadlock مانند الگوریتم بانکر (Banker's Algorithm)، و همچنین استفاده از تایم‌اوت‌ها (timeouts) اشاره کند.

5. چگونه می‌توانید از مشکلات مربوط به حافظه در برنامه‌های Python خود جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای مدیریت حافظه چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه مدیریت حافظه در Python نشان دهد. او باید به مواردی مانند استفاده از ژنراتورها (generators) و ایتراتورها (iterators) برای پردازش داده‌های بزرگ، آزادسازی منابع به موقع، استفاده از کتابخانه‌های مدیریت حافظه مانند `tracemalloc`، و همچنین تکنیک‌های دیگر مانند پروفایل‌گیری (profiling) و بهینه‌سازی الگوریتم‌ها اشاره کند.

6. چگونه می‌توانید از مشکل N+1 Query در Django ORM جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای این مشکل چیست؟

این سوال از متقاضی می‌خواهد تا درک خود را از مشکل N+1 Query و راه‌حل‌های آن در Django ORM نشان دهد. او باید به مواردی مانند استفاده از select_related و `prefetch_related`، بهینه‌سازی پرس‌وجوها با استفاده از ایندکس‌ها، و همچنین تکنیک‌های دیگر مانند کش‌کردن (caching) اشاره کند.

7. چگونه می‌توانید از مشکلات مربوط به مقیاس‌پذیری (scalability) در برنامه‌های وب جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای بهبود مقیاس‌پذیری چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه طراحی و پیاده‌سازی سیستم‌های مقیاس‌پذیر نشان دهد. او باید به مواردی مانند استفاده از معماری‌های چند لایه (multi-tier architecture)، پخش بار (load balancing)، افزونگی (redundancy)، کش‌کردن (caching)، شارد کردن (sharding) پایگاه داده، و همچنین تکنیک‌های دیگر مانند استفاده از سیستم‌های توزیع‌شده (distributed systems) و محاسبات ابری (cloud computing) اشاره کند.

8. چگونه می‌توانید از مشکلات مربوط به امنیت در برنامه‌های وب جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای بهبود امنیت چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه امنیت در برنامه‌های وب نشان دهد. او باید به مواردی مانند استفاده از رمزگذاری قوی، اعتبارسنجی ورودی‌ها، جلوگیری از حملات تزریق (injection attacks)، استفاده از پروتکل‌های امن مانند HTTPS، مدیریت دقیق دسترسی‌ها (access control)، و همچنین تکنیک‌های دیگر مانند به‌روزرسانی منظم سیستم‌ها اشاره کند.

#interview #backend
👍1
قبل مصاحبه یکاری هست که بنظرم حتما انجامش بدید!

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

اکثرا با خوشرویی بهتون جواب میدن و شمارو راهنمایی می کنن. همچنین اینکه پیگیر شرکت بودید یک پوینت مثبت به حساب میاد.
قانون امدال:

بنظرتون اگه بی نهایت core داشته باشیم، می تونیم اجرا شدن یک برنامه رو از مثلا 100 ساعت به یک ساعت برسونیم؟
قانون امدال (AMDAHL) بهمون کمک میکنه تا به جوابمون برسیم.

قبلش بصورت خلاصه بگم serial چیه:
به قسمتی از کد که اصلا توانایی این رو نداره مالتی پراسس بشه رو serial میگیم.

فرمول امدال:
speedup ≤ 1 / (S + ((1 - S) / N) )


S:
عددی بین 0 تا یک که بر اساس حالا بگیم درصد کد های serial هستش.

N:
تعداد core ها.

مثال:
خب بیاید در نظر بگیریم که بیست درصد از کد های ما serial هستش و چهار تا core داریم.
در این صورت میشه:
1 / (0.2 + ((1 - 0.2) / 4)) = 2.5

در این صورت speed up ما میشه دو و نیم برابر و کد ما دو و نیم برابر سریع تر شده.

اما حالا در نظر بگیرید ما 40 تا core داریم،‌ فکر میکنید سرعتمون چقدر افزایش پیدا می کنه؟؟
خب بیاید که حساب کنیم:
1 / (0.2 + ((1 - 0.2) / 40)) = 4.5

بله! speedup ما میشه 4.5 برابر!
احتمالا بر خلاف تصورتون، با افزایش تعداد پراسس ها سرعت ما همش بصورت صعودی افزایش پیدا نمیکنه. در واقع بر اساس درصد serial کد های ما از یه جایی به بعد دیگه سرعت بالا نمیره و فقط بار اضافی بوجود میاد

پست بعدی با نمودار یه سری توضیحات بیشترو میدم

پس قانون امدال چیه؟
قانون Amdahl یک فرموله که بهبود احتمالی عملکرد رو که با اضافه کردن پراسس های بیشتر به یک برنامه که شامل بخش‌های ترتیبی (غیرموازی) و موازی است رو میده.

#note
در زبان آلمانی بین دو جمله زیر تفاوت هست:
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/
آموزش دادن خیلی عالیه واقعا.
مثلا همین بحث مطلب قبلی تا الان بهش دقت نکرده بودم تا اینکه هنرجوی ۱۳ ساله‌ام برگشت پرسید چرا اینجوری شد نتیجه؟
یا حتی همون هنرجو پرسید آیا 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)


البته باز نیاز به گذاشتن شرط هست😅 اگه جذر بود فقط ی ورودی لازم داره، مگر اینکه کد رو وصله‌دار کنیم و برای اونم ی آرگومان سوخته تعریف کنیم و داخل تابع ازش استفاده نکنیم که اینم اصولی نیست.

اگه شما هم راه حلی دارین خوشحال میشم باهام به اشتراک بذارین.😉

باهام همراه باشید...
👍1
۱۱ تا tip کمک کننده در برنامه نویسی

۱.حفظ نکن!

یاد بگیر چطور اطلاعاتی که نیاز داری رو پیدا کنی. منظورم فقط StackOverflow و GenAI نیست. برای ابزارها و زبان‌هایی که استفاده می‌کنی، باید بدونی که مستنداتشون کجا پیدا می‌شه. کی بهترین راهنماها رو می‌نویسه؟ مهم نیست که یادت نمی‌مونه موقع استفاده از عملگر شرطی اولویت با ؟ یا : هست. مهم اینه که بدونی کی از یه عملگر شرطی استفاده کنی و کجا دقیقاً syntax رو پیدا کنی. ابزارها دائماً به‌روز می‌شن یه راهی برای به‌روز بودن پیدا کن، چه یه خبرنامه باشه چه یه دوست که عاشق CSS هست :)

۲.رو اصول اولیه عمیقاً کار کن!

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

۳.تفکر سیستمی خیلی به دردت می‌خوره!

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

۴.قبل از پرسیدن، امتحان کن تا هیچ وقت سوالت مسخره نباشه!

برنامه‌نویس‌ها معمولاً به سمت حل مشکل گرایش دارن. اگه بتونی نشون بدی که چند تا راه رو امتحان کردی و جواب نداده، احتمالاً خودشون می‌خوان دست به کار شن تا بفهمند چرا راه‌حل‌های واضح جواب ندادن.

۵.هر خط کد یه دردسره!

کد
رو طوری بنویس که انگار یه نفر دیگه قراره اون رو فیکس کنه. (حتی اگه اون یه نفر خودت باشی تو ۶ ماه دیگه!) دلیل کارهاتو مستند کن تا بعداً یه چیزی رو ناخواسته خراب نکنی. قبل از اینکه یه ابزار رو جزئی از سیستم کنی، نظرات بقیه رو راجع بهش بخون، شاید نظرات اون ابزار با قابلیت‌هایی که نیاز داری، جور درنیاد!

۶.خوندن کد بقیه رو تمرین کن!

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

۷.تست کن و باز هم تست کن!

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

۸.تمرین کن تا نیازمندی‌ها رو به نرم‌افزار تبدیل کنی!

ایشو:
یک دکمه به صفحه اضافه کن که یه modal باز کنه و کاربر بتونه این داده رو ویرایش کنه


ازت انتظار می‌ره بتونی یه همچین نیازمندی‌ای رو به یه لیست از مرحله‌ها (list of steps) یا شبه‌کد تبدیل کنی. اگه تیکت خیلی گنگه، برای شفاف تر شدنش سوال بپرس. بعد از اینکه مرحله‌ها رو مشخص کردی، نوبت این می‌رسه که اونا رو به کد و (امیدوارم) تست برای اون کد تبدیل کنی. بعدش هم کد رو وارد version control کنی، ریویو و کنترل کیفیت بشه و توی پروسه‌ی deployment قرار بگیره. برای تمرین کردن این کار، پروژه‌های اپن سورس عالین.

۹.کامیونیتی خیلی مهمه!

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

۱۰.چیزی رو تو برنامه‌نویسی پیدا کن که ازش لذت می‌بری!

نمی‌گم عاشق شغلت بشو یا تبدیل به اون برنامه‌نویس افسانه‌ای و پرشور (Passionate Programmer) بشین. اما یادگیری مداوم یعنی اینکه خودت رو برای ناخوشایندی‌های(discomfort) مکرر آماده کنی. اگه نمی‌دونی چرا می‌خوای هر روز صبح بیدار شی و این کار رو با خودت بکنی، آسیب میبینی. می‌تونه یه دلیل کاملاً خودخواهانه باشه، اما باید دلیل خودت رو پیدا کنی.

۱۱.هرکسی تو مسیر خودش قرار داره!

تو با مسیر شغلی و محتوای بقیه رقابت نمی‌کنی. مسیر موفقیت دیگران شاید اصلاً برای تو کار نکنه. روی دیدگاه و نقاط قوت منحصربه‌فرد خودت تمرکز کن. صدات رو پیدا کن و با بقیه به اشتراک بذار. اون بیرون کسی هست که می‌خواد صدات رو بشنوه.
Forwarded from Sadra Codes
یه سری از ورژن های خاص کتابخونه pandas با pip خیلی جور نیس. نمیدونم مشکل caching یا چیه ولی الان ۱۰ دقیقه‌اس که با سرعت ۳۵ مگ داره سعی می‌کنه pandas==2.0.3 رو با pip==24 نصب کنه!!

+ شدید منتظرم uv استیبل شه و سوییچ کنم بهش.
uv: https://github.com/astral-sh/uv
به بهانه معرفی فریمورک <جای‌خالی> با ۳ برابر سرعت در پاسخگویی نسبت به FastAPI و البته باهدف battery included بودن مثل django

وقتی صحبت از بکند توی پایتون میشه تا همین چندسال قبل تنها گزینه خوب فقط و فقط django بود و مرسی دولوپرهاش؛ تو زمانی که همه غر میزدند پایتون کند هست و نباید و ... (تو ایرانم ازین حرفا زیاد بود) قشنگ یادمه ی بنده خدایی اسم نمیبرم ولی معروفم هست توی یکی از دانشگاها پنل سخنرانی داشت.
گفت که پایتون فقط یک جو هست و خیلی زود هم تموم می‌شه؛ بعد هم ادعا کرد به همین دلیل مطالبش رو نیاورده و ترجیح میده راجب مطالب مهمتر صحبت کنه (سخنرانی به شوخی گذشت و تنها کسی که اعتراض کرد توی سالن ۳۰۰-۴۰۰ نفری من بودم) الان شنیدم همون بنده خدا داره از پایتون نون میخوره و دوره هم میذاره.

بگذریم اومد جلوتر و async معرفی شد؛ هوش مصنوعی از فقط ریسرچ بودن داشت خارج میشد و تجریه دپلوی مهم شد.
دپلوی رو django انقدر سخت و غیر بهینه بود که عملا خیلی از تیم‌هایی که پروژه‌هاشون مشتری کافی رو داشت مجبور به توسعه بکند توی زبان‌های برنامه نویسی دیگه بودند؛ خیلی از بچه ها رفتند سراغ C, C++ , Go-lang و ...
حتی جوگیری زیاد شد مدل هارو سمت وب و موبایل و ... هم بردند که صحبتی نیست.

یادی کنم از شب زنده داری‌ها و دپلوی کدها و مدل‌ها با Majid A.M (آیدی نمیزارم ولی احتمالا هرکی django کار می‌کنه میشناسه) عزیز و حجم اپتیمایز‌های بالا جزو اولین نفرات و تیم‌هایی بودیم که کل مدل هوش مصنوعی و اپتیمایز و وب و ... همه روی پایتون بود و البته دسترسی و درخواست رایگان (این برای زمانی بود که همه میرفتن سراغ C, ... برای دپلوی و کسی باورش نمیشد بشه مدل‌های سنگین رو روی سرور بیاری و اون تعداد ریکوست رو با پایتون جواب بده) اون زمان همه فکر میکردند روی سرورهای خفن و ...هستیم ولی این موضوع رو اولین بار هست دارم اعلام می‌کنم؛
۲ نسخه اول مدل‌های پردازش تصویرمون روی کلاستر رزپبری پای و نسخه آخر روی لپ‌تاپ شخصی بنده بود.

ازین دوران گذشتیم flask با ایده‌های جدید اومد و خوبیش این بود که دیگه به اندازه django سنگین نبود (برای تست‌های کوچیک خیلی جواب بود ولی بازم همون مشکلات رو داشت)
البته اضافه کنم سرویس‌هایی مثل Celery, ... خیلی از مشکلات رو توی django حل می‌کردند

بعد از این زمان FastAPI معرفی شد؛ روی همون کامیت‌های اولیه که عمومی شد چون از بچه‌ها و همکارای بکندم توی شرکت‌های سیلیکون‌ولی و ... بسیار راجبش شنیدم به خیلی از دوستان بکند دولوپرم پیشنهاد کردم که وقتش هست یاد بگیرند و بهش کد donate کنند (کاش خودم اینکارو میکردم) خیلی هم مسخره میکردند. همون Majid A.M جزوشون بود.

به لطف همه‌ی دولوپرهای پروژه‌های قبلی django - flask - fastapi حالا خیلی‌ها باور دارند پایتون می‌تونه توی پروداکشن و برای پروژه‌های بزرگ استفاده بشه؛ خیلی‌ها قبول دارند که میشه با پایتون کد زد و از پکیج‌هایی استفاده کرد که سرعت پردازش بسیار بیشتر بشه .
دولوپرهای پروژه‌های قبلی نشون دادند که توسعه پکیج‌هایی با ایده‌هایی حتی کمی بهتر بسیار ارزش داره و جامعه پایتون همیشه قدردان این زحمات خواهد بود.

تا اینجا که حالا community زبانی مثل Rust برای توسعه یک web framework با سرعت بیشتر و البته به راحتی موارد قبلی برای Python وارد شده و پروژه Robyn رو به حد خوبی رسونده بطوری که امروز توی چندین جلسه مختلف با دوستان و همکاران بسیار درمورد این پروژه شنیدم.
توی مطالبی که داشتم میخوندم و بنچمارک‌هایی که از باقی شنیدم اکثرا اشاره می‌کنند که به راحتی سرعتی ۳ برابر fastapi رو ارائه میده.
از نظر کدهم شخصا یک نگاهی انداختم به همون سادگی هست؛ خلاصه که شمارو نمی‌دونم اما شخصا فکر کردم باید قدردان زحمات تیم‌های توسعه django, flask, fastapi و برو بچه هایی که توی دوران سخنرانی ضد سرعت و ... پایتون با این زبان برنامه نویسی ادامه دادند باشم.
1
این همه مدت تو فکر بودم واسه دوستانی که با زبان برنامه نویسی پایتون پیش میرن جلو این پست صرفا فقط برای کسایی که مدتی به یادگیری زبان برنامه نویسی پایتون پرداخته شده اند نیست بلکه برای تمامی کسانی هستش که در حال حاضر دارند زبان برنامه نویسی پایتون رو یاد میگیرند یکی از اصول اولیه تو هر زبان برنامه نویسی داکیومنت خوانی می باشد که یه مشکلی که در داک خونی هست این هست که به طور کامل به زبان انگلیسی تسلط نداریم و بنده شخصا توصیه میکنم که هر طور شده و حتما زبان انگلیسی تون رو تقویت کنید چون بدون شک هم در داکیومنت خوانی و رفع ارور ها کمک بزرگی بهتون میکنه ولی بنده دارم کاری میکنم که بتونم داکیومنت خوانی رو براتون تا حدودی خواندش رو ساده کنم و کمکی بهتون بکنم که در بتونید به راحتی داکیومنت های پایتون رو بخونید مقاله ای که در تصویر بالا مشاهده میکنید مقاله ای هستنش که بنده دارم بر طبق سیلابس های و داکیومنت های پایتون به ترتیب ترجمه میکنم و در اخر و به محضی که تکمیل شد در همین کانال خودم منتشر میکنم که بتونید با خواندن این داکیومنت ها بتونید تسلط کافی رو پیدا کنید این صرفا کپی برداری نیست
1
🧑‍💻PythonDev🧑‍💻
این همه مدت تو فکر بودم واسه دوستانی که با زبان برنامه نویسی پایتون پیش میرن جلو این پست صرفا فقط برای کسایی که مدتی به یادگیری زبان برنامه نویسی پایتون پرداخته شده اند نیست بلکه برای تمامی کسانی هستش که در حال حاضر دارند زبان برنامه نویسی پایتون رو یاد میگیرند…
و بنده فقط طبق مهارت انگلیسی که در این چند سال کسب کردم در تلاش هستم که براتون یه فایل کامل رو خیلی به زبان رسا و قابل فهم براتون ترجمه کنم که بتونه تو یادگیری بهتر بهتون کمک کنه و شما رو یه قدم جلو تر ببره موفق باشید ریکشن یادتون نره شبتون زیبا🫡❤️💻
👍1
یکی از مشکلات کسایی که میخوان برنامه نویسی یاد بگیرن پیدا کردن منبع درست حسابیه
با وجود چنل های یوتوب خیلی خفن ممکنه بعضیا نشناسنشون و نتونن ازشون استفاده کنن برای #بحث_امشب چنل های یوتوبی که میشناسید و میدونید محتوای بدرد بخور تولید میکنن چه فارسی و چه انگلیسی تو کامنتا بفرستید

فقط دوتا نکته
هر لینکی غیر از لینک یوتوب پاک میشه
مهم نیس چنل برا خودتون باشه یا دیگران چک میکنم مربوط به برنامه نویسی یا تکنولوژی نبود پاک میشه
✔️ فرض کنیم چنین سوالی داریم

"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"

دو راه داریم که مشخص شدن.

بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کند‌تره؟

و برای جواب‌تون حتما دلیل بتراشید
👍1
2025/07/13 08:40:49
Back to Top
HTML Embed Code: