<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی صادقی نیا</title>
        <link>https://virgool.io/feed/@ali.sadeqinia</link>
        <description>درس خوانده مهندسی مکانیک هستم و علاوه بر مکانیک و ارتعاشات به برنامه نویسی، تولید محتوا، طراحی و آموزش علاقه مندم.</description>
        <language>fa</language>
        <pubDate>2026-04-15 06:45:39</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/8246/avatar/Sil7lP.jpg?height=120&amp;width=120</url>
            <title>علی صادقی نیا</title>
            <link>https://virgool.io/@ali.sadeqinia</link>
        </image>

                    <item>
                <title>حل سوال 12 جبر گزاره ریاضی کنکور انسانی 1402</title>
                <link>https://virgool.io/@ali.sadeqinia/%D8%AD%D9%84-%D8%B3%D9%88%D8%A7%D9%84-12-%D8%AC%D8%A8%D8%B1-%DA%AF%D8%B2%D8%A7%D8%B1%D9%87-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C-%DA%A9%D9%86%DA%A9%D9%88%D8%B1-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-1402-ke0un5aypnsj</link>
                <description>سلام؛ این دومین قسمت از سری برنامه های «پِرایم» هست. توی این برنامه ها فقط سوال حل می کنم، اونم سوالات خفن #ریاضی. توی این جلسه سوال 12 ریاضی از #کنکور مرحله اول 1402 انسانی رو با هم حل می کنیم. این سوال مربوط به مبحث «جبر گزاره» از ریاضی و آمار سال یازدهم انسانی هست.  پیشنهاد می کنم همون اول که سوال رو شنیدی، ویدیو رو متوقف کنی و خودت سعی کنی حلش کنی؛ بعد ادامه ویدیو رو ببینی. به نظرت راه حل دیگه ای هم وجود داره؟ اون رو توی کامنت مطرح کن. https://www.aparat.com/v/cFJy0 اگر این محتوا رو پسندیدی، ممنون می شم با لایک و انتشارش به رشد کانال کمک کنی. محتوای آموزشی من رو از همین کانال آپارات و لینک های زیر می تونی دنبال کنی:در ایتا: @alisadeqinia دیگر آدرس های من: zil.ink/ali.sadeqinia</description>
                <category>علی صادقی نیا</category>
                <author>علی صادقی نیا</author>
                <pubDate>Mon, 30 Jan 2023 09:07:37 +0330</pubDate>
            </item>
                    <item>
                <title>حل سوال 17 ریاضی کنکور انسانی 1402</title>
                <link>https://virgool.io/@ali.sadeqinia/%D8%AD%D9%84-%D8%B3%D9%88%D8%A7%D9%84-17-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C-%DA%A9%D9%86%DA%A9%D9%88%D8%B1-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-1402-dxttnbi6jljf</link>
                <description>سلام؛این اولین قسمت از سری برنامه های «پِرایم» هست. توی این برنامه ها فقط سوال حل می کنم، اونم سوالات خفن ریاضی. توی این جلسه سوال 17 ریاضی از کنکور مرحله اول 1402 انسانی رو با هم حل می کنیم. پیشنهاد می کنم همون اول که سوال رو شنیدی، ویدیو رو متوقف کنی و خودت سعی کنی حلش کنی؛ بعد ادامه ویدیو رو ببینی. به نظرت راه حل دیگه ای هم وجود داره؟ اون رو توی کامنت مطرح کن. https://www.aparat.com/v/MvqL5 </description>
                <category>علی صادقی نیا</category>
                <author>علی صادقی نیا</author>
                <pubDate>Sat, 28 Jan 2023 08:49:16 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم function closures در جاوا اسکریپت</title>
                <link>https://virgool.io/@ali.sadeqinia/%D9%85%D9%81%D9%87%D9%88%D9%85-function-closures-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-txss4gawpl7l</link>
                <description>در این نوشتار سعی دارم یک مفهوم جالب و &quot;آدم سر ذوق بیار&quot; رو برای شما تشریح کنم. البته بسته به اینکه شما چقدر با جاوا اسکریپت آشنا هستید، شاید توضیحات اولیه براتون جدید نباشه؛ اما انرژی تون رو نگه دارید و همراه من بمونید:شمایی از همپوشانی محدوده های بوجود آورنده کلاسوراول: Scope چیه؟&quot;محدوده دسترسی&quot; یکی از اون مفاهیم مشترک بین زبان های برنامه نویسی به حساب میاد. توضیحش یک مقدار انتزاعی به نظر میرسه؛ پس سعی میکنم به جای تعریف scope در قالب یه دسته کد مفهومش رو برای شما شرح بدم:var v1 = 1;
