<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Milad Sadeghi</title>
        <link>https://virgool.io/feed/@miladsade96</link>
        <description>Java Backend Software Engineer</description>
        <language>fa</language>
        <pubDate>2026-06-07 15:02:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/14276/avatar/3Br2ZP.jpg?height=120&amp;width=120</url>
            <title>Milad Sadeghi</title>
            <link>https://virgool.io/@miladsade96</link>
        </image>

                    <item>
                <title>آموزش MultiThreading در جاوا - قسمت اول</title>
                <link>https://virgool.io/@miladsade96/mtijp1-exn77yc2ykfn</link>
                <description>سلام ، توی این سری پست ها قراره که در مورد multi threading یاد بگیریم.فرض کنید که به یه رستوران شلوغ برای خوردن شام رفتید ، سفارشتون رو دادید و منتظرید که غذاتون رو براتون بیارن. کاری که توی پشت صحنه داره انجام میشه چیه؟ یه سری آشپز توی آشپرخونه ی رستوران هستن که دارن باهم کار میکنن؛ تعدادیشون مشغول آماده کردن سالادها هستن ، تعدادیشون مشغول پخت غذاها و تعدادیشون هم مشغول تزیین کردن غذاهای آماده شده ان که قراره تحویل مشتری ها بشن. شاید الان براتون سوال باشه که این جریان رستوران چه ارتباطی به بحث multi threading داره.Multi Threading چیه؟به اجرای همزمان چند thread (نخ) توی یه برنامه جاوا ، multi threading گفته میشه. همونطور که توی رستوران چند آشپز دارن همزمان کار میکنن تا سفارش ها زودتر آماده بشه ، توی جاوا هم در بعضی موارد ما نیاز داریم که قسمت هایی از منطق برنامه ، همزمان اجرا بشن تا توی کوتاه ترین زمان نتیجه به دست بیاد.در حالت کلی thread یه sub-process سبک هست که به ما این امکان رو میده تا کارهای مختلف رو همزمان انجام بدیم و در کل باعث بهبود عملکرد برنامه میشه.قبل از اینکه وارد مباحث ساخت و استفاده از thread بشیم ، بهتره ببینیم که یه برنامه جاوا که داخلش از multi threading استفاده نشده چطوری کار میکنه. برای این کار یه پروژه جاوا توی intellij میسازیم:پروژه خالی جاوابعدش توی مسیر src/main/java یه پکیج به نام part1 میسازیم و داخلش یه کلاس به نام NormalJavaWithoutMultiThreading میسازیم ، توی این کلاس قراره که کدهامون رو بنویسیم:کلاس NormalJavaWithoutMultiThreadingبرای اینکه کدهای داخل کلاس بتونن اجرا بشن به متد main نیاز داریم ؛ پس اون رو هم تعریف میکنیم:متد mainحالا میتونیم کدهامون رو داخل متد main بنویسیم. برای اینکه بتونیم رفتار جاوا رو توی این سناریو (استفاده نکردن از multi threading) بررسی و تست کنیم به دو تا حلقه for نیاز داریم ؛ اولی برای پرینت کردن اعداد از 0 تا 10 و دومی برای پرینت کردن اعداد از 11 تا 20. پس مینویسیم:حلقه های forحالا برنامه رو اجرا میکنیم تا خروجیش رو ببینیم. خروجی برنامه باید مثل تصویر پایین باشه:خروجی حلقه های forهمونطور که میبینید اعدا از 0 تا 20 بهمون نمایش داده شدن. نتیجه ای که میتونیم بگیریم اینه که کدهایی که توی جاوا نوشتیم در حالت عادی ، پشت سر هم (خطی) اجرا میشن. این روش برای اکثر جاها جواب میده ولی در مواردی ما نیاز داریم که قسمت هایی از برنامه بصورت همزمان (موازی) باهم کار کنن ؛ اونجاست که باید از multi threading استفاده کنیم.نکته ی مهمی که اینجا وجود داره اینه که ما وقتی برنامه جاوا رو اجرا میکنیم ، جاوا یه thread به نام main میسازه و برنامه رو روی اون اجرا میکنه. برای اینکه صحت این موضوع رو بررسی کنیم میتونیم این کار رو بکنیم؛ اول باید روی حلقه ی for دوم یه breakpoint بزاریم تا زمانی که برنامه به اون خط رسید pause بشه:breakpoint روی حلقه for دومو بعدش برنامه رو روی حالت debug اجرا کنیم ؛ برای این کار باید روی آیکون debug کلیک کنیم:آیکون debugبعد از کلیک روی آیکون debug ، یه پنل جدید پایین صفحه intellij برامون باز میشه که اسم thread اصلی ای که برنامه جاوا روی اون داره اجرا میشه توش نوشته شده:پنل debugخب این هم از این. حالا قبل از اینکه وارد مباحث thread توی جاوا بشیم ، اول باید با مفهوم thread آشنا بشیم. از اونجایی که thread مختص جاوا نیست و مربوط به مباحث سیستم عامل میشه ؛ اول باید بدونیم که خود سیستم عامل چطوری thread هارو میسازه و باهاشون کار میکنه.همه این مباحث رو توی قسمت بعد قراره بررسی کنیم.امیدوارم که تا اینجای کار براتون مفید بوده باشهفعلا :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Fri, 25 Jul 2025 20:24:54 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش رفلکشن (Reflection) در جاوا</title>
                <link>https://virgool.io/@miladsade96/reflection-java-ojvpiwukcr3q</link>
                <description>سلام به همگی ، امیدوارم حالتون خوب باشه. بعد از مدت ها برگشتم با یه پست جدید ، این بار با آموزش یه فیچر از زبان برنامه نویسی جاوا.رفلکشن چیه؟در حالت کلی ما با استفاده از رفلکشن میتونیم در زمان runtime یه سری تغییرات رو روی کلاس هایی که نوشتیم اعمال کنیم. اجازه بدید با یه مثال شروع کنیم و ببینیم که رفلکشن (reflection) چیه و چه امکاناتی رو در اختیار ما قراره میده:فرض کنید که یک کلاس به نام Cat پیاده سازی کردیم که طبق تصویر بالا یک سری property و method داره. برای تست کردن امکانات رفلکشن نیاز داریم که یک متد main هم داشته باشیم تا یک آبجکت از کلاس Cat رو داخلش ایجاد کنیم:برای شروع بریم ببینیم که میتونیم لیست فیلدهای داخل کلاس Cat رو به دست بیاریم یا نه. زمانی که قصد داریم تا اطلاعاتی رو از کلاس یک آبجکت به دست بیاریم ، از متد getClass استفاده میکنیم. متد getClass به ما اجازه میده تا از امکانات مربوط به reflection که جاوا در اختیارمون قرار داده استفاده کنیم. خب برای به دست آوردن فیلدهای تعریف شده توی کلاس Cat ، باید از متد getDeclaredFields استفاده کنیم و از آنجایی که این متد آرایه ای از نوع Field برمیگردونه باید مقدار برگشتی اون رو داخل یک متغییر با همین نوع ذخیره کنیم:درضمن برای استفاده از کلاس Field باید اون رو از داخل پکیج java.lang.reflect ایمپورت کنیم. حالا ما یک آرایه از نوع Field داریم که محتوی تمامی فیلدهای تعریف شده داخل کلاس Cat هست و میتونیم با استفاده از یک حلقه ی for ، اون رو پیمایش کنیم:حالا اگر برنامه رو اجرا کنیم ، لیست فیلدهای کلاس Cat رو خواهیم دید:nameageجالبه، نه؟! اینکه میتونیم کدی بنویسیم که ساختار داخلی یک کلاس توی جاوا رو ببینه.اگر کلاس Cat رو دوباره بررسی کنیم میبینیم که یک فیلد به نام name از نوع private و final داره ، به این معنی که ما دسترسی مستقیمی به اون فیلد ، خارج از کلاس خودش نداریم و این فیلد تنها یک بار میتونه مقداردهی بشه اون هم فقط داخل constructor کلاس هست. به عبارت دیگه اگر ما قصد داشته باشیم که کد زیر رو بنویسیم:کدی که نوشتیم حتی کامپایل هم نمیشه و خطا میده:نتیجه اینکه بدون استفاده از رفلکشن اصلا امکان تغییر مقدار فیلد name از داخل متد main وجود نداره. ولی اگر پای رفلکشن به قضیه باز بشه ، اوضاع کلا فرق میکنه. چطور؟! الان بهتون میگم.با استفاده از رفلکشن ما میتونیم بدون ایجاد تغییر توی کلاس Cat ، جاوا رو مجبور کنیم تا تغییراتی که میخوایم رو روی کلاس مدنظرمون اعمال کنه.حالا قصد داریم که مقدار فیلد name کلاس Cat رو تغییر بدیم. برای این کار باید روی آرایه ی فیلدهای کلاس Cat پیمایش کنیم و فیلد مورد نظر رو به دست بیاریم. پس مینویسیم:برای ایجاد تغییرات در مقدار از متد set استفاده میکنیم. این متد دو تا پارامتر ورودی داره:اولی: آبجکتی هست که قصد داریم روی فیلدهای اون تغییرات ایجاد کنیمدومی: مقداری هست که قصد داریم ست کنیمپس مینویسیم:بعد از نوشتن کد بالا، خطای Unhandled Exception میگیریم که برای رفع اون باید throws Exception رو به signature متد main اضافه کنیم، پس مینویسیم:حالا اگر برنامه رو اجرا کنیم، خطای IllegalAccessException میگیریم که کاملا منطقی هست چون قصد داریم که به یک فیلد private دسترسی داشته باشیم. برای رفع این خطا باید سطح دسترسی فیلد name رو هم قبل از مقداردهی تغییر بدیم:اگر الان برنامه رو اجرا کنیم ، هیچ خطایی نمیگیریم. فقط باید ببینیم که تغییراتی که میخواستیم اعمال شدن یا نه. پس مینویسیم:یک بار دیگه برنامه رو اجرا میکنیم و خروجی زیر رو میبینیم:Jerryنتیجه اینکه علی رغم private و final بودن فیلد name توی کلاس Cat ، میتونیم با استفاده از رفلکشن اون رو دستکاری کنیم و تغییرات مدنظرمون رو اعمال کنیم.امکانات مربوط به رفلکشن فقط محدود به فیلدهای یک کلاس نمیشه. مثلا ما میتونیم روی متدهای تعریف شده داخل یک کلاس هم تغییرات اعمال کنیم.اول ببینیم که میتونیم لیست متدهای تعریف شده توی کلاس Cat رو به دست بیاریم یا نه. برای اینکار داخل متد main مینویسیم:متد getDeclaredMethods آرایه ای از کلاس Method رو برمیگردونه ، پس باید مقدار اون رو داخل یک متغیر با همون نوع ذخیره کنیم:برای استفاده از کلاس Method باید اون رو از داخل پکیج java.lang.reflect ایمپورت کنیم. حالا بریم ببینیم که تونستیم لیست متدها رو به دست بیاریم یا نه. برای اینکار باید روی آرایه متدها پیمایش کنیم:حالا اگر برنامه رو اجرا کنیم، خروجی زیر رو میبینیم:getNamethisIsPublicStaticthisIsPrivateStaticgetAgesetAgemeowheyThisIsPrivateنکته ای که باید در نظر داشته باشید اینه که جاوا هیچ ترتیب خاصی رو برای آرایه متدها رعایت نمیکنه به همین خاطر همیشه باید روی این آرایه پیمایش کنیم و المانی که مدنظرمون هست رو انتخاب و روش کار کنیم.یکی از کارهای جالبی که با آبجکت method میشه انجام داد، اصطلاحا invoke کردن یا صدا زدن متد هست. برای اینکار از متد invoke استفاده میکنیم. فرض کنید که قصد داریم تا متد meow داخل کلاس Cat رو با استفاده از رفلکشن صدا بزنیم. برای اینکار مینویسیم:متد invoke یک سری پارامتر ورودی میگیره:اولی: آبجکتی که قصد داریم روی کلاس اون کار کنیمبعدی ها: اگر متدی که میخوایم باهاش کار کنیم ، خودش پارامتر ورودی داشته باشه ، باید مقدار اونها رو به ترتیب تعریف شده داخل کلاسش ، به متد invoke پاس بدیم. توی مثال بالا از اونجایی که متد meow هیچ پارامتر ورودی ای نمیگیره ، فقط پارامتر اول رو به متد invoke پاس میدیم.حالا اگر برنامه رو اجرا کنیم ، قاعدتا باید متد meow صدا زده بشه و خروجی زیر رو ببینیم:Meow!حالا شاید سوال براتون پیش بیاد که چرا برای صدا زدن متد meow که از نوع public هست ، باید از رفلکشن استفاده کنیم؟ مادامی که میتونیم بطور مستقیم این متد رو صدا بزنیم:سوالتون کاملا منطقیه ، در واقع توی مثال بالا نیازی نیست که از رفلکشن استفاده کنیم. ولی اگر بخوایم متدی رو صدا بزنیم که بهش دسترسی نداریم ، چطور؟!برای مثال داخل کلاس Cat متدی داریم به نام heyThisIsPrivate که یک متد از نوع private هست به این معنی که خارج از کلاس خودش بهش نمیتونیم دسترسی داشته باشیم. برای اینکه بتونیم این متد رو صدا بزنیم، مینویسیم:حالا اگر برنامه رو اجرا کنیم، خروجی زیر رو میبینیم:This is a private methodداخل کلاس Cat یک متدی داریم به نام thisIsPublicStatic که از نوع static هست. برای صدا زدن متدهای static که مربوط به کلاس میشن نه آبجکت های ساخته شده از اون کلاس ، اگر بخوایم از متد invoke توی رفلکشن استفاده کنیم ، باید به عنوان پارامتر اول بجای myCat ، کلید واژه ی null رو پاس بدیم:حالا اگر برنامه رو اجرا کنیم ، خروجی زیر رو میبینیم:This is a public static methodسناریوی بالا برای متدهای private و static هم صادق هست با این تفاوت که قبل از صدا زدن متد ، باید سطح دسترسی اون رو دستکاری کنیم:حالا اگر برنامه رو اجرا کنیم ، خروجی زیر رو میبینیم:This is a private static methodچرا باید از رفلکشن استفاده کنیم؟چون فیچر جذابی هستتوی فریمورک ها خیلی استفاده میشه. مثلا فریمورک spring برای دستکاری و تغییر کلاس هایی که ما نوشتیم از رفلکشن استفاده میکنهتوی تست کردن برنامه ، اگر از رفلکشن استفاده کنیم ، دستمون به مراتب باز تره بخاطر امکان کار کردن با المان های privateچرا نباید از رفلکشن استفاده کنیم؟توی استفاده از رفلکشن اگر ندونید که دارید چیکار میکنید میتونید باگ هایی تولید کنید که به سادگی قابل رفع نیستنچون تمامی کارهای مربوط به رفلکشن در runtime انجام میشه ، امکان اعمال فرایندهای بهینه سازی زمان کامپایل وجود نداره در نتیجه کدهای مربوط به رفلکشن معمولا از بقیه کدها کُند تر هستن.در حالت کلی اگر کاری که قصد دارید انجام بدید ، بدون کمک گرفتن از رفلکشن قابل انجام هست ، نباید ازش استفاده کنید.این هم از آموزش reflection در جاواامیدوارم براتون مفید بوده باشه. منتظر نظراتتون توی کامنت ها هستمموفق باشید :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Fri, 27 Dec 2024 22:43:54 +0330</pubDate>
            </item>
                    <item>
                <title>اجرای کدهای فورترن داخل پایتون</title>
                <link>https://virgool.io/@miladsade96/f2py-jyfve6cil1ef</link>
                <description>سلام ، میلاد هستم.امروز قراره یاد بگیریم که چطور میتونیم کدهای نوشته شده به زبان فورترن رو داخل پایتون استفاده کنیم.برای این کار لازمه که با ابزار F2PY  آشنا بشیم. اگر بخوام خیلی ساده بگم ، این ابزار رابطی مابین زبان پایتون و فورترن میسازه تا ما بتونیم کدهای فورترنی خودمون رو داخل زبان پایتون استفاده کنیم(ولی از لحاظ فنی موضوع خیلی پیچیده ست). F2PY  بخشی از کتابخونه ی numpy  هست که مطمئنم همه ی افرادی که رفتن سراغ حوزه هوش مصنوعی ، یادگیری ماشین و دیتاساینس با اون آشنا هستن. همچنین این ابزار بصورت یک ابزار مستقل خط فرمانی هم برای سیستم های لینوکسی وجود داره .همونطور که میدونید فورترن یک زبان کامپایلری هست که بیشتر برای برنامه نویسی علمی و محاسبات عددی استفاده میشه و کتابخونه های نرم افزاری خیلی قوی ای با این زبان نوشته شدن مثل lapack و intel math kernel library. خیلی از مواقع مخصوصا توی پروژه های بزرگ پایتونی بجای اینکه بیایم و ابزارهای مورد نیازمون رو از صفر به زبان پایتون بنویسیم ، میایم و ابزارهای نوشته شده به زبان فورترن داخل پروژه ی خودمون استفاده میکنیم ؛ بدون اینکه کاربر متوجه بشه ابزاری که داره استفاده میکنه به زبان فورترن هست نه پایتون. با این کار هم زمان هدر نمیره بخاطر توسعه پروژه و هم سرعت برنامه افزایش پیدا میکنه(سرعت فورترن از پایتون بیشتره).ساخت extension module :خب بریم سراغ اصل مطلب.  فرض کنید که تابع فورترنی زیر رو داریم:even_odd.f90تابع بالا یک مقدار صحیح رو دریافت میکنه و بعد مشخص میکنه که مقدار داده شده زوج هست یا فرد.ابزار F2PY امکانات و روش های مختلفی برای کار کردن داره ولی ما اینجا آسون ترین و راحت ترین روش رو بررسی میکنیم. برای اینکار دستور زیر رو داخل ترمینال وارد میکنیم:python  - m  numpy.f2py  - c  even_odd.f90  - m  even_odd_moduleدستور بالا فایل فورترنی مارو (even_odd.f90)پردازش میکنه و بعد یک extension module برای پایتون با نام even_odd_module تولید میکنه. بعد از اجرا شدن دستور خواهید دید که یک فایل جدید با پسوند .so داخل دایرکتوری ساخته شده.تست ماژول:خب حالا میریم سراغ تست کردن ماژول داخل زبان پایتون. مفسر پایتون رو اجرا میکنیم و ماژول رو ایمپورت میکنیم:&gt;&gt;&gt;  from even_odd_module  import even_oddمیخوایم بدونیم که این ماژولی که ایمپورت کردیم در واقع چه چیزی هست و به کدوم کلاس تعلق داره:&gt;&gt;&gt;  print(even_odd)
