<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های داریوش مهدی پور یقینی</title>
        <link>https://virgool.io/feed/@dmahdipour</link>
        <description>مدرس دانشگاه، مولف کتاب، برنامه نویس، عاشق هوش مصنوعی مخصوصا یادگیری عمیق، کتاب و مسافرت و گشت و گذار تو طبیعت مخصوصا بکرش رو هم خیلی دوست دارم.</description>
        <language>fa</language>
        <pubDate>2026-06-10 13:03:38</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/21827/avatar/Vu26p6.png?height=120&amp;width=120</url>
            <title>داریوش مهدی پور یقینی</title>
            <link>https://virgool.io/@dmahdipour</link>
        </image>

                    <item>
                <title>باید چیا رو بلد باشیم؟!</title>
                <link>https://virgool.io/@dmahdipour/%D8%A8%D8%A7%DB%8C%D8%AF-%DA%86%DB%8C%D8%A7-%D8%B1%D9%88-%D8%A8%D9%84%D8%AF-%D8%A8%D8%A7%D8%B4%DB%8C%D9%85-l0ubmcrvs6td</link>
                <description>پای اجرا که میاد، دیگه مهارته که حرف اول رو می زنه. باید یه عده از مهارت  های ویژه رو داشته باشیم تا بتونیم کار واقعی در اینچیه رو پیش ببریم. قصد دارم تا  اون چیزهایی که لازمه بلد باشیم تا این ایده و پروژه رو جلو ببریم رو لیست  کنم. شاید لیستم تو ابتدای کار ناقص باشه، ولی سعی می کنم رفته رفته تکمیل  ترش بکنم.کتابخانه مناسب دیتا اسکرپچون قراره دیتا ست رو خودمون جمع کنیم، لازمه تا کار کردن با یکی از کتابخانه های رایج اسکرپ رو بلد باشیم. فعلا Beautiful Soup جدی ترینن گذینه ای یه که سراغ دارم. خیلی راحت نصب می شه و کار کردن باهاش هم آسونه.فریم ورک یادگیری ماشینبرای این که مجبور نباشیم خودمون تمامی ملزومات یک مدل  یادگیری ماشین و یا یادگیری عمیق رو از جز پیاده سازی کنیم، منطق حکم می  کنه از یک فریم ورک یادگیری ماشین استفاده کنیم. از میان گذینه هایی که  وجود دارن، انتخاب ما pytorch هست.و ....علاوه بر این دو مورد پایه و اصلی که گفته شد، لازمه تا با Numpy ، Pandas و scikit-learn کار  کرده باشیم. فک کنم برای یه شروع اولیه همینا لازم باشن. رو اینا تمرکز می  کنیم و با اینا کارای پروژه رو جلو می بریم. هر جایی هم لازم شد مورد  جدیدی به لیست توانمندی ها اضافه بشه، این پست و لیست رو آپدیت می کنم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 02 Dec 2023 09:27:28 +0330</pubDate>
            </item>
                    <item>
                <title>انتخاب دسته بندی های کلی و جزئی تر</title>
                <link>https://virgool.io/@dmahdipour/%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%AF%D8%B3%D8%AA%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D9%87%D8%A7%DB%8C-%DA%A9%D9%84%DB%8C-%D9%88-%D8%AC%D8%B2%D8%A6%DB%8C-%D8%AA%D8%B1-wj6l5xalupej</link>
                <description>تا حالا تونستیم تا یه حدی کار جمع آوری تصاویر رو برای آموزش در مدل اینچیه پیش ببریم.  در حین کار بایستی حواسمون به انتخاب دسته های کلی هم باشه. با بررسی هایی  که داشتیم به این نتیجه رسیدیم که دسته بندی ها رو از کلی به جزئی انتخاب  کنیم. تا به اینجا به 6 دسته بندی کلی رسیدیم که رفته رفته داریم تکمیل ترش  می کنیم. سعی خواهیم داشت که تعدادشون رو از 10 دسته بیشتر نکنیم و به جای  افزودن بر دسته های کلی، اون ها رو به زیر دسته های والدها تبدیل کنیم.# موجود زنده (جاندار)اولین دسته بندی که به ذهنمون رسید (و معمولا به ذهن همه می  رسه) موجودات زنده هستند. یه سری از خاطرات درس های علوم کمک گرفتیم و یه  سری رو هم تحقیق کردیم. به صورت کلی بخوام بگم انسان، حیوان، حشرات و گیاهان زیر  دسته های اصلی این دسته بندی هستند که هر کدوم زیر دسته های زیادی رو شامل  میشن که رفته رفته میخوایم تکمیل ترش کنیم. در به نظرم اینجا ذکر چند نکته  ضروری هست.نکته 1: منتظر نکته نظرات دوستان هستیم تا  ما رو کمک کنن بتونیم دسته بندی های بهتر و معقول تری رو ارائه بدیم. لطف  می کنین تو کامنت ها بنویسین برامون.نکته 2: برای قرار دادن تصاویر در مطلب از نوشته های دستی استفاده کردیم. می تونستیم تایپ کنیم ولی به نظرم صمیمی تر و اثربخش تر میومد.نکته 3: امکان تغییر این دسته بندی ها در  آینده وجود داره و همچنین وجود زیردسته های تکراری در مواردی غیرقابل  اجتناب بوده که اگر راهکاری به نظرتون اومد، مشتاقان در خدمتت دوستان  هستیم.# ابزارآلاتدسته دومی که همه ی ما در دنیای امروزی باهاشون سر و کار داریم، ابزارآلاتی هستند که برای کارهای برش یا سرواخکاری، جوشکاری و یا اتصال دو یا چند چیز به هم استفاده میشه، انبرها که برای گرفتن و نگه داشتن لوازم دیگر، چکش ها و ضربه زن ها، پیچ گوشتی ها که به طور کلی برای سفت کاری و شل کردن قطعات استفاده میشه و در نهایت لوازم ریزتر استفاده میشن.# وسایط نقلیهنیاز به جابجایی از نقطه ای به نقطه ی دیگر همیشه موجب  اکتشافات جدید در این راستا شده که ما هم به طبع اون این وسایل رو به عنوان  دسته بندی کلی دیگری انتخاب کردیم. همونطوری که در ادامه و در تصویر زیر  می بینین، از نظر ما تجهیزات حمل و نقلی به سه زیردسته زمینی، هوایی، و دریایی تقسیم میشن.# تجهیزات الکترونیکیفکر نمی کنم تو دنیای امروزی کسی رو سراغ داشته باشیم که با  این دسته کار نداشته باشه و یا ندیده باشدشون. به نظر می رسه که به دلیل  تفاوت ظاهری که دارن بایستی کامپیوترها رو از لپ تاپ ها جداکرد.گوشی ها و تبلت ها  رو می شه در یک گروه قرار داد چون از لحاظ ظاهری تفاوت چندانی ندارن. چرا  هی می گم از لحاظ ظاهری؟ چون شناسایی ما (فعلا) از روی ویژگی های ظاهری  خواهد بود. دستگاه های ATM، POS و این قبیل رو در یک دسته قرار دادیم و در نهایت قطعات الکترونیک ریزتر رو به عنوان زیر دسته نهایی این دسته انتخاب کردیم.# لوازم خانگی و اداریاینا چیزهایی هستند که دائمه در اطافمون می بینیمشون. چه در خونه ی خودمون، چه دوستان و آشنایان و چه در اداره جات. لوازمی که برای شستشو، آشپزی، روشنایی یا مرتبط با برق و در نهایت تفریحی و به نوعی کاری استفاده می شه.# املاک و مستغلاتدر حال حاضر (ممکنه بعدها مطلب به روز بشه) آخرین دسته ی کلی  که تونستیم انتخاب کنیم، املاک و مستغلات هست که به سه زیر دسته کلی  مسکونی، تجاری و باغی یا ویلایی تقسیم شدند که همونطور که در تصویر می  بینین، فعلا نسبت به بقیه دسته هایی که تا به حال بهشون اشاره شده، نیازمند  افزودن جزئیات بیشتری هست.نکته آخر اینکه همچنان به کمکتون نیاز داریم تا این انتخاب رو بهبود بدیم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Tue, 31 Oct 2023 11:13:53 +0330</pubDate>
            </item>
                    <item>
                <title>زبان های برنامه نویسی</title>
                <link>https://virgool.io/@dmahdipour/%D8%B2%D8%A8%D8%A7%D9%86-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-enm3j3yrm27x</link>
                <description>انتخاب زبان برنامه نویسی که بتونه نیازهای ایده و پروژه رو تامین کنه کار  حساس و نسبتا سختیه. تنوع زبان های برنامه نویسی با قابلیت های بسیاری که  هر زبان ارائه می ده نیز تا حد بسیار زیادی این انتخاب رو مشکل تر می کنه. در پروژه اینچیه باید زبانی انتخاب کنیم که تا حد ممکن یک سرو گردن از سایر زبانها  بالاتر باشه.سعی ما این هست که زبان مناسب رو بر مبنای کارکردش انتخاب کنیم نه اینکه  صرفا زبانی باشه که اونو بلدیم. شاید اینجوری یه زبان برنامه نویسی جدیدی  هم یاد بگیریم و این چالش یک زبان برنامه نویسی دیگه هم به مهارت هامون  اضافه کنه. لیست کوتاهی که داریم، پایتون(Python) سی پلاس پلاس(C++)   قو(Go) و جاوا(Java) هستش.پس از بررسی آیتم هایی مثل سرعت و سادگی کدنویسی پایتون از این لیست   اومد بالا و تصمیم ما توسعه ی ایده مون با استفاده از پایتون شد. زبان  پایتون همانگونه که توسعه دهنده ی اون گفته، تلاش داره تا کدنویسی ساده تر  بشه. در حال حاضر از زبان پایتون در اکثر حوزه های هوش مصنوعی، یادگیری  ماشین و یادگیری عمیق به صورت گسترده استفاده می شود. پایتون همچنان بهترین  گزینه برای انجام پروژه‌های بزرگ و پیچیده است و به‌خوبی می‌تواند نیاز  توسعه‌دهندگان را رفع نماید. پایتون به دلیل open source بودن و داشتن  کتابخانه‌های بسیار برای بخش‌های مختلف از داده‌کاوی تا پردازش گفتار و  پردازش زبان طبیعی مورد توجه متخصصان این حوزه ها می باشد.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Wed, 18 Oct 2023 09:27:29 +0330</pubDate>
            </item>
                    <item>
                <title>دیتا اسکرپ</title>
                <link>https://virgool.io/@dmahdipour/%D8%AF%DB%8C%D8%AA%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%D9%BE-vk7ieg9dbakh</link>
                <description>یکی از راه های دسترسی به دیتا ستی که بتونیم روش مدل مونو ترین کنیم،  اسکرپ کردن دیتا هست. تکنیک دیتا اسکرپ اجازه می ده تا دیتای مورد نظر رو  از بستر اینترنت و وب سایت های مختلف جمع آوری کنیم. تو پروژه اینچیه، به  تعداد خیلی زیادی تصویر لیبل گذاری شده تو کلاس های مختلف نیاز داریم تا  نتیجه ترین مدل خوب دربیاد.برای شروع اسکرپ باید، بگردیم و سایت هایی رو پیدا کنیم که تصاویر لیبل  گذاری شده داشته باشن. شاید به صورت صریح و دقیق تصاویر لیبل گذاری شده  نباشه، ولی تا حدودی هم لیبل تصویر نزدیک به کلاس بندی اش باشه می تونه  کارمونو راه بندازه.این تصویر از سایت دیجی کالا،  محصولات قسمت پوشاک، پوشاک مردانه و کفش ور نشون میده. می شه تصاویر این  قسمت رو ذخیره کرد و برای تارگت سه لیبل گفته شده رو بهش تخصیص داد.حسب  اینکه دسته بندی مون قراراه تا چند سطح باشه، می شه لیبل ها و تارگت های  مختلفی رو به تصاویر تخصیص داد. تا اینجای کار یه چیزی واضح و روشنه و اون  هم اینکه به حجم خیلی بالایی از نمونه ها احتیاج داریم که تعداد زیادی از  کلاس ها رو پوشش بده. اول از همه می خوایم لیست دسته بندی هامونو دربیاریم و  بر مبنای لیستی که داریم تصویر مرتبط جمع کنیم.یه کار خوبی که می خوایم  بکنیم اینه که دیتاست هایی که جمع کردیم و لیبل گذاری کردیم رو هم به صورت  رایگان در اختیار علاقمندای این کار قرار بدیم. انشالله بدرد بخور باشه.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 07 Oct 2023 10:54:21 +0330</pubDate>
            </item>
                    <item>
                <title>چه دیتاستی به درد اینچیه می خوره؟</title>
                <link>https://virgool.io/@dmahdipour/%DA%86%D9%87-%D8%AF%DB%8C%D8%AA%D8%A7%D8%B3%D8%AA%DB%8C-%D8%A8%D9%87-%D8%AF%D8%B1%D8%AF-%D8%A7%DB%8C%D9%86%DA%86%DB%8C%D9%87-%D9%85%DB%8C-%D8%AE%D9%88%D8%B1%D9%87-svqrfpspmvhk</link>
                <description>برای اینکه بتونیم مدل مدنظر برای اینچیه رو ترین کنیم و توسعه بدیم باید  دیتاست مناسب برای این کار رو پیدا کنیم. پس لازمه اول بدونیم دیتاستی که  بهش نیازداریم دقیقا چه ویژگی هایی داره و ساختارش باید چجور باشه. این  ویژگی ها رو بر مبنای عملکردی که از اینچیه مد نظرمون هست در میاریم.انتظاری که ما از اینچیه داریم اینه که هر تصویری بهش داده می شه، کلاس  های متناسب با اون تصویر رو بده. با این تعریف می شه فهمید که ما با یک  مساله کلاسبندی تصویر روبرو هستیم و متناسب با اون دیتاست انتخاب کنیم.  دیتاست های مناسب برای کلاس بندی دیتاست هایی هستن که لیبل یا تارگت هر  تصویر هم مشخص باشه. یعنی دیتای آموزشی کلاسش هم مشخص باشه. یکی از مهمترین  و معروفترین دیتاست ها برای آموزش مدل کلاسبند تصویری دیتا ست CFAR-10  هست.این دیتا ست 60 هزار تا تصویر داره که تمامی این تصاویر تو ده دسته قرار گرفتن.این دیتاست از نظر تعداد تصویر برای ترین مدل خیلی خوبه ولی یک مشکل اساسی  داره و اون هم اندازه تصاویر هستش. نمونه های این دیتا ست تو اندازه های 32  در 32 پیکسل تهیه شدن. عملا تصاویری که کاربرا برای کلاس بندی به اینچیه  ارسال خواهند کرد خیلی بزرگ تر از این تصاویر خواهند بود. پس باید دیتا ستی  که استفاده می کنیم اندازه نمونه هاش از این بزرگتر باشه. علاوه بر این  دیتاستی که می خوایم باید برای هر تارگت چندین کلاس سلسله مراتبی برای  نمونه ها تارگت زده بشه. مثلا وقتی یک تصویر از سگ بهش داده بهش بتونه اونو  کلاس های حیوانات، سگ ها، سگهای پاکوتاه و ... دسته بندی کنه. با این  تفاسیر ممکنه لازم باشه ما دیتاست مناسب برای کارخودمون رو با اسکرپ کردن  اطلاعات تو سایت های مختلف جمع آوری کنیم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:40:04 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت و دسته بندی دیتا ست ها</title>
                <link>https://virgool.io/@dmahdipour/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%88-%D8%AF%D8%B3%D8%AA%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7-%D8%B3%D8%AA-%D9%87%D8%A7-wcqlzad0lwpg</link>
                <description>در پست قبلی به این موضوع اشاره کردیم که دیتا ست ها مجموعه ای از داده ها  هستند. وقتی بحث در مورد مجموعه ها رو داریم، از روی همین تعریف نتیجه می  گیریم که نوع خود داده ها تا حد زیادی می تواند دسته بندی دیتا ست را مشخص  نماید. یک از فواید این جداسازی افزودن دیتای جدید به دسته ی مربوطه است.  هر کتابخانه یا موسسه ای (Google Dataset Search, Kaggle, Amazon, Github و  ...) که در این زمینه فعالیتی داشته، دسته بندی های متفاوتی رو ارائه داده  ولی تو این مطلب می خوایم به بررسی تعدادی از مهمترین آن ها از نظر اینچیه بپردازیم.متنیتصویریصوتیعددیطبقه بندی شده# متنیاین نوع از دستا ست های ورودی های ماشین های پردازش زبان (NLP)  هستند و همانطور که از اسمشون مشخص هست، مجموعه از متون و اسناد متنی  هستند که می تونن طیف وسیعی از اخبار، مقالات، کتاب ها، خوراک سایت، لغت  نامه ها و از این قبیل موارد زا دربرگیرند. از بزرگترین و مشهورترین دیتاست  در این دسته بندی می توان به مجموعه ویکی پدیا اشاره نمود که در تهیه Word net (که بعدا در موردشون مطلبی خواهیم داشت) استفاده می شود.# تصویریاز آنجایی که نسبت به بقیه موارد نتایج ملموس تری داشته و  منابع بیشتری برای تهیه تصاویر وجود دارد، احتمالا بیشترین جذابیت برای  مخصوصا نوآموزان، کار با این نوع دیتاست هاست. کتابخانه هایی مانند TorchVision اقدام به تهیه دیتاست های کوچک مانند FashionMNIST (مجموعه ی تصاویر لباس  در 10 دسته ی مختلف) و CIFAR10 (مجموعه تصاویر حیوانات و وسایل نقلیه در 10  دسته ی مختلف)  برای این افراد نموده اند. همچنین برای اونهایی که قصد  دارن پروژه های بزرگتری انجام بدن یا از دیتاست های Kaggle و امثال آن استفاده می کنند و یا در نهایت خود اقدام به تهیه دیتای مورد نیازشان می نمایند.# صوتیشناسایی صدا و استخراج متن از آنها دو نمونه از کاربردهای  وسیع این نوع دیتا ست است. مکالمات موجود در فیلمها، انیمیشن ها، اخبار،  برنامه های رادیویی و سخنرانی ها بهترین منابع جمع آوری این نوع داده  هستند. یکی از نمونه های موجودر در منابع Kaggle که با نام Speaker Recognition Audio Dataset مشخص شده است مجموعه از 50 سخنرانی بیش از یک ساعتی می باشد.عددیمجموعه ای از اطلاعات آماری و ریاضی در درون این دسته بندی ها  جای می گیرند. اگر بخواهیم بهتر با مفهوم این دیتا ست ها آشنا شویم می  توان آن ها را به مانند جداولی از اعداد در نظر گرفت که هر کدام مقداری از  یک ویژگی خاص را نشان می دهد. مثلا اگر بخواهیم موقعیت خانه ها را در یک  شهر داشته باشیم می توانیم مقادیر عرض و طول جغرافیایی آن ها را در قالب  جدولی داشته باشیم. از جمله معرفترین این نوع دیتا ست ها مجموعه های  کتابخانه Scikit-learn هستند که به صورت نقاط رنگی در نمودارهای مختلف قابل ارائه هستند.# طبقه بندی شدهیکی دیگر از مجموعه های ساده برای کارهای کوچک و مخصوصا دسته بندی های دوتایی (Binary classification)  داده هایی هستند که با یک مقدار صفر و یک ویا دست و غلط و امثال آن ها  مشخص می شوند. برای درک بهتر می توان مثال مرد و زن بودن افراد جامعه را  مثال زد. در این میان، میتوان مقدار یک برای زن بودن و صفر برای مرد بودن  بکار برد.دسته بندی براساس برچسباز منظری دیگر می توان اطلاعات را براساس این که هدف و یا  برچسب مشخصی دارند و یا نه نیز دسته بندی نمود. بر این اساس اگر برای هر  نمونه از دیتا ست ها نام خاصی در نظر گرفته شد، یا در پوشه ی خاصی قرار  داده شد که از دیگر دیتا ها مجزا گردند و یا در موارد عددی، ستون مجزایی  برای نمایش خروجی آن نمونه در نظر گرفته شند، به عنوان دیتاست های برچسب  دار شناخاته خواهند شد. درغیرانصورت بدون برچسب خواهند بود. در موارد نیز  می توان شاهد اطلاعات تلفیقی نیز بود که با روش هایی از جمله استفاده برچسب  دار ها برای آموزش و بدون برچسب ها برای آزمایش، این مشکل را نیز مرتفع  ساخت.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:36:50 +0330</pubDate>
            </item>
                    <item>
                <title>دیتا ست!</title>
                <link>https://virgool.io/@dmahdipour/%D8%AF%DB%8C%D8%AA%D8%A7-%D8%B3%D8%AA-aisv9x3rieao</link>
                <description>یکی دیگر از چالش هایی که پیش بینی می کردیم تو مسیر اینچیه بهش بر بخوریم، چالش و  یا بهتره بگم ابر چالش دیتا ست (Data set) هستش. دیتاست ها مجموعه ای از  داده ها هستن که در فرآیند یادگیری ماشین استفاده می شن. هر نمونه در دیتا  ست مستقل از سایر نمونه هاست و ستون های دیتا ست هم ویژگی های خاصی رو نشون  می دن. دیتا ست ها در بحث یادگیری ماشین و توسعه ی سیستم های هوشمند واقعا  نقش مهمی ایفا می کنن. عملا ماشین چیزی رو یاد میگیره که دیتاست به خوردش  می ده.چیزی که ما تو اینچیه قراره بهش برسیم مدلی هوشمند برای کلاس بندی تصاویر  هستش. ماشین یه تصویر رو از کاربر می گیره و کلاس هایی که این تصویر بهشون  اختصاص داره رو به عنوان خروجی می ده. مثلا اگه عکس یه اردک به مدل داده  بشه باید بتونه تشخصی بده که تصویر یک حیوان، یک پرنده و در نهایت اردک  هستش و کلاس های اونو به عنوان خروجی نمایش بده.برای اینکه همچین مدلی داشته باشیم باید از روش های یادگیری ماشین با ناظر مدل مون رو آموزش بدیم. برای این نوع آموزش هم باید دیتا ست مون شامل نمونه ها و تارگت  هاشون باشه. یعنی هر نمونه کلاس هایی که بهش تعلق داره هم مشخص بشه. هرچه  تعداد نمونه های دیتا ست بیشتر باشه مدل هوشمند عملکرد بهتری تو تشخیص خواهد داشت. در ادامه این  مسیر باید بگردیم و دیتا ست های مناسب این کار رو پیدا کنیم. شاید هم مجبور  بشیم خودمون دیتا ست هایی رو تولید کنیم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:31:27 +0330</pubDate>
            </item>
                    <item>
                <title>تا حالا تو اینچیه چیکارا کردیم؟</title>
                <link>https://virgool.io/@dmahdipour/%D8%AA%D8%A7-%D8%AD%D8%A7%D9%84%D8%A7-%D8%AA%D9%88-%D8%A7%DB%8C%D9%86%DA%86%DB%8C%D9%87-%DA%86%DB%8C%DA%A9%D8%A7%D8%B1%D8%A7-%DA%A9%D8%B1%D8%AF%DB%8C%D9%85-ffdbnt9yir7q</link>
                <description>تا به امروز سخت ترین قدم اینچیه یعنی شروع رو پشت سر گذاشتیم. حالا داریم با  برنامه ریزی هایی که قبلا انجام دادیم به پیش می ریم. بر همین اساس نیاز به  یک سری ابزارها از جمله وبلاگ، مدیریت وظایف، صفحات اجتماعی، گیت هاب و  اسکریپت‌های کاربردی داشتیم که در ادامه به اونها می پردازیم.وبلاگمدیریت وظایفصفحات اجتماعیگیت هاباسکریپت‌های کاربردی# وبلاگبرای اینکه بتونیم مطالب رو بصورت سازماندهی شده ارائه کنیم نیاز به وبلاگ داشتیم. اولش خواستیم صفر تا صدش رو تو فریم ورک فلسکِ پایتون (Flask) پیاده سازی کنیم، شروعش خوب بود ولی دیدیم خیلی زمان بر خواهد بود  و عملا از پروژه اصلی دورمون نگه می داره. بنابراین با مشورتی که با اعضای  گروه داشتیم تصمیم بر این شد که از یه پروژه ای که از قبل طراحی کرده  بودیم (و البته به زبان دیگه ای بود) استفاده کنیم و با اعمال تغییرات کمی  به عنوان CMS وبلاگمون استفاده کنیم. برای ایندکس بهتر و رو به جهانی رفتن، تصمیم گرفتیم که مطالب رو به صورت دو زبانه ارائه بدیم.# مدیریت وظایفیکی از ابزارهای ضروری برای تقسیم کارها مابین اعضای تیم،  زمان بندی و مدیریت آنها استفاده از این ابزارها است که ما تصمیم گرفتیم از  تسکولو برای این کار استفاده کنیم. در ابتدا دو پروژه به نام های تولید محتوی و توسعه فنی وب سایت ایجاد کردیم و وظایف رو براساس توانایی های گروه نوشتیم و زمانبندی کردیم.  هرکی براساس وقت، دانش و البته اولویت پروژه ها یکی رو از حالت ToDo به  Doing و بعد از اتمام به Done منتقل می کرد.# صفحات اجتماعیبرای این که بتونیم ارتباطات خوبی داشته باشیم حتما بایستی مطالبمون رو تو این صفحات انتشار داده و به جمعیت بزرگتری به اشتراک بزاریم. اولویت رو روی لینکدین قرار دادیم. در ادامه، کار رو در اینستاگرام و  تلگرام گسترش دادیم. برای اینکه اهمیت وبلاگ رو حفظ کنیم، خلاصه مطالب رو در این  صفحات انتشار داده و لینک مطالب رو برای مطالعه بیشتر در اختیار قرار  دادیم.# گیت هابیکی از بهترین محل هایی که برای مدیرت نسخه های مختلف می توان  استفاده کرد، گیت هست. اولین کاری که به محض ایجاد حساب کاربری کردیم،  تشکیل یک سازمان بود. با این  کار می تونستیم خودمون رو عضوی از یک سازمان بدونیم. از اونجایی که وبلاگ  های موجود در گیت بسیار پرطرفدار هستند، بعد از فورک ریپازیتوری مربوطه، مطالب انگلیسی رو در اون هم به اشتراک میگذاریم.# اسکریپت‌های کاربردییکی از اهداف ما (همونطوری که از شروع ماجرا گفته بودیم)  اشتراک کدهایی هست که می نویسیم. از همین رو قسمتی رو در وبلاگ (سمت چپ) با  این نام قرار دادیم تا کدهای مورد استفاده رو در اونجا منتشر کنیم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:27:58 +0330</pubDate>
            </item>
                    <item>
                <title>اینچیه، چجوری کار خواهد کرد؟!</title>
                <link>https://virgool.io/@dmahdipour/%D8%A7%DB%8C%D9%86%DA%86%DB%8C%D9%87-%DA%86%D8%AC%D9%88%D8%B1%DB%8C-%DA%A9%D8%A7%D8%B1-%D8%AE%D9%88%D8%A7%D9%87%D8%AF-%DA%A9%D8%B1%D8%AF-yfi0f06o1er1</link>
                <description>ایده اینچیه از اسمش پیداس. قراره هر چیزی رو که نتونستین شناساییش کنین و  بفهمین چیه، عکسشو بفرستین تا اینچیه بهتون بگه چی هست. تا اینجای کار شمای  کلی از ایده ی پنهان پشت سر اینچیه دات آی آر مشخص شد. از نظر فنی می شه  گفت، که  در پی توسعه مدلی برای کلاس بندی تصاویر هستیم. ما مدلی رو توسعه  خواهیم داد و ترین خواهیم کرد که بتونه تصویر ارسالی از طرف کاربر رو تو  کلاس های مختلف کلاس بندی کنه.شاید برای شما هم پیش اومده باشه، که چیزی پیدا کردین یا دیدین که نمی  دونین چیه. ایده ی ما تو اینچیه اینه که این چالش رو براتون رفع کنیم. یعنی  اگه نتونستین تشخیص بدین چیزی که به دوست تون رسیده یا پیدا کردین چی هست  اصلا، از اینچیه دات آی آر کمک بگیرین. تو اینچیه دات آی آر ما تلاش می  کنیم سیستم کلاسبندی تصویری رو توسعه بدیم، که تصاویر ارسالی رو در حد قابل  قبولی کلاسبندی بکنه. برای این کار ما از مدل های هوشمند حوزه یادگیری  ماشین، بینایی ماشین و یادگیری عمیق بهره خواهیم برد. طبیعتا تعداد کلاس  های خیلی زیاد خواهد بود. پس ما باید در مرحله اول در مورد تعداد کلاس ها و  یا حتی کلاس بندی سلسله مراتبی فکر بکنیم. علاوه بر این یکی دیگه از اساسی  ترین چالش های پیش رو چالش جمع آوری دیتا ست برای ترین مدل هست. در ادامه و  در طول مسیر در مورد روش هایی که بتونیم این چالش ها رو رفع کنیم، براتون  می نویسیم.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:23:53 +0330</pubDate>
            </item>
                    <item>
                <title>شروع پروژه ی &quot;اینچیه؟&quot;</title>
                <link>https://virgool.io/@dmahdipour/%D8%B4%D8%B1%D9%88%D8%B9-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%DB%8C-%D8%A7%DB%8C%D9%86%DA%86%DB%8C%D9%87-q9nc6fvdothh</link>
                <description>فکر کنم همه مون موافق این مطلب باشیم که شروع هر کاری سخت ترین قسمت اون  کار هست. چرا؟ چون سختی های خودشو داره. نمی دونی اصلا باید از کجا شروع  کنی. بعضی وقتها اصلا نمی دونی باید شروع کنی یا نه. بعد از حدودا سه چهار  سال فکر کردن و بحث های بسیار، بالاخره تصمیم گرفتیم شروع کنیم...خوب!و اما فهرست مطالبی که تو این پست می خونین:تولد یک ایدهاین چیهبه درد من میخوره؟خودمونی و مفیدچطوری میتونین با ما در ارتباط باشین؟مسیر پیش رو# تولد یک ایدهایده ی این چیه به چند ماه پیش برمی گرده زمانی که ما به  دنبال انجام یه پروژه ی یادگیری عمیق با تفکر و ایده ای نو می گشتیم. روی  کلاسیفایرهای تصویری کار می کریدیم و حتی یه پروژه برای تولید اشکال نوشته  بودیم (که روی گیتمون هست). نتیجه Train هامون زیاد خوب نبود، حدود 70 درصد Accuracy داشتند. مدل های Torch Vision Pretrained رو روش اعمال کردیم و نتیجه رو تا 85 درصد افزایش دادیم ولی هنور برامون  راضی کننده نبود تا اینکه یه فکری به سرمون زد. جزئیات ایده رو تو پست های  آینده بحث خواهیم کرد ولی کلیات رو در ادامه می گیم براتون.# این چیههمون طوری که حتما از اسمش حدث زدین، یه پروژه ای هست که  معکسی رو ازتون میگیری و بهتون میگه که چی هستش. البته یه فکرهای بزرگتری  راجع بهش داریم که باهاتون خواهیم بود. متاسفانه تو زبان خودمون یه همچین  چیزی رو ندیدیم. نمونه ی خارجی رو نمی تونیم با اطمینان بگین چراکه همیشه  یه منابعی هستند که ما بهشون دسترسی نداریم. یه چیزهای ماورای Cfar-100 و اینا. # به درد من میخوده؟به نظر ما این وبلاگ می تونه برای همه مفید باشه مخصوصا اونایی که تو زمینه برنامه نویسی، یادگیری ماشین به خصوص یادگیری عمیق فعالیت دارن. ولی کسایی که مثل ما نمی دونستند از کجا شروع کنن و در ادامه چیکارا بکنن می تونن بیشترین بهره رو از مطالبش ببرن.# خودمونی و مفیدبرخلاف خیلی از وبلاگ هایی که خوندن مطالبشون، خسته کننده  میشه (شاید چون خیلی کلیشه ای می نویسند) ما دوست داریم خیلی خودمونی  بنویسیم و مفید برای خواننده. متعهدیم که یه چیز مفیدی رو ارائه بدیم و وقت  خوانندمون رو بی خودی نگیریم که شاید بتونه چراغ راهی براش باشه.# چطوری میتونین با ما در ارتباط باشین؟به نظرمون میاد که سریع ترین راه می تونه کامنت های هر پستی باشه (البته اگر ارتباط با موضوع داشته باشه)اگه چیزی خواستین که خارج از مطالب پستی بود می تونین بهمون ایمیل بزنین inchiyeh.ir@gmail.comمی تونین صفحات اجتماعی مون رو که در سمت چپ بلاگ قرار داره رو دنبال کنین.خلاصه هر جوری که راحتین# مسیر پیش روهمون طوری که توضیح دادیم مسیر پیش روی ما مشخص هست. رفته  رفته که کارهای رو با هم به اشتراک گذاشتیم، مشکلات رو بیان کردیم و از  نظرات دوستان متخصص (شما خوانندگان عزیز) بهره بردیم، دوستانی که حاضر به  همکاری باشند رو هم به جمعمون اضافه خواهیم کرد.منبع: اینچیه</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 30 Sep 2023 12:13:32 +0330</pubDate>
            </item>
                    <item>
                <title>فصل هفدهم آموزش پایتون مقدماتی - مدیریت خطاها</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D9%87%D9%81%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AE%D8%B7%D8%A7%D9%87%D8%A7-nv2pqfclbuuq</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh پایتون دارای دو ویژگی بسیار مهم برای مدیریت خطاهای غیرمنتظره و افزودن امکان اشکال‌‌زدایی در برنامه‌‌های شماست که در ادامه به بررسی هر یک خواهیم‌‌پرداخت.17-1- مدیریت خطاها و استثنائات[1]در این فصل از کتاب، بیشتر در مورد این نوع خطاها بحث خواهیم‌‌کرد. لیستی از خطاها و استثنائات استاندارد را به همراه توضیحات، در شکل (17-1) مشاهده می‌‌کنید.شکل (17-1)[1]Exceptions17-2- اظهارات و ادعاها[1]هر ادعا، یک بررسی عقلانی است که برای شروع تست برنامه‌‌ی خودتان، می‌‌توانید آن را روشن نموده و برای اتمام کار، آن را خاموش‌‌نمایید. به عبارت دیگر، هر ادعا، معادل دستور raise-if و به طور دقیق‌‌تر، raise-if-not است. در این دستور، عبارت مدنظر بررسی می‌‌شود. اگر نتیجه‌‌ی بررسی، Flase بود، یک پیغام خطا صادر می‌‌شود.ادعاها، توسط دستور assert اجرا می‌‌شوند. این دستور در پایتون نسخه‌‌ی 1.5 معرفی شده‌‌است. به طور معمول، برنامه‌‌نویسان از آن‌‌ها برای بررسی ورودیِ معتبر تابع، در ابتدای تابع و بررسی خروجی معتبر آن، پس از فراخوانی تابع، استفاده می‌‌کنند.[1]Assertion17-3- دستور Assertوقتی پایتون با یک دستور assert مواجه می‌‌شود، دستورات همراه آن را از لحاظ درستی، ارزیابی می‌‌کند. اگر دستورات، نادرست‌‌باشند، پایتون یک AssertionError را صادر می‌‌کند. اگر خود دستور با اشکال مواجه‌‌شود، پایتون از ArgumentExpression به عنوان آرگومان AssertionError استفاده می‌‌کند.این خطا می‌‌تواند مانند هر خطای دیگری به وسیله‌‌ی بلوک دستوری try-except استفاده‌‌شود. اما اگر عمل‌‌نکرد، برنامه را خاتمه‌‌داده و یک traceback ایجاد می‌‌کند.مثال شکل (17-2)، نمایان‌‌گر تابعی‌‌است که درجه‌‌ی حرارت را از کلوین[1] به فارنهایت[2] تبدیل می‌‌کند. از آن جایی که صفرِ کلوین، سردترین نقطه است، مقدار منفی برای تابع، به منزله‌‌ی خطا می‌‌باشد.شکل (17-2)نتیجه‌‌ی اجرای این مثال، به صورت شکل (17-3) است. همان طوری که مشاهده می‌‌کنید، برای مقدار منفی خطای مدنظر، صادر می‌‌شود.شکل (17-3)[1]Kelvin [2]Fahrenheit17-4- یک Exception چیست؟این کلمه، دارای معانی مختلفی است که در مهندسی کامپیوتر، بیشتر در معانی استثناو خطا مورد استفاده قرار می‌‌گیرد. هر استثنا یک رویداد[1] است که در طی اجرای یک برنامه رخ می‌‌دهد. این رویداد، جریان عادی دستورالعمل‌‌های برنامه را با اختلال مواجه می‌‌کند. به طور کلی، زمانی که یک اسکریپت پایتون، با وضعیتی مواجه‌‌‌‌شود که نمی‌‌تواند آن را مدیریت کند، یک خطا یا استثنا را تولید می‌‌کند. در نهایت می‌‌توان گفت که، هر استثنا، یک شی پایتون است که خطایی را نشان می‌‌دهد. هنگامی که برنامه‌‌ی پایتون یک استثنا را ایجاد ‌‌کند، دو حالت پیش‌‌رو دارد. یا باید بتواند آن را مدیریت‌‌کند ویا برنامه را خاتمه‌‌دهد.[1]Event17-5- مدیریت خطا و استثنااگر کد مشکوکی دارید که احتمال رخ‌‌داد خطای برنامه را افزایش می‌‌دهد، با قراردادن آن در بین بلوک try: می‌‌توانید از برنامه‌‌ی خود در مقابل این احتمال محافظت‌‌کنید. بعد از بلوک مذکور، یک دستور except: به همراه یک بلوکِ کد حاوی روش‌‌های مدیریت خطا، خواهیم‌‌داشت. شمای کلی این دستور به شکل (17-4) است.شکل (17-4)در ادامه‌‌ی مطلب، چند نکته‌‌ی مهم را در رابطه با این شمای کلی ذکر می‌‌کنیم.هر دستور try می‌‌تواند دارای چندین دستور except باشد. این نکته زمانی می‌‌تواند مفید‌‌باشد که امکان صدور چندین استثنا برای یک بلوک، وجود داشته‌‌باشد.شما می‌‌توانید برای مدیریت همه‌‌ی استثناها، یک عبارت استثنای عمومی ارائه‌‌دهید.بعد از عبارات except می‌‌توان یک عبارت else اضافه‌‌نمود. اگر هیچ یک از استثنائات تعریف‌‌شده، رخ‌‌ندادند، از این بلوک استفاده می‌‌شود. این بلوک برای کدهایی که نیازی به محافظت در برابر خطا ندارند نیز کاربرد دارد.شکل (17-5)، مثالی از بازکردن فایل و نوشتن متن در آن را نشان می‌‌دهد.شکل (17-5)با اجرای این مثال، خروجی برنامه، به شکل (17-6) خواهد بود. همان طوری که می‌‌بینید، به دلیل عدم وجود هرگونه خطای I/O ، متن مدنظر، در فایل مربوطه نوشته‌‌شده و موفقیت‌‌آمیز بودن کار، با عبارتی که در قسمت else داشتیم، نمایش داده‌‌شد.شکل (17-6)حال به مثال شکل (17-7) توجه‌‌کنید. در این مثال، یک استثنا را برای حالتی نوشتیم که فایل مدنظر موجود‌‌ نیست و ما سعی در بازکردن آن داریم. با اجرای مثال، عبارت مربوط به خطا، در خروجی چاپ خواهدشد. خروجی آن به شکل (17-8) می‌‌شود.شکل (17-7)شکل (17-8)17-6- عبارت Except بدون نوع مشخصشما می‌‌توانید از این عبارت بدون مشخص‌‌نمودن نوع استثنای آن، استفاده‌‌کنید. این نوع از try-except، می‌‌تواند تمام رخ‌‌داد استثناها را مدیریت‌‌کند. با وجود این که، نوع مذکور، با پوشش تمام خطاها، می‌‌تواند کار را برای برنامه‌‌نویس راحت‌‌تر نماید، همچنان نمی‌‌تواند علت اصلی مشکل را نمایش‌‌دهد. نحوه‌‌ی استفاده از آن شبیه به مثال موجود در شکل (17-6) است. تنها تفاوت، در این است که نیازی به نوشتن عبارت خطا (برای مثال IOError) نیست.17-7- عبارت Except با چندین نوع مشخصشمای کلی این عبارت، به شکل (17-9) خواهدبود. همان گونه که می‌‌بینید، می‌‌توانیم چندین استثنای مهم را به صورت هم‌‌زمان، مدیریت‌‌کنیم.شکل (17-9)17-8- عبارت Try-Finallyشما همواره می‌‌توانید از یک بلوک finally به‌‌همراه try استفاده‌‌کنید. در این بلوک، کدهایی قرار می‌‌گیرند که چه خطا داشته‌‌باشیم و چه هیچ خطایی نداشته‌‌باشیم، بایستی اجرا ‌‌شوند. در شکل (17-10)، مثالی ارائه می‌‌دهیم که ترکیبی از چندین نوع از این عبارات را نشان می‌‌دهد.شکل (17-10)زمانی که یک استثنا در بلوک try رخ می‌‌دهد، بلافاصله، مترجم پایتون، به بلوک finally منتقل می‌‌شود. بعد از این که تمامی دستورات این بلوک اجرا شدند، دوباره، خطا صادر می‌‌شود. اگر در لایه‌‌ی بالایی، try-except دیگری وجود داشته‌‌باشد، پایتون، مدیریت آن‌‌ها را ادامه می‌‌دهد. در نهایت، با اجرای این قطعه کد، متن &quot;Going to close the file&quot; چاپ می‌‌شود. البته اگر به جای پارامتر w، از پارامتر r استفاده‌‌کنیم، به دلیل بروز خطا، عبارت &quot;Error: can&#x27;t find file or read data&quot; را خواهیم‌‌داشت.17-9- آرگومان Exceptionهر استثنایی می‌‌تواند یک آرگومان نیز داشته‌‌باشد. این آرگومان حاوی مقداری‌‌است که اطلاعات بیشتری را در مورد آن استثنا ارائه می‌‌دهد. محتوای آرگومان‌‌ها می‌‌تواند متناسب با نوع استثنا، متفاوت‌‌باشد.اگر کد شما، برای مدیریتِ تنها یک استثنا باشد، می‌‌توانید یک متغیر حاوی نام استثنا، در کنار عبارت except داشته‌‌باشید.همچنین در صورتی که بخواهید، چندین استثنا را به صورت هم‌‌زمان مدیریت‌‌کنید، می‌‌توانید متغیری از نوع تاپل داشته‌‌باشید که هر عنصر آن، یکی از استثنا را پوشش‌‌دهد.این متغیر می‌‌تواند، تک مقداری ویا چند مقداری باشد. به طور معمول، مقدار آن، در نوع اول، علت خطا و در حالت دوم، علت، شماره و مکان خطا را مشخص می‌‌کند. همانند مثال شکل (17-11)، به راحتی می‌‌توان از این آرگومان استفاده‌‌نمود.شکل (17-11)همان طوری که می‌‌بینید، تابعی به همراه بلوک try-except تعریف‌‌کردیم. با اجرای این مثال خروجی شکل (17-12) را خواهیم‌‌داشت که علاوه بر پیغام‌‌خطا، مقداری که موجب صدور این خطا شده‌‌است را نیز چاپ می‌‌کند.شکل (17-12)17-10-دستور Raiseدر پایتون می‌‌توان به وسیله‌‌ی دستور raise، استثناها را به وجود آورد. شمای کلی این دستور، به صورت شکل (17-13) است.شکل (17-13)در این شکل Exception، برای مشخص‌‌نمودن نوع ویا نام استثنا بوده و args برای تعیین مقدار آرگومان به کار می‌‌رود. از آن جایی که، استفاده از آرگومان اختیاری است، اگر تعیین‌‌نشود، خالی در نظرگرفته می‌‌شود. البته آرگومان آخر، یعنی traceback نیز اختیاری‌‌بوده و در عمل، به ندرت استفاده می‌‌شود. اگر مقدار آن تعیین شده‌‌باشد، شیِ ردیابی، برای استثنا به کار می‌‌رود.هر استثنا می‌‌تواند یک رشته، کلاس ویا شی باشد. اغلب استثنائاتی که خودِ هسته‌‌ی پایتون استفاده می‌‌کند، از نوع کلاس هستند. این نوع، حاوی آرگومانی به عنوان نمونه‌‌ای از آن کلاس، می‌‌باشند. تعریف استثنای جدید، بسیار آسان‌‌بوده و به صورت شکل (17-14) انجام می‌‌شود.شکل (17-14)اگر مقدارِ کوچک‌‌تر از یک را برای فراخوانی این تابع ارسال‌‌کنیم، خروجی ما چیزی شبیه به شکل (17-15)، خواهدبود که معادل خطای تعریف شده‌‌است.شکل (17-15)نکته: برای دسترسی به هر استثنایی، بایستی عبارت except به همان استثنا، اشاره‌‌کند. کلاس ویا رشته‌‌ی ساده بوردن استثنا، هیچ تفاوتی ایجاد نمی‌‌کند. به عنوان مثال، برای صدور خطای شکل (17-15)، باید این عبارت را به صورت شکل (17-16)، به کار گیریم.شکل (17-16)17-11- تعریف خطای سفارشیدر نهایت، پایتون به ما اجازه می‌‌دهد که استثنائات مخصوص خود را با استنتاج از کلاس‌‌های توکار استاندارد، ایجاد‌‌کنیم. برای نمونه، در شکل (17-17)، مثالی مربوط به RuntimeError را با استنتاج از زیرکلاس آن می‌‌سازیم.در بلوک try، استثناي تعريف‌‌شده توسط کاربر، صادر‌‌شده و در بلوک except ضبط و مدیریت مي‌‌شود. متغیر e نیز برای ایجاد نمونه‌‌ای از کلاس Networkerror به‌‌کار می‌‌رود.شکل (17-17)لازم به ذکر است، بعد از تعریف کلاس مدنظر، می‌‌توان استثنای آن را به صورت شکل (17-18) صادر‌‌کرد.شکل (17-18)سخن آخرکتاب پیش رو، حاصل تلاش‌‌های شبانه‌‌روزی گردآورندگان آن می‌‌باشد. همیشه به دنبال راه‌‌ها و مثال‌‌هایی گشتیم تا درک مطالب پیچیده را برای خوانندگان عزیز، آسان‌‌تر نماییم. امید است در این تلاش، موفق بوده‌‌باشیم. هیچ اثر ساخت بشری عاری از نقص نیست. این کتاب نیز از این قاعده، مستثنی نخواهدبود. با این وجود سعی در کاهش هرچه بیشتر این نقایض داشتیم.امیدواریم خوانندگان عزیز با ارائه‌‌ی نظرات و پیشنهادات خود ما را در هر چه بهتر‌‌نمودن این اثر، یاری نمایند. بدیهی است، استقبال شما عزیزان، مشوقی جهت شروع تالیف کتاب &quot;پایتون پیشرفته&quot; خواهدبود.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 25 Mar 2023 10:17:09 +0330</pubDate>
            </item>
                    <item>
                <title>فصل شانزدهم آموزش پایتون مقدماتی - فایل و دایرکتوری</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D9%BE%D8%A7%D9%86%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D9%88-%D8%AF%D8%A7%DB%8C%D8%B1%DA%A9%D8%AA%D9%88%D8%B1%DB%8C-vz4fjknipad8</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh این فصل از کتاب، تمامی توابع اولیه I/O‌‌[1] موجود در پایتون را پوشش می‌‌دهد. البته برای کسب اطلاعات بیشتر در مورد این نوع توابع، می‌‌توانید به اسناد استاندارد پایتون مراجعه‌‌نمایید.[1]Input/Output16-1- چاپ در صفحه نمایشهمان طوری که از قبل می‌‌دانیم، ساده‌‌ترین راه برای تولید خروجی، استفاده از دستور print است که در آن می‌‌توانید عبارات دلخواه خود را با کاما از هم جدا‌‌کنید. این تابع به طور خودکار هر چیزی را که در آن وارد می‌‌کنیم، به یک رشته تبدیل‌‌کرده و نتایج را همانند شکل (16-1)، به صورت استاندارد در خروجی ظاهر می‌‌کند. البته اگر هیچ عبارتی به عنوان ورودی نداشته‌‌باشیم، مقدار خالی را در خروجی خواهیم‌‌داشت.شکل (16-1)16-2- خواندن ورودی صفحه کلیدزبان پایتون، تابع توکار Raw_Input را برای خواندن یک خط متن از ورودی استاندارد (به طور پیش فرض، صفحه کلید)، فراهم می‌‌کند. ما در ادامه به توضیح این توابع می‌‌پردازیم.تابع مذکور، یک خط (اتمام با کلید Enter) را از کاربر دریافت‌‌کرده و آن را به عنوان یک رشته برمی‌‌گرداند. البته علامت خط جدیدی که در انتهای این ورودی وجود ‌‌دارد را حذف می‌‌کند. نمونه‌‌ای از کاربرد آن را در شکل (16-2) می‌‌بینید. گفتنی‌‌است که این تابع در پایتون نسخه2 کاربرد دارد. در نسخه‌‌های جدیدتر، این تابع را به ( ) input تغییر نام دادند.شکل (16-2)با اجرای این قطعه کد، از کاربر درخواست می‌‌شود که رشته‌‌ی دلخواه خود را وارد کند. در نهایت رشته‌‌ی وارده به همراه عبارت موجود در دستور چاپ، در خروجی ظاهر می‌‌شود. با فرض این که کاربر عبارت &quot;Hello Python&quot; را وارد کند، ورودی و خروجی ما به شکل (16-3) خواهدشد.شکل (16-3)16-3- باز و بسته کردن فایلبعد از خواندن اطلاعات از ورودی و نوشتن آن‌‌ها در خروجی، نوبت به بررسی چگونگی خواندن اطلاعات از فایل ویا پرونده‌‌ی واقعی می‌‌رسد. به طور پیش فرض، پایتون توابع پایه و روش‌‌های لازم برای کار با فایل و دستکاری[1] آن‌‌ها را فراهم می‌‌کند. شما می‌‌توانید اکثر دستکاری‌‌های فایل را به وسیله‌‌ی یک شیِ فایل[2] انجام‌‌دهید.[1]Manipulate [2]File Object16-4- تابع Openقبل از اقدام به خواندن و نوشتن فایل، بایستی آن را به وسیله‌‌ی تابع توکار ( ) open باز ‌‌کنیم. این تابع، یک شی فایل را ایجاد می‌‌کند که برای فراخوانی سایر متدهای پشتیبانی‌‌شده و مرتبط با آن، مورد استفاده قرار می‌‌گیرد. شمای کلی این دستور، به شکل (16-4) می‌‌باشد.شکل (16-4)حال به توضیح هر یک از پارامترهای این تابع می‌‌پردازیم.پارامتر file_name : یک مقدار رشته‌‌ای حاوی نام پرونده‌‌ای است که می‌‌خواهیم به آن دسترسی داشته‌‌باشیم.پارامتر access_mode : برای تعیین حالت‌‌های دسترسی به فایل، مانند خواندن، نوشتن و افزودن کاربرد ‌‌دارد. البته در شکل (16-5)، لیست کاملی از مقادیر ممکن، ذکر می‌‌شود. همان گونه که در شمای کلی این تابع دیدید، استفاده از آن، اختیاری‌‌است. در هر حال، مقدار پیش فرض آن، &quot;r&quot; به معنی خواندن است.پارامتر buffering : اگر مقدار این پارامتر، صفر در نظر گرفته‌‌شود، عمل بافر اتفاق نمی‌‌افتد. ولی اگر مقدار بافر، یک باشد، در هنگام دسترسی به فایل، دستور بافرکردن اجرا می‌‌شود. حال اگر مقدار بافر، عدد صحیح بزرگتر از یک باشد، عمل بافر، با اندازه‌‌ی تعیین‌‌شده انجام می‌‌شود. در نهایت، مقدار منفی، نمایانگر استفاده از مقدار پیش فرض سیستم برای بافرکردن است. این حالت، پیش فرض این پارامتر نیز درنظر گرفته می‌‌شود.شکل (16-5)نحوه استفاده از هر حالت در خلال مطالب بعدی توضیح داده خواهد شد.[1] Appending16-5- ویژگی‌‌های شی فایلزمانی که یک پرونده باز شود، شما یک شی فایل دارید که می‌‌توانید اطلاعات مختلفی را راجع به آن به دست آورید. در شکل (16-6)، لیستی از این ویژگی‌‌ها را مشاهده می‌‌نمایید.شکل (16-6) برای درک بهتر مطالب، شکل (16-7) را داریم.شکل (16-7)نتیجه‌‌ی اجرای این مثال را در شکل (16-8) مشاهده می‌‌کنید.شکل (16-8)16-6- متد Closeاین متد، تمامی اطلاعاتی که تغییر یافته ولی در فایل نوشته نشده‌‌اند را خالی‌‌کرده و شی فایل را می‌‌بندد. پس از اجرای این دستور، تا بازکردن مجدد فایل، هرگونه امکان نوشتن از آن گرفته می‌‌شود. پایتون به طور خودکار، مرجع هر فایلی که به فایل دیگری منتقل شده‌‌است را می‌‌بندد. در این رابطه، شکل (16-9)، مثال ساده‌‌ای را بیان می‌‌کند. همان گونه که مشاهده می‌‌نمایید، این دستور، بعد از چاپ نام فایل، آن را می‌‌بندد.شکل (16-9)16-7- خواندن و نوشتن در فایلبرای راحتی کار، هر شی فایل، مجموعه‌‌ای از روش‌‌های دسترسی را فراهم می‌‌کند. در ادامه، روش استفاده از هر دو متد را به صورت مجزا بررسی خواهیم‌‌کرد.16-7-1- متد Writeاین متد، رشته‌‌ی مدنظر را در یک فایلِ باز می‌‌نویسد. توجه داشته‌‌باشید که در پایتون، رشته‌‌ها می‌‌توانند علاوه بر متن، حاوی داده‌‌های باینری نیز باشند. البته این متد نمی‌‌تواند کاراکتر خط جدید یعنی &quot;n\&quot; را به انتهای متن اضافه‌‌کند. شکل (16-10)، متن دلخواه موجود در پارامتر ارسال‌‌شده را در فایل باز شده، می‌‌نویسد.شکل (16-10)با اجرای این مثال، در ابتدا، فایل foo.txt ایجاد می‌‌شود. حال محتوای ارسالی، در فایل نوشته‌‌شده و فایل را می‌‌بندد. اگر شما فایل را باز ‌‌کنید، محتوای شکل (16-11) را خواهیددید.شکل (16-11)16-7-2- متد Readاین متد، یک رشته را از فایل بازشده، می‌‌خواند. همانند متد write، رشته‌‌های پایتون می‌‌توانند حاوی داده‌‌های باینری نیز باشند. پارامتر ارسالی متد، تعداد بایت‌‌هایی است که از ابتدای فایل باز ‌‌شده، خوانده می‌‌شود. اگر پارامتری برای آن ارسال نشود، این متد سعی می‌‌کند تا حد امکان، اطلاعات داخل فایل را بخواند. این کار می‌‌تواند حداکثر تا پایان فایل ادامه‌‌یابد. شکل (16-12)، مثالی را در مورد عملکرد آن بیان می‌‌کند.شکل (16-12)در این مثال، از فایل ایجادشده در شکل (16-12)، استفاده‌‌کرده و 9 کاراکتر اول آن را برمی‌‌گردد. نتیجه اجرای این قطعه کد را در شکل (16-13) مشاهده می‌‌کنید.شکل (16-13)16-8- موقعیت فایلمتد tell مکان کنونی خط فرمان را در فایل نشان می‌‌دهد. به عبارت دیگر، خواندن و نوشتن داده‌‌ی بعدی، به تعداد بایت‌‌های تعیین‌‌شده، از ابتدای آن موقعیت را برمی‌‌گرداند.متد seek(offset[, from]) مکان خط فرمان در فایل بازشده را تغییر می‌‌دهد. آرگومان offset نمایانگر تعداد بایت‌‌هایی است که بایستی منتقل‌‌شوند. آرگومان from نیز، مکان مرجع را از محل بایت‌‌های انتقالی، مشخص می‌‌کند. اگر مقدار صفر برای from تعیین‌‌شود، به این معنی‌‌است که از ابتدای فایل، به عنوان مرجع استفاده می‌‌کند. مقدار 1، معادل استفاده از مکان کنونی، برای مرجع است. همچنین اگر مقدار آن را، 2 درنظر بگیرید، انتهای فایل را به عنوان مکان مرجع انتخاب می‌‌کند. با فرض استفاده از فایل foo.txt ، مثال شکل (16-14) را خواهیم‌‌داشت.شکل (16-14)نتیجه­ی اجرای این مثال به‌‌صورت شکل (16-15) خواهدبود.شکل (16-15)16-9- تغییر نام و حذف فایلماژول OS در پایتون، متدهایی را ارائه می‌‌دهد تا به وسیله‌‌ی‌‌ آن‌‌ها، اقدام به انجام انواع عملیات پردازش فایل، از جمله تغییر نام و حذف فایل‌‌ها نمایید. برای استفاده از این ماژول و فراخوانی توابع مربوطه، ابتدا باید آن را import کنید. در ادامه به بررسی هر یک از این متدها می‌‌پردازیم.16-9-1 متد Renameاین متد، نام فعلی و نامی که می‌‌خواهید فایل به آن تغییریابد را به عنوان آرگومان، از شما می‌‌گیرد. شکل (16-16) مثالی از کاربرد متد مذکور را نشان می‌‌دهد.شکل (16-16)با اجرای این مثال، نام فایل test1.txt به test2.txt تغییر می‌‌یابد.16-9-2- متد Removeتنها آرگومانی که این متد نیاز‌‌ دارد، نام فایلی است که می‌‌خواهیم آن را حذف‌‌کنیم. برای مثال، در شکل (16-17) قصد داریم، فایل test2.txt را از محل پوشه ویا دایرکتوری (بعد از این تنها از کلمه‌‌ی دایرکتوری استفاده می‌‌کنیم) جاری حذف‌‌نماییم.شکل (16-17)16-10- کار با دایرکتوریبه طور معمول، در هر سیستم عامل، فایل‌‌ها داخل دایرکتوری‌‌های متعددی قرار می‌‌گیرند. پایتون نیز همانند سایر زبان‌‌ها، متدها و راه‌‌کارهایی را برای مدیریت آن‌‌ها فراهم نموده‌‌است. البته برای انجام عملیات مختلف از جمله ایجاد، حذف و تغییر نام دایرکتوری، بایستی ابتدا ماژول OS را واردکنیم. در ادامه، این متدها را بررسی می‌‌کنیم.16-10-1- متد MkDirشما می‌‌توانید از این متد، برای ایجاد دایرکتوری در داخل دایرکتوری فعلی استفاده‌‌کنید. برای این کار کافی‌‌است، نام دلخواه را به عنوان آرگومان این متد وارد ‌‌کنید. شکل (16-18)، مثالی را از ایجاد دایرکتوری به نام test ارائه می‌‌دهد.شکل (16-18)16-10-2- متد ChDirمی‌‌توان از این متد، برای تغییر دایرکتوری فعلی استفاده‌‌کرد. برای این کار، بایستی مسیر دایرکتوری مدنظر را به عنوان آرگومان وارد ‌‌نمود. نحوه‌‌ی عملکرد متد مذکور را در شکل (16-19) می‌‌بینید.شکل (16-19)16-10-3- متد GetCwdبا این متد، می‌‌توان مسیر دایرکتوری جاری را به دست آورد. در شکل (16-20) نحوه‌‌ی استفاده از آن را مشاهده می‌‌کنید.شکل (16-20)16-10-4- متد RmDirبا ورود مسیر دایرکتوری مدنظر، به عنوان آرگومان ورودی، می‌‌توان آن دایرکتوری را حذف‌‌کرد. البته قبل از حذف، بایستی تمامی فایل‌‌های موجود در داخل آن، حذف‌‌شوند. نمونه‌‌ای از این مطلب را در شکل (16-21) می‌‌بینید. اگر مسیر و نام دقیق دایرکتوری را وارد ‌‌نکنید، این تابع، تنها در داخل دایرکتوری جاری، به دنبال آن خواهد‌‌گشت.شکل (16-21)در این فصل سعی‌‌کردیم در مورد کار با فایل و دایرکتوری، مطالب کاربردی را ارائه‌‌داده و از ذکر مطالب پیچیده‌‌تر در مورد File Object و OS Object اجتناب‌‌کنیم. مطالعه‌‌ی بیشتر در این موضوع را به خواننده واگذار می‌‌نماییم.در پست بعدی به مدیریت خطاها خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sun, 19 Mar 2023 10:24:11 +0330</pubDate>
            </item>
                    <item>
                <title>فصل پانزدهم آموزش پایتون مقدماتی - ماژول ها</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D9%BE%D8%A7%D9%86%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%87%D8%A7-cuwpueimyy5d</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh ماژول‌‌ها در پایتون، به ما این اجازه را می‌‌دهند که به صورت منطقی، کدهای خود را سازماندهی‌‌کنیم. دسته‌‌بندی کدهای مربوط به‌‌هم، در یک ماژول باعث می‌‌شود که کدها به راحتی درک و استفاده شوند. از آن جایی که هر ماژول، یک شی بوده و نام ویژگی‌‌های آن، به دلخواه انتخاب می‌‌شود، به راحتی می‌‌توان آن‌‌ها را مقیّد‌‌نموده[1] و ارجاع‌‌داد.به طور ساده‌‌تر می‌‌توان گفت، هر ماژول، شامل فایلی از کدهاست که می‌‌تواند تابع، کلاس و متغیرهای خاص خود را داشته‌‌باشد. همچنین یک ماژول می‌‌تواند حاوی کد‌‌های قابل اجرا نیز باشد.برای نام‌‌گذاری فایلی که کدهای ماژول در آن قرار دارند، از پسوند py استفاده می‌‌شود. شکل (15-1)، مثالی ساده‌‌ای از کدهای یک ماژول با نام support.py را نشان می‌‌دهد که تنها حاوی یک تابع برای چاپ مقدار وارد ‌‌شده است.شکل (15-1)[1]Bind15-1- دستور Importبه وسیله‌‌ی این دستور می‌‌توان هر فایل پایتون را در فایل دیگر آن، وارد کرد. با ورود یک ماژول به برنامه، می‌‌توان از توابع، کلاس‌‌ها و سایر محتوای آن استفاده‌‌نمود. در شکل (15-2) شمای کلی دستور را مشاهده می‌‌کنید.شکل (15-2)زمانی که مترجم پایتون، با یک دستور import مواجه می‌‌شود، در صورت وجود ماژول مدنظر در مسیر جستجو، آن را وارد می‌‌کند. مسیر جستجو، لیستی از پوشه‌‌هایی است که مترجم، قبل از وارد‌‌کردن یک ماژول، آن را جستجو می‌‌کند. برای مثال، برای ورود ماژول support.py باید همانند شکل (15-3)، دستور import را در بالای کدهای خود قرار‌‌ دهیم. با توجه به کدهای این ماژول، خروجی مثال ما برابر با شکل (15-4) خواهدبود.شکل (15-3)شکل (15-4)ذکر این نکته ضروری‌‌است که هر ماژول، تنها یک بار بارگذاری[1] می‌‌شود. حتی اگر چندین بار از دستور import برای یک ماژول استفاده‌‌کنیم، از ورودهای تکراری جلوگیری می‌‌شود.[1]Load15-2- دستور From … Importدستور from  به شما اجازه می‌‌دهد تا ویژگی خاصی از یک ماژول را وارد ‌‌کنید. این دستور در جهت کاهش پردازش و جلوگیری از ورود کل ماژول‌‌هایی که دارای تعداد زیادی ویژگی هستند، کاربرد دارد. شمای کلی این دستور به صورت شکل (15-5) است.شکل (15-5)در شکل (15-6)، می‌‌خواهیم ویژگی فیبوناچیرا از ماژول fib وارد ‌‌کنیم. همان طوری که به آن اشاره‌‌کردیم، این دستور، کل ماژول را به فضای اسمی برنامه‌‌ی ما اضافه نمی‌‌کند، بلکه فقط ویژگی فیبوناچی را به عنوان جدول سراسری نماد[1]اضافه می‌‌کند تا به راحتی بتوان آن را فراخوانی‌‌کرده و استفاده‌‌نمود.شکل (15-6)همچنین به وسیله‌‌ی دستور شکل (15-7) می‌‌توانیم همه اسامی موجود در ماژول را به فضای اسمی برنامه‌‌ی خود اضافه‌‌کنیم.شکل (15-7)با وجود این که روش ذکر‌‌شده، یک راه آسان برای واردکردن تمامی اسامی ماژول، به فضای اسمی فعلی‌‌است، بایستی خیلی کم و با احتیاط از آن استفاده‌‌نمود.[1]Global Symbol Table15-3- مکان‌‌یابی ماژولوقتی شما یک ماژول را وارد می‌‌کنید، مترجم پایتون، یکی از این مسیرها را برای یافتن آن جستجو می‌‌کند.پوشه‌‌ی جاری که فایل اصلی برنامه در آن قرار ‌‌دارد.اگر ماژول پیدا‌‌ نشد، پایتون تمامی پوشه‌‌هایی را که در متغیر پوسته[1]‌‌ به نام PYTHONPATH است، جستجو می‌‌کند. در مورد این متغیر، در بخش بعدی توضیح می‌‌دهیم.در نهایت پایتون، پوشه‌‌ی پیش فرض را جستجو می‌‌کند. در سیستم‌‌عامل یونیکس، مسیر این پوشه به صورت /usr/local/bin/python/ است. این مسیر را در بالای اکثر مثال‌‌های کتاب مشاهده‌‌کردیم. همچنین این پوشه در سیستم‌‌عامل ویندوز در یکی از مسیرهای C:\Python36 ویا C:\Users\(AccountName)\AppData\Local\Programs\Python\Python36 قرار ‌‌دارد. البته نسخه 3.6 پایتون در این مسیردهی مدنظر قرارگرفت.گفتنی‌‌است که تمامی مسیرهای جستجوی ماژول در یک متغیر واقع در ماژول سیستمی به نام sys.pth ذخیره می‌‌شود. متغیرهای موجود در این فایل، حاوی مسیر جاری، PYTHONPATH و مسیر پیش فرض نصب پایتون است.[1]Shell Variable15-4- متغیر PYTHONPATHیک متغیر محیطی‌‌است که آن را در فصل‌‌های قبلی توضیح‌‌دادیم. شمای کلی تعریف این مسیر در متغیر محیطی برای دو نوع سیستم‌‌عامل ویندوز و یونیکس را به ترتیب در شکل‌‌های (15-8) و (15-9) نشان می‌‌دهیم.شکل (15-8)شکل (15-9)15-5- فضای اسمی و حوزه‌‌ی دسترسیمتغیرها، همان نام و شناسه‌‌هایی هستند که به اشیای مختلف، نگاشت می‌‌شوند. فضای اسمی، نوع خاصی از دیکشنری‌‌است که اسامی متغیرها به عنوان کلید دیکشنری و اشیای مربوط به متغیر، معادل مقادیر آن هستند.هر دستور پایتون می‌‌تواند به متغیرهای فضای اسمی محلی دسترسی داشته‌‌باشد. اگر دو متغیر عمومی و محلی، اسامی یکسانی داشته‌‌باشند، متغیر محلی بر متغیر سراسری، اولویت خواهد داشت.هر تابعی دارای فضای اسمی مخصوص به خود است. متدهای هر کلاس از قوانین حوزه‌‌ی دسترسی توابع استاندارد، تبعیت می‌‌کنند.در رابطه با این که یک متغیر محلی است ویا سراسری، پایتون حدس‌‌های آموزش دیده‌‌ای را دارد. این مترجم، فکر خواهد کرد که تمامی متغیرهای تعریف‌‌شده، در داخل بدنه‌‌ی تابع، از نوع محلی هستند. بنابراین برای انتصاب یک مقدار به متغیر سراسری در یک تابع، ابتدا باید از دستور global و به دنبال آن، نام متغیر استفاده‌‌نماییم. این دستور، به پایتون اعلام می‌‌کند که جستجوی این متغیر را در فضای اسمی محلی متوقف‌‌کند.به عنوان مثال، در شکل (15-10) یک متغیر به نام Money را تعریف‌‌کردیم. از آن جایی که درون تابع، مقداری را به آن متغیر انتصاب‌‌دادیم، پایتون آن را به عنوان متغیر محلی درنظر می‌‌گیرد. مشکل این جا به وجود می‌‌آید که ما می‌‌خواهیم بدون انتصاب مقدار اولیه به این متغیر محلی، به آن دسترسی‌‌داشته و مقداری را به آن بیافزاییم. بنابراین در خروجی، با خطای ناخواسته‌‌ی محلی[1] مواجه خواهیم‌‌شد.شکل (15-10)بعد از اجرای این مثال، بعد از انتصاب مقدار اولیه به متغیر Money، دستور چاپ خارج از بدنه‌‌ی تابع، اجرا‌‌شده و مقدار اولیه را برمی‌‌گرداند. حال تابع AddMoney فراخوانی می‌‌شود. ابتدا با استفاده از کلمه کلیدی global، متغیر خارج از تابع فراخوانده‌‌شده و مقداری به آن افزوده می‌‌شود. در نهایت، مقدار جدید چاپ و در خروجی ظاهر می‌‌شود.[1] Unbound Local Error15-6- تابع Dirاین تابع توکار، لیستی مرتب‌‌شده از رشته‌‌های حاوی نام‌‌های تعریف‌‌شده توسط یک ماژول را برمی‌‌گرداند. این لیست شامل نام همه‌‌ی ماژول‌‌ها، متغیرها و توابعی‌‌است که در یک ماژول تعریف شده‌‌اند. شکل (15-11)، مثال ساده‌‌ای از این کاربرد را نشان می‌‌دهد.شکل (15-11)در این مثال، ما تمامی توابع موجود در ماژول math را لیست‌‌کردیم که خروجی این قطعه کد را در شکل (15-12) مشاهده می‌‌کنید.شکل (15-12)در این جا، متغیرهای خاص __name__ معادل نام ماژول و __file__ نام فایلی است که ماژول، از آن بارگذاری شده‌‌است.15-7- توابع Globals و Localsبسته به موقعیت مکانی که این توابع فراخوانی می‌‌شوند، می‌‌توانند برای بازگرداندن نام‌‌های محلی و سراسری استفاده‌‌شوند. اگر تابع ( ) locals از داخل یک تابع صدا زده شود، می‌‌تواند تمامی اسامی که از آن تابع به صورت محلی قابل دسترسی هستند را بازگرداند. و اگر ( ) globals از داخل یک تابع فراخوانی‌‌شود، می‌‌تواند تمامی اسامی که از آن تابع به صورت سراسری در دسترس‌‌باشند را بر‌‌گرداند. نوع بازگشتی هر دو توابع، از نوع دیکشنری است. از این رو می‌‌توان اسامی را با استفاده از تابع ( ) key استخراج‌‌نمود.15-8- تابع Reloadزمانی که ماژول، به یک برنامه وارد شد، کدهای سطح بالای[1] آن، فقط یک‌‌بار اجرا می‌‌شود. اگر می‌‌خواهید در یک ماژول، دوباره از کدهای سطح بالا استفاده‌‌کنید، به راحتی می‌‌توانید از تابع reload استفاده‌‌نمایید. بنابراین این دستور، تابع ماژول وارد‌‌شده‌‌ی قبلی را دوباره وارد می‌‌کند. شمای کلی این تابع به صورت شکل (15-13) می‌‌باشد.شکل (15-13)[1]Top-Levelلازم به ذکر است که برای پایتون نسخه 3 بایستی ماژول importlib نیز فراخوانی گردد.15-9- بسته‌‌ها[1] در پایتونهر بسته از یک ساختار سلسله مراتبی فایل و پوشه پیروی می‌‌کند. محیط کاربردی برنامه پایتون، شامل ماژول‌‌ها، زیربسته‌‌ها و زیر ِزیربسته‌‌ها و از این قبیل است. فرض‌‌کنید یک فایل Pots.py در داخل پوشه Phone وجود ‌‌داشته و حاوی کدهای شکل (15-14) باشد.شکل (15-14)به همین ترتیب، دو فایل دیگر با نام‌‌های Isdn.py و G3.py حاوی توابعی با نام‌‌های Isdn و G3 خواهیم‌‌داشت. حال یک فایل دیگر با نام __init__.py داخل این پوشه ایجاد می‌‌کنیم. برای این که در موقع ورود Phone، تمامی توابع در دسترس‌‌باشند، بایستی از دستور ورود صریح[2]، به صورت شکل (15-15) استفاده‌‌نماییم.شکل (15-15)پس از اضافه‌‌کردن این خطوط به __init__.py، در زمان وارد‌‌کردن بسته Phone، همه‌‌ی این کلاس‌‌ها در دسترس خواهندبود. نمونه‌‌ای از کاربرد این مطالب را در مثال شکل (15-16) خواهیددید.شکل (15-16)زمانی که این قطعه کد اجرا شود، خروجی آن به شکل (15-17) می‌‌شود.شکل (15-17)در این مثال، ما تنها یک تابع را برای هر فایل درنظر گرفتیم. اما شما می‌‌توانید چندین تابع مختلف را در فایل‌‌های خود داشته‌‌باشید. البته هر فایل می‌‌تواند حاوی کلاس‌‌های متعددی نیز باشد. بنابراین در نهایت می‌‌توانید بسته‌‌های خود را از این کلاس‌‌ها استخراج‌‌کنید.[1]Packages [2]Explicit Importدر پست بعدی به فایل و دایرکتوری خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 18 Mar 2023 11:17:57 +0330</pubDate>
            </item>
                    <item>
                <title>فصل چهاردهم آموزش پایتون مقدماتی - توابع</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%DA%86%D9%87%D8%A7%D8%B1%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-xzf8obdentqr</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh هر تابع متشکل از بلوک کدهای سازماندهی‌‌شده‌‌، با قابلیت استفاده‌‌ی مجدد ‌‌است که جهت انجام عملیات مرتبط و منسجم استفاده می‌‌شود. این توابع، برای برنامه‌‌ها، حالت ماژولی و امکان استفاده‌‌ی مجدد بهتری از کد را فراهم می‌‌کنند.همان طوری که از قبل می‌‌دانیم، با وجود این که پایتون، توابع داخلی زیادی را در اختیار ما قرار می‌‌دهد، همچنان نیازمند تعریف توابع دلخواه بر حسب نیازهای متفاوت هستیم که در اصطلاح، آن‌‌ها را توابع تعریف‌‌شده توسط‌‌کاربر[1] می‌‌نامیم.[1]User-defined Functions14-1- تعریف تابعدانستیم که توابع می‌‌توانند بر حسب نیازهای مختلف، تعریف‌‌شوند. در این بخش، قواعد ساده‌‌ی تعریف یک تابع در پایتون را توضیح خواهیم‌‌داد.هر بلوک تابع با کلمه کلیدی def شروع‌‌شده و به دنبال آن، نام تابع و سپس علامت‌‌های پارانتز می‌‌آید.پارامترها ویا آرگومان‌‌های ورودی باید در داخل این پارانتزها قرار‌‌گیرند. اولین خط هر تابع می‌‌تواند یک عبارت اختیاری باشد که حاوی توصیفی از آن تابع است.بلوک کد بایستی با علامت دو نقطه شروع‌‌شود. البته تمامی دستورات باید دارای تورفتگی باشند. دستور return [expression] موجب خروج ما از تابع می‌‌شود. عبارت اختیاری داخل علامت‌‌های براکت، یک مقدار را به صداکننده‌‌ی تابع بازمی‌‌گرداند. دستور return بدون آرگومان، معادل دستوری است که هیچ عبارت بازگشتی ندارد.شمای کلی تعریف یک تابع را در شکل (14-1) مشاهده می‌‌کنید.شکل (14-1)لازم به ذکر است که، به طور پیش فرض، رفتار پارامترها برحسب مکان آن‌‌ها، متغییر است. شما بایستی از آن‌‌ها به همان ترتیبی که نوشته‌‌اید، استفاده کنید. این امر بیشتر در صدا زدن توابع، کاربرد دارد. برای درک بهتر مطلب، در شکل (14-2)، تابع ما، یک رشته را به عنوان پارامتر ورودی گرفته و آن را چاپ می‌‌کند.شکل (14-2)14-2- فراخوانی تابعبعد از این که ایجاد یک تابع، به پایان رسید، می‌‌توان آن را به صورت مستقیم ویا از درون توابع دیگر فراخوانی‌‌کرد. همان گونه که در شکل (14-3) می‌‌بینید، فقط با استفاده از نام تابع و مقداردهی پارامترها، می‌‌توان آن را فراخوانی‌‌کرد. ما در این مثال، تابع تعریف‌‌شده در شکل (14-2) را صدا می‌‌زنیم.شکل (14-3)با توجه به مقدار بازگشتی تابع printme، خروجی ما به شکل (14-4) خواهدبود.شکل (14-4)14-3- ارسال پارامتر با مقدار و ارسال با مرجع[1]در زبان پایتون، تمام پارامترها (آرگومان‌‌ها)، توسط مرجع ارسال می‌‌شوند. به عبارت دیگر، اگر در چیزی که یک پارامتر به درون تابع ارجاع می‌‌دهد، تغییری ایجاد‌‌کنیم، این تغییر در مقادیر فراخوانی‌‌کننده نیز تاثیر دارد. این مطلب را در مثال شکل (14-5) نشان‌‌دادیم.شکل (14-5)همان طوری که در شکل (14-6) می‌‌بینید، ابتدا، لیست myList به تابع ارسال‌‌شده و در داخل تابع، مقادیری به آن افزوده‌‌شده و در نهایت چاپ می‌‌شود. این تغییر لیست، به دستور چاپِ خارج از تابع نیز اعمال می‌‌گردد. در نتیجه هر دو دستور چاپ، مقادیر یکسانی را در خروجی تولید می‌‌کنند.شکل (14-6)شکل (14-7)، مثال دیگری را به نمایش می‌‌گذارد که در آن آرگومان‌‌ها به صورت ارجاعی، فرستاده‌‌شده و این ارجاع در داخل تابع، بازنویسی می‌‌شود.شکل (14-7)در این مثال، پارامتر mylist به صورت محلی در تابع changeme تعریف شده‌‌است. در نتیجه، تغییر در لیست داخل تابع، در لیست اصلی تاثیری نمی‌‌گذارد. در نهایت، خروجی ما به شکل (14-8) می‌‌شود. سطر اول خروجی، نتیجه‌‌ی اجرای تابع و سطر دوم نتیجه‌‌ی دستور چاپ خارج از تابع است.شکل (14-8)[1]Pass by reference vs value14-4- آرگومان‌‌های تابعشما می‌‌توانید یک تابع را با استفاده از این چهار نوع آرگومان رسمی، فرخوانی‌‌کنید:14-4-1- آرگومان‌‌های ضروریهمان طوری که از نامش پیداست، برای این که توابع ما، به صورت صحیح و بدون خطا کار‌‌کنند، باید این آرگومان‌‌ها ارسال‌‌شوند. البته تعداد و ترتیب آن‌‌ها در زمان ارسال بایستی با تعداد و ترتیب پارامترهای تعریف‌‌شده در تابع، مطابقت داشته‌‌باشد. در شکل (14-9)، ما هیچ آرگومانی را برای تابع printme ارسال‌‌نکردیم.شکل (14-9)خروجی این مثال را در شکل (14-10) می‌‌بینید. به دلیل عدم ارسال این پارامتر ضروری، با یک خطای نحوی روبرو می‌‌شویم.شکل (14-10)14-4-2- آرگومان‌‌های کلمه‌‌کلیدیاین آرگومان‌‌ها، در زمان فراخوانی توابع، تعریف و مقداردهی می‌‌شوند. زمان استفاده از آن‌‌ها، هر آرگومانی، با نام خودش، شناسایی می‌‌شود. این کار به ما اجازه می‌‌دهد تا تعدادی از آرگومان‌‌ها را حذف‌‌کرده ویا آن‌‌ها را خارج از ترتیب وارد‌‌کنیم. مترجم پایتون قادر است برای تطبیق مقادیر پارامترها از کلمات‌‌کلیدی ارائه‌‌شده استفاده‌‌نماید. به عنوان مثال، می‌‌توان تابع printme را به صورت شکل (14-11) فراخوانی‌‌نمود.شکل (14-11)برای درک بهتر این مطلب، از مثال دیگر در شکل (14-12) استفاده می‌‌کنیم. در حالی که هیچ ترتیبی در ارسال مقادیر پارامترها رعایت نشده‌‌است، برنامه‌‌ی ما، بدون خطا کار می‌‌کند.شکل (14-12)14-4-3- آرگومان پیش‌‌فرضاگر هیچ مقداری برای این نوع آرگومان‌‌ها اختصاص‌‌ندهیم، تابع مدنظر، از مقادیر پیش فرض استفاده می‌‌کند. با نگاه‌‌کردن به مثال شکل (14-13) درمی‌‌یابیم که بعد از تعریف تابع، یک بار آن را با مقداردهی همه‌‌ی پارامترها، فراخوانی‌‌کرده و بار دیگر تنها با مقداردهی یکی از آن‌‌ها، اقدام به فراخوانی‌‌کردیم.شکل (14-13)بنابراین به دلیل عدم ارسال آرگومان age در فراخوانی تابع، برای دستور چاپ‌‌دوم، از مقدار پیش فرض آن، یعنی 33 استفاده می‌‌شود. خروجی این مثال به شکل (14-14) خواهدبود.شکل (14-14)14-4-4- آرگومان‌‌هایی با طول‌‌متغیرگاهی نیازمند استفاده از آرگومان‌‌های بیشتر از تعداد تعریف‌‌شده برای تابع، باشیم. در این حالت، آرگومان‌‌هایی با طول متغیر را خواهیم‌‌داشت. برخلاف آرگومان‌‌های نوع پیش فرض و کلمه کلیدی، در زمان تعریف تابع، ضرورتی برای اعلام و مقداردهی آن‌‌ها نخواهیم‌‌داشت. شمای کلی این نوع آرگومان‌‌ها به صورت شکل (14-15) است.شکل (14-15)در این حالت، قبل از نام متغیر، یک علامت ستاره قرار می‌‌گیرد. این متغیر، مقادیر تمام آرگومان‌‌های غیرکلیدی را در خود نگه می‌‌دارد. در صورتی که در زمان فراخوانی تابع، هیچ آرگومان اضافی، نیاز نباشد، مقدار این متغیر، خالی در نظرگرفته می‌‌شود. در شکل (14-16) سعی‌‌کردیم، یک مثال ساده از این نوع را به شما نشان‌‌دهیم.شکل (14-16)خروجی اجرای این قطعه کد، به شکل (14-17) خواهدبود.شکل (14-17)14-5- توابع ناشناس[1]از آن جایی که برای تعریف این توابع، از کلمه‌‌ی def استفاده‌‌نشده و ساختار آن‌‌ها با توابع استاندارد یکسان نیست، نام ناشناس بر روی آن‌‌ها گذاشتیم. برای تعریف یک تابع کوچک از این نوع، می‌‌توانیم از کلمه کلیدی lambda استفاده‌‌کنیم. در ادامه، به ذکر چندین نکته در رابطه با تعریف چنین توابعی می‌‌پردازیم.انواع مختلف لامبدا می‌‌تواند تعداد دلخواهی از آرگومان‌‌ها را داشته‌‌باشد، اما فقط یک مقدار را به صورت نمایش یک عبارت، برمی‌‌گرداند. آن‌‌ها قادر به برگرداندن دستورات و عبارات متعدد نیستند.به دلیل این که، لامبدا نیازمند یک عبارت است، این توابع نمی‌‌توانند یک فراخوانی مستقیم را برای چاپ یک عبارت داشته‌‌باشد.توابع لامبدا، فضای اسمی[2] محلی مخصوص به خود را دارند و نمی‌‌توانند به غیر از متغیرهایی که برایشان فهرست شده‌‌است ویا آن‌‌هایی که در فضای اسمی عمومی[3] قرار دارند، دسترسی پیدا‌‌کنند.اگر چه به نظر می‌‌رسد که لامبدا نسخه‌‌ای از توابع تک خطی هستند، اما نمی‌‌توان آن‌‌ها را معادل این نوع توابع در زبان C ویا C++ درنظر گرفت. توابع تک خطی در زبان‌‌های ذکرشده، برای عبور دادن پشته‌‌ی توابع، برای بهبود کارایی در زمان فراخوانی استفاده می‌‌شوند.شمای کلی توابع لامبدا، به صورت شکل (14-18) خواهدبود. مثال شکل (14-19)، نمونه‌‌ای از تعریف و فراخوانی این نوع توابع را نشان می‌‌دهد.شکل (14-18)شکل (14-19)خروجی اجرای این قطعه کد، به شکل (14-20) است. همان گونه که مشاهده می‌‌کنید، هیچ نیازی به ورود مقادیر همه‌‌ی آرگومان‌‌ها در این توابع نیست.شکل (14-20)[1]The Anonymous Functions [2]NameSpace [3]Global14-6- حوزه‌‌ی متغیرها[1]گاهی متغیرهای مختلف یک برنامه، در تمامی بخش‌‌های آن، در دسترس نیستند. این مطلب بستگی به مکانی دارد که شما آن متغیر را تعریف می‌‌کنید. به عبارت دیگر، حوزه‌‌ی یک متغیر مشخص می‌‌کند که شما از کدام قسمت برنامه می‌‌توانید به یک متغیر خاص، دسترسی داشته‌‌باشید. در پایتون دو حوزه‌‌ی اصلی به نام متغیرهای سراسری[2] و محلی برای متغیرها وجود دارد که در ادامه، به مقایسه و بررسی آن‌‌ها می‌‌پردازیم.متغیرهایی که داخل بدنه‌‌ی تابع تعریف شده‌‌اند را متغیرهای محلی و آن‌‌هایی که در خارج از بدنه تعریف می‌‌شوند را متغیرهای سراسری (جهانی) می‌‌نامیم. بنابراین متغیرهای محلی، فقط در داخل تابعی که در آن تعریف شده‌‌اند، قابل دسترسی هستند. در حالی که، متغیرهای سراسری را می‌‌توان در بخش‌‌های مختلف برنامه و توسط هر تابعی به کار برد. همچنین زمانی ‌‌که تابعی فراخوانی می‌‌شود، متغیرهای درون آن، در دسترس قرارگرفته و بعد از فراخوانی، از دسترس خارج می‌‌شوند. در شکل (14-21) مثال ساده‌‌ای را در این رابطه آورده‌‌ایم.شکل (14-21)اولین متغیر total که در ابتدای برنامه تعریف و مقدار صفر به آن انتصاب داده‌‌شد، از نوع عمومی است. اما متغیر total دوم که درون بدنه‌‌ی تابع تعریف و استفاده‌‌گردید، محلی است. از این رو، اثر تغییرات آن در خط آخر این قطعه کد (دستور چاپ)، اعمال‌‌نشد. در نهایت خروجی این مثال را در شکل (14-22) می بینید.شکل (14-22)[1]Scope of Variables [2]Global variablesدر پست بعدی به ماژول خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Wed, 15 Mar 2023 10:35:01 +0330</pubDate>
            </item>
                    <item>
                <title>فصل سیزدهم آموزش پایتون مقدماتی - تاریخ و زمان (بخش دوم)</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D8%B3%DB%8C%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-jl2qo4pzp0nk</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh 13-7- ماژول تقویماین ماژول شامل توابعی برای کار با تقویم است. از جمله‌‌ی آن‌‌ها، می‌‌توان به توابعی برای چاپ متن تقویم یک ماه ویا سال خاص اشاره‌‌کرد. همان گونه که حدس می‌‌زنید، به طور پیش فرض، دوشنبه به عنوان اولین و یکشنبه به عنوان آخرین روز تقویم درنظر گرفته می‌‌شود. شروع و پایان آن را می‌‌توان با فراخوانی تابع ( ) calendar.setfirstweekday تغییرداد. در ادامه، لیستی از توابع موجود در ماژول تقویم را مورد بررسی قرار می‌‌دهیم.13-7-1- توابع Calendar و PrCalاز این توابع برای چاپ چند خطی ماهانه‌‌ی تقویم یک سال خاص استفاده می‌‌شود. از آن جایی که عملکرد هر دوی آن‌‌ها یکسان است، به توضیح یکی از آن‌‌ها می‌‌پردازیم. شمای کلی دستور، به صورت calendar.calendar(year, w, l, c) است که به طور خلاصه آرگومان‌‌های مختلف آن را توضیح می‌‌دهیم.آرگومان year : شماره سالی که می‌‌خواهیم آن را چاپ کنیم.آرگومان w : عرض کاراکترهای مختلف تقویم ازجمله روزها را مشخص می‌‌کند.آرگومان l : نمایان‌‌گر تعداد فاصله‌‌ی سطرهای هفته‌‌های یک ماه است.آرگومان c : تعیین‌‌کننده فاصله‌‌ی عرضی ماه‌‌های مختلف تقویم از هم است.نمونه‌‌ای از عملکرد این تابع را در شکل (13-28) می‌‌بینید.شکل (13-28)خروجی این قطعه کد، به شکل (13-29) خواهدبود.شکل (13-29)13-7-2- توابع FirstWeekDay و SetFirstWeekDayانتخاب اولین روز هفته، به عهده تابع ( ) firstweekday است. همان طوری که از قبل به آن اشاره‌‌شد، زمانی که برای اولین بار، از تقویم استفاده می‌‌شود، این مقدار، به طور پیش فرض، برابر صفر (روز دوشنبه) است. البته برای تنظیم آن می‌‌توان از ( ) setfirstweekday استفاده‌‌کرد. شکل (13-30)، کاربرد این دو تابع را در کنار هم نشان می‌‌دهد.شکل (13-30)در این مثال، ابتدا مقدار صفر به عنوان اولین روز هفته، چاپ‌‌شده و بعد از تغییر آن به یک، در خروجی، عدد 1 را خواهیم‌‌داشت.13-7-3- تابع WeekDayبا تعیین مقادیر سال، ماه (بین 1 تا 12) و روز (1 تا 31) در این تابع، می‌‌توانیم شماره‌‌ی روز هفته را که بین صفر تا 6 است، به‌‌دست آوریم. البته بایستی مقدار تعیین‌‌شده برای ماه، در محدوده‌‌ی آن باشد. برای مثال عدد 31 برای ماه فوریه قابل قبول نیست. بنابراین خروجی مثال شکل (3-31)، برابر 2 یعنی چهارشنبه خواهدبود.شکل (13-31)13-7-4- توابع Month و PrMonthهمانند ( ) Calendar عمل می‌‌کند با این تفاوت که از آن‌‌ها برای چاپ ماه خاصی از سال استفاده می‌‌شود. البته به دلیل این که فقط یک ماه را در خروجی داریم، نیازی به جداسازی نبوده و خبری از آرگومان c در این‌‌توابع نیست. البته بایستی شماره‌‌ی ماه را به عنوان دومین آرگومان آن، وارد تابع کنیم. برای درک بهتر مطلب، به مثالی که در شکل (13-32) آورده‌‌ایم، توجه‌‌کنید.شکل (13-32)خروجی این قطعه کد، به شکل (13-33) است.شکل (13-33)13-7-5- تابع MonthCalendarلیستی از لیست‌‌هایی از جنس اعداد صحیح را باز می‌‌گرداند. هر زیر‌‌لیست، نماینده یک هفته است. روزی از هفته‌‌ی اول و آخر که خارج از ماه باشد، مقدار صفر و بقیه آن‌‌ها مقادیر یک و بالاتر را خواهند‌‌داشت. برای توضیح بیشتر مثالی را در شکل (13-34) داریم.شکل (13-34)با اجرای این قطعه کد، خروجی ما به شکل (13-35) می‌‌شود. اولین روز از هفته‌‌ی اول این ماه، جمعه است. بنابراین برای روز دوشنبه تا پنچ‌‌شنبه مقادیر صفر و برای جمعه تا یک‌‌شنبه مقادیر یک تا سه را خواهیم‌‌داشت.شکل (13-35)13-7-6- تابع MonthRangeاین تابع، دو عدد صحیح را برمی‌‌گرداند. اولین عدد، شماره‌‌ی اولین روز از هفته‌‌ی ماه و دومین عدد نشانگر تعداد روزهای ماه مدنظر است. نمونه‌‌ای از استفاده‌‌ی این تابع را  در شکل (13-36) می‌‌بینید.شکل (13-36)خروجی این مثال، به صورت (4, 31) خواهدبود که عدد 4، نشان‌‌گر روز جمعه (به عنوان شروع ماه) و عدد 31، تعداد روزهای ماه مارس را نشان می‌‌دهد.13-7-7- تابع IsLeapاگر شماره‌‌ی سالی که وارد تابع ( ) isleap می‌‌شود، از نوع کبیسه باشد، مقدار True و در غیر این صورت، مقدار False را برمی‌‌گرداند. شکل (13-37)، مثالی از این تابع را نشان می‌‌دهد. از آن جایی که سال 2019، کبیسه نیست، مقدار False را خواهیم‌‌داشت.شکل (13-37)13-7-8- تابع LeapDaysبرای شمارش تعداد سال‌‌های کبیسه در بازه‌‌ی سال‌‌های تعیین‌‌شده، از این تابع استفاده می‌‌شود. به عنوان مثال، در شکل (3-38)، تعداد سال‌‌های کبیسه از 2000 تا 2019 برابر 5 است.شکل (13-38)13-7-9- تابع TimeGMعکس تابع ( ) time.gmtime عمل می‌‌کند. به این صورت که، ورودی آن یک تاپل زمان و خروجی آن، عدد اعشاری است که تعداد ثانیه‌‌ها را از مبدا زمانی نشان می‌‌دهد. از آن جایی که در مورد تابع gmtime در مباحث قبلی توضیحات مفصلی ارائه شده‌‌است، از ذکر توضیح و مثال بیشتر خودداری می‌‌کنیم.لازم به توضیح است که، با وجود مباحث زیادی که در مورد زمان داشتیم، چندین ماژول دیگر زمانی نیز وجود دارند که به علت عدم کاربرد زیاد ، فقط به ذکر نام datetime، pytz و dateutil اکتفا می‌‌کنیم.در پست بعدی به توابع خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Tue, 14 Mar 2023 09:39:56 +0330</pubDate>
            </item>
                    <item>
                <title>فصل سیزدهم آموزش پایتون مقدماتی - تاریخ و زمان (بخش اول)</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D8%AF%D9%88%D8%A7%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-ecyetnbb2zut</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh زبان پایتون با روش‌‌های مختلفی می‌‌تواند تاریخ و زمان را مدیریت‌‌کند. تبدیل انواع قالب‌‌های زمان و تاریخ، یکی از رایج‌‌ترین کارهایی‌‌است که با انواع زبان‌‌های برنامه‌‌نویسی انجام می‌‌پذیرد. پایتون نیز از این قانون مستثنی‌‌نبوده و برای این‌‌کار، از ماژول‌‌های مخصوص زمان و تاریخ کمک می‌‌گیرد.13-1- تیک (Tick)به طور اختصاصی، مبدا زمانی، ساعت 12:00 صبح، اول ژانویه سال 1970 در نظر گرفته شده‌‌است. در پایتون، فواصل زمانی، اعداد اعشاری بر حسب ثانیه یعنی تیک هستند.در پایتون یک ماژول محبوب برای زمان وجود دارد که شامل توابعی برای کار با زمان و تبدیل انواع نمایش آن‌‌ها به یکدیگر است. برای مثال، تابع ( ) time.time زمان فعلی سیستم را برحسب ثانیه، مبدا ذکرشده و برمی‌‌گرداند. به عنوان نمونه، شکل (13-1) را در نظر بگیرید.شکل (13-1)با اجرایاین مثال، شکل (13-2) را خواهیم‌‌داشت.شکل (13-2)محاسبات ریاضی زمان برحسب ثانیه، خیلی آسان است. با این حال، تاریخ‌‌های قبل از مبدا را نمی‌‌توان به این شکل نشان‌‌داد. به نظر می‌‌رسد در آینده (حداقل تا تاریخ 2038) نیز نمی‌‌توان با این روش به قبل از این تاریخ در یونیکس و ویندوز دسترسی‌‌یافت.13-2- تاپل تایم (TimeTuple)خروجی بسیاری از توابع زمان در پایتون، یک تاپل شامل 9 عدد است که معادل ویژگی‌‌های ساختار ( ) struct_time است. در شکل (13-3) به توضیح هر یک از آن‌‌ها خواهیم‌‌پرداخت.شکل (13-3)لازم به ذکر است که مثال‌‌های این مطلب در بخش‌‌های بعدی ذکر خواهندشد.[1]Daylight savings13-3- دریافت زمان فعلیبرای تبدیل زمان یک لحظه بر حسب ثانیه که مقداری اعشاری است به یک تاپل 9تایی زمان، کافی‌‌است که این مقدار را وارد یک تابع زمانی کنیم. همان گونه که می‌‌بینید، در مثال شکل (13-4)، زمان فعلی را به عنوان ورودیِ زمان محلی[1]، وارد آن کردیم.[1]Local Timeشکل (13-4)خروجی این مبدل به‌‌شکل (13-5) است که یک تاپل 9تایی است و برای هرویژگی مقدار خاصی‌‌را خواهیم‌‌داشت. به‌‌دلیل طولانی‌‌بودن خروجی، آن‌‌را در دو سطر نمایش‌‌دادیم.شکل (13-5)13-4- دریافت زمان قالب‌‌بندی شدهنمایش زمان در قالب تیک، خیلی خوانا و قابل فهم نیست. از این رو می‌‌توان با استفاده از تابع ( ) asctime که در شکل (13-6) می‌‌بینید، آن را بهبود ‌‌داد.شکل (13-6)با اجرای این تابع، زمان را در قالب شکل (13-7) خواهیم‌‌داشت که بسیار خواناتر و قابل فهم‌‌تر از قبل است.شکل (13-7)13-5- دریافت تقویم ماهانهماژول تقویم می‌‌تواند طیف گسترده‌‌ای از روش‌‌های نمایش تقویم سالانه و ماهانه را فراهم‌‌کند. برای نمونه، در شکل (13-8)، می‌‌خواهیم تقویم ماه فوریه سال 2019 را چاپ‌‌کنیم.شکل (13-8)با اجرای این مثال، خروجی ما همانند شکل (13-9) خواهدبود.شکل (13-9)حال که با کلیات مفهوم زمان آشنا شدید، در ادامه به بررسی هر چه بیشتر توابع و ماژول‌‌های زمان، تاریخ و تقویم می‌‌پردازیم.13-6- ماژول زماناین ماژول محبوب پایتون می‌‌تواند توابعی را برای کار با زمان و تبدیل نمایش‌‌های مختلف آن‌‌ها به یکدیگر فراهم‌‌کند. از این رو می‌‌خواهیم تمامی روش‌‌های موجود را بررسی‌‌کنیم.13-6-1- تابع LocalTimeاز آن جایی که برای توضیح مباحث پیشین، نیاز به بررسی این تابع داشتیم، از ذکر مطالب تکراری در این بخش خودداری‌‌کرده و شما را به مطالعه بخش 13-3 با عنوان دریافت زمان فعلی، ارجاع می‌‌دهیم.13-6-2- تابع GmTimeاین متد، زمان برحسب ثانیه را به یک زمان ساخت‌‌یافته[1]در واحد UTC تبدیل می‌‌کند که در آن مقدار DST همیشه برابر صفر است. اگر مقداری به این تابع داده‌‌نشده ویا مقداری برابر صفر وارد‌‌کنیم، زمان‌‌فعلی سیستم، جایگزین آن می‌‌شود. شکل (13-10) نمونه‌‌ای از استفاده این تابع را نشان می‌‌دهد.شکل (13-10)خروجی اجرای این مثال به شکل (13-11) خواهدبود.شکل (13-11)[1]Structed Time13-6-3- تابع AscTimeهمان طوری که در بخش 13-4 به آن اشاره‌‌شد، این تابع می‌‌تواند چندتایی زمان را که به صورت localtime و gmtime هستند، به یک رشته‌‌ی 24 کاراکتری تبدیل‌‌کرده  و در قالب شکل (13-12) نمایش‌‌دهد. شکل (13-12)خروجی مثال شکل (13-13)، زمان فعلی سیستم، در قالبی خواناست.شکل (13-13)13-6-4- تابع CTimeاین تابع نیز همانند ( ) asctime زمان برحسب ثانیه را به یک رشته تبدیل می‌‌کند. با این تفاوت که در تابع مذکور، نیازی به استفاده از localtime نبوده و درصورت عدم تعیین مقداری به‌‌عنوان ورودی، زمان فعلی، ورودی پیش‌‌فرض تابع خواهدبود. مثال شکل (13-14)، نمایانگر نحوه‌‌ی استفاده از این متد است.شکل (13-14)خروجی اجرای این مثال، به شکل (13-15) می‌‌شود.شکل (13-15)13-6-5- تابع AltZoneبرای دریافت انحراف (تغییر) منطقه زمانی محلی (DST)، برحسب ثانیه، از این تابع استفاده می‌‌شود. اگر مقدار مثبت برگردانده‌‌شود، انحراف از غرب UTC[1] (ساعت‌‌جهانی گرینویچ[2]) و اگر منفی باشد، انحراف از شرق آن برگردانده می‌‌شود. همچنین مقدار صفر متعلق به کشورهایی مانند انگلیس است که در ساعت صفر جغرافیایی قرار دارند. البته زمانی که از این تابع استفاده می‌‌شود، ساعت فصلی، خاموش در نظر گرفته‌‌شده و مقدار آن را به نتیجه، اضافه ویا از آن، کسر می‌‌کند. برای درک بهتر به مثال شکل (13-16) توجه‌‌کنید.شکل (13-16)با اجرای این مثال در خروجی، مقدار 16200- را خواهیم‌‌داشت. با تقسیم عدد مذکور به 60، آن را برحسب دقیقه و با تقسیم مجدد عدد حاصل بر 60، مقدار 4.5- را خواهیم‌‌داشت. فاصله زمانی کشور ما با گرینویچ، 3.5 ساعت است که به دلیل یک ساعت فاصله فصلی در این فصل از سال، مقدار 4.5 را داریم. عدد منفی نیز نمایان‌‌گر این است که ما در شرق UTC قرار‌‌داریم.[1]Coordinated Universal Time [2]Greenwich13-6-6- تابع Timeهمان طوری که در بحث‌‌های قبلی، به آن اشاره‌‌کردیم، این تابع، زمان فعلی را به صورت یک عدد اعشاری برحسب ثانیه برمی‌‌گرداند. با این وجود، همه‌‌ی سیستم‌‌ها نمی‌‌توانند زمان را با دقت بهتر از یک ثانیه ارائه‌‌دهند. این امر، موجب تولید اعداد صحیح به جای اعشاری می‌‌شود. لازم به ذکر است که اگر زمان سیستم را تغییر دهیم، با اجرای مجدد این تابع، خروجی ما نیز متفاوت از مقدار قبلی خواهدشد.13-6-7- تابع Sleepبا استفاده از این تابع می‌‌توانیم در اجرای برنامه، برای تعداد ثانیه مشخص، وقفه ایجاد‌‌کنیم. برای تعیین زمان دقیق‌‌تر می‌‌توان یک عدد اعشاری را به کار برد. لازم به ذکر است که به دلیل این که هر سیگنال دریافتی می‌‌تواند در این روند اختلال ایجادکند، ممکن‌‌است زمان تعلیق واقعی، از عدد تعیین‌‌شده، کمتر باشد. شکل (13-17) نمونه‌‌ای از استفاده‌‌ی این تابع را نشان می‌‌دهد.شکل (13-17)نتیجه اجرای این قطعه کد را در شکل (13-18) می‌‌بینید.شکل (13-18)13-6-8- تابع Clockاین تابع در سیستم عامل‌‌های یونیکس، زمان فعلی را به عنوان یک عدد اعشاری و برحسب ثانیه بیان می‌‌کند. در سیستم‌‌های ویندوزی نیز، این تابع، زمان را از اولین فراخوانی برمی‌‌گرداند. البته اغلب برای توابع تعریف‌‌شده توسط کاربر، استفاده می‌‌شود ولی از آن جایی که در حال حاضر، در مورد این توابع خاص، بحثی را مطرح نکرده‌‌ایم. به ذکر یک مثال ساده در شکل (13-19)، بسنده می‌‌کنیم.شکل (13-19)در ابتدا، زمان فعلی، چاپ‌‌شده و در ادامه با نگه‌‌داشتن زمان در متغیر t0، اقدام به کسر زمان ابتدای اجرا از این مقدار می‌‌نماییم. با اجرای این مثال، خروجی ما به شکل (13-20) خواهدشد.شکل (13-20)13-6-9- تابع MkTimeعملکرد این تابع، عکس تابع ( ) localtime است. ورودی آن، یک تاپل 9تایی زمان و خروجی آن، زمان بر حسب ثانیه خواهدبود. البته اگر این ورودی به طور صحیح وارد نشود، خطای‌‌سرریز[1] ویا خطای‌‌مقدار[2] را خواهیم‌‌داشت. شکل (13-20) مثالی را در این مورد بیان می‌‌کند.شکل (13-21)در این قطعه کد، ابتدا تاپل زمان را به ثانیه تبدیل‌‌کرده و چاپ می‌‌کنیم. سپس دوباره زمان به دست آمده را به قالب استاندارد دیگری تبدیل می‌‌نماییم. خروجی اجرای آن، به شکل (13-22) خواهدبود.شکل (13-22)[1]OverflowError [2]ValueError13-6-10- توابع StrfTime و StrpTimeتابع ( ) strftime یک تاپل ویا زمان ساخت‌‌یافته را از توابعی مانند ( ) gmtime و ( ) localtime دریافت‌‌کرده و به صورت یک رشته (که توسط آرگون‌‌های خاصی قالب‌‌بندی شده‌‌اند) برمی‌‌گرداند. همانند اکثر توابع زمانی، اگر هیچ مقدار زمانی را به عنوان ورودی آن درنظر نگیریم، از زمان فعلی سیستم، استفاده خواهدکرد. اگر هر یک از زمان‌‌ها، خارج از محدوده‌‌ی مجاز باشند، با خطای مقدار، مواجه می‌‌شویم. در شکل (13-23) مثالی از نحوه‌‌ی تعریف و استفاده این تابع  را نشان می‌‌دهیم. همان طوری که مشاهده می‌‌نمایید، ورودی اول تابع، عملگر‌‌های قالب‌‌بندی برای تعیین مقادیر هر زمان و ورودی دوم، قالب خروجی را تعیین می‌‌کند.شکل (13-23)خروجی این قطعه کد، به شکل (13-24) خواهدبود. البته در ادامه، عملگر‌‌های قالب‌‌بندی آن‌‌ها را توضیح می‌‌دهیم.شکل (13-24)در مورد تابع ( ) strptime بایستی گفت که به وسیله آن می‌‌توانیم رشته‌‌ی زمانی را به یک قالب ویا تاپل زمان، تجزیه[1]کنیم. این تابع نیز همانند ( ) strftime از عملگر‌‌های قالب‌‌بندی پیروی می‌‌کند. البته به صورت پیش فرض، قالب‌‌بندی این تابع همانند ( ) ctime و شبیه به &quot;%a %b %d %H:%M:%S %Y&quot; است. اگر رشته ورودی، قابل تجزیه نبوده ویا مقدار آن خارج از محدوده مجاز باشد، خطای مقدار را خواهیم‌‌داشت. شکل (13-25) نمونه‌‌ای از این تابع را نشان می‌‌دهد. همان گونه که می‌‌بینید، آرگومان اول تابع، یک زمان به صورت رشته و آرگومان دوم آن، عملگرهای قالب‌‌بندی برای نمایش خروجی است.شکل (13-25)خروجی این مثال به شکل (13-26) است.شکل (13-26)اکنون نوبت به توضیح عملگرهای قالب‌‌بندی زمان می‌‌رسد که در شکل (13-27) لیستی از آن‌‌ها را می‌‌بینید. لازم به ذکر است که این دو تابع، از عملگر‌‌های یکسانی استفاده‌‌کرده و به نوعی مکمل یکدیگر درنظر گرفته می‌‌شوند. همچنین بایستی اشاره‌‌کرد که، تنها عملگرهای هم نوع، می‌‌توانند در محل یکسان و به جای یکدیگر استفاده‌‌شوند. این لیست به صورت الفبایی مرتب شده‌‌است.شکل (13-27)[1]Parse13-6-11- ویژگی‌‌های time.timezone و time.tznameاین‌‌ها دو ویژگی مهمی هستند که در مورد توابع زمانی پایتون، در دسترس هستند. ویژگی timzone، آفست منطقه‌‌ی زمانی کنونی از UTC (بدون DST) را برحسب ثانیه نشان می‌‌دهد که برای قاره آمریکا بزرگتر از صفر و برای اکثر اروپا، آسیا و آفریقا برابر صفر ویا بزرگتر از آن است. همچنین ویژگی tzname یک رشته‌‌ی دوتاییِ &quot;منطقه-وابسته[1]&quot; است که نمایان‌‌گر نام منطقه‌‌ی زمانی با DST و بدون آن است.[1]Locale-Dependentبرای اینکه مطلب زیاد طولانی نباشه، این فصل رو در قالب دو بخش ارائه دادیم. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Mon, 13 Mar 2023 11:00:47 +0330</pubDate>
            </item>
                    <item>
                <title>فصل دوازدهم آموزش پایتون مقدماتی - Dictionary یا فرهنگ‌‌لغت ها</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%DB%8C%D8%A7%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-dictionary-%DB%8C%D8%A7-%D9%81%D8%B1%D9%87%D9%86%DA%AF-%D9%84%D8%BA%D8%AA-%D9%87%D8%A7-kykplo7awsfz</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh در دیکشنری، هر کلید با یک علامت دونقطه، از مقدار آن جدا شده و در کل، تمامی اعضا و عناصر آن توسط ویرگول از هم جدا می‌‌شوند. البته همه چیز اعم از کلید و مقدار، مابین جفت‌‌کوتیشن قرار می‌‌گیرند. همچنین برای تعریف دیکشنری خالی نیز می‌‌توان از علامت‌‌های { } استفاده‌‌نمود.کلید‌‌های دیکشنری منحصر به‌‌فرد هستند. حال این که ممکن‌‌است مقادیر آن‌‌ها نیز یکسان باشد. مقادیر می‌‌توانند از هر نوعی باشد، در حالی که کلیدها باید از نوع داده‌‌ی تغییرناپذیری مانند رشته، عدد ویا تاپل باشند.12-1- دسترسی به مقادیر دیکشنریبرای دسترسی به مقادیر عناصر این نوع داده، همانند شکل (12-1) می‌‌توانید از وارد‌‌نمودن مقدار کلید عنصر مدنظر در بین علامت‌‌های براکت مربعی استفاده‌‌کنید. با اجرای این مثال در خروجی، به ترتیب مقادیر ‘Zara’ و 7 را خواهیم‌‌داشت.شکل (12-1)همچنین اگر قصد داشته‌‌باشیم، به عنصری مانند ‘Alice’ دسترسی داشته‌‌باشیم که در این دیکشنری وجود ندارد، با خطایی شبیه به شکل (12-2) رو به رو خواهیم‌‌شد.شکل (12-2)12-2- به روز رسانی دیکشنریشما می‌‌توانید یک دیکشنری را با اضافه‌‌کردن ورودی‌‌جدید ویا دوتاییِ کلید و مقدار، به روز کنید. همچنین همانند شکل (12-3) می‌‌توانید اقدام به ویرایش ویا حذف یکی از آن‌‌ها نمایید.شکل (12-3)همان طوری که در این قطعه کد دیدید، هر دو دستور به یک شکل هستند. به دلیل وجود کلید ‘Age’ در دیکشنری، این دستور عمل ویرایش را روی آن اعمال خواهدکرد. این در حالی است که به دلیل عدم وجود کلید ‘School’ در دیکشنری ما، اجرای این دستور، موجب ایجاد کلید جدیدی خواهدشد.12-3- حذف عناصر دیکشنریشما به راحتی می‌‌توانید با استفاده از دستور del هر عنصر دلخواهی را از دیکشنری حذف‌‌کنید. به طور کلی، امکان حذف کل محتوای یک دیکشنری نیز وجود دارد. این کار با استفاده از دستور clean انجام می شود. شکل (12-4) مثال ساده‌‌ای از این مطلب را نشان می‌‌دهد. به یاد داشته‌‌باشید که در خروجی دستور چاپ، دیکشنری ما به صورت مرتب شده بر اساس حروف الفبا ظاهر می‌‌شود.همان طوری که از خروجی این مثال در شکل (12-5) مشخص‌‌است، در مثال اول عنصری با کلید ‘Name’ از دیکشنری ما حذف شده‌‌است. همچنین مثال دوم برای حذف تمام عناصر دیکشنری به کار رفته‌‌است. البته در سومین مثال، به دلیل ‌‌حذف این دیکشنری از حافظه، دسترسی به کلید ‘Age’ ممکن‌‌نبوده و با پیغام خطا رو برو می‌‌شویم.شکل (12-4)شکل (12-5)در مورد متد ( ) clear به صورت مجزا و در بخش مربوط به متدها بحث خواهیم‌‌کرد.12-4- خواص کلیدهای دیکشنریهمان گونه که در مبحث قبلی به آن اشاره‌‌کردیم، بر خلاف لیست ها که مقادیر آن می‌‌تواند هر نوع داده‌‌ی استانداردی باشد، کلیدها تنها بایستی از نوع داده‌‌ی تغییرناپذیر مانند رشته، عدد ویا تاپل باشند. با این حال ذکر دو نکته ضروری است.1) بیشتر از یک ورودی برای هر کلید مجاز نیست. به عبارت دیگر ما مجاز به استفاده از هیچ کلید تکراری نیستیم. اگر با عناصری مواجه‌‌شدیم که برای یک کلید، دو مقدار متفاوت دارند، آخرین انتساب، مورد قبول خواهدبود. برای مثال در شکل (12-6) با توجه به انتصاب دو مقدار مجزا برای کلید ‘ Name’ در خروجی اجرای قطعه کد، مقدار دوم یعنی ‘ Manni’ را خواهیم‌‌داشت.شکل (12-6)2) کلیدها باید تغییر‌‌ناپذیر باشند. به این معنی که شما می‌‌توانید از رشته، عدد ویا تاپل استفاده‌‌کنید. همان طوری که در شکل (12-7) می‌‌بینید، استفاده از عناصری مانند [‘key’] مجاز نیست.شکل (12-7)با اجرای این مثال با خطایی همانند شکل (12-8) مواجه خواهیم‌‌شد.شکل (12-8)12-5- توابع داخلی دیکشنریاز آن جایی که عملکرد و نحوه‌‌ی استفاده از تابع  ( ) len شبیه به چیزی که در لیست‌ و تاپل دیدید، است، از توضیح بیشتر در این دو مورد صرف نظر نموده و فقط اشاره می‌‌کنیم که در این جا ورودی آن‌‌ها، دیکشنری خواهدبود.در این قسمت اشاره‌‌ای به دو تابع دیگر خواهیم‌‌داشت که علاوه‌‌بر دیکشنری، برای سایر انواع داده نیز مورد استفاده قرار می‌‌گیرند.1) تابع ( ) str برای تبدیل انواع داده به رشته، کاربرد دارد. همان گونه که در شکل (12-9) می‌‌بینید، برای این کار کافی است، نوع داده‌‌ی مدنظر را درون پارانتز قرار داده و به عنوان ورودی تابع درنظر گیریم.شکل (12-9)نتیجه‌‌ی اجرای این قطعه کد، به شکل (12-10) خواهدبود.شکل (12-10)2) تابع ( ) type برای برگرداندن نوع متغیر داخل پارانتز استفاده می‌‌شود. شکل (12-11) نمونه‌‌ای از استفاده‌‌ی این تابع را نشان می‌‌دهد.شکل (12-11)برای چاپ خروجی این تابع از عملگرهای قالب‌‌بندی رشته استفاده می‌‌شود. با اجرای این مثال، خروجی ما به صورت شکل (12-12) می‌‌شود که بیانگر نوع دیکشنری است.شکل (12-12)12-6- متدهای کار با دیکشنریدر مبحث نهایی این فصل، به توضیح در مورد تعدادی از متدهایی خواهیم‌‌پرداخت که برای دستکاری دیکشنری استفاده می‌‌شوند.12-6-1- متد Clearهمان طوری که در مبحث قبلی و در شکل (12-4) به آن اشاره‌‌شد، از این متد برای پاک‌‌کردن تمام عناصر موجود در دیکشنری و در نتیجه تبدیل طول آن به صفر استفاده می‌‌شود.12-6-2- متد Copyاگر بخواهیم یک کپی از دیکشنری فعلی را با عنوان دیکشنری جدید، داشته‌‌باشیم، همانند شکل (12-13) می‌‌توان به راحتی از این متد استفاده‌‌نمود.شکل (12-13)حال اگر از دستور print (dict2) استفاده‌‌کنید، خواهیددید که عناصر آن همانند عناصر dict1 است.12-6-3- متد FromKeysاین متد می‌‌تواند به وسیله مجموعه‌‌ای از داده‌‌های یک دنباله، دیکشنریِ جدیدی را ایجاد نماید. در شکل (12-14)، دو نوع مختلف از این کاربرد را نشان‌‌دادیم.شکل (12-14)همان طوری که در شکل (12-15) مشاهده می‌‌کنید، حاصل اجرای مثال اول این قطعه کد، یک دیکشنری با کلیدهایی از تاپل seq بوده و مقادیر آن برابر None است. در حالی که خروجی دومین مثال، کلیدها برابر مقادیر ذکرشده بوده و مقادیر همه‌‌ی آن‌‌ها برابر 10 است.شکل (12-15)12-6-4- متد Has_Keyبرای بررسی وجود یک عنصر خاص در دیکشنری از این متد استفاده می‌‌نماییم. روشن است که در صورت وجود، مقدار True و در غیر این صورت، مقدار False برمی‌‌گردد. در پایتون نسخه 3 این متد با دستور in جایگزین شده است. شکل (12-16) نمونه‌‌ای از این کاربرد را نشان می‌‌دهد.شکل (12-16)با اجرای این قطعه کد مشاهده می‌‌کنیم که به دلیل وجود کلید ‘ Age’ مقدار True را خواهیم‌‌داشت. همچنین عدم وجود کلید ‘Gender’ خروجی False را درپی دارد.12-6-5- متد Itemsاین متد برای ما یک لیست، حاوی دوتایی کلید و مقدار را برمی‌‌گرداند. در شکل (12-17)، این مطلب را مشاهده می‌‌کنید.شکل (12-17)خروجی اجرای این مثال، به شکل (12-18) خواهدبود.شکل (12-18)12-6-6- متدهای Keys و Valuesبه وسیله‌‌ی این متدها می‌‌توانیم به ترتیب، لیستی از کلیدها ویا مقادیر یک دیکشنری را داشته‌‌باشیم. مثالی در مورد استفاده از این دو متد را در شکل (12-19) خواهید دید.شکل (12-19)پس از اجرای این مثال، خروجی ما به شکل (12-20) خواهدشد.شکل (12-20)12-6-7- متد Getاستفاده از این متد، موجب برگشت مقدار کلید خاصی، در صورت وجود، می‌‌شود. عدم وجود آن، مقدار None را در پی خواهدداشت. البته در شکل (12-21) مشاهده می‌‌کنید که، می‌‌توان از مقدار دلخواهی به جای None استفاده‌‌کرد.شکل (12-21)خروجی این سه دستور چاپ به ترتیب برابر 7، None و Never است.12-6-8- متد SetDefaultتفاوت این متد با ( ) get در این است که، متد مذکور علاوه بر نمایش خروجی، درصورت عدم وجود کلید مدنظر، آن را با مقدار تعیین‌‌شده، به دیکشنری اضافه می‌‌کند. از روی شکل (12-22) بهتر متوجه این مطلب خواهیم‌‌شد.شکل (12-22)در نهایت می‌‌بینیم که خروجی این مثال به شکل (12-23) خواهدبود.شکل (12-23)12-6-9- متد Updateآخرین مطلب مورد بحث ما از این بخش، متدی‌‌است که به ما اجازه‌‌ی افزودن گروهیِ عناصر یک دیکشنری به دیکشنری دیگر را صادر می‌‌کند. در شکل (12-24) خواهید دید که تمامی عناصر dict2 به dict1 افزوده‌‌شده و در خروجی چاپ می‌‌گردد.شکل (12-24)با اجرای این قطعه کد، شکل (12-25) در خروجی ظاهر می‌‌شود.شکل (12-25)در پست بعدی به تاریخ و زمان خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sun, 12 Mar 2023 10:28:42 +0330</pubDate>
            </item>
                    <item>
                <title>فصل یازدهم آموزش پایتون مقدماتی - Tuple یا چندتایی ها</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%DB%8C%D8%A7%D8%B2%D8%AF%D9%87%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-tuple-%DB%8C%D8%A7-%DA%86%D9%86%D8%AF%D8%AA%D8%A7%DB%8C%DB%8C-%D9%87%D8%A7-motmiw7cnot9</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh یک چندتایی یا تاپل، دنباله‌‌ای از اشیای غیرقابل تغییر پایتون هستند. آن‌‌ها نیز همانند لیست‌‌ها، نوعی دنباله هستند، با این تفاوت که بر خلاف لیست‌‌ها، بعد از تعریف، نمی‌‌توان آن‌‌ها را تغییرداد. همچنین این نوع داده با علامت پارانتز مشخص می‌‌شود، در حالی که لیست‌‌ها از براکت‌‌های مربعی استفاده می‌‌نمایند.البته استفاده از پارانتز نیز اختیاری‌‌است. برای جداسازی عناصر مختلف نیز می‌‌توان از علامت کاما استفاده‌‌کرد. به عبارت دیگر، اگر دنباله‌‌ای از انواع داده مختلف بدون استفاده از پارانتز، تعریف و به وسیله کاما از هم جداشوند، به صورت پیش فرض از نوع تاپل یا چندتایی شناخته می‌‌شوند. به عنوان مثال، شکل (11-1) را داریم.شکل (11-1)برای تعریف یک تاپل خالی (از این به بعد به جای عبارت چندتایی، این واژه را به کار خواهیم‌‌برد)، کافی‌‌است همانند شکل (11-2) از پارانتز خالی استفاده‌‌نماییم. البته برای تعریف تاپلی با یک عضو، حتما باید یک کاما به آخر آن افزود.شکل (11-2)همانند لیست و رشته، اندیس تاپل نیز از صفر شروع می‌‌شود. همچنین بر روی این نوع نیز می‌‌توان عملگرهایی مانند قطعه‌‌قطعه، جمع و از این‌‌قبیل را پیاده‌‌کرد.11-1- دسترسی به مقادیر تاپلبرای این کار در تاپل شبیه به لیست عمل خواهیم‌‌کرد. همان طوری که در شکل (11-3) مشاهده می‌‌نمایید، کافی‌‌است از براکت‌‌های مربعی و اندیس‌‌ها برای دسترسی به مقادیر مدنظر استفاده‌‌کنیم. خروجی این قطعه کد به شکل (11-4) خواهدبود.شکل (11-3)شکل (11-4)11-2- به‌‌روز رسانی تاپلدر بحث قبلی اشاره‌‌شد که نوع داده‌‌ی تاپل تغییرناپذیر هستند. به این معنی که شما نمی‌‌توانید مقادیر عناصر آن را به روز کرده ویا مقدار آن‌‌ها را تغییر‌‌دهید. چنان‌‌چه در شکل (11-5) می‌‌بینید، تنها کاری که می‌‌توانید، انجام‌‌دهید افزودن بخشی از تاپل موجود بر روی تاپل دیگر برای ایجاد تاپل جدید است. بنابراین بر خلاف لیست نمی‌‌توانید دستور “tup[x] = y” را به کار گیرید. خروجی اجرای این مثال به شکل (11-6) خواهدبود.شکل (11-5)شکل (11-6)11-3- حذف تاپلاز آن جایی که تاپل‌‌ها غیر قابل تغییر هستند، حذف عناصر آن به صورت تک به تک امکان‌‌پذیر نیست. البته می‌‌توانید تاپل جدیدی را با عناصر دلخواه تاپل قدیمی ایجاد‌‌کرده و تاپل قبلی را به کل حذف‌‌کنید. در بخش پیشین، نحوه ایجاد تاپل جدید را بررسی‌‌نمودیم. حال همانند شکل (11-7) می‌‌توان اقدام به حذف تاپل نمود.شکل (11-7)خروجی این مثال را در شکل (11-8) می‌‌بینیم. به دلیل حذف تاپل، اثری از آن نمانده و استفاده از دستور چاپ، خطای عدم تعریف تاپل را تولید می‌‌کند.شکل (11-8)11-4- عملیات‌‌پایه و توابع‌‌داخلیبا توجه به این‌‌که تمامی عملیات پایه ازجمله محاسبه‌‌طول، جمع، ضرب، تکرار، عضویت و حلقه تکرار و توابع داخلی مانند max و min دقیقا شبیه به لیست هستند، از ارائه توضیح بیشتر و تکراری در این مورد اجتناب می‌‌کنیم. فقط توجه داشته باشید که خروجی بعضی از آن‌‌ها، تاپل نخواهدبود.ذکر این نکته ضروری‌‌است که تنها تابع متفاوت با لیست، تابع ( ) tuple خواهدبود که برای تبدیل لیست به تاپل قابل استفاده است. به عبارت دیگر، ورودی این تابع با توجه به شکل (11-9)، یک لیست بوده و خروجی آن یک تاپل خواهدبود.شکل (11-9)و در نهایت خروجی این مثال به صورت شکل (11-10) به نمایش در می‌‌آید.شکل (11-10)در پست بعدی به Dictionary یا فرهنگ‌‌لغت ها خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Sat, 11 Mar 2023 10:32:15 +0330</pubDate>
            </item>
                    <item>
                <title>فصل دهم آموزش پایتون مقدماتی - لیست ها</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D8%AF%D9%87%D9%85-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D9%84%DB%8C%D8%B3%D8%AA-%D9%87%D8%A7-vagtq4bpyaxq</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh اساسی‌‌ترین ساختمان داده در پایتون، دنباله‌‌ها[1] هستند. هر عنصر از دنباله، عددی را برای تعیین موقعیت یا اندیس خود دارد. اندیس اول برابر صفر، دومی برابر یک و الی آخر است.پایتون از شش نوع دنباله پشتیبانی می‌‌کند که رایج‌‌ترین آن‌‌ها، لیست و چندتایی هستند. ما نیز در این فصل، به بحث در مورد لیست‌‌ها و در فصل بعدی در مورد چندتایی‌ها خواهیم‌‌پرداخت.کارهایی هستند که شما می‌‌توانید با همه نوع دنباله انجام‌‌دهید. این عملیات شامل اندیس‌‌گذاری[2]، برش[3]، جمع، ضرب و بررسی‌‌عضویت هست. علاوه بر این‌‌ها، پایتون دارای چندین تابع داخلی برای پیدا‌‌کردن طول دنباله، بزرگترین و کوچکترین عضو دنباله است.[1]Sequences [2]Indexing [3]Slicing10-1- لیست در پایتونلیست‌‌ها در پایتون، متنوع‌‌ترین نوع داده هستند. آن‌‌ها دنباله‌‌ای از مقادیر جداشده توسط کاما هستند که مابین براکت‌‌های مربعی یا همان [ ] قرار می‌‌گیرند. مهم‌‌ترین مزیت لیست، عدم نیاز به یک نوع بودن عناصر موجود در آن است. همان طوری که در شکل (10-1) می‌‌بینید، ساخت یک لیست، بسیار راحت و ساده است.شکل (10-1)اغلب کارهایی که می‌‌توان با لیست انجام‌‌داد، مشابه رشته است.10-2- دسترسی‌‌به مقادیر لیست‌‌هابرای این کار کافی‌‌است همانند شکل (10-2) اندیس ویا اندیس‌‌های مورد نیاز را درون براکت قراردهیم. چنان‌‌چه مشاهده می‌‌کنید در لیست اول عناصری از هر دو نوع رشته‌‌ای و عددی داریم.شکل (10-2)همان طوری که در شکل (10-3) می‌‌بینید، خروجی دستور چاپ اول، فقط یک عنصر و به عبارت دیگر، یک رشته خواهدبود. همچنین برای چاپ دوم، لیستی از اعداد 2 الی 5 را داریم. البته آخرین اندیس تعیین‌‌شده که مقداری برابر 6 دارد، در خروجی نخواهدبود.شکل (10-3)لازم به ذکر است که اگر از اعداد منفی برای دسترسی به اندیس‌‌ها استفاده‌‌نماییم، با حفظ اندیس صفر برای اولین عضو، شمارش بقیه از سمت راست خواهدبود. بنابراین اندیس منفی‌‌یک به آخرین عضو و اندیس منفی‌‌دو به یکی مانده به آخر اشاره خواهدداشت. همچنین اگر اندیس ابتدایی را مشخص‌‌کرده و انتهایی را مشخص‌‌نکنیم، منظور تا اندیس آخر خواهدبود. شکل (10-4) نمایانگر این مطالب است. خروجی این مثال را در شکل (10-5) می‌‌بینید.شکل (10-4)شکل (10-5)10-3- به‌‌روز رسانی لیستهمان گونه که در شکل (10-6) خواهیددید، شما می‌‌توانید مقدار یک یا چندین عنصر از لیست را با استفاده از عملگر انتساب تغییر‌‌دهید. همچنین به وسیله ( ) append عنصر جدیدی را به لیست افزود که این بحث را در بخش دیگری از این فصل بررسی خواهیم‌‌کرد.شکل (10-6)ابتدا مقدار اندیس 2 از لیست، به 2001 تغییر می‌‌کند. با توجه به این‌‌که در خط بعدی 3 اندیس برای تغییر در نظرگرفته شده ولی تنها دو مقدار برای آن‌‌ها انتصاب دادیم، مقادیر اندیس‌‌های صفر و یک به 2019 و 2018 تغییر می‌‌یابد. بنابراین لیست جدیدی در خروجی شکل (10-7)  ظاهر می‌‌شود.شکل (10-7)10-4- حذف عناصر از لیستبرای حذف یک ویا چند عنصر از لیست، می‌‌توان از دستور del و یا متد ( ) remove استفاده‌‌کرد. اگر اندیس عنصر مدنظر را می‌‌دانید، از روش اول و در غیر این صورت از دومی استفاده‌‌نمایید. در شکل (10-8) مثال‌‌هایی در مورد دستور del خواهیم‌‌داشت. در مورد روش بعدی نیز در بخش مجزا بحث خواهیم‌‌کرد.شکل (10-8)در این قطعه کد ابتدا مقدار اندیس 2 حذف می‌‌شود. حال با توجه به این‌‌که دستور del در لسیت، آخرین اندیس را در نظر گرفته نمی‌‌گیرد،مقادیر اندیس‌‌های صفر و یک حذف می‌‌شود. که در نهایت لیست ما حاوی فقط یک عنصر خواهدبود. خروجی این مثال را در شکل (10-9) می‌‌بینید.شکل (10-9)10-5- عملیات پایه‌‌ی لیستهمانند رشته، در لیست می‌‌توان از عملگرهای + و * استفاده‌‌کرد. اولی برای اتصال چند لیست به هم و دومی برای تکرار یک لیست به تعداد تعیین‌‌شده، خواهد‌‌بود. همان طوری که در شکل (10-10) می‌‌بینید، خروجی نهایی این عملگرها، یک لیست است. همچنین چگونگی محاسبه‌‌ی طول لیست، بررسی عضویت و نحوه‌‌ی ایجاد یک حلقه تکرار را نیز در این شکل توضیح داده‌‌ایم.شکل (10-10)10-6- توابع داخلی لیست‌‌هابر خلاف تعداد زیاد توابع داخلی مربوط به رشته‌‌ها، زبان پایتون از تعداد محدودتر این توابع برای لیست پشتیبانی می‌‌کند. در ادامه به توضیح هریک از آن‌‌ها خواهیم‌‌پرداخت.10-6-1- توابع Max و Minاین توابع می‌‌توانند به ترتیب، بزرگترین و کوچکترین عنصر از یک لیست را برگردانند. روش و معیار مقایسه در تابع مذکور به صورت عناصر داخل لیست است. همچنین در نظر داشته باشید برای استفاده از این توابع بایستی تمامی عناصر لیست از یک نوع داده باشند. برای نمونه شکل (10-11) را می‌‌بینیم.شکل (10-11)نتیجه اجرای این قطعه کد به صورت شکل (10-12) است.شکل (10-12)10-6-2- تابع Listورودی این تابع، یک چندتایی و خروجی آن، یک لیست است. بنابراین اگر بخواهیم یک چندتایی را به نوع داده لیست تبدیل‌‌کنیم، به راحتی می‌‌توان از این تابع استفاده‌‌کرد. همان گونه که در شکل (10-13) می‌‌بینید، عمده تفاوت چندتایی با لیست در علامت‌‌های ( ) با [ ] است.شکل (10-13)خروجی این‌‌مثال را در شکل (10-14) نشان‌‌دادیم.شکل (10-14)10-7- متدهای کار با لیست‌‌هاهمانند توابع داخلی، تعداد محدودی از متدها برای لیست‌‌ها وجود دارند که در ادامه به توضیح آن‌‌ها می‌‌پردازیم.10-7-1- متد Countهمان طوری که در شکل (10-15) مشاهده می‌‌کنید، برای یافتن تعداد یک عنصر خاص در لیست موجود، از این متد استفاده می‌‌شود. خروجی این شکل به ترتیب مقادیر 2 و 1 است.شکل (10-15)10-7-2- متد Indexدر صورتی که به دنبال یافتن اولین اندیس ظاهرشدن عنصری از لیست باشیم، از این متد استفاده می‌‌کنیم. برای مثال در شکل (10-16) عنصر ‘xyz’ در اندیس‌‌های 1 و 3 ظاهر شده‌‌است ولی این متد مقدار 1 را برمی‌‌گرداند.شکل (10-16)10-7-3- متد Insertبا مشخص‌‌نمودن شماره‌‌ی اندیس و مقدار عنصر آن و با استفاده از این متد می‌‌توان عنصر مدنظر را در اندیس مشخص‌‌شده درج‌‌کرد. شکل (10-17) نمونه‌‌ای از کاربرد این متد را نشان می‌‌دهد.شکل (10-17)در شکل (10-18) می‌‌بینیم که عدد 2009 در محل اندیس سوم، یعنی عنصر چهارم جای گرفته است.شکل (10-18)10-7-4- متد Appendبرخلاف ( ) insert، این متد، عنصر مدنظر را به انتهای لیست اضافه می‌‌کند. به عنوان مثال، در شکل (10-19)، مقدار 2009 به لیست ما افزوده می‌‌شود.شکل (10-19)خروجی این مثال، به شکل (10-20) خواهدشد.شکل (10-20)10-7-5- متد Extendاین متد همانند ( ) append عمل می‌‌کند. با این تفاوت که به جای یک عنصر، یک لیست را به انتهای لیست مدنظر اضافه می‌‌کند. در شکل (10-21) لیست bList به انتهای aList افزوده می‌‌شود. درنهایت، خروجی ما به شکل (10-22) خواهدبود.شکل (10-21)شکل (10-22)10-7-6- متد Removeبرای حذف اولین مورد مشاهده‌‌شده از یک عنصر خاص در لیست، این‌‌متد را به‌‌کار می‌‌گیریم. در شکل (10-23) دو مورد از عنصر ‘xyx’ موجود است که تنها اولین مورد از آن با متد ( ) remove حذف خواهدشد. به عبارت دیگر، همیشه اندیس کوچکتر حذف خواهدشد.شکل (10-23)در شکل (10-24)، خروجی این قطعه کد را نشان دادیم.شکل (10-24)10-7-7- متد Popدر صورتی که هیچ اندیسی برای این متد مشخص‌‌نشود، مقدار آخرین عنصر لیست را برگردانده و سپس آن را از لیست حذف می‌‌کند. چنان‌‌چه در شکل (10-25) مشاهده می‌‌نمایید، اگر اندیس تعیین‌‌گردد، آن‌‌عنصر در خروجی ظاهرشده و سپس از لیست حذف خواهدشد. لازم به ذکر است که این متد خود لیست را بر‌‌نمی‌‌گرداند. برای این‌‌کار بایستی از دستور مجزا استفاده‌‌کنید که ما در این مثال، از دستور چاپ استفاده‌‌کردیم.شکل (10-25)در مثال اول این شکل، ابتدا عنصر ‘abc’ چاپ‌‌شده و سپس حذف می‌‌شود و در مثال دوم این کار برای عنصر اندیس 2 یعنی ‘zara’ انجام خواهدشد. خروجی این قطعه کد را در شکل (10-26) می‌‌بینید.شکل (10-26)10-7-8- متد Sortهمان گونه که از اسم آن پیداست، می‌‌توان برای مرتب‌‌سازی لیست‌‌ها، از آن  استفاده‌‌کرد. همان طوری که در از قبل اشاره‌‌کردیم، بایستی تمامی داده های لیست در این متد از یک نوع باشند. شکل (10-27) بیانگر این مطلب است. لیست مرتب‌‌شده را در شکل (10-28) می‌‌بینید.شکل (10-27)شکل (10-28)10-7-9- متد Reverseبرای معکوس‌‌سازی لیست می‌‌توان از این متد استفاده‌‌کرد. نمونه‌‌ای از متد فوق را درشکل (10-29) مشاهده می‌‌کنید.شکل (10-29)در نهایت خروجی مثال ما به شکل (10-30) خواهد‌‌بود.شکل (10-30)در پست بعدی به Tuple یا چندتایی خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Tue, 07 Mar 2023 09:47:37 +0330</pubDate>
            </item>
                    <item>
                <title>فصل نهم آموزش پایتون مقدماتی - رشته ها (بخش سوم)</title>
                <link>https://virgool.io/@dmahdipour/%D9%81%D8%B5%D9%84-%D9%86%D9%87%D9%85-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D8%B1%D8%B4%D8%AA%D9%87-%D9%87%D8%A7-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-tovvl3csckbl</link>
                <description>سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh 9-8-21- متد Capitalizeهمان گونه که در شکل (9-49) مشخص‌‌است، اگر حرف اول رشته، کوچک باشد، این متد، آن را به حرف بزرگ تبدیل می‌‌کند.شکل (9-49)خروجی این قطعه کد را در شکل (9-50) می‌‌بینید.شکل (9-50)9-8-22- متد Titleبا استفاده از متد فوق می‌‌توانیم رشته‌‌ی دلخواه را طوری تغییر دهیم که حروف اول تمامی کلمات آن، بزرگ و بقیه کوچک شوند. شکل (9-51) مثال‌‌هایی را در این رابطه نشان می‌‌دهد.شکل (9-51)خروجی تغییریافته رشته‌‌ی اصلی را در شکل (9-52) می‌‌بینید.شکل (9-52)9-8-23- متدهای Lower و Upperبا توجه به مثال شکل (9-53)، با استفاده از متد ( ) lower، تمامی حروف‌‌بزرگ یک رشته با استفاده‌‌از این متد تبدیل به حروف‌‌کوچک خواهندشد.شکل (9-53)خروجی این قطعه کد را در شکل (9-54) مشاهده می‌‌کنید. لازم به ذکر است که عملکرد متد ( ) upper عکس ( ) lower است.شکل (9-54)9-8-24- متد SwapCaseاگر بخواهیم حروف بزرگ رشته‌‌ی دلخواه را به کوچک و حروف کوچک آن را به بزرگ تبدیل‌‌کنیم، می‌‌توانیم به سادگی از این متد استفاده‌‌کنیم. یکی از کاربردهای آن، زمانی‌‌است که کلید CapsLock صفحه کلید شما روشن‌‌است و مانند شکل (9-55)، شما را هنگام استفاده‌‌از کلید Shift به دردسر انداخته و یک رشته از کلمات اشتباه را تایپ نموده‌‌اید.شکل (9-55)خروجی و رشته‌‌ی اصلاح شده‌‌ی مثال قبلی را در شکل (9-56) می‌‌بینیم.شکل (9-56)9-8-25- متد Joinدرصورتی که نیاز داشته‌‌باشیم که عناصر موجود در لیست ویا چندتایی از نوع رشته را با استفاده از یک کاراکتر ویا عبارت خاص به هم چسبانده و تبدیل به یک رشته‌‌ی واحد نماییم، از این متد استفاده می‌‌کنیم. برای نمونه خروجی شکل (9-57) به صورت a-b-c خواهد‌‌بود.شکل (9-57)9-8-26- متد Lenطول انواع داده‌‌ها از جمله رشته، لیست، چندتایی و فرهنگ‌‌لغت را برمی‌‌گرداند. از آن جایی که بحث ما در مورد رشته‌‌هاست، در شکل (9-58) نیز از مثال رشته‌‌ای استفاده‌‌نمودیم. رشته‌‌ی str حاوی 32 کاراکتر است، بنابراین خروجی مثال ما نیز همان عدد خواهد‌‌بود.شکل (9-58)9-8-27- متدهای Rjust و Ljustاگر طول رشته ما از عدد تعیین‌‌شده در این متدها کوچک‌‌تر باشد، بسته به انتخاب یکی از متد ( ) rjust و ( ) ljust به ترتیب سمت چپ و راست رشته با کاراکتر دلخواه پر می‌‌شود. در نهایت طول رشته برابر با آن عدد خواهدشد. برای درک بهتر، به مثال شکل (9-59) نگاه‌‌کنید.شکل (9-59)دقت‌‌نمایید که حروف R و L جهت قرارگیری رشته ‌‌را در سمت چپ و راست مشخص می‌‌کنند. بنابراین خروجی این قطعه کد همانند شکل (9-60) می‌‌شود.شکل (9-60)9-8-28- متد ZFillمتد فوق، شبیه به ( ) rjust عمل می‌‌کند با این تفاوت که در این متد، کاراکتر پرکننده، همان عدد صفر است. نمونه‌‌ای از آن را در شکل (9-61) می‌‌بینید.شکل (9-61)خروجی این مثال به شکل (9-62) است.شکل (9-62)9-8-29- متدهای Rstrip ، Lstrip و Stripبرخلاف متدهای خانواده‌‌ی Just که کاراکتر خاصی را به رشته اضافه می‌‌کردند، وظیفه‌‌ی این متدها، حذف کاراکتر تعیین‌‌شده از سمت‌‌راست، چپ ویا هر دو طرف رشته است. همان گونه که در شکل (9-63) می‌‌بینید، این وظایف به ترتیب با متدهای lstrip ،  rstrip  و strip انجام می‌‌پذیرد. همچنین اگر هیچ کاراکتر خاصی تعیین‌‌نشود، به صورت پیش فرض، کاراکتر فاصله را درنظر می‌‌گیرند.شکل (9-63)به دلیل این که، علامت خطِ زیر نسبت به فاصله خالی، بهتر دیده می‌‌شود ، در شکل (9-64) به جای فاصله، از این علامت استفاده کرده‌‌ایم.شکل (9-64)9-8-30- متدهای Min و Maxبه ترتیب این متدها، کوچک‌‌ترین و بزرگ‌‌ترین مقدار موجود در انواع داده را برمی‌‌گردانند. در این مثال، متدهای ذکرشده، کد اسکی کاراکترهای موجود در رشته را ملاک ارزیابی قرار می‌‌دهند. لطفا با دقت به شکل (9-65) نگاه‌‌کنید.شکل (9-65)بزرگ‌‌ترین و کوچک‌‌ترین کد اسکی در بین کاراکترهای این رشته به ترتیب مربوط به کارکترهای x و فاصله است. بنابراین در خروجی نیز آن‌‌ها را خواهیم‌‌داشت.9-8-31- متد Splitاین متد توسط جدا کننده‌‌ای که توسط برنامه‌‌نویس تعیین می‌‌شود، رشته‌‌ی دلخواه را جدا کرده و تبدیل به لیست می‌‌کند. اگر این جداکننده تعریف‌‌نشود، به‌‌طور پیش‌‌فرض از کاراکترهای فضای‌‌خالی استفاده می‌‌شود. البته امکان تعیین تعداد جداسازی به صورت اختیاری وجود ‌‌دارد. تعداد بخش‌‌های جداشده، همیشه یک واحد بیشتر از عدد تعیین‌‌شده خواهدبود. برای مثال، شکل (9-66) را ببینید.شکل (9-66)همان طوری که در شکل (9-67) می‌‌بینید، به‌‌علت عدم تعیین جدا‌‌کننده در اولین دستور چاپ، عبارات برحسب فاصله از هم جداشده‌‌اند. در حالی که در دستور دوم، کاراکتر فضای‌‌خالی به عنوان جداکننده تعیین شده‌‌است. همچنین عدد یک نشانگر این مطلب است که در نهایت می‌‌بایستی لیست ما حاوی دو عنصر باشد.شکل (9-67)9-8-32- متد SplitLinesاگر بخواهیم رشته‌‌ای را براساس عملگر ‘ n\’ ویا سطر جدید، جداکنیم، می‌‌توان از این متد استفاده‌‌کرد. در صورتی که نیاز به حفظ عملگر ‘ n\’ در کنار عناصر جداشده باشد، کافی‌‌است به عنوان آرگومان از مقادیر True ، False ویا اعداد بزرگتر از صفر استفاده‌‌کرد. شکل (9-68) نمونه‌‌هایی از کاربرد این متد را نشان می‌‌دهد.شکل (9-68)شکل (9-69) نشان‌‌دهنده خروجی این قطعه کد است. مشخص است که وجود عبارت False تفاوتی در خروجی ما ایجاد نمی‌‌کند. درحالی که عدد 3 در حالت Boolean برابر True بوده و خروجی آن حاوی علامت‌‌های ‘ n\’ خواهدبود.شکل (9-69)9-8-33- متدهای MakeTrans و Translateمتد ( ) maketrans، یک جدولِ ترجمه را ارائه می‌‌دهد به طوری که در آن، هر یک از کاراکترها، نظیر به نظیر به کاراکتر دیگری نگاشت می‌‌شوند. چنان‌‌چه با دقت به شکل (9-70) نگاه‌‌کنید، خواهید‌‌دید، متغیر outtab حاوی کاراکترهایی است که باید با محتوای متغیر intab جایگزین‌‌شوند. توجه‌‌کنید که هر دو متغیر باید طول یکسانی داشته‌‌باشند. نگاشت این دو متغیر توسط متد مذکور، انجام می‌‌گیرد. درنهایت توسط متد ( ) translate رشته ورودی، تبدیل به رشته‌‌ی دلخواه می‌‌شود. البته برای استفاده از این دو متد بایستی ماژول مربوط به آن‌‌ها را وارد‌‌کنیم.شکل (9-70)خروجی این قطعه کد را در شکل (9-71) می‌‌بینید.شکل (9-71)در فصل بعد سعی می‌‌کنیم، توضیحات بیشتری را برای درک بهتر لیست‌‌ها، تقدیم حضورتان نماییم.در پست بعدی به لیست خواهیم پرداخت. با ما همراه باشین.</description>
                <category>داریوش مهدی پور یقینی</category>
                <author>داریوش مهدی پور یقینی</author>
                <pubDate>Wed, 01 Mar 2023 10:22:36 +0330</pubDate>
            </item>
            </channel>
</rss>