var v2 = 2;
function myFunc1(){
    //statements
}
function myFunc2(){
    //statements
}
var v3 = 3;
function myFunc3(){
    //statements
}
var v4 = 4;داخل بدنه اصلی کد بالا، 4 متغیر تعریف و مقدار دهی شده؛ دوتا در ابتدای کد، یکی در میانه کد مابین تعریف تابع myFunc2 و تابع myFunc3 و دیگری در انتهای کد. از طرفی با سه بلوک مربوط به محدوده داخلی توابع مواجهیم که هر یک با {} مشخص شده اند. بیان ساده و سر راست ماجرا اینه که &quot;محدوده&quot; اصلی کد در خارج از بلوک هر تابع به عنوان &quot;محدوده دسترسی جهانی&quot; یا Global Scope شناخته میشه و متغیرهایی که داخل این محدوده تعریف شدند، متغیرهای جهانی هستند. از طرفی محدوده های داخل بلوک هر تابع، به عنوان &quot;محدوده دسترسی محلی&quot; مختص همان تابع یا Local Scope شناخته می شه و به هر متغیری که داخل اون تعریف بشه، متغیر محلی اون تابع میگن. بر اساس این دو تعریف &quot;جهانی/محلی&quot; باید نکات زیر رو به یاد داشته باشیم:عمر متغیرهای جهانی تا پایان اجرای کد می باشد.عمر متغیرهای محلی تا انتهای اجرای تابع حاوی آن است. مثلا یک متغیر محلی داخل تابع myFunc2 از زمانی که این تابع فراخوان می شود (invoice) تا زمانی که اجرای آن تمام می گردد، معنادار است و بعد از آن حذف شده و قابل دسترسی نیست.کدهای نوشته شده در یک محدوده محلی، مثلا داخل تابع myFunc1، به تمامی متغیرهای تعریف شده در محدوده جهانی دسترسی دارند. مثلا داخل بلوک تابع myFunc1 می توان مقدار متغیر var1 را تغییر داد یا از آن برای یک عملیات ریاضی استفاده کرد.کدهای نوشته شده در محدوده جهانی، به متغیرهای محلی دسترسی ندارند. مثلا نمی توانیم مقدار پیشفرض یک متغیر داخل بلوک تابعی رو از بیرون از اون تغییر بدیم.از داخل یک محدوده محلی، نمی توان به محدوده محلی دیگری دسترسی داشت! مثلا از داخل تابع اول، نمی توان مقدار یک متغیر تعریف شده داخل تابع دوم را خواند.خلاصه که:متغیرهای داخل هر تابع مختص همان تابع بوده و بدون اجرای تابع نمی توان به آن دسترسی داشت. اما متغیرهای جهانی در تمامی محدوده های محلی قابل دسترسی هستند.حالا با چیزهایی که اینجا یاد گرفتیم، به کد زیر نگاه کنید؛ به نظر شما نتیجه ای که داخل کنسول می بینیم چیه؟ قبل از ادامه مطالعه بهتره، این کد رو امتحان کنید و نتیجه رو ببینید.function outter(){
    let a = 3;
    function inner(b = 2){
        return a+b;
    }
    return inner;
}
var func = outter();
console.log(func(4));دوم: مفهوم کلاسورکد بالا رو اجرا کردید؟ تابع func آرگومانش رو با عدد 3 جمع می کنه و حاصل رو بر می گردونه.در این کد طبق چیزهایی که تا الان می دونیم، متغیر a، محلی تابع outter و متغیر b محلی تابع inner به حساب میاد. پس وقتی تابع inner رو به متغیر جهانی func نسبت دادیم، متغیرهاش رو هم به همراهش بردیم و ضمن اجرای ()func متغیر b هم معنادار میشه. تابع outter تنها یک بار حین تخصیص به func اجرا شده؛ اما هر بار ()func فرخوان بشه، تابع outter که اجرا نمی شه! یعنی توقع داریم متغیر a برای کد ما بی معنی باشه و بنابراین توقع داریم داخل کنسول یه خطای قرمز ببینیم که : &quot;بزرگوار! a رو که declare نکرده استفاده کردی.&quot; اما در کمال تعجب می بینیم که کد ما a=3 رو در نظر گرفته و در اجرای ()func ازش استفاده کرده!!!!یه لحظه به خودمون وقت بدیم؛ افکارمون رو منظم کنیم. پیشنهاد می کنم یه بار دیگه پاراگراف بالایی رو بخونید تا مطمئن بشیم ماجرا رو دقیقا متوجه شدید.حالا میخوام یه نکته ای رو راجع به scope واضح کنم که احتمالا بنا به استقرا خودتون اون رو فرض کردید:گفتیم هر تابع به scope جهانی دسترسی داره؛ دقیق تر این هست که بگیم هر تابع به &quot;محدوده بالادست&quot; خودش دسترسی داره؛ خواه محدوده جهانی باشه خواه محدوده یک تابع بیرونی تابع ما.حالا اگر ما تابعی داشته باشیم که داخل محدوده تابع دیگه نوشته شده باشه، و تابع بیرونی اون رو به عنوان خروجی return کرده باشه (دقت کنید که باید خود شی تابع رو برگردونده باشه و نه اون رو اجرا کنه؛ دقیقا عین سینتکس کد بالا!)، بعد از آنکه نتیجه اجرای تابع بیرونی رو به یک متغیر نسبت دادیم (و محتوای متغیر شد همون تابع داخلی)، کاری کردیم که تابع داخلی، مقادیر متغیرهای محدوده بالادست خودش رو حین اجرا یادآوری کنه؛ بدون اینکه متغیر خارجی اجرا بشه!با این نحوه نوشتن، ما بدون اینکه هر بار تابع بیرونی رو اجرا کنیم، از طریق تابع داخلی به متغیرهای محلی اون دسترسی داریم. این همون کلاسور تابع هست.خب حالا که چی؟ &quot;این لقمه رو دور سر گردوندن&quot; به چه کار میاد؟برای اینکه کاربردش رو بهتر متوجه بشید، به مساله زیر دقت کنید.سوم: معمای شمارندهصورت مسأله معمای شمارنده یا &quot;counter dilemma&quot; اینه: یک تابع بنویسید که هربار فراخوانی بشه، یه بار بشماره و یکی به شمارنده اضافه بشه؛ سپس مقدار شمارنده رو بهمون بده. یعنی مثلا مقدار اولیه شمارنده صفره، اما با هر بار نوشتن ()add یکی بهش اضافه شده و مقدار جدید برگردانده بشه.یا علی! دست به کار بشید ببینم چطوری این مساله رو حل می کنید؟راهکار اولیه:بعضی از شما ممکنه برای حل معما، راهکاری شبیه این داشته باشید:// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
    counter += 1;
}
 