&lt;fortran object&gt;
&gt;&gt;&gt;  print(type(even_odd))
&lt;class &#039;fortran&#039;&gt;حالا میخوایم داکیومنت مربوط به تابع فورترنی رو بررسی کنیم :&gt;&gt;&gt;  print(even_odd.__doc__)
even_odd(number)

Wrapper for  ``even_odd``.

Parameters
-------------------
number   :   input  int و در آخر میخوایم تابع مورد نظر رو با دادن ورودی تست کنیم ببینیم درست کار میکنه یا نه:&gt;&gt;&gt; even_odd(5)
5  is  an  odd  number
&gt;&gt;&gt; even_odd(10)
10  is  an  even  numberاینم از تست کردن این ماژول (:اینم اینجا داخل پرانتز بگم که بیشتر امکانات و توابع موجود توی کتابخونه ی  numpy  و ماژول جبر خطی کتابخونه ی scipy مدیون یک کتابخونه ی نوشته شده با زبان فورترن بنام lapack هستن و دارن از توابع اون استفاده میکنن.کلام آخر:اگر به این موضوع علاقه مند شدید و خواستید که بیشتر در این مورد یاد بگیرید و یا کار کنید ، پیشنهاد میکنم حتما مستندات ابزار F2PY رو مطالعه کنید.امیدوارم مفید بوده باشه براتون ، موفق باشید.</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Sat, 02 May 2020 20:18:30 +0430</pubDate>
            </item>
                    <item>
                <title>مسیر یادگیری من برای پایتون - آپدیت مهر ۱۴۰۰</title>
                <link>https://virgool.io/coderlife/pythonroadmap-fvfbu5wzajyy</link>
                <description>۲۳ مهر 1400سلام ، میلاد هستم (:امیدوارم حالتون خوب باشه. امروز میخوام مسیری که برای یادگیری پایتون طی کردم رو باهاتون به اشتراک بزارم.خوب همونظور که میدونید برای یادگیری یه زبان برنامه نویسی جدید باید وقت بذازید ، تلاش کنید و پشتکار داشته باشید . هیچ کس نمیتونه ره صد ساله رو یه شبه بره. در ضمن منابعی که توی این پست قراره معرفی بکنم وحی منزل :) نیستن و منابع خوب دیگه ای هم هست که میتونید با کمی جستجو پیداشون کنید. این منابع در قالب ۶ بخش دسته بندی شدن که باهم بررسی میکنیم.بخش اول - مبانی:برای یادگرفتن پایتون از صفر تا سطح متوسط یکی از بهترین کتاب ها ، کتاب Think Python چاپ انتشارات O&#x27;reilly هست که از مباحث خیلی پایه شروع میکنه و تا شی گرایی (البته خیلی مبتدی و خلاصه) ادامه میده. در انتهای هر فصل یک سری تمرینات وجود داره که برای تثبیت یادگیری حتما باید انجام بدید.بخش دوم - ساختمان داده و الگوریتم:بعد از اینکه دستورات نحوی (syntax) زبان رو یاد گرفتید ، مرحله ی بعدی یادگیری مباحث ساختمان داده و الگوریتم هست. برای اینکه مهارت حل مساله تون تقویت بشه باید با الگوریتم های مختلف توی دنیای کامپیوتر و ساختمان داده هایی که زبان برنامه نویسی پایتون در اختیارتون قرار داده آشنا بشید و نحوه ی استفاده از اونها رو یاد بگیرید. در این بخش سه تا کتاب از سه تا انتشارات متفاوت وجود داره که به اختیار خودتون میتونید یکی رو انتخاب کنید و با اون پیش برید. اولی کتاب Data Structures and Algorithms with Python چاپ انتشارات Springer ، دومی کتاب Python Data Structures and Algorithms چاپ انتشارات Packt و سومی هم کتاب Grokking Algorithms چاپ انتشارات Manning هست. یه دوره ی آموزشی ویدئویی خیلی خوب هم وجود داره که محصول شرکت Udemy هست که علاوه بر مباحث ساختمان داده و الگوریتم ، مباحث مربوط به مصاحبه ها رو هم پوشش میده ؛ اگر با ویدئو راحت تر هستید میتونید این دوره رو انتخاب کنید و پیش برید.بخش سوم - حل تمرین:خب برای تثبیت و تقویت آموخته هامون باید بطور مستمر تمرینات برنامه نویسی حل بکنیم. این بخش رو میتونید تعمیم بدید به کل مسیر یادگیری زبان پایتون به این صورت که بعد از یادگیری هر مبحث ، تمریناتی مرتبط با اون انجام بدید. در این بخش یک کتاب و یک وبسایت بهتون معرفی میکنم. کتاب Python Workout چاپ انتشارات Manning که حاوی ۵۰ تمرین برنامه نویسی با موضوعات مختلف هست و وبسایت exercism.org که یک وبسایت عالی برای انجام تمرینات برنامه نویسی هست که زبان های برنامه نویسی زیادی از جمله پایتون رو پشتیبانی میکنه.بخش چهارم - برنامه نویسی فانکشنال و شئ گرا:در این بخش قصد داریم تا وارد مباحث پیشرفته تر زبان پایتون بشیم. همونطور که میدونید زبان پایتون از پارادایم های برنامه نویسی فانکشنال(تابعی) و شئ گرا پشتیبانی میکنه ، پس باید روی این مباحث تا حد خیلی خوبی اشراف داشته باشید. برای یادگیری مبحث فانکشنال کتاب  Functional Python Programming چاپ انتشارات Packt یکی از بهترین کتاب هاست که این مبحث رو به خوبی آموزش میده. حالا نوبت میرسه به مبحث شئ گرایی ؛ اگر یادتون باشه در بخش اول با کتاب Think Python این مبحث رو در حد خیلی مبتدی یاد گرفتیم و باهاش آشنا شدیم ، الان وقتشه تا پارو فراتر بزاریم. کتابی که برای یادگیری این مبحث میخوام بهتون معرفی کنم کتاب Pyhton Object Oriented Programming چاپ انتشارات Packt هست که با مباحث مربوط به شئ گرایی شروع میکنه و در آخر هم با بررسی الگوهای طراحی در پایتون ، روش های تست نرم افزار و همزمانی(Concurrency) به کار خودش خاتمه میده.امیدوارم تا اینجا خسته نشده باشید!بخش پنجم - جمع بندی و نکات مهم:این بخش در حکم جمع بندی مباحث گفته شده در بخش چهارم به علاوه ی برخی نکات کلیدی هست. در این بخش قراره دو تا کتاب بهتون معرفی کنم. اولی کتاب Expert Python Programming چاپ انتشارات Packt هست که شامل جمع بندی مباحث گفته شده در بخش چهارم به علاوه ی تدریس مباحثی مانند نحوه ساخت پکیج های پایتونی و انتشار اونها ، نحوه دیپلوی کردن پروژه ها ، بهینه سازی و ... . دومی هم کتاب Effective Python چاپ انتشارات Addison-Wesley که شامل 90 درس(نکته) هست که یادگرفتنشون باعث میشه کدهای پایتونی بهتر (Pythonic)و بهینه تری بنویسید.اگر کسی تا اینجا ادامه داده باشه و کتاب هایی که معرفی کردم رو خوب مطالعه و تمرین کرده باشه ، به جرأت میتونم بگم که یکی از بهترین ها تلقی میشه و میتونه توی همه ی زیر شاخه های زبان پایتون مسیر شغلی خودش رو با قدرت ادامه بده.بخش ششم - کتب اختیاری:کتاب هایی که در این بخش قصد دارم معرفی کنم مطالعه شون کاملا اختیاری هست و در صورت نیاز میتونید اونهارو مطالعه کنید. همونطور که میدونید پایتون یک زبان مفسری هست و سرعتش نسبت به زبان های کامپایلری پایینه (نمیخوام وارد مباحث فنی و مقایسه ای بشم). روش های مختلفی وجود داره که سرعت برنامه های نوشته شده به این زبان رو تا حدی بالا ببریم . برخی از این روش ها عبارتند از:استفاده از تکنیک های برنامه نویسی موازیاستفاده از کامپایلر Cythonاستفاده از پکیج Numbaروش های بالا هر کدوم به طریقی باعث افزایش سرعت میشن ؛ مثلا cython با حذف قابلیت Dynamic Type زبان پایتون، تبدیل و تولید کد به زبان های C و یا C++ و تبدیل اون کدها به بسته های قابل import باعث افزایش سرعت برنامه میشه. یا مثلا پکیج Numba با استفاده از کامپایلر LLVM باعث افزایش سرعت برنامه میشه(اگر علاقه داشتید حتما داکیومنت پروژه رو مطالعه کنید)؛ بسته به شرایط داخل برنامه میتونید از روش های بالا استفاده کنید. کتاب هایی که در بخش های چهارم و پنجم معرفی کردم تا حدودی مباحث مربوط به برنامه نویسی موازی رو آموزش میدادن ؛ کتاب Python Parallel Programming Cookbook چاپ انتشارات Packt شامل بیش از ۷۰ سناریو هست که یادگرفتن و تمرین کردنشون باعث میشه روی این مبحث به تسلط خوبی برسید. متاسفانه کتاب های خیلی زیادی برای آموزش Cython وجود نداره و همین کتاب Cython چاپ انتشارات O&#x27;reilly  خوبه و کارتون رو راه میندازه.و تمام ....امیدوارم مطالبی که گفتم مفید واقع بشه.در ضمن تمامی منابع رو میتونید از کانال تلگرام من به راحتی دانلود و استفاده کنیدآدرس کانال تلگرامموفق باشید (:</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Thu, 23 Apr 2020 22:03:17 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش جریان کاری در گیت برای مشارکت در پروژه های متن باز</title>
                <link>https://virgool.io/apieco/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%B1%DB%8C%D8%A7%D9%86-%DA%A9%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%DA%AF%DB%8C%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%B4%D8%A7%D8%B1%DA%A9%D8%AA-%D8%AF%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D9%86-%D8%A8%D8%A7%D8%B2-twmvfuwzzono</link>
                <description>سلام به همگیخب ، به مناسبت هکتوبرفست امروز میخوایم که جریان کاری استانداردی رو برای مشارکت کردن در توسعه ی پروژه های اُپن سورس باهم یاد بگیریم.بعد از اینکه ریپازیتوری مورد نظرمون رو پیدا کردیم ، کارمون رو با fork کردن اون شروع می کنیم و بعد روی سیستم خودمون clone می کنیم :git  clone  git@github.com:your_username/tensorflow.gitتو مرحله ی بعدی آدرس ریپازیتوری upstream (آدرس گیتهاب پروژه ی اصلی که از اون fork کردیم) رو اضافه میکنیم :git  remote  add  upstream  git@github.com:tensorflow/tensorflow.gitدر نهایت یک برنچ جدید ایجاد میکنیم تا بتونیم کارهامون رو داخلش انجام بدیم :git  checkout  -b  feature_branchحالا با خیال راحت میتونیم تغییراتی که میخوایم رو داخل پروژه ایجاد کنیم.جریان کاری اول :زمانی که آماده ی push کردن کامیت ها هستیم.مطمئن میشیم همه ی تغییراتی که روی feature_branch داده بودیم رو کامیت کردیم.برنچ feature_branch رو ریبِیس (Rebase) میکنیم :با این کار تمامی تغییرات جدید ایجاد شده روی پروژه ی اصلی ، به برنچ مورد نظر ما اضافه میشه:git  pull  --rebase  upstream  master۳. روی برنچ master سوییچ می کنیم :git  checkout  master۴. برنچ master خودمون رو هم ریبیس (Rebase) می کنیم :git  pull --rebase  upstream  master۵. اگر تغیراتی وجود داشته باشه ، اونها رو به ریپازیتوری خودمون روی گیتهاب منتقل (push) می کنیم :git  push  origin  master۶. برمیگردیم روی feature_branch :git  checkout  feature_branch۷. تغییراتی که داخل feature_branch دادیم رو به ریپازیتوری گیتهاب خودمون منتقل میکنیم :git  push  origin  feature_branch۸. پول ریکوئست (pull request) رو ارسال میکنیم.برای آپدیت کردن ریپازیتوری گیتهاب خودمون بعد از مِرج (merge) شدن پول ریکوئست ، مراحل زیر رو طی میکنیم :۹. بعد از اینکه پول ریکوئست مورد نظر تایید شد ، برای اینکه تاریخچه ی گیتهاب ما تمیز و مرتب بشه ، feature_branch رو از ریپازیتوری گیتهاب حذف میکنیم .۱۰. توی ترمینال ، برمیگردیم روی برنچ master :git  checkout  master ۱۱. برنچ master رو rebase می کنیم :git  pull  --rebase upstream  master۱۲. تغییرات مورد نظر رو به ریپازیتوری گیتهاب منتقل میکنیم :git  push  origin  master۱۳. و در نهایت feature_branch رو از سیستم خودمون حذف میکنیم :git  branch  -d  feature_branchجریان کاری دوم :زمانی که پول ریکوئست دیگر توسعه دهندگان پروژه ، تایید و مِرج شده و ما قصد داریم که تغییرات جدید رو داشته باشیم : خب ، فرض میکنیم که داریم روی feature_branch خودمون کار میکنیم .مطمئن میشیم که همه ی تغییرات رو کامیت کرده باشیم.برنچ feature_branch رو ریبِیس میکنیم :git  pull  --rebase  upstream  master۴. به برنچ master سوییچ میکنیم :git  checkout  master۵. برنچ master رو هم ریبِیس میکنیم :git  pull  --rebase  upstream  master۶. تغییرات مورد نظر رو به ریپازیتوری گیتهاب منتقل (push) میکنیم :git  push  origin  master۷. در نهایت برمیگردیم سراغ برنچ feature_branch و به توسعه دادن ادامه میدیم :git  checkout  feature_branchنکته : اگر قبلا پول ریکوئستی ارسال کرده باشیم و هنوز تایید نشده بوده باشه و قصد داشته باشیم تغییراتی رو به همون پول رکوئست که در وضعیت باز (open) قرار داره بفرستیم ، کافیه تغییرات جدید رو کامیت کنیم و تغییرات جدید برنچ (feature_branch) رو به گیتهاب منتقل کنیم :git  commit  -m &amp;quot new changes&amp;quot
git  push origin  feature_branchو تمام !امیدوارم مفید بوده باشه براتون.موفق باشید :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Sat, 12 Oct 2019 16:28:41 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش رگرسیون خطی ساده</title>
                <link>https://virgool.io/@miladsade96/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-%D8%B3%D8%A7%D8%AF%D9%87-k9orgbkirlh5</link>
                <description>رگرسیون خطی یک روش بسیار ساده است که کاربرد آن در بسیاری از مسائل اثبات شده. در این آموزش قصد داریم تا طریقه کارکرد رگرسیون ساده خطی را قدم به قدم باهم بررسی کنیم. دیتاسِت آموزشی :دیتاسِتی که در این آموزش از آن استفاده خواهیم کرد کاملا ساختگی است :دیتاسِت آموزشیمؤلفه ی x متغیر ورودی و مؤلفه ی y متغیر خروجی ما هستند که سعی در پیش بینی کردن آن داریم. نمودار پراکندگی داده ها را در زیر میبینید :نمودار داده های آموزشیهمانطور که مشاهده میکنید رابطه ی بین x و y به نظر میرسد که خطی هست و ما میتوانیم بصورت احتمالی خطِ موربی را از سمت چپ پایین به سمت راست بالای نمودار رسم کنیم تا با استفاده از آن ، رابطه ی بین داده ها مشخص شود.رگرسیون ساده خطی :زمانی که مؤلفه ی ورودی (x) مؤلفه ی واحدی هست و میخواهیم که از رگرسیون خطی استفاده کنیم ؛ این نوع رگرسیون ، رگرسیون خطی ساده نامیده میشود ولی زمانی که مؤلفه های ورودی (x1, x2, x3, x4, ...) مؤلفه های چندگانه باشند ، رگرسیون خطی چندگانه نامیده میشود. روش کارکرد رگرسیون خطی ساده متفاوت و ساده تر از رگرسیون خطی چندگانه است و در این آموزش قصد داریم که مدل رگرسیون خطی ساده ای را بر اساس داده های آموزشی بسازیم و سپس پیشبینی هایی را روی داده های آموزشیمان انجام دهیم و بررسی کنیم که مدلِ به دست آمده ، رابطه ی بین داده ها را چقدر خوب یاد گرفته است. مدل رگرسیون خطی ساده بصورت زیر تعریف میشود :معادله ی رگرسیون خطی سادهمعادله ی بالا مربوط به یک خط راست میباشد که در آن ، y متغیر خروجی ای است که قصد پیش بینی کردن آن را داریم ، x متغیر ورودی ای است که مقدار آنرا میدانیم و B0 , B1 ضرایب معادله هستند که باید مقدار آنها را تخمین بزنیم. B0 همان عرض از مبدا و B1 نیز شیب خط میباشد.هدف ، پیدا کردن بهترین مقادیر تخمین زده شده برای ضرایب معادله به منظور کمینه کردن خطاهای حاصل از  پیش بینی متغیر y از روی x می باشد. ما میتوانیم در رگرسیون ساده خطی از روی داده هایی که داریم بصورت مستقیم مقدار ضرایب را تخمین بزنیم. مقدار B1 از معادله ی زیر به دست می آید :در معادله ی بالا، mean ، برابر مقدار میانگین مقادیر هر مؤلفه از دیتاسِت است. xi و yi به این نکته اشاره دارند که باید این محاسبات را برای همه ی مقادیر داخل دیتاسِت تکرار کنیم. بعد از به دست آوردن مقدار B1 ،  مقدار B0 با استفاده از رابطه ی زیر به دست می آید :تخمین مقدار شیب (B1):از بالاترین قسمت معادله شروع خواهیم کرد(صورت کسر). در ابتدا باید مقدار میانگین را برای مؤلفه های x و y محاسبه کنیم. مقدار میانگین با استفاده از معادله ی زیر به دست می آید :در فرمول بالا ، مقدار n برابر تعداد هر یک از مؤلفه های x یا y است (که در این مثال برابر با عدد ۵ می باشد).مقدار میانگین x برابر است با 3 و مقدار میانگین y برابر است با 2.8حال باید مقدار خطای هر متغیر از مقدار میانگین را محاسبه کنیم ؛ برای مؤلفه x :باقیمانده ی تفاضل هر مقدار از مؤلفه ی x از مقدار میانگینو برای مؤلفه ی y :باقیمانده ی تفاضل هر مقدار از مؤلفه ی y از مقدار میانگینحال قسمت هایی را برای محاسبه ی صورت کسر در اختیار داریم. تنها کاری که باید انجام شود این است که مقادیر باقیمانده ی تفاضل هر مقدار از هر مؤلفه از مقدار میانگین آنرا بصورت متناظر در هم ضرب کرده و سپس حاصل جمع مقادیر مؤلفه ی جدید(مؤلفه ی حاصلضرب ها) را محاسبه کنیم :حاصل ضرب مقادیر باقیمانده ی تفاضلات x و y از مقادیر میانگینشانحاصل جمع مقادیر ستون آخر که همان صورت کسر است ، برابر عدد 8 می باشد. حال نوبت به محاسبه ی مقدار مخرج کسر میرسد. مخرج کسر را میتوان بصورت زیر تشریح کرد :مجموعِ مربعاتِ تفاضلاتِ هر مقداری از مؤلفه ی x از مقدار میانگیناز آنجایی که قبلا مقدار (x - mean(x را برای هر مقدار از x محاسبه کرده ایم ، تنها کار لازم برای انجام دادن ، به توان ۲ رساندن این مقادیر است :با محاسبه ی حاصل جمع این مربعات ، مخرج کسر برابر عدد 10 میشود .حال میتوانیم مقدار شیب را محاسبه کنیم :تخمین مقدار عرض از مبدأ (B0):برای محاسبه ی مقدار عرض از مبدأ از رابطه ی زیر استفاده می کنیم :پیش بینی کردن :حال که ضرایب معادله را به دست آورده ایم ،قصد داریم تا با پیش بینی کردن برای داده های آموزشی ، مدل به دست آمده را امتحان کنیم :مقدار y پیش بینی شده برای هر xهمچنین ما میتوانیم مقادیر بیش بینی شده را بصورت یک خط در کنار داده های آموزشی در قالب نمودار نمایش دهیم :مقادیر پیش بینی شده توسط مدل رگرسیون خطی سادهتخمین خطا :ما می توانیم برای داده های پیش بینی شده ، مقدار خطا را محاسبه کنیم که با نام خطای جذر میانگین مربعات شناخته میشود.Root Mean Squared Errorدر فرمول بالا ، pi برابر مقادیر پیش بینی شده و yi برابر مقادیر اولیه در مؤلفه ی y هستند؛ چون ما مقدار خطا را باید برای همه ی مقادیر پیش بینی شده محاسبه کنیم. در ابتدا باید مقدار تفاضل هر داده ی پیش بینی شده توسط مدل را از داده ی واقعی به دست آوریم :مقدار خطا برای داده های پیش بینی شدهبه سادگی می توانیم مربع این مقادیر را به دست آوریم:مربع خطاها برای داده های پیش بینی شدهمجموع این داده ها برابر با 2.4 واحد است که اگر بر تعداد داده ها تقسیم شود ، مقدار خطای جذر میانگین مربعات به دست می آید :معنی خطای بالا این است که هر پیش بینی انجام شده بطور متوسط 0.692 واحد اشتباه است.این هم پیاده سازی انجام شده برای این آموزش در زبان پایتون : https://gist.github.com/EverLookNeverSee/ae0b512b7e927008cb2657b78ca36587 امیدوارم مفید بوده باشهموفق باشید :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Fri, 20 Sep 2019 12:11:07 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش پایتون - فصل چهارم(عبارات شرطی و بازگشتی)</title>
                <link>https://virgool.io/@miladsade96/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%81%D8%B5%D9%84-%DA%86%D9%87%D8%A7%D8%B1%D9%85%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B4%D8%B1%D8%B7%DB%8C-%D9%88-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-wrvsmiu7ttse</link>
                <description>موضوع اصلی این فصل دستور if هست که بسته به شرایط داخل برنامه ، کدهای متفاوتی رو اجرا میکنه ولی قبلش میخوام که دوتا عملگر جدید رو بهتون معرفی کنم : عملگر تقسیم صحیح و عملگر باقیمانده .تقسیم صحیح و باقیمانده :تقسیم صحیح که با علامت // نشون داده میشه بعد از انجام عمل تقسیم ، نتیجه رو به نزدیک ترین عدد صحیح کوچکتر گرد میکنه. برای مثال فرض کنید که مدت پخش یک فیلمی برابر 105 دقیقه هست و میخوایم بدونیم که این زمان بر حسب ساعت چقدر میشه . در صورتی که از عملگر تقسیم مرسوم استفاده کنیم ، نتیجه بصورت یک عدد اعشاری به ما برگردونده خواهد شد :&gt;&gt;&gt; minutes = 105
&gt;&gt;&gt; minutes / 60
1.75این مدل خروجی زیاد به درد ما نخواهد خورد . درحالیکه عملگر تقسیم صحیح با نادیده گرفتن قسمت اعشاری ، تعداد ساعات رو به ما برمیگردونه :&gt;&gt;&gt; minutes = 105
&gt;&gt;&gt; hours = minutes // 60
&gt;&gt;&gt; hours
1برای به دست آوردن باقیمانده هم میتونیم به شکل زیر عمل کنیم :&gt;&gt;&gt; remainder = minutes - hours * 60
&gt;&gt;&gt; remainder
45علاوه بر روش بالا ، برای به دست آوردن باقیمانده ی تقسیم میتونیم از عملگر ٪ استفاده کنیم که دو عدد رو بر هم تقسیم میکنه و باقیمانده رو به ما نمایش میده :&gt;&gt;&gt; remainder = minutes % 60
&gt;&gt;&gt; remainder
45عملگر باقیمانده (٪) بیشتر از چیزی که بنظر میرسه مفید و کاربردی هست ؛ برای مثال شما با استفاده از این عملگر میتونید بررسی بکنید که یک عدد بر عدد دیگه ای بخش پذیر هست یا نه (اگر باقیمانده تقسیم عدد x بر عدد y برابر صفر باشه یعنی x بر y بخش پذیره).نکته : اگر شما از پایتون نسخه ی ۲ استفاده میکنید ، عملگر تقسیم به شکل متفاوتی کار میکنه . به این صورت که اگر هردو عملوند تقسیم ، اعداد صیح باشند تقسیم بصورت تقسیم صحیح انجام خواهد شد ولی اگر هر یک از عملوندها از نوع اعشاری باشند ، تقسیم بصورت مرسوم انجام خواهد شد و نتیجه در قالب یک عدد اعشاری به ما برگشت داده خواهد شد.عبارات بولی (Boolean Expressions) :عبارت بولی به عبارتی گفته میشه که مقدار اون برابر با True و یا برابر با False باشه . در مثال های زیر از عملگر == استفاده میکنیم . این عملگر ، عملوندها رو با هم مقایسه میکنه و اگر مقدار اونها باهم برابر باشه ، True و در غیر اینصورت مقدار False رو به ما برمیگردونه :&gt;&gt;&gt; 5 == 5
True
&gt;&gt;&gt; 5 == 6
Falseنکته : مقادیر True و False جزء مقادیر خاص هستند و به نوع داده ای bool تعلق دارند :&gt;&gt;&gt; type(True)
&lt;class &#039;bool&#039;&gt;&gt;&gt;&gt; type(False)
&lt;class &#039;bool&#039;&gt;عملگر == یکی از عملگرهای رابطه ای هست ، بقیه عملگرهای رابطه ای رو در قطعه کد زیر میتونید ببینید :x != y         # x is not equal to y
x &gt; y          # x is greater than y
x &lt; y          # x is less than y
x &gt;= y        # x is greater than or equal to y
x &lt;= y        # x is less than or equal to yعملگرهای منطقی :سه نوع عملگر منطقی داریم : and ، or و not . معنی و مفهوم این عملگرها شبیه به معنی اونها در زبان انگلیسی هست . برای مثال جواب عبارت زیر فقط زمانی True خواهد بود که مقدار x بزرگتر از ۰ و کوچکتر از 10 باشد :x &gt; 0  and  x &lt; 10و جواب عبارت زیر زمانی True خواهد بود که مقدار هردو یا حداقل یکی از شروط عبارت برابر با True باشد :n % 2 == 0  or   n % 3 == 0و در نهایت میرسیم به عملگر not که مقدار یک عبارت بولی رو منفی میکنه ؛ برای مثال حاصل عبارت زیر تنها زمانی برابر True خواهد بود که مقدار عبارت (x &gt; y) برابر False باشه :not (x &gt; y)        # result is True if x is less than or equal to yنکته : عبارت های بولی هم میتونن به عنوان عملوند در عملگرهای منطقی مورد استفاده قرار بگیرند. پایتون تمام اعداد غیر صفر رو به عنوان True تفسیر میکنه :&gt;&gt;&gt; 42  and  True
Trueدستورات شرطی :برای نوشتن برنامه های مفید ، برنامه ی ما باید توانایی بررسی شرایط رو داشته باشه و بسته به اون شرایط ، رفتارش رو تغییر بده. دستورات شرطی این توانایی رو در اختیار ما قرار میدن ؛ ساده ترین نوعش هم دستور if هست :if  x &gt; 0 :
    print(&quot;x is positive&quot;)به عبارت بولیِ بعد از دستور if ، شرط گفته میشه . اگر مقدار شرط برابر با true باشه ، دستورات داخل if اجرا میشه وگرنه هیچ اتفاقی نمیوفته. نکته : محدودیتی در تعداد دستورات داخل بدنه ی if وجود نداره ولی حداقل باید یک خط کد نوشته بشه .در صورتیکه بخوایم ساختار دستور شرطیمون( if ) رو ایجاد بکنیم و دستورات داخل اون رو بعدا وارد کنیم ، از دستور pass استفاده میکنیم :if x  &lt;  0 :
    pass        #  TODO : need to handle negative values!جایگزین دستور شرطی (Alternative execution) :نوع دیگر دستور if ، دستور جایگزین شرط هست و زمانی به کار میره که دو حالت داشته باشیم و شرط برنامه مشخص میکنه که کدوم یکی باید اجرا بشه :if  x  %  2 == 0 :
    print(&quot; x is even &quot;)
else :
    print(&quot; x is odd &quot;)همونطور که در مثال بالا میبینید ، اگر باقیمانده ی تقسیم x بر ۲ برابر با صفر باشه ، مقدار شرط برابر با true میشه و دستور داخل if اجرا میشه در غیر اینصورت دستور داخل بدنه ی دستور else اجرا خواهد شد(یعنی همون جایگزین دستور شرطی).دستورات شرطی زنجیری(Chained conditionals):بعضی موقع ها شرط برنامه بیشتر از دو حالت داره و برای اینکه بتونیم همه حالات شروط رو مورد بررسی قرار بدیم و نسبت به اون شرایط بتونیم تصمیم بگیریم از دستورات شرطی زنجیری استفاده میکنیم :if  x &lt; y :
    print(&quot; x is less than y &quot;)
elif x &gt; y :
    print(&quot; x is greater than y &quot;)
else :
    print(&quot; x and y are eqal &quot;)دستور elif مخفف کلمه ی else if هست . در مثال بالا اگر مقدار x کوچکتر از مقدار y باشه ، دستورات داخل بدنه ی if اجرا خواهند شد وگرنه اگر مقدار x بزرگتر از مقدار y باشه ، دستورات داخل بدنه ی elif اجرا خواهند شد ؛ در غیر این صورت دستورات مربوط به else اجرا خواهند شد (و این کار در صورتی اتفاق خواهد افتاد که مقدار x و y برابر باشه).نکته : میدونیم که دستور elif بعد از دستور if قرار داده میشه تا حالت های دیگر شروط داخل برنامه رو مورد بررسی قرار بده و این رو هم میدونیم که اگر مقدار شرط دستور if برابر True باشه ، همه دستورات elif بعد از اون نادیده گرفته میشن حتی اگر مقدار شرط دستور elif هم برابر True باشه . با این مثال بهتر متوجه خواهید شد :x = 5

if 0 &lt; x &lt; 10 :
    print(&quot; if statement accomplished&quot;)
elif 2 &lt; x &lt; 8 :
    print(&quot; elif statement accomplished&quot;)
else :
    print(&quot;else statement accomplished&quot;)در مثال بالا مقدار متغیر x هم مابین ۰ و 10 هست و هم مابین 2 و 8 ؛ یعنی هم مقدار شرط دستور if برابر True هست و هم مقدار شرط دستور elif . ولی طبق نکته ای که بالا بهتون گفتم فقط دستورات داخل if اجرا خواهند شد و مهم نیست که مقدار شرط elif برابر True باشه یا False :Output :
if statement accomplishedدستورات شرطی تودرتو (Nested Conditionals):ما میتونیم داخل بدنه ی هر دستور شرطی ، دستورات شرطی دیگه ای هم داشته باشیم ؛ به این حالت از دستورات ، دستورات شرطی تودرتو میگیم. برای مثال :if x == y :
    print(&quot; x and y are equal&quot;)
else:
    if x &lt; y :
        print(&quot; x is less than y &quot;)
    else :
        print(&quot; x is greater than y &quot;)در مثال بالا اگر مقدار x برابر با مقدار y باشه ، دستورات داخل بدنه ی if اجرا خواهند شد وگرنه دستورات داخل بدنه ی else واقع در اولین لایه اجرا خواهند شد ؛ که خودش دو حالت داره : اگر مقدار x کوچکتر از مقدار y باشه ، دستورات داخل بدنه ی if واقع در دومین لایه اجرا خواهند شد در غیر این صورت (که میشه وقتی که مقدار x بزرگتر از مقدار y هست) ، دستورات داخل بدنه ی else واقع در دومین لایه اجرا خواهند شد.نکته : خوانایی دستورات شرطی تودرتو خیلی زود کم میشه ؛ برای همین تا جایی که میتونیم باید از نوشتن دستورات شرطی تو در تو خودداری کنیم.استفاده از عملگرهای منطقی میتونه دستورات شرطی تودرتوی مارو ساده تر کنه :if 0 &lt; x :
    if x &lt; 10 :
        print(&quot; x is a positive single-digit number &quot;)دستور print در مثال بالا فقط زمانی اجرا میشه که هردوتا شرط برقرار باشه . میتونیم کد بالا رو به اینصورت بازنویسی کنیم :if 0 &lt; x and x &lt; 10 :
    print(&quot; x is a positive single-digit number&quot;)و همچنین میتونیم به این حالت هم بازنویسی کنیم :if 0 &lt; x &lt; 10 :
    print(&quot; x is a single-digit number&quot;)بازگشت(Recursion):توابع نه تنها میتونن توابع دیگر رو فراخوانی بکنن ، بلکه میتونن خودشون رو هم فراخوانی کنن. برای مثال :def countDown(n):
    if n &lt;= 0 :
        print(&quot; BlastOff!&quot;)
    else :
        print(n)
        countDown(n - 1)اگر مقدار n برابر با 0 یا یک مقدار منفی باشه ، عبارت &quot;BlastOff&quot; نمایش داده خواهد شد در غیر اینصورت مقدار n نمایش داده میشه و تابع خودش رو فراخوانی میکنه و مقدار n - 1 رو به عنوان آرگومان به خودش پاس میده.چه اتفاقی میوفته اگر تابع رو بصورت زیر فراخوانی کنیم :&gt;&gt;&gt; countDown(3)خب در مرحله ی اول ، روند اجرای تابع با مقدار n = 3 شروع میشه و چون مقدار n بزرگتر از 0 هست مقدار ۳ رو به ما نمایش میده و بعد خودش رو فراخوانی میکنه . در مرحله ی دوم ، روند اجرای تابع با مقدار n = 2 شروع میشه و چون مقدار n بزرگتر از 0 هست مقدار 2 رو به ما نشون میده و بعد خودش رو فراخوانی میکنه .در مرحله ی سوم ، روند اجرای تابع با مقدار n = 1 شروع میشه و چون همچنان مقدار n بزرگتر از 0 هست ، مقدار 1 رو به ما نشون میده و بعد خودش رو فراخوانی میکنه . در مرحله ی چهارم ، روند اجرای تابع با مقدار n = 0 شروع میشه ولی در این مرحله دیگه مقدار n بزرگتر از 0 نیست و به همین علت عبارت &quot;!BlastOff&quot; به ما نمایش داده میشه .نکته ی مهم : در مثال بالا شاید تصور کنید بعد از اینکه مقدار رشته ای &quot;!BlastOff&quot; به ما نشون داده شد ، روند اجرای برنامه از داخل تابع countDown به یکباره خارج میشه و اگر دستورات دیگه ای در ادامه ی تابع نوشته شده باشن ، اونهارو اجرا میکنه ولی اینطور نیست . وقتی تابعی بصورت بازگشتی خودش رو فراخوانی میکنه ، روند اجرای برنامه بصورت تودرتو داخل توابعی که فراخوانی شده اند پیشروی میکنه و یک ساختار تودرتو از اجراها و بازگشت ها ایجاد میکنه و روند اجرای برنامه به یکباره نمیتونه از این ساختار بیرون بیاد و به کارش ادامه بده . پس مجبوره مرحله به مرحله این ساختار تودرتو رو به سمت بیرون پیمایش کنه و روند اصلی اجرایی برنامه رو پیش بگیره.بعد از انجام شدنِ نکته ی بالا هست که خروجی زیر به کاربر نشون داده میشه:3
2
1
BlastOff!بازگشت نامتناهی(Infinite Recursion):اگر فرایند بازگشت (فراخوانی تابع توسط خودش) به شرط معین نرسه ، این فرایند تا بی نهایت ادامه پیدا میکنه و برنامه هیچوقت به پایان نمیرسه . به این حالت ، بازگشت نامتناهی گفته میشه. برای مثال :def recurse():
     recurse()در اغلب محیط های برنامه نویسی ، برنامه ای که دارای بازگشت نامتناهی هست در عمل تا بی نهایت اجرا نمیشه . اگر فرایند بازگشت به ماکزیممِ حدِ تعیین شده برسه ، پایتون پیام خطای زیر رو به ما نشون خواهد داد :  File &quot;&lt;stdin&gt;&quot; , line 2 ,  in recurse
  File &quot;&lt;stdin&gt;&quot; , line 2 ,  in recurse
  File &quot;&lt;stdin&gt;&quot; , line 2 ,  in recurse
                        .
                        .
                        .
   File &quot;&lt;stdin&gt;&quot; , line 2 ,  in recurse
RuntimeError : Maximum recursion depth exceedنکته : در صورتی که از توابع بازگشتی استفاده میکنیم همیشه باید در نظر داشته باشیم که فرایند بازگشت در نهایت به شرط تعیین شده ی ما برسه وگرنه تابع مورد نظر دچار بازگشت بی نهایت میشه.دریافت ورودی از کیبورد(Keyboard Input):برنامه هایی که تا الان نوشتیم ، هیچ ورودی ای رو از کاربر دریافت نمیکردن و همیشه یه کار مشابه رو انجام میدادن. پایتون تابعی درون-ساخت (Built-in) بنام input رو در اختیار ما گذاشته که وقتی اجرا میشه ، برنامه رو متوقف میکنه و منتظر میمونه تا کاربر چیزی رو از طریق کیبورد وارد بکنه و کلید enter رو بزنه تا روند اجرای برنامه ادامه پیدا کنه.نکته ی اول : تابع input ورودی کاربر رو بصورت string دریافت میکنه.نکته ی دوم : نام تابع input در پایتون نسخه ی ۲ ، raw_input هست.&gt;&gt;&gt; text_1 = input()          # in python 3.x
what are you waiting for?
&gt;&gt;&gt; text_1
what are you waiting for?

&gt;&gt;&gt; text_2 = raw_input()          # in python 2.x
how are you?
&gt;&gt;&gt; text_2
how are you?قبل از گرفتن ورودی از کاربر بهتره پیامی رو بهش نمایش بدیم تا متوجه بشه که چه چیزی رو باید وارد کنه . تابع input میتونه پیام مورد نظر رو به عنوان آرگومان دریافت کنه :&gt;&gt;&gt; name = input(&quot;what is your name?\n&quot;)
what is your name?
Milad sadeghi
&gt;&gt;&gt; name
Milad Sadeghiنکته : درمثال بالا ، n\ یکی از کاراکتر های ویژه به معنی خط جدید هست ؛ به اینصورت که وقتی روند اجرای برنامه به این کاراکتر میرسه ، برنامه ، روند اجرا رو از یک خط پایین تر ادامه میده.اگر انتظار دارید که کاربر یک مقدار عددی صحیح رو وارد کنه ، باید مقدار برگشتی تابع input رو به int تبدیل کنید :&gt;&gt;&gt; prompt = &quot;How old are you?\n&quot;
&gt;&gt;&gt; age = input(prompt)
How old are you?
23
&gt;&gt;&gt; int(age)
23اما اگر مقدار ورودی کاربر چیزی بغیر از رشته ی اعداد باشه ، با خطا مواجه خواهید شد : &gt;&gt;&gt; age = input(prompt)
How old are you?
twenty three
&gt;&gt;&gt; int(age)
Traceback (most recent call last):
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
ValueError: invalid literal for int() with base 10: &#039;twenty three&#039;نحوه رسیدگی به این نوع خطاها رو بعدا بررسی خواهیم کرد.خطایابی (Debugging) :زمانی که یک خطای نحوی یا زمان اجرا رخ میده ، پیام خطا شامل اطلاعات زیادی هست که به نوبه ی خودش هم میتونه مفید باشه و هم گیج کننده . مفید ترین و به درد بخورترین بخش های یک پیام خطا عبارت اند از :نوع خطایی که رخ دادهجایی که خطا رخ دادهمثال برای خطای نحوی :&gt;&gt;&gt; x = 5
&gt;&gt;&gt;   y = 6
    File &quot;&lt;stdin&gt;&quot; , line 1
       y = 6
       ^
Indentati : unexpected indentخطاهای نحوی معمولا به راحتی قابل شناسایی و رفع هستند باستثنای فضاهای خالی موجود در کدهای برنامه که میتونن دردسرساز بشن . در مثال بالا ، خطا مربوط به خط دوم هست که توسط کلید فاصله (space) دچار تورفتگی شده . ولی همونطور که میبینید پیام خطا داره y رو نشون میده که میتونه گمراه کننده باشه. معمولا پیام خطا جایی که مشکل پیدا شده رو نشون میده در حالیکه ممکنه مشکل اصلی توی کدهای قبلی بوده باشه. این مساله برای خطاهای زمان اجرا هم صادق هست . فرض کنید میخوایم برنامه ای بنویسیم که طبق فرمول زیر نسبت سیگنال به نویز رو در واحد دسیبل برای ما حساب کنه :برای این کار ممکنه به شکل زیر عمل کنیم :import  math
signal_power = 9
noise_power = 10
ratio = signal_power // noise_power
decibels = 10 * math.log10( ratio )
print(decibels)اگر برنامه ی بالا رو اجرا کنیم با خطای زیر مواجه خواهیم شد :Traceback (most recent call last):
   File &quot;snr.py&quot;, line 5, in ?
      decibels = 10 * math.log10(ratio)
ValueError: math domain errorپیام خطا خط پنجم رو نشون میده درحالیکه این خط هیچ مشکلی نداره . برای اینکه بفهمیم قضیه از چه قراره بهتره مقدار متغیر ratio رو چاپ کنیم (که در اینجا برابر با 0 هست). ایراد برنامه جایی هست که ما بجای استفاده از تقسیم اعشاری از تقسیم صحیح برای به دست آوردن مقدار متغیر ratio استفاده کردیم.نکته : شما باید پیام های خطا رو با دقت بخونید ولی این رو یادتون نره که همه ی چیز هایی که پیام های خطا میگن لزوما درست نیست (:تمرینها :ماژول time تابعی هم نام خودش (time)رو در اختیارمون گذاشته که زمان رو از مبدا تاریخ به وقت گرینویچ به ما نشون میده . مبدا تاریخ در سیستم های مبتنی بر یونیکس ، یکم ژانویه سال 1970 هست .&gt;&gt;&gt; import  time
&gt;&gt;&gt; time.time()
1563687834.2420669الف - برنامه ای بنویسید که زمان رو بخونه و بگه که این زمان مربوط به چه ساعت ، چه دقیقه و چه ثانیه ای از زمان امروز هست.ب - برنامه ای بنویسید که تعداد روزهای سپری شده از مبدا تاریخ تا به امروز رو محاسبه کنه.تابع is_triangle رو طوری بنویسید که سه آرگومان صحیح رو دریافت کنه و بسته به اینکه این آرگومان ها میتونن یک مثلث رو تشکیل بدن یا نه ، کلمه ی &quot;yes&quot; , &quot;no&quot; رو برا ما چاپ بکنه.برنامه ای بنویسید که طول اضلاع مثلث رو از کاربر بگیره و با استفاده از تابع is_triangle به ما نشون بده که آیا ورودی های کاربر میتونن یه مثلث رو تشکیل بدن یا نه.خروجی تابع زیر رو بررسی کنید :def  recurse ( n, s ) :
    if n == 0 :
        print( s )
    else :
        recurse ( n -1, n + s)

recurse ( 3, 0)خروجی تابع بالا رو زمانی که بصورت زیر فراخوانی شده باشه بررسی کنید :recurse ( -1, 0 )خب ، اینم از فصل چهارم . امیدوارم مفید واقع بشهموفق باشید (:</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Sun, 21 Jul 2019 12:53:08 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش پایتون - فصل سوم(توابع)</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%81%D8%B5%D9%84-%D8%B3%D9%88%D9%85%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-xb3wzfmpkv8s</link>
                <description>در زمینه ی برنامه نویسی ، تابع دنباله ی نامگذاری شده ای از دستورات هست که محاسباتی رو برای ما انجام میده . از طریق مشخص کردن نام و دنباله دستورات ، یک تابع رو تعریف میکنیم و بعد میتونیم با استفاده از نام تابع ، اون رو فراخوانی بکنیم .فراخوانی تابع :قبلا نمونه ای از فراخوانی تابع رو باهم دیدیم :&gt;&gt;&gt; type(42)
&lt;class &#039;int&#039;&gt;نام تابع ، type هست و عبارت داخل پرانتز ، آرگومان تابع نامیده میشه . تابع بالا ، نوع آرگومانی که بهش پاس دادیم رو در خروجی چاپ میکنه . در واقع میتونیم بگیم که یک تابع ، آرگومان رو میگیره و نتیجه رو به ما برمیگردونه ؛ به نتیجه ی تابع ، مقدار برگشتی هم گفته میشه .پایتون توابعی رو برای تبدیل انواع داده ای در اختیار ما قرار داده . برای مثال تابع int مقداری رو به عنوان آرگومان میگیره و اگر بتونه اون رو به عدد صحیح تبدیل میکنه ؛ اگر هم نتونه به ما اخطار میده :&gt;&gt;&gt; int(&#039;32&#039;)
32&gt;&gt;&gt; int(&#039;Hello&#039;)
ValueError: invalid literal for int(): Helloتابع int میتونه مقادیر اعشاری رو به مقادیر صحیح تبدیل کنه ولی نکته ای که وجود داره اینه که بجای گرد کردن مقادیر اعشاری ، فقط قسمت اعشاری اونها رو حذف میکنه :&gt;&gt;&gt; int(3.99999)
3&gt;&gt;&gt; int(-2.3)
-2تابع float هم مقادیر صحیح و رشته ای رو به عدد اعشاری تبدیل میکنه :&gt;&gt;&gt; float(32)
32.0&gt;&gt;&gt; float(&#039;3.14159&#039;)
3.14159و در نهایت تابع str آرگومانی که بهش پاس دادیم رو به مقدار رشته ای تبدیل میکنه :&gt;&gt;&gt; str(32)
&#039;32&#039;

&gt;&gt;&gt; str(3.14159)
&#039;3.14159&#039;توابع ریاضی :در پایتون ماژولی بنام math وجود داره که اکثر توابع معروف ریاضی رو در اختیار ما قرار میده . ماژول به فایلی گفته میشه که شامل مجموعه ای از توابع مرتبط هست. قبل از اینکه بتونیم از توابع داخل یک ماژول استفاده کنیم ، باید ماژول مورد نظر رو با دستور import به پروژه خودمون اضافه کنیم :import mathاین دستور باعث ایجاد یک شیِ ماژول به نام math میشه . شیِ ماژول شامل توابع و متغیر های تعریف شده در داخل یک ماژول هست . برای دسترسی به هر یک از این توابع ، باید نام ماژول به همراه نام تابع که با یک نقطه از هم جدا شده اند رو وارد کنیم ؛ به این روش dot notation گفته میشه :&gt;&gt;&gt; ratio = signal_power / noise_power
&gt;&gt;&gt; decibels = 10 * math.log10(ratio)
&gt;&gt;&gt; radians = 0.7
&gt;&gt;&gt; height = math.sin(radians)در مثال اول از math.log10 برای محاسبه ی نسبت سیگنال به نویز در واحد دسیبل استفاده میکنیم (فرض کنید متغیرهای signal_power و noise_power از قبل تعریف شدن).  علاوه بر این ، ماژول math تابع log رو برای محاسبه ی لگاریتم در مبنای e در اختیار ما قرار داده. مثال دوم مقدار سینوس متغیر radians رو برای ما محاسبه میکنه . نکته ای که اینجا باید بهش اشاره کنم اینه که تابع سینوس و دیگر توابع مثلثاتی مانند کسینوس ، تانژانت و .... آرگومان رو بجای درجه بصورت رادیان دریافت میکنند.برای تبدیل درجه به رادیان ، درجه رو بر 180 تقسیم کرده و در pi ضرب میکنیم :&gt;&gt;&gt; degrees = 45
&gt;&gt;&gt; radians = degrees / 180.0 * math.pi
&gt;&gt;&gt; math.sin(radians)
0.707106781187عبارت math.pi از داخل ماژول math ، مقدار تقریبی عدد پی که تا 15 رقم اعشار محاسبه شده رو در اختیا ما قرار میده .ترکیب بندی (composition):تا اینجای کار با المان های سازنده ی برنامه ها مانند متغیرها ، عبارات و دستورات کار کردیم ولی همه ی این مفاهیم رو بصورت مجزا استفاده کردیم بدون اینکه در مورد ترکیب این المان ها حرفی زده باشیم. یکی از ویژگی های زبان های برنامه نویسی ، توانایی ایجاد بلوک های کوچک کد و ترکیب اونها هست. برای مثال آرگومان یک تابع میتونه شامل هر نوع عبارتی باشه مثلا عملگرهای محاسباتی :x = math.sin(degrees / 360.0 * 2 * math.pi)و یا شامل فراخوانی یک تابع باشه :x = math.exp(math.log(x+1))نکته : شما تقریبا در هر جایی میتونید مقدار و یا عبارت دلخواهی رو قرار بدید و در این مورد فقط یک استثنا وجود داره ؛ در سمت چپِ هر عبارتِ انتساب باید نام یک متغیر قرار بگیره و قرار دادن هر نوع عبارت دیگه ای باعث ایجاد خطای نحوی میشه :&gt;&gt;&gt; minutes = hours * 60        # right
&gt;&gt;&gt; hours * 60 = minutes        # wrong
SuntaxError : can&#039;t assign to operatorافزودن توابع جدید :تا اینجای کار ما داشتیم از توابع موجود در داخل زبان پایتون استفاده میکردیم و الان میخوایم که توابع جدید خودمون رو ایجاد بکنیم. تعریف یک تابع با نام تابع و دنباله ی دستوراتی که هنگام فراخوانی تابع اجرا میشن ، مشخص میشه . برای مثال :def print_lyrics():
     print(&quot;I&#039;m  Milad, and I&#039;m okay.&quot;)
     print(&quot;I sleep all night and I work all day.&quot;)کلمه ی def نشون میده که این عبارت مربوط به تعریف یک تابع هست و همچنین عبارت print_lyrics به عنوان نام تابع در نظر گرفته میشه .نکته : قوانین نامگذاری توابع دقیقا مانند قوانین نامگذاری متغیر ها در پایتون هست. ما نمیتونیم از کلید واژه های پایتون برای نامگذاری توابعمون استفاده کنیم ؛ در ضمن از انتخاب یک نام مشترک برای یک تابع و یک متغیر باید خودداری کنیم.پرانتز باز و بسته نشون دهنده ی این هست که این تابع هیچ آرگومانی رو دریافت نمیکنه . به اولین خط تعریف تابع ، هِدِر گفته میشه و مابقی به عنوان بدنه ی تابع شناخته میشن . در آخرِ هدر تابع باید دونقطه (:) قرار داده بشه و بدنه ی تابع نیز بصورت پیشفرض به اندازه ی ۴ عدد space تورفتگی خواهد داشت تا ساختار تابع به درستی شکل بگیره . در صورتی که مستقیما با مفسر پایتون کار میکنید ، هنگام تعریف یک تابع ، مفسر نقطه هایی رو بری شما نمایش خواهد داد تا بهتون اطلاع بده که فرایند تعریف تابع هنوز کامل نشده :&gt;&gt;&gt; def print_lyrics():
...         print(&quot;I&#039;m Milad, and I&#039;m okay.&quot;)
...         print(&quot;I sleep all night and I work all day.&quot;)
...برای پایان دادن به بدنه ی تابع ، بعد از سه نقطه نباید دستوری وارد کنیم .هنگام تعریف یک تابع ، یک شئِ تابع ساخته میشه که از نوع تابع هست :&gt;&gt;&gt; print(print_lyrics)
&lt;function print_lyrics at 0xb7e99e9c&gt;&gt;&gt;&gt; type(print_lyrics)
&lt;class &#039;function&#039;&gt;برای فراخوانی توابعی که ساختیم ، مانند فراخوانی توابع داخل پایتون عمل میکنیم :&gt;&gt;&gt; print_lyrics()
I&#039;m  Milad, and I&#039;m okay.
I sleep all night and I work all day.بعد از تعریف یک تابع ، میتونیم اون رو داخل توابع دیگه فراخوانی کنیم . برای مثال تابعی به نام repeat_lyrics میسازیم و تابع قبلی رو داخل اون دوبار فراخوانی میکنیم :def repeat_lyrics():
      print_lyrics()
      print_lyrics()و بعد تابع repeat_lyrics رو فراخوانی میکنیم :&gt;&gt;&gt; repeat_lyrics()
I&#039;m  Milad, and I&#039;m okay.
I sleep all night and I work all day.
I&#039;m  Milad, and I&#039;m okay.
I sleep all night and I work all day.تعاریف و کاربردها :در این بخش میخوایم که توابعی که ساخته بودیم رو داخل یک برنامه و کنار هم بنویسیم و تغییراتی رو روی اونها انجام بدیم :def print_lyrics():
      print(&quot;I&#039;m Milad, and I&#039;m okay.&quot;)
      print(&quot;I sleep all night and I work all day.&quot;)def repeat_lyrics():
      print_lyrics()
      print_lyrics()repeat_lyrics()خب ، این برنامه شامل دو تعریف تابع هست . تعاریف توابع مانند بقیه دستورات اجرا میشن ولی بجز ساختن شئ تابع ، هیچ کار دیگه ای انجام نمیدن. دستورات داخل توابع تا زمانی که تابع مورد نظر فراخوانی نشده ، اجرا نمیشن و طبیعتا هیچ خروجی ای هم تولید نمیشه .نکته مهم : برای فراخوانی یک تابع باید اون تابع قبلا تعریف شده باشه .به عنوان مثال و برای اینکه بیشتر متوجه بشید ، در برنامه ی بالا ، جای آخرین خط برنامه (فراخوانی تابع) رو عوض کنید و اون رو به اول برنامه انتقال بدید . ببینید که بعد از اجرای برنامه با چه خطایی مواجه میشید.حالا برنامه رو به حالت اول برگردونید و این بار تابع print_lyrics رو بعد از تابع repeat_lyrics تعریف کنید . بررسی کنید که بعد از اجرای این کار چه اتفاقی خواهد افتاد.روند اجرا :روند اجرای یک برنامه همیشه از اولین دستور اون شروع میشه ؛ دستورات موجود در برنامه یک بار از بالا به پایین اجرا میشن .تعریف توابع روند اجرای برنامه رو تغییر نمیدن و همونطور که قبلا هم گفتیم دستورات داخل توابع تا زمانی که اونها رو فراخوانی نکرده باشیم اجرا نخواهند شد. فراخوانی یک تابع مانند راه انحرافی در روند اجرای برنامه هست ؛ به این صورت که بجای رفتن به دستور بعدی ، روند اجرا به داخل بدنه ی تابع انتقال پیدا میکنه و دستورات داخل تابع اجرا میشن و بعد از پایان کار ، روند اجرا دوباره بجای قبلی خودش برمیگرده و دستور بعدی اجرا میشه . خیلی ساده :)نکته ای که باید به یاد داشته باشید اینه که یک تابع میتونه تابع دیگری رو فراخوانی بکنه . مثلا در میانه ی بدنه ی یک تابع ، برنامه مجبور میشه که دستورات موجود در یک تابع دیگری رو اجرا بکنه و همینطور مادامی که در حال اجرای دستورات تابع جدید هست ، مجبور باشه که دستورات یک تابع دیگری رو هم اجرا بکنه.بطور خلاصه وقتی قصد داریم که کدهای یک برنامه رو بخونیم و بررسی کنیم بهتره بجای خوندن از بالا به پایین ، روند اجرای برنامه رو طی کنیم تا حس تشخیص و درک بیشتری داشته باشیم .پارامترها و آرگومان ها :بعضی از توابعی که قبلا باهم دیدم آرگومان هایی رو نیاز داشتند . برای مثال وقتی تابع math.sin رو فراخوانی میکنیم ، عددی رو به عنوان آرگومان به اون پاس میدیم. بعضی از توابع بیش از یک آرگومان میگیرن مانند تابع math.pow که دو آرگومان رو میگیره ؛ اولی به عنوان پایه و دومی به عنوان توان .در داخل توابع ،مقدار آرگومان ها به متغیر هایی بنام پارامتر ها انتقال پیدا میکنن . برای مثال در اینجا تابعی رو تعریف کردیم که یک آرگومان رو دریافت میکنه :def print_twice(name):
     print(name)
     print(name)این تابع مقدار آرگومان دریافتی رو به پارامتری بنام name انتقال میده و هنگام فراخوانی تابع ، مقدار پارامتر (هرچیزی که باشه) دوبار چاپ خواهد شد.این تابع با هر مقداری که قابل چاپ شدن باشه ، میتونه کار کنه :&gt;&gt;&gt; print_twice(&#039;Spam&#039;)
Spam
Spam&gt;&gt;&gt; print_twice(42)
42
42&gt;&gt;&gt; print_twice(math.pi)
3.14159265359
3.14159265359مشابه قوانین ترکیب بندی برای توابع درون-ساخت(Built-in) زبان پایتون ، این قوانین ، توابع ساخته شده توسط کاربر رو هم شامل میشه و میتونید از هر نوع عبارتی به عنوان آرگومان برای تابع print_twice استفاده کنید :&gt;&gt;&gt; print_twice(&#039;Spam &#039;*4)
Spam Spam Spam Spam
Spam Spam Spam Spam&gt;&gt;&gt; print_twice(math.cos(math.pi))
-1.0
-1.0همچنین ما میتونیم از یک متغیر به عنوان آرگومان تابع استفاده کنیم :&gt;&gt;&gt; var1 = &quot;Python Is Amazing&quot;
&gt;&gt;&gt; print_twice(var1)
Python Is Amazing
Python Is Amazingمتغیرها و پارامترهای محلی :زمانی که شما متغیری رو داخل یک تابع ایجاد میکنید ، اون متغیر یک متغیر محلی هست ؛ به این معنی که فقط داخل اون تابع وجود داره . برای مثال :def cat_twice(part1, part2):
     cat = part1 + part2
     print_twice(cat)این تابع دو آرگومان رو از ما دریافت میکنه ، اونها رو بهم میچسبونه و نتیجه رو دوبار برای ما چاپ میکنه. از تابع بالا بصورت زیر میتونیم استفاده کنیم :&gt;&gt;&gt; line1 = &#039; this is the first string &#039;
&gt;&gt;&gt; line2 = &#039; and that is the second string&#039;&gt;&gt;&gt; cat_twice(line1, line2)
&#039;this is the first string and that is the second string&#039;
&#039;this is the first string and that is the second string&#039;بعد از اینکه تابع cat_twice خاتمه پیدا کرد ، متغیر cat از بین میره و اگر بخوایم که مقدار اون رو چاپ کنیم با خطای زیر مواجه میشیم :&gt;&gt;&gt; print(cat)
NameError: name &#039;cat&#039; is not definedپارامترها هم مانند متغیرهای داخل توابع ، محلی هستند . برای مثال خارج از تابع print_twice ، هیچ چیزی بنام name وجود نداره .توابع دارای مقدار برگشتی و توابع خالی(fruitful functions and void functions) :بعضی از توابعی که قبلا استفاده کردیم مانند توابع ریاضی ، نتایجی رو برای ما برگشت میدادن . به این نوع توابع در اینجا اصطلاحا fruitful functions خواهیم گفت. در مقابل ، توابعی مانند print_twice عملی رو برای ما انجام میدادن بدون اینکه مقداری رو برای ما برگشت بدن . به این نوع توابع ، void functions میگیم.وقتی ما یک تابعِ fruitful رو فراخوانی میکنیم ، قصد داریم که از مقدار برگشتی اون برای انجان یک کاری استفاده کنیم. برای مثال میخوایم که مقدار برگشتی رو داخل یک متغیری بریزیم و یا اینکه مقدار برگشتی به عنوان بخشی از یک عبارت مورد استفاده قرار بگیره :x = math.cos(radians)

golden = (math.sqrt(5) + 1) / 2وقتی که ما تابعی رو داخل مفسر پایتون فراخوانی میکنیم ، مقدار برگشتی برای ما نمایش داده میشه :&gt;&gt;&gt; math.sqrt(5)
2.2360679774997898ولی در حالت اسکریپتی وقتی تابعی رو فراخوانی میکنیم که دارای مقدار برگشتی هست ، مقدار برگشتی برای همیشه از دست خواهد رفت :math.sqrt(5)اسکریپت بالا ریشه ی دوم عدد 5 رو محاسبه میکنه ولی چون نه مقدار برگشتی رو داخل متغیری میریزه و نه مقدار رو برای ما نمایش میده ، زیاد به درد بخور نیست :)توابع Void میتونن مقداری رو برای ما نمایش بدن و یا تاثیرات دیگه ای داخل برنامه داشته باشن ولی هیچ مقداری رو برای برنمیگردونن ؛ اگر با توابع void مانند توابع fruitful رفتار کنیم (یعنی مقدار برگشتی رو داخل متغیری بریزیم) با نوع خاصی از مقدار بنام None مواجه خواهیم شد :&gt;&gt;&gt; result = print_twice(&#039;Bing&#039;)
Bing
Bing&gt;&gt;&gt; print(result)
Noneمقدار None مشابه مقدار رشته ای &quot;None&quot; نیست و نوع مخصوص خودش رو در زبان پایتون داره :&gt;&gt;&gt; print(type(None))
&lt;class &#039;NoneType&#039;&gt;چرا از توابع استفاده میکنیم ؟ایجاد توابع به ما این امکان رو میده که دستورات برنامه رو بصورت گروهی نام گذاری کنیم که این کار خوانایی و خطایابی برنامه رو راحت تر میکنه.استفاده از توابع باعث حذف کدهای تکراری و کاهش حجم کدهای برنامه میشه ؛ که این کار سبب میشه تغییرات رو راحت تر بتونیم اعمال بکنیم.تقسیم یک برنامه به توابع این امکان رو به ما میده که بخش های مختلف برنامه رو بصورت جداگانه خطایابی کنیم.توابعی که به خوبی طراحی و پیاده سازی شدن ، میتونن در بسیاری از برنامه ها و پروژه های دیگه دوباره استفاده بشن.تمرین ها :تابع average رو طوری تعریف کنید که دو عدد رو به عنوان پارامتر دریافت کنه و میانگین اونها رو برای ما نمایش بده.تابع right_justify رو طوری تعریف کنید که پارامتری بنام s از نوع رشته رو بگیره و با رعایت فاصله ی کافی از سمت چپ ، رشته ی مورد نظر رو طوری چاپ بکنه که حرف آخر رشته در ستون 70 ام صفحه نمایش قرار گرفته باشه. (راهنمایی : با استفاده از تلفیق و تکرار رشته ها و تابع len میتونید این تمرین رو حل کنید)خب اینم از فصل سوم ، امیدوارم مفید واقع بشه.موفق باشید :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Wed, 12 Jun 2019 13:58:18 +0430</pubDate>
            </item>
                    <item>
                <title>اضافه کردن Virtual Environment به Jupyter Notebook در لینوکس</title>
                <link>https://virgool.io/@miladsade96/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-virtual-environment-%D8%A8%D9%87-jupyter-notebook-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-oforcowycpij</link>
                <description>با سلام خدمت همه دوستانامروز میخوام نحوه اضافه کردن محیط مجازی (Virtual Environment) پایتون به منوی کرنل های ژوپیتر رو باهم یاد بگیریم . با من همراه باشید!نصب pip :خب ، فرض میکنیم که فقط پایتون روی سیستم عامل نصب هست . برای ادامه باید pip که پکیج منیجر پایتون هست رو نصب کنیم :در نسخه های مبتنی بر دبیان :sudo  apt  install  python-pipدر نسخه های ردهت و سنت او اس :sudo  yum  upgrade  python-setuptoolssudo  yum  install  python-pip  python-wheelدر نسخه های مبتنی بر فدورا :sudo  dnf  upgrade  python-setuptoolssudo  dnf  install  python-pip  python-wheelو در آخر ، توزیع های مبتنی بر آرچ لینوکس مانند مانجارو :sudo  pacman  -S  python-pipنکته : از این جای کار به بعد دیگه فرقی نمیکنه که با کدوم توزیع کار میکنید و دستورات برای همه ی اونها یکسان هست.نصب ابزار virtualenv : نوبت میرسه به نصب virtualenv که ابزاری هست برای ایجاد محیط مجازی برای زبان پایتون . با استفاده از دستور زیر میتونیم این ابزار رو نصب کنیم :sudo  pip install  virtualenvنصب نرم افزار ژوپیتر :برای نصب ویرایشگر کد ژوپیتر باید دستور زیر رو داخل ترمینال وارد کنیم :sudo  pip  install  -U  jupyterایجاد محیط مجازی :بعد از انجام موارد بالا ، حالا نوبت به این میرسه که داخل سیستم عامل یک محیط مجازی برای خودمون بسازیم . نکته ای که در اینجا وجود داره اینه که وقتی دستور زیر رو وارد میکنید ، داخلِ هر دایرکتوری ای که باشید محیط مجازی داخل اون دایرکتوری براتون ایجاد خواهد شد ؛ و اگر قصد دارید که محیط مجازی رو داخل یک دایرکوری خاص ایجاد کنید باید مسیر ترمینال رو هم به اون دایرکتوری تغییر بدید :virtualenv  myEnvنکته : myEnv نام محیط مجازیمون هست و میتونه هر اسم دیگه ای داشته باشه.فعال کردن محیط مجازی :برای فعال کردن محیط مجازی از دستور زیر استفاده میکنیم :source  myEnv/bin/activateنصب ipykernel در محیط مجازی :نرم افزار ژوپیتر برای اینکه از نسخه ی زبان پایتون موجود در داخل محیط مجازی ما به عنوان کرنل اجرایی خودش استفاده بکنه باید ابزار ipykernel داخل محیط مجازی نصب شده باشه. برای نصب از دستور زیر استفاده میکنیم :sudo  pip  install  ipykernelرسیدیم به آخرین قسمت کارمون یعنیاضافه کردن python و ipykernel موجود در محیط مجازی به نرم افزار ژوپیتر :برای این کار باید دستور زیر رو وارد کنیم :sudo  python  -m  ipykernel  install  --user  --name=myEnvبعد از انجام آخرین قدم میتونید نرم افزار ژوپیتر رو اجرا و نتیجه کار رو ببینید :همونطور که در تصویر بالا میبینید ، AI_Env نام محیط مجازی ای هست که ایجاد کردم.امیدوارم براتون مفید بوده باشه!موفق باشید (:</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Mon, 03 Jun 2019 00:06:59 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش پایتون - فصل دوم (متغییر ها ، عبارات و ...)</title>
                <link>https://virgool.io/@miladsade96/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%81%D8%B5%D9%84-%D8%AF%D9%88%D9%85-%D9%85%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%87%D8%A7-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%88-sxoygr7ucypk</link>
                <description>یکی از قوی ترین ویژگی های موجود در زبان های برنامه نویسی ، توانایی دستکاری متغیر هاست . متغیر نامی هست که به یک مقدار اشاره میکنه .عبارات تخصیص :یک عبارت تخصیص ، متغیری رو میسازه و به اون مقداری رو میده :code sample :&gt;&gt;&gt; message = &#x27;And now for something completely different&#x27;&gt;&gt;&gt; n = 17&gt;&gt;&gt; pi = 3.141592653589793در مثال های بالا سه تا عمل تخصیص صورت میگیره . در اولی مقدار رشته ای به متغیری بنام message تخصیص پیدا میکنه ، در دومی مقدار صحیحِ 17 به متغیری بنام n تخصیص داده میشه و در سومی مقدار تقریبی عدد پی (یکی از اعداد پرکاربرد در ریاضی) به متغیری بنام pi تخصیص داده میشه .نام گذاری متغیر ها :معمولا برنامه نویس ها برای متغیرهایی که تعریف میکنن نام های با معنایی رو انتخاب میکنن . نام متغیر شما میتونه هرچقدر که دوست دارید طولانی باشه . همچنین میتونید برای اسم متغیر از حروف و اعداد در کنارهم استفاده کنید .نکته : نام متغیر نمیتونه با عدد شروع بشه.شما میتونید از حروف بزرگ الفبای انگلیسی برای نامگذاری متغیرهاتون استفاده کنید ولی استفاده از حروف کوچک بیشتر مرسوم هست. علاوه براین ، در استفاده از علامت خط زیرین(underline) هم محدودیتی ندارید . درواقع علامت خط زیرین در نام گذاری متغیر هایی که از چندین کلمه تشکیل شده اند کاربرد داره ، مانند :your_name و airspeed_of_unladen_swallowاگر شما نام گذاری غیر مجازی رو برای متغیرهاتون انجام بدید ، با خطای نوشتاری (syntax error) مواجه خواهید شد :&gt;&gt;&gt; 76trombones = &#x27;big parade&#x27;SyntaxError: invalid syntax&gt;&gt;&gt; more@ = 1000000SyntaxError: invalid syntax&gt;&gt;&gt; class = &#x27;Advanced Theoretical Zymurgy&#x27;SyntaxError: invalid syntaxحالا یک به یک بررسی میکنیم که چرا مفسر پایتون این نام گذاری هارو قبول نکرده . در متغیر اول (76trombones) ، چون نام متغیر با عدد شروع شده پس غیر مجاز هست . در متغیر دوم چون نام متغیر شامل کاراکتر @ هست ، این نام گذاری هم در پایتون غیر مجاز اعلام میشه . اما میرسیم به سومین نام گذاری ؛ بنظرتون کجای کار ایراد داره که این نام گذاری هم غیر مجاز اعلام شده ؟جواب : کلمه ی class که به عنوان نام متغیر قرار داده شده ، یکی از کلید واژه های زبان پایتون هست . مفسر پایتون از کلید واژه ها استفاده میکنه تا ساختار برنامه ی ما رو شناسایی کنه و ما اجازه نداریم که از این کلید واژه ها در نامگذاری متغیر ها استفاده کنیم .عبارات و بیانیه ها (Expressions and Statements) :یک عبارت (Expression) ، ترکیبی از مقدار ، متغیر و عملگر هست . متغیر و مقدار به خودی خود یک عبارت در نظر گرفته میشن . به مثال ها توجه کنید :code sample :&gt;&gt;&gt; 4242&gt;&gt;&gt; n17&gt;&gt;&gt; n + 2542زمانی که شما عبارتی رو داخل خط فرمان پایتون تایپ میکنید ، مفسر اون رو ارزیابی میکنه یعنی مقدار عبارت مورد نظر رو پیدا میکنه . برای مثال در نمونه کد بالا ، ارزیابی میکنه که n مقدار ۱۷  و n + 25 مقدار 42 رو داره .یک بیانیه (statement) ، یک واحد کدی هست که اثری داره ، مثل : ساختن متغیر یا نشون دادن یک مقدار . به مثال ها توجه کنید :code sample :&gt;&gt;&gt; n = 17&gt;&gt;&gt; print(n)خط اول بیانیه ی تخصیصی هست که یک مقدار رو به متغیرِ n اختصاص میده و خط دوم بیانیه ای شامل دستور print هست که مقدار متغیر n رو به ما نشون میده .حالت اسکریپتی :تا اینجای کار ما داشتیم مستقیما با مفسر پایتون کار میکردیم . این روش برای شروع خوبه ولی اگر ما با بیش از چند خط کد سرو کار داشته باشیم ، روش جالبی نیست . دوتا روش جایگزین وجود داره : اولی اینه که کدهامون رو داخل یک فایلی با پسوند py. (به این فایل اسکریپت میگیم ) ذخیره کنیم و بعد از داخل مفسر پایتون اون رو باز و اجرا کنیم . روش دوم هم استفاده از ویرایشگر های کد و آی دی ای (IDE) ها هست . IDE مخفف Integrated Development Environment به معنی محیط توسعه یکپارچه هست . از بین ویرایشگرها  ، من ویژوال استویدو کد (Visual Studio Code) و از بین IDE ها ، PyCahrm نسخه ی Community رو بهتون پیشنهاد میکنم که میتونید از سایتشون که در خط بالایی لینک دادم دانلود و شروع به کدنویسی کنید .بین کار کردن با پایتون در حالت مستقیم و حالت اسکریپتی (منظورم ‌ذخیره در فایل ، استفاده از ویرایشگرهای کد و IDE هاست ) تفاوت هایی وجود داره . برای مثال فرض کنید که در حالت استفاده  ی مستقیم ، کدهای زیر رو تایپ میکنید :code sample :&gt;&gt;&gt; miles = 26.2&gt;&gt;&gt; miles * 1.6142.182خط اول یک مقداری رو به متغیر miles نسبت میده . خط دوم یک عبارت هست پس مفسر پایتون اون رو ارزیابی میکنه و نتیجه رو به ما نشون میده . مثلا در این مثال به ما میگه که طول مسیر ماراتن تقریبا 42 کیلومتر هست .اما اگر همین کد رو بصورت اسکریپتی بنویسیم و اجراش بکنیم ، هیچ خروجی ای به ما نشون داده نمیشه . در حالت اسکریپتی ، مفسر پایتون عبارت رو ارزیابی میکنه و تا زمانی که بهش گفته نشده ، مقداری رو به ما نشون نمیده :code sample :miles = 26.2print(miles * 1.61)این رفتار ممکنه در اوایلِ کار شما رو سردرگم بکنه ولی جای هیچ نگرانی نیست :)یک اسکریپت معمولا دارای دنباله ای از بیانیه (statement) هاست . اگر ما داخل اسکریپت بیش از یک بیانیه داشته باشیم و اون رو اجرا بکنیم ، همه ی نتایج در یک خروجی نشون داده میشن . به مثال زیر توجه کنید :code sample :print(1)x = 2print(x)قطعه کد بالا این خروجی رو به ما نشون میده :12نکته : بیانیه ی تخصیص (x = 2)در مثال بالا ، به خودی خود هیچ خروجی ای به ما نشون نمیده .برای اینکه این قضیه براتون بیشتر تفهیم بشه ازتون میخوام که کد زیر رو داخل مفسر پایتون بصورت مستقیم وارد بکنید و ببینید که چه اتفاقی میوفته :code sample :5x = 5x + 1و بعد ، همین کد رو داخل یک اسکریپتی بنویسید و اجراش بکنید ببینید این دفعه چه اتفاقی میوفته .حالا اسکریپت رو یکمی تغییر بدید ؛ به این صورت که همه ی بیانیه هارو داخل دستور print بنویسید و دوباره اجراش بکنید .ترتیب عملگرها :وقتی یک عبارت شامل چند عملگر باشه ، ترتیب ارزیابی به ترتیب عملگرهای موجود در اون بستگی داره . برای عملگرهای ریاضی ، پایتون از ترتیب عملگرها در ریاضیات پیروی میکنه . برای بخاطر سپردن ترتیب عملگرها میتونید از کلمه ی PEMDAS استفاده کنید :پرانتز (Parentheses) :پرانتز ها دارای بالاترین اولویت هستند . شما میتونید برای سازماندهی ارزیابی از پرانتز استفاده کنید. عباراتی که داخل پرانتز نوشته میشن ، اول از همه مورد ارزیابی توسط مفسر قرار میگیرن . برای مثال حاصل عبارت های زیر به ترتیب میشه 4 و 8 :code sample :2 * (3 - 1)(1 + 1) ** (5 - 2)همچنین شما میتونید برای خوانایی بهتر کدهاتون بدون اینکه نتیجه محاسبات تغییری بکنه از پرانتز ها استفاده کنید :code sample :(minute * 100) / 60توان (Exponentiation) :بعد از پرانتز ، توان رسانی در اولویت دوم هست . برای مثال حاصل عبارت های زیر به ترتیب میشه 9 و 18 :code sample :1 + 2 ** 32 * 3 ** 2اولویت های بعدی (Multiplication , Division , Addition and Subtraction): بعد از دو اولویت اول نوبت میرسه به ضرب و تقسیم و بعد این دو هم اولویت با جمع و تفریق هست . برای مثال حاصل عبارات زیر به ترتیب میشه 5 و 8 :code sample :2 * 3 - 16 + 4 / 2نکته : بجز عملگر توان رسانی ، اگر در عبارتی عملگرهایی با اولویت های یکسان داشته باشیم ، مفسر پایتون اون هارو از سمت چپ به راست عبارت مورد ارزیابی قرار میده .عملگرهای مربوط به رشته ها :ما معمولا نمیتونیم برای کار روی رشته ها از عملگرهای ریاضی استفاده کنیم حتی اگر اون ها شبیه اعداد باشند . برای مثال نمونه های زیر همگی در پایتون غیر مجاز شناخته میشن :code sample :&#x27; 2 &#x27; - &#x27; 1 &#x27;&#x27; eggs &#x27; / &#x27; easy &#x27;&#x27; apple &#x27; * &#x27; orange &#x27;ولی در زبان پایتون در مورد این مساله دوتا استثنا وجود داره : عملگر + و عملگر *عملگرِ + در کار کردن با رشته ها ، عملِ پیوند رشته ای رو انجام میده به این معنی که چند رشته رو بهم میچسبونه . به مثال های زیر توجه کنید :code sample :&gt;&gt;&gt; first = &#x27;milad&#x27;&gt;&gt;&gt; second = &#x27;sadeghi&#x27;&gt;&gt;&gt; first + secondmiladsadeghiعملگرِ * هم در کار با رشته ها عملِ تکرار کردن یک رشته رو انجام میده . برای مثال حاصل عبارت   3 * &#x27;spam&#x27; میشه spamspamspam . نکته : در مثال بالا مادامی که یکی از مقادیر از نوع رشته ای هست  ، باید مقدار بعدی از نوع عدد صحیح (integer) باشه .نوشتن توضیحات (comments) در داخل کد :هرچقدر که برنامه هایی که مینویسیم بزرگتر و پیچیده تر میشن ، قابلیت خوانایی اونها هم رفته رفته پایینتر میاد و وقتی که داریم به قطعه کدی از برنامه نگاه میکنیم ، به سختی میشه فهمید که اون قسمت از برنامه داره چیکار میکنه و چرا ؟به همین دلیل بهتره یادداشت هایی رو برای توضیح دادن این که هر قسمت از برنامه چه کاری رو انجام میده به برنامه مون اضافه کنیم . به این یادداشت ها اصطلاحا کامنت(comment) میگیم که با علامت # شروع میشن. برای مثال :code sample :# compute the percentage of the hour that has elapsedpercentage = (minute * 100) / 60در این مثال ، خط اول بعنوان کامنت قرار داده شده و درباره ی کاری که خط دوم قراره انجام بده توضیح میده . همچنین شما میتونید بجای نوشتن کامنت و کد در دو خط مجزا ، اونهارو در یک خط بنویسید . برای مثال :code sample :percentage = (minute * 100) / 60        # percentage of an hourنکته : هر چیزی که بعد از بعد از علامت # مینویسیم ، مفسر پایتون اون رو تا انتهای همون خط نادیده اش میگیره ؛ یعنی هیچ تاثیری روی روند اجرای برنامه مون نخواهد گذاشت .روش صحیح نوشتن کامنت برای برنامه :به مثال های زیر توجه کنید :code sample :v = 5        # assign 5 to vv = 5        # velocity in meters / secondهمونطور که میبینید در خط اول مثال بالا ، یک کامنتِ بدیهی ای نوشته شده که اطلاعات چندان مفیدی در اختیار خواننده قرار نمیده . ولی در خط دوم ، مثلا اگر برنامه ما در مورد سرعت یک خودرو داره بحث میکنه ، اون اطلاعات رو به شکل مختصر و مفید داخل کامنت قرار میدیم .نکته : قرار دادن اسامی با معنا برای متغیر ها میتونه نیاز مارو برای کامنت گذاری کمتر کنه ولی در عین حال قرار دادن اسامی طولانی برای متغیر ها باعث ایجاد عبارت های پیچیده ای میشه که خوندن اونها هم خیلی سخته .خطایابی (Debugging) :انواع خطاها در برنامه نویسی : خطای نحوی (syntax error) ، خطای زمان اجرا (runtime error) و خطای معنایی (semantic error) . برای رفع سریع این خطاها لازمه که بطور مختصر و مفید اونها رو بشناسیم (در فصل های بعد بیشتر توضیح خواهم داد ) و با تفاوت هاشون آشنا بشیم :خطای نحوی :این نوع خطا به ساختار برنامه و قوانینی که این ساختارها دارند ، اشاره میکنه .  برای مثال استفاده از یک پرانتز بجای یک جفت پرانتز باز و بسته ، خطای نحوی بوجود میاره :code sample :(1 + 2)        # it is legal( 8              # but it is a syntax errorنکته : چنانچه در داخل کدهای برنامه ای که نوشته ایم خطای نحوی وجود داشته باشه ، مفسر پایتون بعد از نشون دادن اخطار بلافاصله روند اجرای برنامه رو متوقف میکنه و از برنامه خارج میشه و شما قادر به اجرای برنامه نخواهید بود .خطای زمانِ اجرا :نوع دوم خطا ، خطای زمان اجرا هست ؛ دلیل این نام گذاری اینه تا زمانی که برنامه ی ما شروع به کار کردن نکنه ، خطایی ظاهر نمیشه . همچنین این نوع خطاها با نام خطای استثنا ها نیز شناخته میشن.خطای معنایی :سومین نوع خطاها ، خطای معنایی نام داره و همونطور که از اسمش پیداست ، به مفهوم و هدف برنامه مربوط میشه . اگر داخل برنامه ای که نوشته ایم خطای معنایی وجود داشته باشه ، برنامه بدون نشون دادن هیچ خطایی اجرا خواهد شد و کار خواهد کرد. اما مشکل اینجاست که برنامه ی ما کاری که ازش انتظار میره رو انجام نمیده ، در واقع کار اشتباهی که ما داخل کدهامون نوشتیم رو داره انجام میده .تمرین ها :در مثال های قبل دیدیم که n = 50 عبارت درستی هست . حالا جای طرفین مساوی رو عوض کرده و صحت عبارت جدید رو بررسی کنید .درستی عبارت x = y = 1 رو بررسی کنید .در بعضی از زبان های برنامه نویسی ، برای پایان دادن به یک عبارت از علامتِ ; استفاده میشه . بررسی کنید که اگر در پایان عباراتِ پایتون از این علامت استفاده کنیم چه اتفاقی میوفته ؟بررسی کنید که اگر در پایان عبارات پایتون از نقطه استفاده کنیم چه اتفاقی میوفته ؟در نشانه گذاری ریاضی ما میتونیم برای نشون دادن ضرب x و y از عبارت xy استفاده کنیم .اگر این کار رو در زبان پایتون انجام بدیم چه اتفاقی میوفته ؟حجم کره ای با شعاع 5 واحد چقدر است؟فرض کنید قیمت روی جلد یک کتاب 30000 تومان هست و فروشگاه مورد نظر کتاب هارو با 40 درصد تخفیف میفروشه . هزینه ارسال یک کتاب 5000 تومان هست ولی فروشگاه به ازای خرید تعداد جلدهای بیشتر ، هزینه ارسال جلدهای بعدی رو 1000 تومن حساب میکنه . قیمت کل رو به ازای خرید 60 جلد کتاب حساب کنید .خب ، اینم از پایان فصل دوم . امیدوارم که مفید باشه براتون . در فصل بعدی در مورد توابع صحبت خواهیم کرد.موفق باشید :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Mon, 13 May 2019 18:33:22 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش پایتون - فصل اول (مقدمات)</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%81%D8%B5%D9%84-%D8%A7%D9%88%D9%84-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA-loynvfvdat7n</link>
                <description>سلام دوستان . از امروز میخوایم که زبان برنامه نویسی پایتون رو در کنار هم و قدم به قدم یاد بگیریم . پس با من همراه باشید !خب بهتره از اینجا شروع بکنیم که اصلا یک برنامه چه چیزی هست؟ برنامه چیست؟برنامه ، دنباله ای از دستور العمل هاست که نحوه انجام محاسبات رو مشخص میکنه . این محاسبات میتونن در مورد مباحث ریاضی مثل حل یک دستگاه معادلات یا پیدا کردن ریشه های یک چند جمله ای باشن ، میتونن محاسبات نمادین باشن مثل جستجو و جایگزین کردن یک متن ، داخل یک فایل متنی و همچنین میتونن محاسبات گرافیکی باشن مثل پردازش تصویر یا پخش یک فایل ویدئویی .جزئیات در زبان های برنامه نویسی مختلف ، متفاوت هست ولی تعدادی دستور العمل اساسی وجود داره که بین تمامی زبان ها مشترک هستن :ورودی : گرفتن داده های مورد نیاز از طریق کیبورد ، فایل ، شبکه و سایر دستگاه هاخروجی : نمایش داده ها در صفحه نمایش، ذخیره داده ها داخل یک فایل ، فرستادن داده ها روی شبکه و ...ریاضیات : انجام عملیات پایه ای ریاضی مانند حاصل جمع ، حاصل ضرب و غیره عملیات شرطی : بررسی شرایط موجود داخل برنامه و اجرای کدِ مناسبتکرار : انجام چند بارِ برخی از دستوراتاجرای پایتون خب ، اگر زبان برنامه نویسی پایتون روی سیستمتون نصب نیست ، میتونید از سایتش اون رو دانلود و نصب کنید . پایتون دوتا نسخه مختلف(ورژن ۲ و ورژن ۳) داره که خیلی شبیه بهم هستن و تفاوت های کمی باهم دارن ؛ اگر یکی از ورژن هاش رو یاد بگیرید ، به راحتی میتونید به اون یکی ورژن سوئیچ کنید.من در این سری آموزش از ورژن ۳ استفاده میکنم و یک کمی هم از ورژن ۲ براتون میگم .مفسر زبان پایتون برنامه ای هست که کد های شما رو میخونه و اجرا میکنه . بسته به سیستم عاملی که استفاده میکنید ، بعد از کلیک روی آیکون پایتون و یا نوشتن python داخل خط فرمان ، با این خروجی مواجه میشید :Python 3.7.3 (default, Mar 26 2019, 21:43:19) [GCC 8.2.1 20181127] on linuxType &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&gt;&gt;&gt; سه خط اول شامل اطلاعاتی در مورد مفسر پایتون و سیستم عاملی هست که داره روی اون کار میکنه . پس ممکنه داخل سیستم شما این سه خط کمی متفاوت نشون داده بشه .نکته : باید چک کنید که ورژن پایتون با عدد ۳ شروع بشه وگرنه شما دارید از پایتون ورژن ۲ استفاده میکنید.خط آخر نشون میده مفسر پایتون آماده هست که شما کد خودتون رو وارد کنید . اگر یک خط کد بنویسید و کلید enter رو فشار بدید ، مفسر نتیجه رو بهتون نشون خواهد داد.code sample:&gt;&gt;&gt; 1 + 12&gt;&gt;&gt;خب ، حالا شما آماده اید که شروع کنیم .اولین برنامه :بطور سنتی ، اولین برنامه ای که در یک زبان برنامه نویسی جدید نوشته میشه ، برنامه ی سلام دنیا ! هست . چون همه ی کاری که انجام میده نشون دادن عبارت « سلام دنیا ! » هست . این برنامه داخل پایتون به این شکل هست :code sample :&gt;&gt;&gt; print(&quot;Hello, World !&quot;)این یک مثال برای دستور print هست که در واقع چیزی رو روی کاغذ پرینت نمیکنه ،فقط نتیجه رو روی صفحه نمایش به ما نشون میده . در این مثال ، خروجی به این صورت خواهد بود :Hello, World!نکته اول : علامت های نقل قولی که در ابتدا و انتهای عبارت Hello, World قرار داده شده ، در خروجی نمایش داده نمیشه .نکته دوم : علامت های پرانتز باز و بسته نشون دهنده ی این هستند که دستور print یک تابع هست . در مورد توابع در فصل های بعدی بطور مفصل صحبت خواهیم کرد.نکته سوم : در پایتون ورژن ۲ ، دستور print کمی متفاوت هست . چون تابع نیست ، پس دارای پرانتز باز و بسته هم نیست :code sample :&gt;&gt;&gt; print &quot;Hello, World !&quot;عملگرهای ریاضی :بعد از نوشتن برنامه ی سلام دنیا! قدم بعدی کار کردن با عملگرهای ریاضی در پایتون هست . در پایتون ، عملگرهای + ، - و * نشون دهنده ی حاصل جمع ، تفریق و ضرب هستند :code sample :&gt;&gt;&gt; 40 + 242&gt;&gt;&gt; 43 - 142&gt;&gt;&gt; 3 * 515عملگر / نشون دهنده ی حاصل تقسیم هست :code sample :&gt;&gt;&gt; 30 / 215.0شاید براتون عجیب باشه که چرا بجای عدد 15 ، نتیجه محاسبه عدد 15.0 شد . دلیل این رو بعدا بهتون میگم . نگران نباشید :)در نهایت میرسیم به عملگر ** که نشون دهنده ی توان هست . یعنی یک عددی رو به توان عدد دیگه ای میرسونه :code sample :&gt;&gt;&gt; 6 ** 236نکته : در بعضی از زبان ها ، علامت ^ به معنای توان هست ولی در پایتون این علامت به معنای یک عملگر بیتی به نام XOR هست . اگر میخواید که بیشتر در مورد عملگرهای بیتی در پایتون بدونید ، پیشنهاد میکنم یه سری به این سایت بزنید .مقادیر و نوع ها :مقادیر جزء ابتدایی ترین چیزهایی هستن که برنامه ی ما باهاش کار میکنه ، مثل کاراکتر ها و اعداد . بعضی از مقادیر رو قبلا دیدیم ، مانند :   2 ، 42.0 و &quot;Hello, World&quot; . این مقادیر دارای انوع متفاوتی هستن . 2 از نوع اعداد صحیح ، 42.0 از نوع اعداد اعشاری و &quot;Hello, World&quot; از نوع رشته است.اگر شما نمیدونید مقداری که دارید از چه نوعی هست ، مفسر پایتون میتونه نوع اون رو بهتون بگه :code sample:&gt;&gt;&gt; type(2)&lt;class &#x27;int&#x27;&gt;&gt;&gt;&gt; type(42.0)&lt;class &#x27;float&#x27;&gt;&gt;&gt;&gt; type(&quot;Hello, World !&quot;)&lt;class &#x27;str&#x27;&gt;نکته :  در نتایج بالا ، کلمه ی class به معنای دسته هست . در مورد class ها در فصل های بعدی صحبت میکنیم .سوال : نظرتون در مورد مقادیر &#x27;2&#x27; و &#x27;42.0&#x27; چیه ؟! بنظر میاد که از نوع اعداد صحیح و اعشاری باشند . ولی اگر کمی دقت کنید متوجه میشید که این مقادیر داخل علامت های نقل قول قرار گرفته اند ، دقیقا مثل رشته ها .حالا بینیم نظر مفسر پایتون در این مورد چیه :code sample :&gt;&gt;&gt; type(&#x27;2&#x27;)&lt;class &#x27;str&#x27;&gt;&gt;&gt;&gt; type(&#x27;42.0&#x27;)&lt;class &#x27;str&#x27;&gt;همینطور که میبینید مفسر پایتون نظرش اینه که هردو از نوع رشته هستن و نتیجه کاملا درسته.خطایابی (Debugging) :برنامه نویس ها ممکنه به دلایل مختلف اشتباه بکنن . به خطاهای برنامه نویسی ، باگ و به روند ردیابی و اصلاح اون خطاها ، دیباگینگ گفته میشه .تمرین ها :اگه در دستور print ، یکی از پرانتز ها (یا هر دو رو) قرار ندیم چه اتفاقی میوفته ؟فرض کنید که میخواید یک رشته ای رو چاپ کنید ، اگر یکی از علامت های نقل قول(یا هر دو رو) قرار ندیم چه اتفاقی میوفته؟شما میتونید برای نشون دادن اعداد منفی از علامت - قبل از اون عدد استفاده کنید . اگر قبل از عدد مورد نظر از علامت + استفاده بکنیم چه اتفاقی میوفته ؟ حاصل عبارتِ 2 ++ 2 چیه؟در علامت گذاری ریاضی ، اگر قبل از عدد ، صفر قرار داده بشه (یعنی عدد مورد نظر با صفر شروع بشه) اشکالی نداره . این قضیه رو توی زبان پایتون بررسی کنید .اگر دو تا مقدار داشته باشیم که هیچ عملگری بینشون نیست ، چه اتفاقی میوفته ؟خب اینم از اولین قسمت . امیدوارم که مفید بوده باشه براتون !توی قسمت بعدی در مورد متغیرها و عبارات صحبت خواهیم کرد . فعلا :)</description>
                <category>Milad Sadeghi</category>
                <author>Milad Sadeghi</author>
                <pubDate>Wed, 01 May 2019 00:19:43 +0430</pubDate>
            </item>
            </channel>
</rss>