// Call add() 3 times
add();
add();
add();با هر بار فرخوانی ()add یکی به counter اضافه می شه. این کد کار میکنه؛ اما مشکل بزرگش اینه که متغیر شمارنده (counter) جهانیه، یعنی میشه به راحتی بدون اینکه ()add در جریان قرار بگیره اون رو تغییر داد. بنابراین میشه شمارنده رو با مشکل مواجه کرد.اصلاحیه اول:برای بهتر کردن این راهکار، میشه کد رو به شکل زیر تغییر داد:// Initiate counter
let counter = 0;
 
// Function to increment counter
function add() {
    let counter = 0;
    counter += 1;
}
 
// Call add() 3 times
add();
add();
add();حالا نه تنها کد بهتر نشد، بلکه حالا شمارنده اصلا نمی شماره! در کد بالا با هر چند 3 بار ()add اجرا شده اما counter هم چنان صفره!بذارید روند حل مسأله رو واضح کنم: ما نیاز داریم تنها یک بار شمارنده صفر بشه تا مقدار اولیه شمارش معلوم باشه. اما بنا به چیزایی که گفتیم این تعریف و مقداردهی اولیه نباید گلوبال باشه (باید محلی باشه). از طرفی تابع ()add باید بتونه به متغیر محلی شمارنده دسترسی پیدا کنه و اون رو تغییر بده. تازه باید این تغییر ذخیره بشه تا اجرای بعدی ()add نتیجه قبلی قابل دسترسی باشه.اصلاحیه دوم:// Function to increment counter
function add() {
    let counter = 0;
    counter += 1;
    return counter;
}
 
// Call add() 3 times
add();
add();
add();این بار ضمن اینکه ()add سه بار فرخوان شده اما هر بار تنها عدد 1 را بر میگردونه. چون متغیر counter متغیر محلیه و عمرش تا پایان اجرای add هست و بعدش مقدار قبلی رو به یاد نمیاره!تغییر روش!:بیاید سیاق کد رو عوض کنیم. کد زیر رو ببینید:// Function to increment counter
function add() {
    let counter = 0;
    // Anonymous function for counting
    function plus() {counter += 1;}
       plus();   
       return counter;
}حلقه for تو در تو شنیدید؟ این تابع تو در تو هست :)اینجا با کمک تابع تو در تو و تعریف تابع plus، شمارنده رو محلی کردیم و تابعی که قراره بشماره حالا در این محدوده محلی با هر بار فراخوان، یکی به شمارنده اضافه می کنه.حالا نیاز داریم که از بیرون به plus دسترسی پیدا کنیم. اینجاست که روش کلاسور می تونه بهمون کمک کنه و معما رو حل کنه.فن استاد:کدمون رو اینجوری تغییر می دیم:// Function to increment counter
function countCreator(){
    let counter = 0;
    // Inner functoin
    function plus(){
      counter += 1;
      return counter;
    }
    return plus;
}
// Assign outter function to a variable
let add = countCreator();

// Call add() 3 times
add();
add();
add();با این راهکار، ضمن اینکه شمارنده درست کار می کنه، دیگه امکان اخلال در اجرا و تغییر مقدار شمارنده وجود نداره. تابع add ضمن هر بار اجرا، مقدار قبلی خودش رو به یاد میاره و یکی به اون اضافه کرده و نتیجه رو به ما نشون میده.به نظرم تا همین جا توضیح و تفصیل کافیه. حالا نوبت شماست؛ چه موارد استفاده ای برای کلاسور به ذهنتون می رسه؟ممنون می شم برای بهتر شدن مطالبم نظرتون رو باهام به اشتراک بذارید.پ ن: در این مقاله از مطلبی آموزشی در سایت W3Schools بهره گرفته شده است.</description>
                <category>علی صادقی نیا</category>
                <author>علی صادقی نیا</author>
                <pubDate>Tue, 18 Jan 2022 12:46:22 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی Numpy؛ ساده و گیرا</title>
                <link>https://virgool.io/Whitenoise/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-numpy-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88-%DA%AF%DB%8C%D8%B1-zwxlyjtgyccp</link>
                <description>سلام. توی این مقاله می خوام کتابخانه نامپای (Numpy) رو معرفی کنم. توی مقاله قبلی بهتون راجع به اینکه زبان برنامه نویسی پایتون و کتابخانه هاش برای ما مهندس ها مثل یک هدیه می مونه توضیح دادم. لب کلام اون مقاله این بود که ما با کمک پایتون می تونیم با سرعت و بهره وری بیشتری با داده های حجیم (big data) کار کنیم. برای رسیدن به این نتیجه، کتابخانه نامپای پای ثابت کار ماست.اولین شگفتی نامپای اشیایی هستند به اسم ndarray؛ یا همون آرایه های نامپای که ممکنه قبلا شنیده باشید. به کمک نامپای می تونیم اشیایی بسازیم که در واقع آرایه هایی چندبعدی از داده ها هستند. یه چیزی شبیه ماتریس ها یا تانسورها. (یادش بخیر مقاومت مصالح و تانسور تنش ) البته شاید پیش خودتون بگید اینکه چیز مهمی نیست. ما خودمون لیست و تاپل مذگان داریم که کلی هم باهاش آرایه های چند بعدی و تو در تو ساختیم! من این حرف شما رو رد نمی کنم. در حالت عادی و برای ذخیره کردن تعداد کمی داده و اعمال عملیات های جزئی روی اون، خودم هم از لیست و مشابه اون (iterable objects)  استفاده می کنم. اما اگر حجم داده ها بالا بره چی؟ اگر سرعت محاسبات مهم باشه چی؟ « ادعا می شه که آرایه های پایتون تا 50 برابر سریعتر از آرایه های ساخته شده از لیست ها هستند».کتابخانه نامپای علاوه بر فراهم کردن آرایه ها، یک سری عملگرها و متدهایی برای عملیات ها و محاسبات سریع روی آرایه ها در اختیار میذاره. عملیات هایی نظیر: محاسبات ریاضی، منطقی، تغییر توزیع وشکل داده ها، مرتب سازی داده، کار با تبدیل فوریه، جبر خطی، آمار و احتمال، ساخت توزیع داده ها و ایجاد انواع داده های رندم و نمایش اون ها.در واقع ndarray یه کلاس داخل کتابخانه نامپای هست که شامل خواص و متدهای مشخصیه و اشیای آرایه ای از همین کلاس الگو می گیرند و ساخته می شوند.شمای آرایه های نامپایحالا که یه معرفی اجمالی از نامپای داشتیم (که امیدوارم شما رو تا اینجای متن شارژ نگه داشته باشه) بریم ریزتر تفاوت آرایه های نامپای رو با آرایه های استاندارد پایتون بررسی کنیم:ما وقتی یه لیست پایتونی می سازیم، طول این لیست در حین برنامه می تونه کم و زیاد بشه، اما ndarray ها اینطوری نیستند. ما وقتی مثلا یه آرایه 4در4 می سازیم، ابعاد این آرایه همیشه ثابت هست و در صورت اعمال تغییر، در واقع داریم این آرایه رو حذف می کنیم و یکی دیگه می سازیم.بر خلاف لیست های پایتون، اجزای آرایه های نامپای همه باید از یک نوع داده باشند؛ مثلا همه از نوع int. ضمن اینکه مثلا اگر یه آرایه دوبعدی دارید، طول آرایه های یک بعدی زیر مجموعه اون، همه باید یکسان باشه. یعنی نمی شه که سطر اول 4، سطر دوم 5 و ... عضو داشته باشند. البته یه &quot;راه در رو&quot; داره که اینجا مجال توضیحش نیست. توی کامنت در خدمت دوستان هستم ؛)متدها و عملگرهایی که زیر مجموعه آرایه های نامپای هستند، علاوه بر این که بهره وری و سرعت بالاتری رو به ارمغان میارن، طول کدهای ما رو هم کمتر می کنند. شما در نظر بگیر برنامه نویسی با پایتون خودش یه جور خلاصه نویسیه، با نامپای از اونم خلاصه تر میشه در حالی که حجم داده ها هم بزرگتره!کلی از برنامه های علمی و مهندسی که امروزه نوشته و منتشر می شن از آرایه های نامپای استفاده می کنند. شاید ورودی ها رو از شما به صورت لیست بگیرن (اگر فایل نگیرن!) اما تبدیلش می کنند به ndarray و بعد عملیات رو روش انجام می دن. نهایتا هم یه ndarray بر می گردونند که طبیعتا برای کار باهاش محتاج نامپای هستیم.البته با ذکر مثال درک این موارد بالا راحت تره برامون. این مثال رو از سایت خود نامپای کش رفتم:اگر دوتا لیست از اعداد داشته باشیم و بخوایم درایه های متناظر رو با هم ضرب کنیم و داخل یه لیست جدید بریزیم، با روش های استاندارد پایتون احتمالا یه کدی داریم مثل این:c = []
for i in range(len(a)):
       c.append(a[i]*b[i])که اگر این دوتا لیست یه میلیون درایه داشته باشند، لوپ زدن خیلی از ما هزینه محاسباتی میگیره. خوب تو دلتون می گید:&quot;چه کاریه؟ میرم با C می نویسم که سریع تره!&quot; هر جو راحتی. اینم از کد همین مساله با سینتکس C(که البته خلاصش کردم):for (i = 0; i &lt; rows; i++): {
       c[i] = a[i]*b[i];
}البته ما با C شاید هزینه های محاسباتی رو کاهش دادیم، اما خودمون رو از مزایای کدنویسی با پایتون محروم کردیم. بگذریم؛ اگر آرایه های ورودی ما 2 بعدی بودن چی؟ باید کدمون رو اینطوری گسترش بدیم:for (i = 0; i &lt; rows; i++): {
        for (j = 0; j &lt; columns; j++): {
               c[i][j] = a[i][j]*b[i][j];
         }
}خب هر چی مثال جانبی زدم بسه دیگه، بریم سر اصل مطلب؛ خانم ها و آقایان، این شما و اینم کد معادل این مسأله به کمک نامپای:c = a * bالان توضیحی می مونه؟ نه انصافا میخوای دیگه چی از جیب من درآد؟ با این عملگر ما فارغ از shape آرایه ها، درایه های متناظر رو ضرب می کنیم و ازش یه آرایه جدید می سازیم.همه این توضیحات یعنی الهه نامپای هم سرعت C رو داره و هم جذابیت پایتون.حالا اصلا چرا اینقدر نامپای سریعه؟ چون: همه چی رو بردار می بینه (Vectorization) و قابلیت توزیع داره.( broadcasting)یه بردار با درایه هاش توصیف میشه. وقتی بردار رو با زوایای فضایی و طول بردار توصیف می کنیم، کارمون خیلی سخت تر از وقتیه که اون رو با بردارهای یکه معرفی می کنیم. در واقع دلیل اینکه ما خیلی صریح هیچ حلقه تکرار یا ایندکس گذاری و امثالهم رو توی محاسبات نامپای نمی بینیم دلیلش همین برداری کردن داده هاست. (البته ضمن اجرای کد، لوپ و اینا هست که ما درگیرش نیستیم و اصن به ما چه!) خلاصه که مزایای برداری سازی از این قراره:خوانایی کد بهتر میشه.کد کمتر، باگ کمتر، زندگی شادتر :)ظاهر کدمون خیلی شبیه معادلات ریاضیاتی و کانتنیومی می شه که کد کردن مسائل رو راحت میکنه.حلقه های for کمترمنظورم از قابلیت توزیعی (ترجمه بهتری داشتید پیشنهاد بدید لطفا) اینه که عملگرها به صورت ضمنی رفتار درایه به درایه دارن. مثلا توی مساله بالا، کد ما کار نداشت که ابعاد a و b چقدره! اون ها رو یه سری درایه می دید که قرار دو به دو ضرب بشن.پس نامپای با کلاس ndarray با برداری کردن داده ها و توزیع پذیری متدها و عملگرها، سرعت، خوانایی، بهره وری و سادگی نوشتاری رو به همه ما هدیه میده.راستی شما ترغیب شدید نامپای رو پایتون یاد بگیرید؟ خیلی خوب میشه برای بهتر شدن کارم نظر شما رو داشته باشم.</description>
                <category>علی صادقی نیا</category>
                <author>علی صادقی نیا</author>
                <pubDate>Sun, 19 Dec 2021 11:32:27 +0330</pubDate>
            </item>
                    <item>
                <title>هدیه پایتون به مهندسان مکانیک</title>
                <link>https://virgool.io/@ali.sadeqinia/%D9%87%D8%AF%DB%8C%D9%87-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D9%87-%D9%85%D9%87%D9%86%D8%AF%D8%B3%D8%A7%D9%86-%D9%85%DA%A9%D8%A7%D9%86%DB%8C%DA%A9-g4ngvjj2gzu7</link>
                <description>این روزها زبان برنامه نویسی پایتون خیلی سر زبون ها افتاده. هر کی به یه دلیلی می خواد پایتون رو یاد بگیره؛ خب ما مهندس های مکانیک هم دل داریم دیگه! چی می شد می تونستیم یه زبان برنامه نویسی رو در فرصت کم و با کمترین سردرگمی و پیچیدگی یاد بگیریم که بتونه مسائل زمان بر و چند بعدی ما رو با سرعت بالا حل کنه و نمودارهامون رو رسم کنه یا دیتاست های حجیمی که از تست های مختلف استخراج کردیم هندل کنه؟ یعنی کی میشه دیگه ناز اکسل و میپل رو نکشیم؟خب پایتون برای ما مهندس های مکانیک هم راهکار داره. حتی بعضیا ادعا میکنن اگر خوب اسکریپتش رو بنویسی، متلب رو هم می‌ذاره توی جیبش (اون طوری نگام نکن! نباید روی نرم افزاری تعصب داشته باشی؛ حتی متلب). همه این کارها رو به نظرم مدیون کتابخانه های متنوع و منعطف پایتون هستیم که من میخوام چندتاشون رو توی این قسمت بهتون معرفی کنم. البته فعلا خیلی مختصر بهشون اشاره می کنم که هر چی بلدم رو خرج یه پست نکنم و بتونم سر همین موضوع یه چندتایی مطلب براتون بنویسم :)ماژول Mathاگر از مقدمات پایتون یه چیزایی شنیده باشید، می دونید که یکسری از توابع و متدهای پایتون رو بدون فراخوانی هیچ ماژول و کتابخانه ای می تونید استفاده کنید. متدهای ریاضی اولیه از قبل همراه پایتون نصب میشه و جوابگوی محاسبات اولیه ریاضی شما هست؛ اما اگر محاسبات شما پیچیده تر بشه، باید ماژول استاندارد Math رو فراخوانی کنید. تفاوت این متدهای داخلی با ماژول Math عین تفاوت ماشین حساب ساده و ماشین حساب مهندسیه! کافیه شما بخواید arcsin یه مقدار رو به دست بیارید یا برعکس sin یه زاویه رو حساب کنید، یا حتی بخواید از اعداد پی یا نپر استفاده کنید. برای محاسبات لوگاریتمی، توانی، مثلثاتی و هذلولوی و محاسبات عددی طولانی مثل سری و حتی ک.م.م (یاد دبیرستان بخیر) هم می تونید از متدهای این تابع کمک بگیرید.یه جا دیدم یه نفر اومده حساب کرده که اگر بخوایم فاکتوریل یه عدد رو بدست بیاریم چکار باید بکنیم؛ خب یه راه اینه که بر اساس تعریف فاکتوریل بیایم با forحلقه بنویسیم تا بتونیم نتیجه نهایی رو حساب کنیم. مثل کد زیر که برای فاکتوریل 7 نوشته شده:def fact_loop(num):
        if num &lt; 0:
               return 0
        if num == 0:
               return 1
        factorial = 1
        for i in range(1, num + 1):
              factorial = factorial * i
         return factorial

&gt;&gt;&gt; fact_loop(7)
5040حالا اگر ماژول Math رو وارد بازی کنیم، با متد factorial() توی یک خط کد می تونیم همون کار رو تکرار کنیم:import math
&gt;&gt;&gt; math.factorial(7) 
5040می پرسی فرقش چیه: عرض به خدمت شما علاوه براینکه با یه کد تمیز طرف هستیم، باید بگم که هزینه محاسباتی رو که برای ما مهندس ها خیلی مهمه، به شدت کاهش دادیم؛ دقیقا یک دهم! محاسبه 7 فاکتوریل با حلقه for حدود 1.064 میلی ثانیه زمان برد اما با کمک ماژول Math در مدت 0.107 میلی ثانیه کار تمام شد. عالیه مگه نه؟ماژول NumPyیادگیری این ماژول واسه ما خیلی مهمه. چون خیلی جاها مجبوریم توی محاسباتمون از مقادیر برداری استفاده کنیم یا با کلی ماتریس سر و کله بزنیم؛ ماژول Numpy برای کار روی آرایه ها و ماتریس ها ساخته شده و رقیب سرسخت متلب هست. توی این لینک می تونید ببینید چطور متلب رو به خاک و خون کشیده!ماژول Matplotlibقبول دارم که متلب توی دنیای پکیج های مهندسی یه جور اسطوره قلمداد می شه. اینجا هم اسم بزرگش روی پایتون سایه انداخته و در نتیجه شاهد ماژول Matplolibهستیم؛ یعنی ماژولی که عین متلب واستون پلات میگیره! خب اگر داده هاتون رو به خاطر ویژگی های خوب پایتون و کتابخانه هاش، با پایتون تحلیل کرده باشید و محاسباتتون رو انجام داده باشید، راحت تره توی همین محیط هم گراف هاتون رو نمایش و نتایج رو نشون بدید. این ماژول هم دقیقا اینجاست که شما یک وقت توی دلتون از اینکه به خاطر پایتون به متلب پشت کردید، پشیمون نشید!ماژول SciPyمهندس های ارتعاشات عاشق این ماژول میشن. در یک کلام Scipy الگوریتم های پردازش و محاسبات رو شامل میشه. شما اگر با پردازش سیگنال، تبدیل فوریه، رگرسیون، حل معادلات دیفرانسیل، انتگرال گیری، درونیابی و بهینه سازی سر و کار دارید، این ماژول چوب جادوی شماست. یه نکته جالب هم اینه که متدها و توابع ماژول Numpyداخل این ماژول هم موجوده!مقایسه پایتون با متلب و اکسل در پردازش داده هاخب حالا چیکار کنیم:ببینید دوستان پروژه های شما ممکنه فقط تحلیل ساده یه سری داده نباشه. ممکنه توی فضا اینترنت اشیا فعال باشید یا روی میکرو کنترلر ها کار کنید. یا شاید دارید یادگیری ماشین کار می کنید و حجم داده هاتون خیلی زیاده. خیلی راحت تره که ضمن یادگیری یک زبان برنامه نویسی واحد به اسم پایتون، با استفاده از کلی کتابخانه منعطف این زبان، به روش های مختلف داده هاتون رو جمع آوری کنید و بدون انتقال به یک پکیج ثانوی، داخل همین محیط پایتون با سرعت خیلی بیشتر اون ها رو پردازش کنید و نهایتا خروجی کارتون رو ببینید. متن باز بودن، جامعه کاربری و پشتیبانی گسترده و ضد تحریمی بودن پایتون در کنار کتابخانه های گسترده اون دلیل های خوبی هست که به عنوان یک مهندس از پکیج های بسته ای مثل متلب (که البته هنوز محتاج سیمولینکش هستم) به پایتون نقل مکان کنید.</description>
                <category>علی صادقی نیا</category>
                <author>علی صادقی نیا</author>
                <pubDate>Thu, 04 Nov 2021 20:05:27 +0330</pubDate>
            </item>
            </channel>
</rss>