<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Amir big</title>
        <link>https://virgool.io/feed/@amirbig</link>
        <description>برنامه نویس پایتون هستم</description>
        <language>fa</language>
        <pubDate>2026-06-17 05:57:33</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/20354/avatar/Qo6rm9.png?height=120&amp;width=120</url>
            <title>Amir big</title>
            <link>https://virgool.io/@amirbig</link>
        </image>

                    <item>
                <title>جهنم چطور در تاریخ هنر تصور شده است؟</title>
                <link>https://virgool.io/@amirbig/%D8%AC%D9%87%D9%86%D9%85-%DA%86%D8%B7%D9%88%D8%B1-%D8%AF%D8%B1-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%87%D9%86%D8%B1-%D8%AA%D8%B5%D9%88%D8%B1-%D8%B4%D8%AF%D9%87-%D8%A7%D8%B3%D8%AA-kmpiushcwsk3</link>
                <description>طبقات جهنم دانته آلیگیریدانته آلیگری، شاعر مشهور قرون وسطایی ایتالیایی، تخیل شگفت‌انگیزی داشت، به‌ویژه وقتی نوبت به درک وحشت جهنم می‌رسید. هیولاهای درنده در انتظار گناهکارانی که دوزخ را پر می کنند. بخش اول شعر حماسی کمدی الهی او در اوایل دهه 1300 سروده شد. در یک کانتو، سربروس، جانور سه سر و چشم زرشکی، که از دروازه‌های جهان مردگان نگهبانی می‌کند، با دست‌های پنجه‌دار، ارواح را می‌درد.در حالی که تصویر ترسناک و واضح نویسنده از 9 دایره جهنم(تصویر بالا) ممکن است مشهورترین تصویر جهنم در ادبیات باشد، هنرمندان نیز چشم اندازهایی از جهان اموات را ساخته اند که به همان اندازه دلخراش هستند. تاریخ هنر غرب مملو از مناظر جهنمی است - ترکیب‌هایی که انواع عذاب‌های جسمی، روانی و روحی را نشان می‌دهند. بسیاری از آنها مستقیماً از نوشته های دانته استفاده می کنند، در حالی که برخی دیگر از توصیفات لعنت در کتاب مقدس مسیحی استفاده می کنند که هدف آن ترساندن ایمانداران به فضیلت است. در زیر، گشتی در دلهره‌آورترین تفاسیر جهنم از زمان دانته تا امروز می‌زنیم. برخی از آنها ترسناک هستند، برخی دیگر به طرز لذت بخشی پوچ هستند - اما همه آنها ترکیبی از ترس، گناه و رنج انسانی را کشف می کنند.1. آخرین داوری، 1307، Giottoجوتو نقاش فلورانسی استعداد دراماتیک داشت. مانند بسیاری از هنرمندانی که در سپیده دم قرن چهاردهم کار می کردند، او عمدتاً نقاشی های دیواری را برای کلیساهای خصوصی خانواده های ثروتمند می کشید. با این حال، نقاشی‌های او کاملاً منحصربه‌فرد هستند: شخصیت‌های کتاب مقدسی که ترکیب‌های او را پر می‌کنند، مانند اجداد بیزانسی‌اش صاف و سبک نیستند. در عوض، آنها با انرژی سرخ خون و احساسات شدید انسانی می پیچند.این در هیچ کجا به اندازه کلیسای کوچک Scrovegni در پادوآ آشکار نیست. در پشت نمازخانه یکی از تأثیرگذارترین نقاشی های تاریخ هنر از آخرین داوری قرار دارد، رویداد مهمی که در عهد جدید توصیف شده است، زمانی که در پایان جهان، خدا مردگان را به بهشت راهنمایی می کند یا آنها را به دنیای آتشین زیرین تبعید می کند. متن مذهبی سرنخ‌های زیادی در مورد اینکه جهنم چه شکلی است باقی نمی‌گذارد، بنابراین جوتو بر اساس تفاسیر هنری گذشته و همچنین تخیل بارور خود بنا نهاد.در گوشه پایین سمت راست نقاشی دیواری، یک هیولای پرخور و شاخدار (احتمالاً شیطان) در دروازه های جهنم ایستاده است و گناهکاران را می بلعد، سپس آنها را بدون تشریفات دفع می کند. چنین مجازات‌های ظالمانه و غیرعادی فراوان است: مردان و زنان برهنه توسط شیاطین سیاه ترسناک به جهنم کشیده می‌شوند و در آنجا تف بریان می‌شوند و نیزه می‌شوند یا در گودال‌های عمیق فرو می‌روند. خود دانته احتمالاً از نقاشی دیواری بازدید کرده است که جوتو آن را نقاشی کرده است. به گفته مورخ جورجیو وازاری، این دو &quot;دوستان عزیز&quot; بودند. دانته نوشتن کمدی الهی خود را در زمانی آغاز کرد که جوتو مشغول نقاشی کلیسای آرنا بود.2. آخرین داوری، 1440، Jan van Eyckیان ون آیک، نقاش پیشگام رنگ روغن، بیش از 100 سال پس از جیوتو در هلند کار می کرد، صحنه آخرین داوری خود را در نیمه سمت راست یک دوقطبی خلق کرد که شامل تصویری از مصلوب شدن است.در زیر بازوهای دراز یک اسکلت غول‌پیکر و تهدیدآمیز، آبشاری از ارواح نفرین شده فرو می‌روند که هر کدام در معرض نوع متفاوتی از مجازات قرار می‌گیرند. در گوشه ای، مردی از درد فریاد می زند که مار او را تکه می کند. در جای دیگر، یک دیو - بخشی از جمجمه، قسمتی دیگر جگوار دندان تیز - روی یک دنده گوشتی را می جود. ناراحتی در اینجا به قدری تداعی کننده است که آینسورث آن صحنه را نامفهوم توصیف کرده است - بینندگان تقریباً می توانند صداهای شکنجه را بشنوند: &quot;ترک خوردن و شکستن استخوان ها، دندان قروچه کردن هیولاها در تعقیب بی امان آنها.&quot;3. دردهای جهنم، 1431، Fra Angelicoبرادر دومینیکن فرا آنجلیکو – که در زمان حیاتش به نام فرا جیووانی شناخته می شد – که پس از مرگش توسط شاگردانش «نقاش فرشته» لقب گرفت، تا حدودی به خاطر چندین مناظر جهنمی درونی خود شهرت دارد. شاید وحشتناک ترین صحنه او مربوط به نقاشی دیواری باشد که آخرین داوری را به تصویر می کشد، که در ابتدا برای کلیسای سانتا ماریا دگلی آنجلی در رم ساخته شده است (هم اکنون در موزه سان مارکو فلورانس آویزان است).در اینجا، هنرمند سرنخی از دانته می گیرد و جهنم را به صورت غاری تیره تجسم می کند که در آن لعنت شدگان بر اساس گناهانشان گروه بندی می شوند. هر کدام از آنها شکنجه مخصوص خود را دارند. به عنوان مثال، کسانی که به طمع گناه می کنند، سکه های طلای ذوب شده را در گلوی خود ریخته اند، در حالی که آنهایی که گناهکار خشم هستند مجبور هستند بی وقفه با یکدیگر بجنگند. در پایه گودال آتشین، لوسیفر در حالی که همزمان در سوپی از روح‌های در حال آب شدن غسل می‌کند، که توسط گروهی از شیاطین تکان می‌خورد، بر بدن انسان می‌چپد.4. باغ لذت‌های زمینی، 1490، Hieronymus Boschبدون هیرونیموس بوش نمی‌توان درباره مناظر جهنمی بحث کرد، شاهکار افسون‌کننده‌اش، باغ لذت‌های زمینی، با شهرت دوزخ دانته رقابت می‌کند. این نقاش هلندی در اواسط دهه 1400 در جریان اصلاحات پروتستانی به بلوغ رسید، زمانی که مسیحیان به جای تکیه بر کلیسا به عنوان یک واسطه، شروع به تفسیر کلام خدا برای خود کردند. بوش این رویکرد را در نقاشی خود گنجانده است و بهشت و جهنم را از طریق صحنه های پر هرج و مرج که در پس زمینه هلندی معاصر قرار گرفته اند، به تصویر می کشد.بوش به جای گودال های آتشین ذکر شده در کتاب مقدس یا کاوش عمیق در دوزخ، جهنم را به عنوان میدان نبردی خشن مملو از موجودات وحشتناک و سوررئالیستی نشان می دهد که از شکنجه مخالفان انسانی خود لذت می برند. شهرت این نقاشی ممکن است تا حد زیادی به دلیل تکثیر جزئیات عجیب و غریب مسحورکننده باشد: یک پای تکه تکه شده مانند یک جایزه از کلاه یک هیولای پرنده خاردار آویزان است. گناهکاران دیگر را روی سازهای غول پیکر کشیده و توسط شیاطین چشم مهره نواخته می شوند، یا خورده می شوند و سپس توسط متجاوزانشان بیرون می ریزند.5. مگ دیوانه، 1561، Pieter Bruegel the Elder استاد هلندی پیتر بروگل بزرگ، در حالی که بیشتر به خاطر صحنه‌های دهقانی خانگی شهرت دارد، در شوکه کردن تماشاگرانش نیز مهارت داشت. لین هوئت، زندگی‌نامه‌نویس بروگل می‌نویسد: «نقاش مانند کارگردان فیلم‌های ترسناک سعی می‌کرد همه حواس را جذب کند تا در عین حال ترس را برانگیزد و لذت ایجاد کند». این در هیچ کجا به اندازه بوم او Dulle Griet (مگ دیوانه) در سال 1561 آشکار نیست، که از بوش سرنخ می گیرد و جهنم را از دریچه فرهنگ معاصر فلاندری بررسی می کند.این نقاشی شخصیت فولکلور Dulle Griet را به تصویر می‌کشد، رهبر یک ارتش کاملاً زن که در تلاش برای غارت جهنم هستند. قدرت او توسط مقیاس عظیم او مشخص شده است. او هم هموطنان و هم مخالفانش را کوتوله می کند، انبوهی از شیاطین خارق العاده که در منظره هلندی آشنا هستند. بروگل دنیای اموات را به عنوان تلفیقی ترسناک از خیال و واقعیت به تصویر کشیده است. به نظر می رسد که گریت به سمت یک &quot;دهن جهنم&quot; با شکاف واقعی می دود، پوست فلس دار آن شبیه آجر در معماری اطراف است. هیولاهای این جهنم به جای بلعیدن مردگان، با جنگجویان گوشت و خون مبارزه می کنند.برخی از محققان نیز این نقاشی را کاوشی در پویایی جنسیتی هلندی در قرن شانزدهم خوانده‌اند. یک کتاب ضرب المثل در سال 1568 زمینه‌ای را ارائه می‌کند: «یک زن غوغا می‌کند، دو زن دردسر زیاد می‌کنند، سه زن بازار سالانه، چهار نفر نزاع، پنج نفر ارتش، و در مقابل شش، خود شیطان هیچ سلاحی ندارد.» به این ترتیب می توان این نقاشی را مطالعه قدرت زنانه خواند. آیا گریت یک عامل حریص آشوب است یا یک پیروز قهرمان که از رویارویی با شیطان نمی ترسد؟6. مجازات دزدان، 1824، William Blakeدر حالی که رنگ‌های ملایم و خطوط موج‌دار این آبرنگ اثر هنرمند بریتانیایی ویلیام بلیک ممکن است بلافاصله فریاد «دوزخ» ندهند، نگاهی دقیق‌تر نشان‌دهنده شیوه‌ای خاص از رنج است. این صحنه برگرفته از مجموعه‌ای از آثاری است که بلیک برای نشان دادن نسخه‌ای از کمدی الهی تولید کرده است. به گفته نویسنده ماریا پوپووا، بلیک این مأموریت را بر عهده گرفت، زیرا «تحقیر دانته نسبت به ماتریالیسم و شیوه‌ای که قدرت اخلاق را منحرف می‌کند» در ذهن هنرمند عجیب و غریب قرن نوزدهم طنین‌انداز شد، او معتقد بود که فضای سیاسی و اجتماعی در انگلستان با حرص و آز تعریف می‌شود. در اینجا، بلیک صحنه‌ای از کانتوهای 24 و 25 را به تصویر می‌کشد که در آن توضیح داده می‌شود که مارها بدن دزدها را می‌دزدند و دستکاری می‌کنند، که بعداً باید بیهوده به دنبال خانه‌ای برای روح خود بگردند. در اینجا، مارهای هیولایی بدن‌های روبنسکی دزدها را خفه می‌کنند، نفوذ می‌کنند و به زیر آب می کشند.7. هیاهو، 1841، John Martinمی توان گفت که موضوع مورد علاقه جان مارتین، نقاش بریتانیایی قرن نوزدهم، عذاب بود. او در طول زندگی حرفه‌ای‌اش، تصاویر فراوانی از جهنم، و همچنین صحنه‌های آتشین و پایانی جهان را به تصویر کشید – و این کار را با قدرتی دراماتیک انجام داد. مارتین این منظره جهنمی را بر اساس شاهکار جان میلتون، شاعر انگلیسی، بهشت گمشده در سال 1667، که در آن جهنم پاندمونیوم نامیده می شود، ساخته است. نسخه مارتین از Pandemonium دنیایی متروک و داغ از عذاب است که توسط یک شیطان زره پوش اداره می شود. در پیش زمینه، شیطان در حالی که فرشتگان شورشی نادیده را به عمل فرا می خواند، بازوهای خود را بالا می برد.این نسخه از جهنم ممکن است برای معاصران لندنی مارتین آشنا به نظر برسد. در واقع، ساختمان عظیم و ترسناکی که شیطان با آن روبرو است، عناصر معماری را از برخی از معروف ترین بناهای شهر، از جمله دروازه های مرتفع سامرست هاوس و پاساژ خانه تراس کارلتون، به عاریت گرفته است.8. دانته و ویرژیل، 1850، William-Adolphe Bouguereauدو گناهکار که آن را در تصویر جهنم توسط ویلیام آدولف بوگرو به تصویر می کشند، برای افراد شیفته خون آشام در میان ما جذابیت دارند. نقاش فرانسوی این صحنه الهام گرفته از دانته را به امید برنده شدن جایزه پر افتخار روم ساخت. دانته در این دوران از محبوبیت مجددی برخوردار شد.بوگرو برای تأکید بر درد جسمانی دو روح نفرین شده از شعر حماسی، تمرکز کرد. دانته و ویرژیل در محاصره گناهکاران در حال پیچش، به این نگاه می‌کنند که جیانی شیچی، شخصیتی که به ارتکاب کلاهبرداری گناهکار است، گردن کاپوکیو، یک بدعت گذار و کیمیاگر را با شرارت گاز می‌گیرد. (دوزخ، دعوای مداوم را یکی از مجازات‌های جهنمی توصیف می‌کند.) نقاش توجه خاصی به بدن‌های برهنه سوژه‌هایش دارد. به طور چشمگیری روشن می شوند، ماهیچه ها و حالات آنها در عذاب مطلق کشیده می شوند. در آن زمان، منتقد تئوفیل گوتیه، «خشم عجیب» این دو نفر را توصیف کرد که «به طرز باشکوهی از طریق ماهیچه‌ها، اعصاب، تاندون‌ها و دندان‌ها به تصویر کشیده شد». به نظر می رسد تنها دیو کچل و بال خفاشی که بالای سر آنها شناور است از این صحنه لذت می برد.9. سلف پرتره در جهنم، 1903، Edvard Munchآثار ادوارد مونک، سمبولیست نوردیک، با بازنمایی های بسیار قانع کننده ای از اضطراب روانی تعریف می شود، که بسیاری از آنها خودنگاره هستند. در این اثر، او از مفهوم جهنم استفاده می‌کند تا با قرار دادن بدن بیمار و برهنه‌اش در محیطی سیاه مایل به قرمز، به رنگ شعله‌های آتش، بر رنج خود تأکید کند. حتی در کودکی، مونک به یاد می آورد که گرفتار مالیخولیا و وعده های زندگی پس از مرگ جهنمی شده است: او درباره جوانی خود می نویسد: «بیماری و جنون فرشتگان سیاهی بودند که در گهواره من نگهبان بودند. همیشه احساس می‌کردم که با من ناعادلانه رفتار می‌شود، بدون مادر، بیمار، و تهدید به مجازات در جهنم بالای سرم است.»10. جهنم، 1908، Franz von Stuckهنگامی که فرانتس فون استاک برای اولین بار Inferno را در Met در سال 1909 به نمایش گذاشت، نیویورک تایمز «وحشیگری حاکمیتی» این اثر را ستود. به گفته موزه، در واقع، این قطعه با نمایش خام خود از نفرین ابدی، مخاطبان را شوکه و شگفت زده کرد، و به گفته موزه، &quot;شهرت سمبولیست آلمانی به عنوان هنرمندی رویایی را تثبیت کرد که از کاوش در جنبه تاریک روان نترسید.&quot;آثار اشتاک اغلب بر درد جسمی و روانی سوژه‌هایش تأکید می‌کند. در سراسر این بوم، هنرمند تنها بدن‌های آزاردهنده و چهره‌های درهم‌رفته چندین گناهکار را نشان می‌دهد - به جای یک نمای کلی کابوس‌آمیز از جهنم - به منظور تأکید بر رنج شخصی آنها، با رنگ‌بندی ناهماهنگی که پریشانی آنها را مشخص می‌کند. شاید بارزترین تظاهر عذاب روانی از یک چهره زنی باشد که چشمان گشادش از پس زمینه به طرز وحشتناکی می درخشد و ترس خالص را در مواجهه با سرنوشت وحشتناکش نشان می دهد.11. جهنم لعنتی، 2008، Jake &amp; Dinos Chapmanهنرمندان بریتانیایی جیک و دینوس چپمن با آمیختن طنز تاریک و گروتسک، بینندگان را شوکه کرده اند. این تاسیسات عظیم شامل 9 ویترین پر از 60000 سرباز اسباب بازی است. علیرغم اینکه از اسباب بازی های مینیاتوری ساخته شده است، با نگاهی دقیق تر به داخل آن قتل عام غیرقابل تصوری را نشان می دهد. در صحنه نبرد بی‌نظیر و پر هرج و مرج که آشکار می‌شود، ارتشی از اسکلت‌ها، جهش‌یافته‌ها و بیگانگان با نازی‌ها می‌جنگند. در حالی که مشخص نیست کدام طرف برنده است، سربازان صلیب شکسته مطمئناً به حق خود می رسند: در این تابلو، آنها قتل عام شده اند.جیک چپمن درباره این اثر گفت: «نازی‌ها روی هر کسی که فکر می‌کردند پست‌تر بود، نسل‌کشی می‌کردند. کاری که ما انجام داده‌ایم این است که نازی‌ها در مکانیزم خودشان بازیافت می‌شوند.» برای برادران چپمن، جهنم بر روی زمین است، که توسط تاریخ طولانی خشونت بشر ایجاد شده است.</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Mon, 22 May 2023 21:50:23 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش حلقه while در پایتون + ویدیو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AD%D9%84%D9%82%D9%87-while-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-nymtqrwew5ri</link>
                <description>حلقه while پایتوندر پایتون iteration به این معنی هست که یک بلوک کد را چندین بار اجرا  کنید. ساختار برنامه نویسی که iteration را پیاده سازی می کند حلقه نامیده  می شود. در پایتون دو نوع حلقه وجود دارد. حلقه for و حلقه while که در این آموزش تمرکز ما روی حلقه while خواهد بود. https://www.aparat.com/v/gZ6SI/%D8%A2%D9%85%D9%88%D8%B2%D8%B4_%D8%AD%D9%84%D9%82%D9%87_while_%D8%AF%D8%B1_%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86 حلقه while پایتونبا استفاده از حلقه while در پایتون میتوانید یک کار رو به  صورت مکرر انجام دهید. این کار تا زمانی که یک شرایط خاص برای قطع کردن  حلقه به وجود بیاد ادامه خواهد داشت. در پایتون، حلقه while برای تکرار  دستورات به کار می رود و تا زمانی که یک شرط معین را برآورده سازد، اجرا می  شود. و هنگامی که شرط نادرست شود، حلقه بلافاصله متوقف خواهد شد. حلقه  while در دسته تکرار نامحدود قرار می گیرد. تکرار نامحدود به این معنی است  که تعداد دفعات اجرای حلقه به طور صریح از قبل مشخص نشده است. این حلقه با استفاده از کلمه کلیدی while و به دنبال آن شرط چرخش حلقه می‌آید:while condition:
    #body_of_whileبخش body_of_ while مجموعه ای از دستورات پایتون است که نیاز به  اجرای مکرر دارد. این مجموعه از دستورات به طور مکرر اجرا می شوند تا زمانی  که شرط داده شده False شود.1. ابتدا شرط داده شده بررسی می شود، اگر شرط false باشد، حلقه خاتمه یافته و ادامه برنامه اجرا میشود.2. اگر شرط درست شود، مجموعه دستورات داخل حلقه اجرا می شوند.این دو مرحله مکرراً تا زمانی که شرط مشخص شده در حلقه while صادق باشد، تکرار می شوند.در اینجا نمونه ای از حلقه while وجود دارد. در این مثال، ما  یک متغیر num داریم و مقدار num را در یک حلقه نمایش می دهیم، حلقه دارای  یک عملیات افزایشی است که در آن مقدار num را افزایش می دهیم. این مرحله  بسیار مهم است، حلقه باید یک عملیات افزایش یا کاهش داشته باشد، در غیر این  صورت حلقه به طور نامحدود اجرا می شود.num = 1

while num &lt; 10:
    print(num)
    num = num + 3

# OUTPUT
1
4
7حلقه بینهایت با while trueحلقه بینهایت به حلقه‌ای گفته میشود که پایان ندارد و تا ابد  اجرا خواهد شد. while بهترین ابزار برای ایجاد کردن حلقه بینهایت است. برای  ایجاد کردن حلقه بینهایت به عنوان شرط میتوانید از کلمه True یا عدد 1  استفاده کنید. در این حالت چون شرط همیشه True است، حلقه تا ابد ادامه  خواهد داشت. دقت کنید که استفاده از حلقه بینهایت خطرناک است زیرا منابع  زیادی را مصرف میکند. حتما در زمان استفاده از حلقه بینهایت شرطی را مشخص  کنید که حلقه را متوقف کند.مثال اول: در کد زیر، کلمه &quot;hello&quot; به طور نامحدود چاپ می شود زیرا شرط همیشه True است:while True:
   print(&amp;quothello&amp;quot)مثال دوم: این مثال عدد 1 را به طور نامحدود چاپ می کند زیرا در داخل حلقه، ما مقدار  num را تغییر نمیدهیم، بنابراین مقدار num همیشه 1 باقی می ماند و شرط num  &lt;5 همیشه درست است:num = 1
while num&lt;5:
   print(num)حلقه while تودرتومیتوانید حلقه‌ها را داخل یکدیگر قرار دهید. وقتی یک حلقه  while داخل حلقه while دیگری وجود داشته باشد، آن را حلقه تو در تو می  نامیم. بیایید برای درک این مفهوم مثالی بزنیم:#statement(s)
while condition_1:
    #statement(s)
    while condition_2: 
        #statement(s)در حلقه‌های تودرتو، به حلقه بیرونی outer و به حلقه درونی  inner گفته میشود. نحوه کار به این شکل است به ازای هر چرخش در حلقه  بیرونی، حلقه‌ درونی به طور کامل چرخش خواهد کرد.حلقه while با بلاک else در پایتونما می توانیم یک بلوک &quot;else&quot; مرتبط با حلقه while داشته  باشیم. بلوک &quot;else&quot; اختیاری است. این یک ویژگی اختصاصی برای پایتون است و  در دیگر زبان‌های برنامه نویسی پیدا نمیشود. بلوک else زمانی اجرا میشود که  حلقه while به طور کامل اجرا شود:num = 10
while num &gt; 6:
   print(num)
   num = num-1
else:
   print(&amp;quotloop is finished&amp;quot)


# OUTPUT
10
9
8
7
loop is finishedاما اگر حلقه به مشکل بخورد و نتواند به طور کامل اجرا شود،  بلوک else اجرا نخواهد شد. به عنوان مثال اگر یک حلقه با break متوقف شود،  بلوک else اجرا نخواهد شد:num = 10
while num &gt; 6:
	break
	print(num)
	num = num-1
else:
	print(&amp;quotloop is finished&amp;quot)

# OUTPUTتفاوت حلقه while و حلقه for پایتوندر پایتون از دو حلقه while و for میتوان برای اجرای مکرر  دستورات استفاده کرد. در ادامه به تفاوت‌ های حلقه while و for پایتون  میپردازیم.حلقه for در بین آیتم‌های یک آبجکت iterable پیمایش میکند، در حالی که  حلقه while به طور ساده تا زمانی که شرط نوشته شده True باشد به دور خود  میچرخد.حلقه for زمانی استفاده میشود که تعداد چرخش‌ های حلقه را بدانیم، اما در حلقه while نیازی نیست که تعداد چرخش‌ها را بدانیم.برای اطلاع بیشتر درمورد تفاوت حلقه for و while میتوانید این سوال stackoverflow را ببینید.برای آموزش‌های پیشرفته پایتون به وبسایت ما سر بزنید: https://www.mongard.ir/ </description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Sat, 01 Jan 2022 14:35:28 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول argparse پایتون + ویدیو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-argparse-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-yhz7ilcrkpqd</link>
                <description>آموزش ماژول argparse پایتونمعرفی argparse پایتونماژول argparse به شما کمک میکند ابزارهای command line  بسازید. ماژول argparse به طور خودکار پیام‌های راهنما و نحوه استفاده را  تولید می‌کند و زمانی که کاربران آرگومان‌های نامعتبر به برنامه می‌دهند،  خطاهای مناسبی را نشان میدهد. ماژول argparse جزوی از کتابخانه استاندارد  پایتون است و شما نیازی به نصب آن ندارید. https://www.aparat.com/v/yfKpq/%D8%A2%D9%85%D9%88%D8%B2%D8%B4_%D9%85%D8%A7%DA%98%D9%88%D9%84_argparse_%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86 نحوه استفاده از ماژول argparse بسیار ساده است. به مثال زیر دقت کنید:import argparse

parser = argparse.ArgumentParser()
parser.parse_args()این ساده‌ترین کدی هست که میتونید در argparse بنویسید:در خط اول ماژول argparse رو import کردیم.در خط دوم از کلاس ArgumentParser یک آبجکت ساختیم که وظیفه اضافه کردن آروگومان‌ها رو داره.در خط سوم با آبجکتی که ساخته بودیم، متد parse_args رو صدا زدیم که وظیفه آماده کردن آرگومان‌ها رو داره.اضافه کردن آرگومان به argparse پایتوندر حال حاضر کد ما هیچ آرگومانی نداره و اگر براش آرگومانی ارسال کنید، ارور میده:$ python test.py amir

# OUTPUT
usage: two.py [-h]
two.py: error: unrecognized arguments: amirدر کد بالا میبینید که من آرگومان amir رو براش فرستادم اما  کد ارور میده که ما همچین آرگومانی نمیخواستیم. جالب اینجاست که ماژول  argparse به طور اتوماتیک برای ما help رو ایجاد میکنه. اگر همون کد بالا  رو با آپشن h- اجرا کنید به شما راهنما رو نشون میده:$ python test -h

# OUTPUT
usage: two.py [-h]

optional arguments:
  -h, --help  show this help message and exitاضافه کردن آرگومان به برنامه خیلی راحته. فقط کافیه متد  add_argument رو صدا بزنید و اسم آرگومانتون رو مشخص کنید. در کد پایین من  یک آرگومان به نام name اضافه کردم:import argparse

parser = argparse.ArgumentParser()
parser.add_argument(&#039;name&#039;)
parser.parse_args()حالا اگر به کد بالا آرگومان ارسال کنم دیگه ارور نمیده. چون  انتظار یه آرگومان رو داشته. و اگر در این حالت دوباره راهنما رو درخواست  کنید به طور اتوماتیک آرگومان name اضافه شده:$ python test.py amir

$ python test.py -h
usage: two.py [-h] name
positional arguments:
  name
optional arguments:
  -h, --help  show this help message and exitدر صفحه راهنما که بالا هست فقط اسم آرگومان رو نوشته و نگفته  که به چه دردی میخوره. اگر بخواید برای هر آرگومانی یک توضیح اضافه کنید  میتونید help رو به add_argument بفرستید:parser.add_argument(&#039;name&#039;, help=&#039;your name&#039;)


$ python test.py -h
usage: two.py [-h] name
positional arguments:
  name        your name
optional arguments:
  -h, --help  show this help message and exitگرفتن آرگومان argparse پایتونالآن ما یک آرگومان اضافه کردیم و میخوایم باهاش کار کنیم.  برای اینکار باید parse_args رو بریزیم داخل متغیر و از اون متغیر برای  دسترسی به آرگومان‌ها استفاده کنیم:import argparse

parser = argparse.ArgumentParser()
parser.add_argument(&#039;name&#039;, help=&#039;your name&#039;)

args = parser.parse_args()
print(args.name)در کد بالا میبینید که parse_args رو ریختم داخل متغیر args و  با اون میتونم به آرگومان‌ها دسترسی پیدا کنم. حالا کد بالا رو با یک  آرگومان اجرا میکنم:$ python test.py amir
&gt;&gt;&gt; amirمیبیند که اسم خودم رو بهش فرستادم و اون هم چاپش کرد.کار با چند آرگومان در argparse پایتونشما میتونید هر تعداد که میخواید آرگومان در ماژول argparse پایتون مشخص کنید. من به کد بالا یک آرگومان age هم اضافه میکنم:import argparse

parser = argparse.ArgumentParser()
parser.add_argument(&#039;name&#039;, help=&#039;your name&#039;)
parser.add_argument(&#039;age&#039;, help=&#039;your age&#039;)

args = parser.parse_args()
print(args.name, args.age)و حالا باید کد بالا رو با دو آرگومان اجرا کنم. اگر با یک آرگومان اجرا کنم ارور میده:$ python test.py amir 20
&gt;&gt;&gt; amir 20

$ python test.py amir
usage: two.py [-h] name age
two.py: error: the following arguments are required: ageاختیاری کردن آرگومان در argparse پایتوندر حال حاضر در کد ما دو آرگومان وجو دارد که هر دو اجباری  هستند. اگر بخواید آرگومان‌ها رو اختیاری کنید کافیه یک یا دو تا خط تیره  (-) به اول اسمش اضافه کنید. در کد پایین قبل از آرگومان name یک خط تیره  گذاشتم که باعث میشه این آرگومان از حالت اجباری خارج بشه:import argparse

parser = argparse.ArgumentParser()
parser.add_argument(&#039;-name&#039;, help=&#039;your name&#039;)
parser.add_argument(&#039;age&#039;, help=&#039;your age&#039;)

args = parser.parse_args()
print(args.name, args.age)در این حالت اگر صفحه راهنما کد رو بگیرم نتیجه به شکل پایین خواهد بود. میبینید که آرگومان name در بخش optionalها قرار گرفته:$ python test.py -h

usage: two.py [-h] [-name NAME] age

positional arguments:
  age         your age

optional arguments:
  -h, --help  show this help message and exit
  -name NAME  your nameآماگر این ویدیو رو دوست داشتید، برای آموزش‌های پیشرفته پایتون به وبسایت ما سر بزنید: https://www.mongard.ir/ </description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Tue, 28 Dec 2021 12:37:05 +0330</pubDate>
            </item>
                    <item>
                <title>ویدیو آموزش  duck typing در پایتون</title>
                <link>https://virgool.io/@amirbig/%D9%88%DB%8C%D8%AF%DB%8C%D9%88-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-duck-typing-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ukq4jjocmd3x</link>
                <description>وقتی وارد اکوسیستم پایتون میشوید باید کدهای پایتونیک  بنویسید. pythonic به مجموعه قواعدی گفته میشود که برنامه نویسان پایتون  برای بهتر کد نوشتن پیشنهاد میدهند. در این ویدیو در رابطه با سه موضوع مهم  صحبت خواهد شد که میتوانید با آنها کدهای پایتونیک بنویسید.مفاهیمی که در این ویدیو بیان خواهد شد، عبارتند از:duck typingEAFPLBYLبیایید جداگانه به هر سه این موارد نگاهی بیندازیم. https://www.aparat.com/v/cUgl6/%D8%A2%D9%85%D9%88%D8%B2%D8%B4_duck_typing_%D8%AF%D8%B1_%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86 مفهوم duck typing در پایتونمفهوم duck typing به زمانی اشاره میکند که  نوع  اطلاعات ورودی اهمیت ندارد و فقط نیاز است که اطلاعات ورودی  ویژگی  خاصی را داشته باشند. در زمانی که از duck typing در کد خود استفاده  میکنید نیازی نیست که نوع آبجکت ورودی را بررسی کنید. فقط وجود متد یا  attribute خاصی را بررسی میکنید.مثالی که میتوان از duck typing در پایتون زد، فانکشن ()len  است. برای فانکشن len اهمیتی ندارد که چه نوع آبجکتی را میگیرد. تنها چیزی  که اهمیت دارد، وجود متد __len__ است. هر آبجکتی که متد __len__ را در خود  داشته باشد، میتواند به متد len ارسال شود در غیر اینصورت پیغام خطای  TypeError خواهد داد.به مثال زیر دقت کنید:&gt;&gt;&gt; len(&#039;amir&#039;)
4

&gt;&gt;&gt; len([1, &#039;amir&#039;, 6])
3متد len به طور کامل مفهوم duck typing را پیاده سازی کرده است. بدون اهمیت به نوع آبجکت، تعداد آیتم‌های درون آن را برمیگرداند.اما مفهوم duck typing میتواند خطرناک باشد. اگر نتوانید به  درستی تمام حالت‌های ممکن را کنترل کنید ممکن است در کدتان به مشکل بخورید.  متد len نمیتواند روی آبجکت‌های عددی کار کند:&gt;&gt;&gt; len(373)

Traceback (most recent call last):
  File &amp;quot/home/amir/Desktop/python/two.py&amp;quot, line 15, in &lt;module&gt;
    print(len(373))
TypeError: object of type &#039;int&#039; has no len()در اینجاست که باید قبل از استفاده، بررسی  کنید که آیا ویژگی که به دنبال آن هستید در آن آبجکت وجود دارد یا نه. اگر  وجود داشت که میتوانید ادامه دهید اگر وجود نداشت باید از ادامه عملیات  جلوگیری کنید. برای این بررسی باید از ویژگی LBYL استفاده کنید. به بخش  بعدی بروید.مفهوم LBYL در پایتونمفهوم LBYL مخفف جمله &quot;Look Before You Leap&quot; است. به این معنی که، قبل از اینکه کاری انجام دهی، اول بررسی کن.  این مفهوم توضیح میدهد که بهتر است قبل از انجام کاری بررسی کنید که آیا  متد یا ویژگی خاصی که به دنبال آن هستید در آبجکت وجود دارد یا خیر.همان مثال بخش قبل را ادامه میدهیم. حالا قبل از استفاده از  متد len باید بررسی کنیم که آیا آبجکت ورودی دارای متد __len__ است یا خیر.  به مثال زیر دقت کنید:def check_len(obj):
	if hasattr(obj, &#039;__len__&#039;):
		print(len(obj))
	else:
		print(&#039;Sorry...&#039;)در کد بالا یک فانکشن داریم که یک obj ورودی دارد. اگر این  obj متد __len__ را با خود داشته باشد، آن را به متد len ارسال میکنیم در  غیر اینصورت یک پیغام مناسب نشان میدهیم. در این کد ما از مفهوم LBYL  استفاده میکنیم. قبل از اینکه روی obj کاری بکنیم، بررسی میکنیم که آیا  ویژگی __len__ را دارد یا نه.حالا بیایید از فانکشن بالا استفاده کنیم:&gt;&gt;&gt; check_len(&#039;amir&#039;)
4

&gt;&gt;&gt; check_len([1, &#039;jack&#039;, 78])
3

&gt;&gt;&gt; check_len(3435)
Sorry...
همانطور که میبیند دیگر کد ما هیچ استثنایی ایجاد نمیکند و در هر نوع آبجکتی به خوبی کار میکند.اما باید بدانید که مفهوم LBYL آنچنان پایتونیک نیست و در  اکوسیستم پایتون پیشنهاد میشود که از آن استفاده نکنید. به جای آن میتوانید  از مفهوم بهتری با عنوان EAFP استفاده کنید.مفهوم EAFP در پایتونمفهوم EAFP مخفف جمله &quot;it’s easier to ask for forgiveness  than permission&quot; است. این مفهوم کاملا برعکس LBYL است. به این معنی که  نیازی به بررسی نیست، اول کاری که میخوای رو انجام بده، اگر درست کار کرد  که هیچی، اما اگر درست کار نکرد، معذرت خواهی بکن.در ادامه مثال قبل، دیگر نیازی به بررسی وجود ویژگی نیست.  ابتدا ویژگی را فراخوانی میکنیم اگر وجود داشت که کدمان به درستی کار خواهد  کرد، در غیر اینصورت باید exception که رخ میدهد را کنترل کنیم.مثال بالا را با استفاده از مفهوم EAFP بازنویسی میکنیم:def check_len(obj):
	try:
		print(len(obj))
	except TypeError:
		print(&#039;Sorry...&#039;)در کد جدید دیگر وجود متد __len__ را بررسی نمیکنیم. مستقما  کد را اجرا میکنیم، در صورت بروز خطا، دوباره پیغام خطای مناسب را به کاربر  نشان میدهیم.در مثال جدید کد ما از دو نظر بهتر شده است:کد کوتاه‌تر شده پس خوانایی آن بیشتر شده.سرعت کد بیشتر شده چون دیگر نیازی به دسترسی به آبجکت و بررسی اضافی نداریم. برای آموزش‌های بیشتر به وبسایت ما سر بزنید: https://www.mongard.ir/ </description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Mon, 13 Dec 2021 14:02:48 +0330</pubDate>
            </item>
                    <item>
                <title>دوره های آموزش پروژه محور و پیشرفته پایتون</title>
                <link>https://virgool.io/@amirbig/%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%85%D8%AD%D9%88%D8%B1-%D9%88-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-huzd015kzcjw</link>
                <description>دوره های آموزش پروژه محور و پیشرفته پایتونزبان برنامه نویسی پایتون چیست؟پایتون یک زبان برنامه نویسی عمومی است که در بسیاری از مشاغل  توسعه وب و فناوری اطلاعات برای انجام انواع کارهای برنامه نویسی استفاده  می شود. از آنجا که پایتون یک زبان برنامه نویسی عمومی است ، می توان از آن  برای توسعه وب، توسعه سمت سرور، توسعه نرم افزار، علم داده و موارد دیگر  استفاده کرد.دوره های آموزش پیشرفته و پروژه محور پایتوندر این مقاله ما دوره‌هایی را به شما معرفی میکنیم تا از سطح  مبتدی به پیشرفته بتوانید پایتون را آموزش ببینید. همچنین در این مقاله  مسیر یادگیری دوره‌های پایتون که در وبسایت مونگارد هستند را برای شما مشخص میکنیم.دوره‌هایی که در این مقاله مشاهده میکنید از مبتدی به پیشرفته  چیده شده اند تا شما قدم به قدم بتوانید در پایتون پیشرفت کنید. بعضی از  این دوره‌ها برای افراد مبتدی مناسب نبوده و ممکن است دچار سرگیجه شوید.  کسانی که آموزش مبتدی ما را با موفقیت گذرانده اند یا تجربه کافی از پایتون  را در جاهای دیگر کسب کرده اند ، نباید مشکلی داشته باشند. همانطور که در  همه جا در آموزش ما ، مباحث را تا حد امکان ملایم معرفی می کنیم. این بخش  از آموزش پایتون ما برای برنامه نویسان پیشرفته است. در این لیست سه دوره  آموزش پروژه محور پایتون نیز وجود دارد که به شما کمک میکند با یاد بگیرید  چطور پایتون را در یک پروژه واقعی بکار ببرید.1. دوره آموزش مقدماتی پایتوندوره آموزش مقدماتی پایتوناین دوره آموزش مقدماتی پایتون میباشد و برای کسانی مناسب است که با پایتون آشنایی ندارند. این دوره  کاملا رایگان بوده و میتوانید همین الآن شروع کنید. در ابتدای این دوره،  توضیحاتی کوتاه در مورد پایتون و IDE داده شده و بعد شروع به یادگیری  پایتون میکنیم. از متغیر‌ها که ساده‌ترین مفهوم هستند شروع کرده و به مباحث  پیشرفته پایتون مانند شی‌گرایی و ارثبری میرسیم. در آخر این دوره شما به  شکل مقدماتی پایتون را بلد هستید. برای دسترسی به این دوره میتوانید از این  لینک استفاده کنید.2. دوره آموزش الگوریتم نویسی در پایتوندوره آموزش الگوریتم نویسی در پایتونبعد از اینکه به طور مقدماتی پایتون را یاد گرفتید، باید یک  قدم فراتر رفته و کمی در پایتون به مباحث پیشرفته‌تر بپردازیم. شروع به  یادگیری الگوریتم نویسی در پایتون کنید. الگوریتم مجموعه‌ای متناهی از دستورالعمل‌ها است، که به ترتیب خاصی اجرا می‌شوند و  مسئله‌ای را حل می‌کنند. به عبارت دیگر یک الگوریتم، روشی گام به گام برای  حل مسئله است. دستورهای الگوریتم باید با زبانی دقیق، و بی‌ابهام بیان  شوند. دوره الگوریتم نویسی در پایتون یک مرحله پیشرفته‌تر از دوره مقدماتی بوده و در آن پروژه‌های کوچک با زبان پایتون مینویسیم.در این دوره ابتدا با پیچیدگی زمانی در پایتون و انواع آشنا  میشوید و سپس شروع به نوشتن الگوریتم‌ها با پایتون خام میکنید. این دوره  کاملا رایگان بوده و میتوانید همین الآن  الگوریتم نویسی در پایتون را شروع کنید. برای اینکه بتوانید در پایتون پیشرفته کنید و به مراحل بالاتر برسید حتما باید با الگوریتم نویسی آشنا باشید.3. دوره آموزش Descriptors در پایتوندوره آموزش Descriptors در پایتوندر این مرحله وقتش رسیده که یک مقدار در رابطه با مسائل پیشرفته شی گرایی در پایتون یاد بگیرید. descriptorهای پایتون راهی برای ایجاد attributeهای مدیریت شده هستند. در میان بسیاری از مزایای  آنها، attributeهای مدیریت شده را در برابر تغییرات یا به روزرسانی خودکار  آنها محافظت میکند. descriptorها درک پایتون را افزایش می دهند و مهارت های کد نویسی را بهبود می بخشند. این دوره نیز به طور کامل رایگان میباشد.4. دوره اول آموزش پروژه محور پایتوندوره اول آموزش پروژه محور پایتوندر دوره اول آموزش پروژه محور پایتون یک پروژه نسبتا بزرگ را با هم کد میزنیم. در این دوره پروژه محور با  استفاده از زبان پایتون یک برنامه زمانبندی کارها را میسازیم. در این دوره  میخواهیم پکیج schedule را بسازیم. در این آموزش، مفاهیم پیشرفته پایتون را در قالب یک پروژه استفاده خواهیم کرد. این دوره مناسب افرادی است که دوره آموزش مقدماتی پایتون را دیده‌اند و میخواهند مواردی که تا الآن یاد گرفته‌اند را در قالب یک پروژه استفاده کنند.5. دوره آموزش web scraping در پایتوندوره آموزش web scraping در پایتونوب اسکرپینگ به عمل جمع آوری داده از وبسایت ها به صورت اتوماتیک با  استفاده از یک bot یا web crawler میگویند. در این دوره با چهارتا از اصلی  ترین ابزارها در web scraping پایتون آشنا خواهید شد. web scraping در پایتون یک علم بسیار هیجان انگیز است که قطعا در هنگام یادگیری لذت خواهید برد.  در این دوره با ابزارهای requests, beautiful soup, selenium, scrapy آشنا  خواهید شد.6. دوره دوم آموزش پروژه محور پایتوندوره دوم آموزش پروژه محور پایتوندر  دوره دوم آموزش پروژه محور با استفاده از پایتون پروژه‌ای مینویسیم که url یک ویدیو از وبسایت آپارات  و کیفیت مورد نظر را گرفته و آن ویدیو را دانلود کند. در نهایت پروژه مورد  نظر را تبدیل به پکیج کرده تا بتوان با استفاده از pip آن را نصب کرد. در  این دوره پکیج pyaparat را میسازیم. این دوره مناسب افرادی است که در مرحله قبل دوره آموزش web  scraping در پایتون را دیده و میخواهند در این علم پیشرفت کنند.7. دوره آموزش Design Patterns در پایتوندوره آموزش Design Patterns در پایتونالگوی طراحی یک راه حل کلی قابل تکرار برای یک مشکل معمول در طراحی نرم افزار است.  الگوی طراحی یک طرح تمام شده نیست که بتواند مستقیماً به کد تبدیل شود بلکه  توضیحات یا الگویی برای نحوه حل مسئله است که می تواند در شرایط مختلف  مورد استفاده قرار گیرد. الگوهای طراحی می توانند با ارائه پارادایم های  آزمایش شده و اثبات شده توسعه ، روند توسعه را تسریع کنند.الگوهای طراحی همیشه و در 100% مواقع در زمان کدنویسی نیاز  هستند و همیشه در گوشه‌ای از ذهنتان باید دیزاین پترن‌ها را داشته باشید.  در این دوره با مهم‌ترین دیزاین پترن‌های پایتون آشنا میشوید.8. دوره آموزش Multi Threading در پایتوندوره آموزش Multi Threading در پایتوندر این دوره با مالتی تریدینگ در پایتون آشنا میشوید که به آن برنامه نویسی چند نخی نیز گفته میشود. این دوره جزو  دوره‌های پیشرفته پایتون بوده که اگر بخواهید به مرحله senior برسید حتما  باید آن را یاد بگیرید. برنامه نویسی چند نخی در پایتون به شما اجازه میدهد که پراسس ها را در برنامه‌تان مدیریت کنید به شکلی که باعث افزایش سرعت اجرا شود.پراسس یک برنامه کامپیوتری قابل اجرا است. هر process  میتواند درون خود یک یا چند وظیفه داشته باشد. هر وظیفه یک Thread است.  Thread کوچکترین واحد یک process است که میتواند توسط سیستم عامل برنامه  ریزی شود. Threadها میتوانند با اشتراک گذاری حافظه RAM کنار یکدیگر کار  کنند، به این معنی که میتوانند به کد، ساختار و مقدار متغیرهای یکدیگر  دسترسی داشته باشند. هر process حداقل یک Thread دارد. یک process میتواند  به صورت همزمان چندین Thread را ایجاد و اجرا کند.9. دوره آموزش unittest در پایتوندوره آموزش unittest در پایتوندر این دوره با نحوه نوشتن تست برای برنامه‌های پایتونی آشنا میشوید.تقریبا  در همه زمینه‌ها، محصولات بطور کامل قبل از عرضه آزمایش میشوند تا از  کیفیت و عملکرد آنها اطمینان حاصل شود. Unit Testing اولین سطح تست نرم  افزار است که در آن کوچکترین قسمتهای قابل تست یک نرم افزار وجود دارد. این  مورد برای تأیید صحت عملکرد هر واحد نرم افزاری طبق طراحی انجام می شود.  تست برنامه‌ها در پایتون موضوعی عظیم است و می تواند با پیچیدگی های زیادی  همراه باشد ، اما لازم نیست سخت باشد. روشهای زیادی برای تست کد شما وجود  دارد. در این دوره با مهمترین ابزارها در این صنعت آشنا میشوید.این دوره نیز جزو آموزش‌های پیشرفته پایتون بوده چون در هر شرکتی که شروع به کار کنید حتما از شما نوشتن تست را درخواست خواهند کرد.10. دوره سوم آموزش پروژه محور پایتوندوره سوم آموزش پروژه محور پایتوندر دوره سوم آموزش پروژه محور پایتون با هم پکیج more-itertools را مینویسیم. این پکیج یکسری فانکشن‌های اضافی را مشابه ماژول itertool  پایتون ایجاد کرده است. چیزی که در این دوره مهم است نوشتن تست میباشد.  برای تمام کدها، تست مینویسیم تا شما به تست نویسی در پایتون مسلط شوید.  قبل از این دوره حتما دوره آموزش تست نویسی در پایتون را ببینید.11. دوره آموزش regex در پایتوندوره آموزش regex در پایتوندر این دوره با عبارات با قاعده در پایتون آشنا میشوید. Regular Expression یا به اختصار Regex مجموعه قواعدی است برای تطابق داده ها با الگویی مشخص.12. ویدیوهای تک قسمتی پیشرفته آموزش پایتونویدیوهای تک قسمتی پیشرفته آموزش پایتوندر بخش ویدیوهای تک قسمتی آموزش‌های پیشرفته بسیاری در رابطه با پایتون وجود دارد که همگی به شکل  رایگان در دسترس شما قرار دارند. در این بخش با موضوعاتی آشنا میشوید که در  هیچ کجا پیدا نمیشوند. در پایین لیستی از مهمترین ویدیوهایی که باید  ببینید برای شما قرار داده‌ایم اما فقط همین‌های کافی نیست و پیشنهاد میشود  همه ویدیوها را ببینید:لامبدا در پایتونآموزش ماژول pickle در پایتونآموزش متدهای hasattr, getattr, setattr, delattr در پایتونآموزش ماژول sys در پایتونآموزش ماژول os در پایتونآموزش آبجکت های container در پایتونآموزش ماژول logging در پایتونآموزش متدهای مقایسه ای در پایتونآموزش ماژول random در پایتوناستفاده از آبجکت های mutable به عنوان مقدار پیشفرض آرگومان ها در پایتونآموزش polymorphism در پایتونآموزش کلاس های abstract در پایتونآموزش متا کلاس ها در پایتونآموزش وراثت چندگانه در پایتونآموزش متد new در پایتونتوضیح __all__ در پایتونتوضیح کاربرد فایل init در پایتونآشنایی با تفاوت args و kwargs در پایتونآشنایی با if name == main در پایتونآشنایی با dictionary comprehensions در پایتونآموزش list comprehension در پایتونتوضیح generator در پایتونآشنایی عمیق با function در پایتونتفاوت بین str و repr در پایتونآموزش متدهای __getattr__, __setattr__, __delattr__ در پایتونارزیابی class variableهای پایتونآموزش فانکشن‌های بازگشتی در پایتونآموزش متدهای getitem, setitem, delitem در پایتون</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Fri, 17 Sep 2021 07:35:42 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش جامع شی گرایی پایتون + ویدیو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-plqkjfoksblv</link>
                <description>آموزش شی گرایی با پایتون در مونگاردشی گرایی در پایتون چیست؟برنامه نویسی شی گرا یک پارادایم برنامه نویسی است که وسیله ای برای ساختاربندی برنامه ها را فراهم می کند تا خصوصیات و رفتارها در اشیاء مجزا جمع شوند.به عنوان مثال، یک شیء می تواند نمایانگر شخصی با ویژگی هایی مانند نام، سن و آدرس و رفتارهایی مانند راه رفتن، صحبت کردن، تنفس و  دویدن باشد. یا می تواند یک ایمیل حاوی ویژگی هایی مانند لیست گیرندگان،  موضوع و متن و رفتارهایی مانند افزودن پیوست ها و ارسال را نشان دهد.به عبارت دیگر ، برنامه نویسی شی گرا یک رویکرد برای  الگوبرداری از چیزهای واقعی است، مانند اتومبیل، و همچنین روابط بین چیزها،  مانند شرکت ها و کارکنان، دانش آموزان و معلمان و غیره. OOP نهادهای دنیای  واقعی را به عنوان اشیاء نرم افزاری که دارای داده های مرتبط با آنها  هستند و می توانند عملکردهای خاصی را انجام دهند، مدل می کند.توجه: در این بخش شما مقدمات شی گرایی در پایتون را می‌آموزید. بعد از اینکه چند ویدیو‌ این قسمت را دیدید و به آنها مسلط شدید، به بخش آموزش پیشرفته شی گرایی در پایتون رفته و ویدیو‌های آن بخش را نیز ببینید.ویدیو اول: https://www.aparat.com/v/9t1yh ویدیو دوم: https://www.aparat.com/v/kRYrH ویدیو سوم: https://www.aparat.com/v/CRyve بقیه ویدیوها رو  میتونید از لینک زیر ببینید: https://www.mongard.ir/courses/python-beginner-course/episode/33/python-class-static-method/ ایجاد کلاس‌ها در پایتوندر این بخش از آموزش شی گرایی در پایتون به سراغ کلاس میرویم.  کلاسها مانند یک طرح اولیه یا نمونه اولیه هستند که می توانید برای ایجاد  اشیاء از آنها استفاده کنید.ما کلاسها را با استفاده از کلمه کلیدی class تعریف می کنیم ، مشابه نحوه تعریف توابع با استفاده از کلید واژه def.بیایید یک کلاس به نام Car ایجاد کنیم. هر کدی که در زیر کلاس قرار گرفته باشد، بخشی از بدنه کلاس محسوب می شود.class Car:
   passتوجه: نام کلاس های پایتون باید به شکل CapitalizedWords نوشته شده است. به عنوان مثال، MySedanCarایجاد آبجکت از یک کلاس در پایتونیک آبجکت یا شی نمونه ای از یک کلاس است. ما می توانیم از  کلاس Car که در بالا تعریف شده استفاده کنیم و از آن برای ایجاد یک شی یا  نمونه استفاده کنیم.ما یک شیء Car به نام benz خواهیم ساخت:benz = Car()ساخت متد در شی گرایی پایتونمتد به فانکشن‌هایی گفته میشود که درون یک کلاس قرار دارند.  هر متد وظیفه انجام کار مشخصی را دارد. برای فراخوانی متدها باید از آبجکتی  که از کلاس ساخته اید استفاده کنید. در کد پایین یک متد به نام drive در  کلاس Car ایجاد کرده‌ایم.class Car:
    def drive(self):
        print(&#039;i drive a car&#039;)

a = Car()
a.drive()


# OUTPUT
i drive a carدر کد بالا بعد از ساختن متد drive، یک آبجکت از کلاس Car به  نام a ایجاد کرده‌ایم. سپس توانستیم با آبجکت a به متد drive دسترسی داشته  باشیم.کلمه self در متد پایتونزمانی که در پایتون یک متد میسازید اولین آرگومانی که باید به  آن متد بدهید کلمه کلیدی self میباشد. کلمه self به خود آبجکت اشاره میکند  که به شما امکان میدهد به attributeها و بقیه ویژگی‌ها دسترسی داشته  باشید. مثلا در کد پایین که با آبجکت a متد drive را صدا میزنیم به طور  اتوماتیک آبجکت a به عنوان کلمه self به داخل متد ارسال میشود.class Car:
    def drive(self):
        print(&#039;i drive a car&#039;)

a = Car()
a.drive()متد init پایتوندر این بخش می‌آموزید که چطور از متد ــinit__ برای مقداردهی  اولیه آبجکت‌های در شی گرایی پایتون استفاده کنید. هنگامی که یک آبجکت از  کلاس را ایجاد می کنید، پایتون به طور خودکار متد __init_() را برای  مقداردهی اولیه attributeهای آبجکت فراخوانی می کند.بر خلاف متدهای معمولی، متد init دارای دو underscore در  اطراف آن است که نشان دهنده خاص بودن این متد دارد. به متدهایی که قبل و  بعد از نام ‌آنها دو underscore وجود داشته باشد، dunder گفته میشود. پس  متد init به شکل dunder init خوانده میشود.class Car:
    def __init__(self, name):
        self.name = name

    def show(self):
        print(self.name)


a = Car(&#039;benz&#039;)
a.show()

# OUTPUT
benzزمانی که در کد بالا، از کلاس Car یک آبجکت ایجاد کردیم،  مقدار benz را مستقیما به کلاس Car ارسال کردیم. که این مقدار به عنوان  name در متد __init__ قرار میگیرد.ویدیو مرتبط: ویدیو آموزش وراثت در پایتونوراثت(inheritance) از کلاسی دیگر در پایتوندر این بخش می‌آموزید که چطور از ارثبری پایتون برای مدیریت  بهتر کلاس‌ها استفاده کنید. وراثت به شما اجازه میدهد از متدها و  اتریبیوت‌هایی که در کلاس‌های دیگر وجود دارد استفاده کنید.class Car:
	def show(self):
		print(&#039;Nice Car...&#039;)
		
class Benz(Car):
	pass

a = Benz()
a.show()

# OUTPUT
Nice Car...در کد بالا، در داخل کلاس Car یک متد به نام show داریم که  جمله Nice Car را چاپ میکند. در پایین‌تر، کلاس Benz را ساخته‌ایم که از  کلاس Car ارثبری میکند. در این حالت کلاس Benz میتواند به تمام اطلاعاتی که  در کلاس Car وجود دارد، دسترسی پیدا کند.در این مثال به کلاس Car، کلاس والد یا Super-class گفته میشود و به کلاس Benz، کلاس فرزند یا Sub-class گفته میشود.بازنویسی متدهای کلاس والد در پایتوندر این بخش، شما یاد خواهید گرفت که چگونه از روش override  پایتون استفاده کنید تا به یک کلاس فرزند اجازه دهید پیاده سازی خاصی از یک  متد را که توسط یکی از کلاس های والد آن ارائه شده است، تغییر دهد. در  زمانی که متد‌های ارائه شده در کلاس والد مناسب کلاس فرزند نباشد، میتوانید  متدی که در کلاس والد وجود دارد را در کلاس فرزند بازنویسی کنید.class Car:
	def show(self):
		print(&#039;Nice Car...&#039;)

class Benz(Car):
	def show(self):
		print(&#039;Nice Benz...&#039;)

a = Benz()
a.show()

# OUTPUT
Nice Benz...متد super در پایتوندر این آموزش، نحوه استفاده از متد super() پایتون را برای  تفویض اختیار به کلاس والد هنگام بازگرداندن متدها یاد خواهید گرفت. در  زمان بازنویسی متدهای کلاس پدر، فقط عملکردی که در کلاس فرزند وجود دارد  اجرا خواهد شد. اما ممکن است نیاز داشته باشید که متدی که در کلاس پدر وجود  دارد نیز در کنار متد کلاس فرزند اجرا شود. در این حالت میتوانید از متد  super پایتون استفاده کنید که وظیفه صدا زدن متد پدر را دارد.class Car:
	def show(self):
		print(&#039;Nice Car...&#039;)

class Benz(Car):
	def show(self):
		super().show()
		print(&#039;Nice Benz...&#039;)

a = Benz()
a.show()

# OUTPUT
Nice Car...
Nice Benz...در کد بالا با استفاده از متد super پایتون مشخص کردیم که متد  show که در کلاس Car وجود دارد نیز باید در کنار show کلاس Benz اجرا شود.ویدیو مرتبط: ویدیو آموزش کلاس های abstract در پایتونکلاس‌های انتزاعی(abstract) در پایتوندر این آموزش، با کلاس های انتزاعی پایتون و نحوه استفاده از  آن برای ایجاد یک طرح اولیه برای کلاس های دیگر آشنا خواهید شد. در برنامه  نویسی شی گرا، کلاس انتزاعی کلاسی است که قابل نمونه سازی نیست. با این  حال، می توانید کلاس هایی ایجاد کنید که از یک کلاس انتزاعی به ارث می  برند. به طور معمول، شما از یک کلاس انتزاعی برای ایجاد طرحی برای کلاس های  دیگر استفاده می کنید. به طور مشابه، متد انتزاعی متدی بدون پیاده سازی  است. یک کلاس انتزاعی ممکن است شامل متدهای انتزاعی باشد یا نباشد.پایتون مستقیماً از کلاس های انتزاعی پشتیبانی نمی کند. اما  ماژولی ارائه می دهد که به شما امکان می دهد کلاس های انتزاعی را تعریف  کنید. برای تعریف یک کلاس انتزاعی، از ماژول abc استفاده می کنید. ماژول  abc زیرساختی را برای تعریف کلاس های پایه انتزاعی در اختیار شما قرار می  دهد.from abc import ABC, abstractmethod

class Car(ABC):
	@abstractmethod
	def show(self):
		pass

class Benz(Car):
	def show(self):
		print(&#039;Nice Benz...&#039;)

a = Benz()
a.show()

# OUTPUT
Nice Benzدر کد بالا با استفاده ماژول abc توانستیم کلاس Car را به یک  کلاس انتزاعی تبدیل کنیم. دیگر به طور مستقیم نمیوانیم از کلاس Car آبجکت  بسازیم زیرا این کلاس به خودی خود کاری انجام نمیدهد، فقط مشخص میکند که  کلاس‌های دیگر باید چطور باشند.</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Tue, 14 Sep 2021 19:38:28 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول pickle در پایتون</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-pickle-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-jztqv4g5tv5i</link>
                <description>بعنوان یک توسعه دهنده ، ممکن است شما نیاز داشته باشید که یک  آبجکت پیچیده را از طریق شبکه بفرستید یا وضعیت داخلی آبجکت‌های خود را  برای استفاده بعدی در دیسک یا دیتابیس ذخیره کنید. برای تحقق این امر می  توانید از فرایندی به نام serialization استفاده کنید که به لطف ماژول pickle پایتون به طور کامل توسط کتابخانه استاندارد پشتیبانی می شود.در زبان انگلیسی pickle به معنی ترشی میباشد.فرایند serialization روشی برای تبدیل  ساختار داده به فرم خطی است که می تواند از طریق شبکه ذخیره یا منتقل شود.  به روند معکوس، که یک فرم خطی را می گیرد و آنرا دوباره به آبجکت تبدیل می  کند را deserialization میگویند. serialization در بسیاری از موقعیت های مختلف قابل استفاده است. یکی از رایج ترین  استفاده ها صرفه جویی در وضعیت شبکه عصبی بعد از مرحله آموزش است تا  بتوانید بعداً از آن استفاده کنید بدون اینکه مجدداً تمرین را دوباره انجام  دهید.داخل ماژول ترشی پایتونماژول pickle پایتون اساساً از چهار متد تشکیل شده است:pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)


pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)


pickle.load(file, *, fix_imports=True, encoding=&amp;quotASCII&amp;quot, errors=&amp;quotstrict&amp;quot, buffers=None)


pickle.loads(bytes_object, *, fix_imports=True, encoding=&amp;quotASCII&amp;quot, errors=&amp;quotstrict&amp;quot, buffers=None)دو روش اول در طی فرآیند pickling استفاده می شود و دو روش دیگر در حین unpickling. تنها تفاوت بین dump() و dumps() در این است که اولی فایلی را ایجاد می کند که حاوی نتیجه serialization است ، در حالی که دوم یک string را برمی گرداند.در مثال زیر میبینید که چطور با استفاده از ماژول pickle میتوان یک کلاس را serialize کرد  و یک رشته ساده را دریافت کرد. بعد از انتخاب کلاس ، می توانید مقدار  ویژگیهای آن را بدون تأثیرگذاری روی رشته pickle تغییر دهید. سپس می توانید  رشته pickle را در یک متغیر دیگر جدا کنید و یک نسخه دقیق از کلاس pickle  قبلی را داشته باشید.# pickling.py
import pickle

class example_class:
    a_number = 35
    a_string = &amp;quothey&amp;quot
    a_list = [1, 2, 3]
    a_dict = {&amp;quotfirst&amp;quot: &amp;quota&amp;quot, &amp;quotsecond&amp;quot: 2, &amp;quotthird&amp;quot: [1, 2, 3]}
    a_tuple = (22, 23)

my_object = example_class()

my_pickled_object = pickle.dumps(my_object)  # Pickling the object
print(f&amp;quotThis is my pickled object:\n{my_pickled_object}\n&amp;quot)

my_object.a_dict = None

my_unpickled_object = pickle.loads(my_pickled_object)  # Unpickling the object
print(f&amp;quotThis is a_dict of the unpickled object:\n{my_unpickled_object.a_dict}\n&amp;quot)در مثال بالا چندین آبجکت مختلف ایجاد می کنید و با pickle آنها را serialize می کنید. و نتیجه به شکل زیر خواهد بود:$ python pickling.py

This is my pickled object:
b&#039;\x80\x03c__main__\nexample_class\nq\x00)\x81q\x01.&#039;

This is a_dict of the unpickled object:
{&#039;first&#039;: &#039;a&#039;, &#039;second&#039;: 2, &#039;third&#039;: [1, 2, 3]}اگر دوست دارید همین مبحث رو به شکل ویدیویی ببینید به لینک زیر سر بزنید: https://www.mongard.ir/one_part/96/python-pickle-module/ https://www.mongard.ir/one_part/96/python-pickle-module/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Sun, 20 Jun 2021 19:28:04 +0430</pubDate>
            </item>
                    <item>
                <title>چرا تیم‌ها تنبل‌اند؟   کم کاری اجتماعی</title>
                <link>https://virgool.io/@amirbig/%DA%86%D8%B1%D8%A7-%D8%AA%DB%8C%D9%85-%D9%87%D8%A7-%D8%AA%D9%86%D8%A8%D9%84-%D8%A7%D9%86%D8%AF-%DA%A9%D9%85-%DA%A9%D8%A7%D8%B1%DB%8C-%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%DB%8C-hlmjhksphjip</link>
                <description>سال ۱۹۱۳، ماکسیمیلی‌ین‌رینگمن، مهندس فرانسوی، عملکرد اسب‌ها را مطالعه کرد. او نتیجه گرفت قدرت دو حیوان که یک کالسکه را میکشند با دوبرابر قدرت یک اسب برابر نیست. رینگمن شگفت‌زده از این نتیجه آن را به انسان‌ها هم تعمیم داد.چند مرد باید طنابی را از دو سو میکشیدند. او نیروی به کار گرفته‌شده از هر طرف را اندازه‌گیری کرد. به طور میانگین، اگر دو نفر با هم طناب را بکشند، هر کدام فقط ۹۳ درصد از قدرت خود را به کار می‌گیرند. وقتی سه نفری باهم بکشند، این عدد ۸۶ درصد است و اگر هشت نفر بکشند، فقط از ۴۹ درصد قدرت خود بهره می‌گیرند.علم چنین چیزی را اثر کم کاری اجتماعی می‌نامد. این پدیده وقتی اتفاق میفتد که عملکرد فردی به صورت مستقیم قابل مشاهده نیست و با تلاش گروهی آمیخته میشود. کم کاری اجتماعی در میان قایق‌رانان نیز مشهود است، اما نه در رقابت‌های امدادی، چون در آنجا مشارکت‌های فردی مشخص‌اند. کم کاری اجتماعی رفتاری منطقی است; چرا همه انرژی خود را مصرف کنی وقتی نیمی از آن هم کفایت میکند؟ مخصوصا زمانی که این کوتاهی‌ها به چشم نمی‌آید. به بیان ساده‌تر، کم‌کاری اجتماعی نوعی گول زدن است که در آن همه ما مقصریم، حتا اگر ناخودآگاه اتفاق افتاده باشد. در مورد اسب‌های رینگمن هم چنین اتفاقی افتاده بود.وقتی مردم کاری را باهم انجام میدهند، عملکرد‌های فردی کاهش پیدا میکند. این شگفت‌آور نیست. چون نیروی مصرف شده از طرف ما به رغم کاهش به طور کامل صفر نمی‌شود. پس چه چیزی مانع می‌شود که کاملا استراحت کنیم و اجازه دهیم بقیه کار سخت را انجام دهند؟ پیامدهای آن.عملکرد در حد صفر مورد توجه قرار خواهد گرفت و این مجازات سنگینی را با خود به همراه دارد، مثل اخراج از گروه یا متهم شدن. تکامل باعث شد خیلی از حس‌های ما پیشرفت کند و به خوبی تنظیم شود، از جمله این که چه مقدار بی‌کاری ما را به دردسر نخواهد انداخت و این که چگونه آن را در دیگران تشخیص بدهیم.کم‌کاری اجتماعی فقط در عملکرد فیزیکی ما اتفاق نمی‌افتد. ما به لحاظ ذهنی هم کم‌کاری میکنیم. برای مثال، در جلسه‌ها، هر چه تیم بزرگ‌تر باشد، مشارکت فردی ضعیف‌تر می‌شود. اما به محض آنکه شرکت‌کنندگان به یک تعداد مشخص برسند، عملکرد ما ثابت می‌شود. مهم نیست گروه شامل بیست نفر باشد یا صد نفر، اینرسی بیشینه حاصل شده.یک سوال باقی میماند: چه کسی این ایده تحسین شده را مطرح کرد که تیم‌ها بسیار بیشتر از افراد موفق می‌شوند؟ شاید ژاپنی‌ها. سی سال پیش، آنها بازارهای جهانی را از محصولات خود پر کردند. اقتصاددانان حوزه تجارت به معجزه صنعتی آنها دقیق‌تر نگاه کردند و دیدند کارخانه‌های ژاپن به شکل تیمی سازمان‌دهی شده‌اند. این مدل با موفقیتی نسبی کپی شد. آن طرحی را که در ژاپن خیلی خوب کار کرده نمی‌توان با آمریکایی‌ها و اروپایی‌ها تکرار کرد. شاید چون کم‌کاری اجتماعی به ندرت در ژاپن اتفاق می‌افتد. در غرب، تیم‌ها فقط و فقط در صورتی بهتر کار میکنند که کوچک‌تر و متشکل از افراد مختلف و متخصص باشد. چنین چیزی منطقی به نظر می‌رسد، چون در چنین گروه‌هایی عملکردهای فردی هر متخصص قابل ردیابی است.کم‌کاری اجتماعی پیامدهای جالبی دارد. در گروه‌ها، ما نه تنها در مشارکت، بلکه حتا در حوزه جواب‌گویی هم تمایل به عقب‌نشینی داریم. هیچ‌کس نمی‌خواهد مسئولیت کار‌های خلاف یا تصمیم‌های بد کل گروه را قبول کند. یک مثال چشمگیر محاکمه نازی‌ها در دادرسی‌های نورنبرگ است و یک مثال کمتر جنجالی آن، هیئت مدیره یا تیم‌های مدیریتی هستند. ما پشت تصمیم‌های تیمی پنهان میشویم. عبارت فنی برای چنین چیزی انتشار مسئولیت است. به همین دلیل است که تیم‌ها به نسبت تک‌تک اعضا تمایل به پذیرش ریسک‌های بزرگ‌تری دارند. افراد گروه استدلال می‌کنند که اگر کارها بد پیش برود، آن‌ها تنها کسانی نیستند که سرزنش خواهند شد. این اثر ((انتقال مخاطره‌آمیز)) نام دارد و به طور خاص برای شرکت‌ها و استراتژیست‌های صندوق بازنشستگی خطرناک است، جایی که پای میلیاردها پول در میان است یا در وزارت دفاع، یعنی جایی که گرو‌ه‌ها در مورد استفاده از سلاح‌های اتمی تصمیم می‌گیرند.در نتیجه، مردم در گروه‌ها نسبت به وقتی که تنها هستند متفاوت رفتار می‌کنند(در غیر این صورت، اصلا گروهی در کار نبود). با آشکار شدن عملکردهای فردی تا حد امکان، می‌توان نقاط ضعف گروه‌ها را خفیف کرد. زنده باد شایسته‌سالاری! زنده باد جامعه‌ی عملکردمحود!این متن بخشی از کتاب زیبای (( هنر شفاف اندیشیدن )) اثر رولف دوبلی، نشر چشمه بود.</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Thu, 08 Apr 2021 13:53:47 +0430</pubDate>
            </item>
                    <item>
                <title>10 روش برای ریفکتور کردن کدهای پایتونی</title>
                <link>https://virgool.io/@amirbig/10-%D8%B1%D9%88%D8%B4-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B1%DB%8C%D9%81%DA%A9%D8%AA%D9%88%D8%B1-%DA%A9%D8%B1%D8%AF%D9%86-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86%DB%8C-v4pb35k73g9k</link>
                <description>یکی از مهم ترین بخش های برنامه نویسی پایتون، نوشتن کدی قابل فهم و در حد ممکن کوتاه است. به کدی با این ویژگی کد پایتونیک (Pythonic) می‌گویند.اما همه ما گاهی اوقات اسیر عادات بد می‌شویم و هنگامی که با عجله کار می‌کنیم، کدمان یک کمی شلوغ می‌شود. در اینجا به 10 روش بازنویسی کد در پایتون می‌پردازیم که کدتان را به کدی قابل فهم تر و پاتونیتک تر تبدیل می‌کند که کار کردن با آن آسان تر است.1. توابع تو‌در‌تو if را با هم ادغام کنیداستفاده بیش از حد از توابع تو‌در‌تو می‌تواند به خوانایی و فهم کد ضربه بزند؛ به ویژه آنکه در پایتون از کروشه برای تمایز میان سطوح مختلف تودرتویی استفاده نمی‌شود. ما می‌توانیم سطوح تودرتویی را با ترکیب دو یا چند شرط if با هم کاهش دهیم.if a:
  if b:
    return cمثال بالا می تواند به کد پایین تبدیل شود:if a and b:
  return c2. خودتان را تکرار نکنید! کد تکراری را از عبارات شرطیتان حذف کنیدما باید از به وجود آمدن کد تکراری اجتناب کنیم و یکی از مواردی که کد تکراری بسیار در آن دیده می‌شود، عبارات شرطی هستند. اگر کدی در دو یا همه ی شاخه های یک عبارت شرطی، تکرار شده باشد، در هر شرایطی اجرا خواهد شد. پس ما می‌توانیم آن را تنها یکبار بنویسیم:if sold &gt; DISCOUNT_AMOUNT:
    total = sold * DISCOUNT_PRICE
    label = f&#039;Total: {total}&#039;
else: 
    total = sold * PRICE
    label = f&#039;Total: {total}&#039;عبارت label = f&#x27;Total: {total}&#x27; همیشه اجرا خواهد شد. پس ما می‌توانیم آن را خارج از عبارت شرطی بنویسیم. این کار به ما کمک می‌کند تا هدف اصلی عبارت شرطی را بهتر درک کنیم.if sold &gt; DISCOUNT_AMOUNT: 
    total = sold * DISCOUNT_PRICE 
else: 
    total = sold * PRICE 
label = f&#039;Total: {total}&#039;3. از حلقه های کمتری استفاده کنید. به جای آن تابع any() را به کار ببرید.معمولا هنگامی که می‌خواهیم شرایطی را روی تک تک عناصر یک مجموعه بررسی کنیم از حلقه استفاده می‌کنیم:found = False 
for thing in things: 
  if thing == other_thing: 
    found = True 
    breakاین کد کارمان را راه می‌اندازد اما یک راه بسیار کوتاه تر نیز وجود دارد! پایتون دارای دو تابع داخلی any() و all() است که می‌تواند به راحتی شرطی را در مورد عنصر یا عناصر یک مجموعه بررسی کند. پس می‌توانیم کد بالا را به شکل زیر بازنویسی کنیم:found = any(thing == other_thing for thing in things)4. حلقه های for و while را خلوت کنید!فهمیدن و دنبال کردن حلقه ها به خودی خود کاری پیچیده است. اضافه کردن اطلاعات غیرضروری به آن ها، آن را پیچیده تر نیز می‌کند. پس می‌توانیم با قرار دادن آن اطلاعات خارج از حلقه، خوانایی کدمان را افزایش دهیم.for building in buildings: 
  city = &#039;London&#039; 
  addresses.append(building.street_address, city)در اینجا، متغیر city در حلقه مقداردهی شده است. اما مقدار city در طول حلقه هیچ تغییری نمی‌کند. پس باید آن را بیرون از حلقه بنویسیم:city = &#039;London&#039; 
for building in buildings: 
  addresses.append(building.street_address, city)5. از حلقه های کمتری استفاده کنید – بخش دوم. از دریافت list،set و dictionary استفاده کنید.یکی دیگر از کارهایی که هنگام برنامه نویسی انجام می‌دهیم، ایجاد مجموعه از مقادیر است. در بسیاری از زبان ها می‌توانیم به شکل زیر عمل کنیم:cubes = [] 
for i in range(20): 
  cubes.append(i ** 3)ابتدا یک لیست خالی cubes ایجاد کرده و سپس آن را به طور تکرارشونده با مقادیر مورد نظرمان مقدار دهی می‌کنیم. این کار در پایتون اشتباه نیست اما می‌توان با استفاده از (قابلیت) دریافت داخلی پایتون، آن را بسیار راحت تر انجام داد. این دریافت ها به ما امکان نوشتن کد بالا را در یک خط، بدون نیاز به تعریف یک لیست خالی، می‌دهند:cubes = [i ** 3 for i in range(20)]تبدیل سه خط به یک خط واقعا عالی است! علاوه بر این، وقتی به سینتکس دریافت لیست عادت کنید، فهمیدن کد نیز برایتان آسان‌تر می‌شود.6. عبارات افزودههر زمان که نیاز به بروزرسانی محتوای یک متغیر داشته باشیم، می‌توانیم عبارتمان را ساده سازی کنیم. به طور مثال به جای کد:count = count + other_valueمیتوانیم بنویسیم:count += other_valueدرست است که این تغییرِ چشمگیری نیست اما کدمان کوتاه تر می‌شود! علاوه بر این، فقط یکبار در مورد متغیر count فکر خواهیم کرد. همچنین می توانیم این ساده سازی را در قبال دیگر عملگرها نیز انجام دهیم. مانند *= , /= , -=, **=7. عبارات if بجای جملات ifاین مورد هنگامی استفاده می‌شود که می‌خواهیم متغیری را با یکی از دو مقادیر انتخابی، مقداردهی کنیم. به طور مثال:if condition: 
  x = 1 
else: 
  x = 2با استفاده از عبارت if می‌توانیم چهار خط را به یک خط تبدیل کنیم!x = 1 if condition else 2این بازنویسی تا حدودی اختیاری است زیرا بعضی برنامه نویس ها اظهار if را بیشتر می‌پسندند و آن را خوانا تر می‌پندارند. اما نظر شخصی من این است که تبدیل یک عبارت شرطی چند خطی به یک خط، به طور قطع پیشرفت محسوب می‌شود. البته شما آزادید که در این مورد با من هم نظر نباشید.8. از یک شمارنده بهتر حلقه استفاده کنید - enumerateمعمولا هنگام مرور یک لیست، از یک شمارنده استفاده می‌کنیم تا شماره عنصر فعلی را بدانیم. معمولا این کد ها به شکل زیر نوشته می‌شوند:i = 0 
for currency in currencies: 
  print(i, currency) 
  i += 1اما پایتون دارای تابعی داخلی به نام enumerate است که شماره عنصر فعلی را به طور خودکار می‌سازد و کد ما را دو خط کوتاه تر می‌کند:for i, currency in enumerate(currencies): 
  print(i, currency)9. از حلقه های کمتری استفاده کنید – بخش سوم. از sum استفاده کنید.خیلی از مواقع نیاز داریم مجموع عناصر یک لیست را بدست آوریم. برای اینکار می توانیم از تابع داخلی sum() استفاده کنیم. بنابراین، به جای:total = 0 
for hat in hats: 
  total += hat.priceبه راحتی می‌توانیم کد یک خطی پایین را بنویسیم:total = sum(hat.price for hat in hats)این کار نه تنها کد ما را کوتاه تر می‌کند، بلکه توضیح بیشتری در مورد آن نیز به ما می‌دهد. – که در این مورد پیدا کردن مجموع قیمت کلاه ها است.10. عبارات مقایسه ای را ساده سازی کنید.معمولا قبل از آنکه عملی را روی یک دنباله یا لیست اعمال کنیم، از خالی نبودن لیست اطمینان حاصل می‌کنیم. یکی از راه های انجام این کار، بررسی شرط بزرگتر بودن طول لیست از صفر است:if len(list_of_hats) &gt; 0: 
    hat_to_wear = choose_hat(list_of_hats)اما پایتون لیست ها و دنباله ها را به طور خودکار بررسی می‌کند. اگر لیست خالی نبود True و اگر خالی بود False را بر‌می‌گرداند. کد زیر از کد بالا پایتونیک تر است:if len(list_of_hats): 
    hat_to_wear = choose_hat(list_of_hats)با انجام دادن این 10 کار، کدتان را تمیز‌تر و خلوت تر می‌کنید. علاوه بر آن، این نحوه کد نویسی در قرارداد PEP8 guidlines پایتون نیز پیشنهاد شده است.برای آموزش‌‌های پیشرفته پایتونی به وبسایت زیر سر بزنید: https://www.mongard.ir/ </description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Wed, 17 Mar 2021 19:16:26 +0330</pubDate>
            </item>
                    <item>
                <title>الگوریتم a1z26 در پایتون</title>
                <link>https://virgool.io/@amirbig/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-a1z26-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-dncgf4icnv9u</link>
                <description>سلامدر این مقاله با هم دیگه الگوریتم a1z26 رو در پایتون پیاده میکنیم.اول توضیح بدم که این الگوریتم چی هست:این الگوریتم یک روش برای رمزنگاری اطلاعات هست، به صورتی که هر حرف الفبا رو به یک عدد تبدیل میکنه. در واقع این اعداد، شماره یونیکد هر حرف هستند. دقت کنید که این روش رمزنگاری اصلا امن نیست و فقط جنبه تمرین داره.در پایتون یک متدی داریم به اسم ord که شماره یونیکد هر حرف رو برمیگردونه. مثال:&gt;&gt;&gt; ord(&#039;a&#039;)
97حالا ما برعکس همین متد رو هم داریم که chr هست و اگر عدد هر یونیکد رو بهش بدین کاراکتر متناظر رو براتون برمیگردونه. مثال:&gt;&gt;&gt; chr(97)
aبریم سراغ پیاده‌سازی الگوریتم:def encode(plain):
     return [ ord(elm) for elm in plain ]


&gt;&gt;&gt;encode(&#039;amir&#039;)
 [97, 109, 105, 114]
در مثال بالا ما یک فانکشن داریم به اسم encode که به عنوان مقدار ورودی plain رو میگیره که همون متنی هست که میخوایم رمزنگاریش کنیم. در خط بعد با استفاده از یک list comprehension داخل اون متن چرخیدیم و هر کاراکتر متن رو با متد ord تبدیل به عدد میکنیم. در آخر هم نتیجه رو برمیگردونیم.و در آخر کدمون رو تست کردیم.حالا میتونیم کدی بنویسیم که همین رمزنگاری رو بشکنه. برای اینکار دقیقا مثل بالا عمل میکنیم منتها به جای ord از chr استفاده میکنیم:def decode(cipher):
     return [chr(elm) for elm in cipher]


&gt;&gt;&gt; decode( [97, 109, 105, 114] )
&#039;amir&#039;میبینید که میتونید با این کد همون اعدادی که از رمزنگاری بدست اومده بودن رو به حالت قبل برگردونید.اگر دوست دارید این مبحث رو بشکل ویدیویی ببینید یا دوست دارید الگوریتم‌های بیشتری رو با پایتون ببینید به لینک زیر یه سر بزنید: https://www.mongard.ir/courses/algorithms/episode/626/algo-a1z26/ https://www.mongard.ir/courses/algorithms/episode/626/algo-a1z26/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Sat, 23 Jan 2021 01:29:20 +0330</pubDate>
            </item>
                    <item>
                <title>درک عمیق از توابع پایتون + ویدیو</title>
                <link>https://virgool.io/@amirbig/%D8%AF%D8%B1%DA%A9-%D8%B9%D9%85%DB%8C%D9%82-%D8%A7%D8%B2-function-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-wueii2nyoeml</link>
                <description>سلامامروز در رابطه با functionهای پایتون براتون میگم و در اونها عمیق میشیم که ببینیم اصلا functionهای پایتون چه قدرتی دارند. (اگر حوصله ندارید همه متن رو بخونید میتونید ویدیو آخر مقاله ور ببینید)در سال 2009 &#x27;خودو ون رسوم&#x27; سازنده پایتون، مقاله ای نوشت با عنوان First class everything که بخشی از اون مقاله رو براتون میارم(لینک مقاله) :One of my goals for Python was to make it so that all objects were  &quot;first class.&quot;  By this, I meant that I wanted all objects that could be  named in the language (e.g., integers, strings, functions, classes,  modules, methods, etc.) to have equal status.   That is, they can be  assigned to variables, placed in lists, stored in dictionaries, passed  as arguments, and so forth.یکی از هدف های من در طراحی پایتون این بود که همه چیز یک آبجکت باشه. منظورم اینکه تمام چیزهایی که در پایتون پیدا میشن مثل integers, strings, functions, classes و... یک وضعیت رو داشته باشند که ما بتونیم با همه اینها به یک شکل رفتار کنیم. مثلا اونها رو داخل یک متغیر یا لیست یا دیکشنری ذخیره کنیم یا حتی اونها رو به عنوان یک آرگومان ارسال کنیم.به احتمال زیاد شما تا الآن فانکشن ها رو به ساختن و صدا زدن محدود میدونستید. اما امروز اونور سکه رو بهتون نشون میدم.everything is an objectاینی که ما میگیم هر چیزی یک آبجکت هستش رو چجوری میتونیم ثابت کنیم؟! داخل پایتون یک متد شگفت انگیز  وجود داره به اسم type. با استفاده از این متد میتونید موجودیت هر چیزی رو ببینید:&gt;&gt; type( 2 )          # &lt;class &#039;int&#039;&gt;
&gt;&gt; type( &#039;iran&#039; )     # &lt;class &#039;str&#039;&gt;
&gt;&gt; type( [1, 2, 3] )     # &lt;class &#039;list&#039;&gt;
&gt;&gt; type( print )     # &lt;class &#039;builtin_function_or_method&#039;&gt;
&gt;&gt; type( type )     # &lt;class &#039;type&#039;&gt;

def show(): pass
&gt;&gt; type( show )    # &lt;class &#039;function&#039;&gt;

import datetime
&gt;&gt; type( datetime ) # &lt;class &#039;module&#039;&gt;تمام چیزهایی که در پایتون میبینید یک کلاس(آبجکت) هستند. خب که چی؟از این به میریم سراغ مبحث اصلیمون که همون فانکشن ها هستند:1. Fuctions are objectsاز اونجایی که فانکشن‌ها آبجکت هستند پس میتونیم اونها رو داخل متغیرها ذخیره کنیم. مثال زیر رو ببینید:def show(name):
    return f &#039;Hello {name}&#039; 

x = show   # don&#039;t put parentheses
x( &#039;amir&#039; )

&gt;&gt; Hello amirهمونطور که در مثال بالا میبینید فانکشن show رو داخل متغیر x ذخیره کردیم. این یکی از فواید آبجکت بودن فانکشن هاست.2. Functions can be stored in data structuresشما میتونید فانکشن‌ها رو داخل دنباله هایی مثل لیست‌ها، تاپل‌ها، دیکشنری‌ها... ذخیره کنید def show(name):
    print( f &#039; Hello { name.upper() } &#039; )

x = [ show, str.capitalize, str.lower ]

for i in x:
    i (&#039;AmIrHOssEin&#039;)

&gt;&gt; Hello AMIRHOSSEIN
&gt;&gt; Hello Amirhossein
&gt;&gt; Hello amirhosseinدر مثال بالا یک فانکشن داریم که مقدار name رو میگیره و اون رو به حروف بزرگ تبدیل میکنه و همراه Hello چاپ میکنه. بعد یک لیست ایجاد کردیم از چند فانکشن که در آخر داخل اون لیست حلقه زدیم و به تک تک اون فانکشن ها رو اجرا کردیم.3. Functions can be passed to other functions (higher-order functions)شما میتونید فانکشن‌ها رو به عنوان آرگومان ارسال کنید به دیگر فانکشن‌ها:def show(name):
    print( f&#039;Hello {name}&#039; )

def shoot(func):
    return func(&#039;amir&#039;)

shoot(show)

&gt;&gt; Hello amirبه فانکشن‌هایی که یک فانکشن دیگه رو به عنوان پارامتر قبول کنند higer-order گفته میشه.4. Functions can be nested (inner and outer functions)5. Functions can capture local state (lexical closure)6. Objects can behave like functionsسه تا مورد آخر چون پیچیده تر هستند بهتره که داخل ویدیو ببینیدشون. https://www.aparat.com/v/6GLh7 اگر بازم دلتون خواست مباحث پیشرفته پایتون رو یاد بگیرید به وبسایت ما سر بزنید. https://www.mongard.ir/ قلب و نظر شما باعث دلگرمی ماست.</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Mon, 25 May 2020 23:28:05 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش urlهای فارسی در جنگو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-url%D9%87%D8%A7%DB%8C-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%AC%D9%86%DA%AF%D9%88-eend37mlcful</link>
                <description>در این مقاله میبینید که چطور میتونید در جنگو  urlهای فارسی ایجاد کنید.برای استفاده از url فارسی در جنگو باید در مدل‌هاتون مقدار آپشن allow_unicode در فیلد SlugField را True قرار دهید:# my_app/models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField(max_length=20, allow_unicode=True)با اینکار SlugField شما میتونه کاراکترهای فارسی رو قبول کنه. اما این مرحله اول بود.در مرحله دوم باید urlهای خودتون رو تغییر بدین. جنگو به صورت  پیشفرض از کاراکترهای یونیکد شده در urlها پشتیبانی نمیکنه. پس مجبورید از  متد re_path استفاده کنید تا بتونید regex مخصوص خودتون رو داشته باشید:# my_app/urls.py

form django.urls import re_path
from . import views

urlpatterns = [
    re_path(r&#039;(?P&lt;slug&gt;[-\w]+)/&#039;, views.detail),
]با استفاده از regex بالا میتونید کاراکترهای فارسی رو در url استفاده کنید.مشکلی که روش بالا داره اینکه بخاطر استفاده از حروف فارسی،  url از راست به چپ نوشته خواهد شد. برای حل این مشکل میتونید قبل از regex  از یک کلمه یا حرف انگلیسی استفاده کنید:re_path(r&#039;detail/(?P&lt;slug&gt;[-\w]+)/&#039;, views.detail),اگر  ترجیح میدید همین مبحث رو بشکل ویدیویی ببینید یا دوست دارید جنگو یاد بگیرید به لینک زیر سر بزنید: https://www.mongard.ir/one_part/73/django-persian-urls/ https://www.mongard.ir/one_part/73/django-persian-urls/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Wed, 06 May 2020 14:11:04 +0430</pubDate>
            </item>
                    <item>
                <title>توضیح querysetهای تنبل در جنگو</title>
                <link>https://virgool.io/@amirbig/%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-queryset%D9%87%D8%A7%DB%8C-%D8%AA%D9%86%D8%A8%D9%84-%D8%AF%D8%B1-%D8%AC%D9%86%DA%AF%D9%88-tlrlt4s2aswu</link>
                <description>تمامی querysetها در جنگو تنبل هستند یعنی تا زمانی که مجبور(evaluate) نباشند به دیتابیس متصل نشده و اطلاعات را نمیگیرند.این تنبل بودن querysetها باعث مصرف بهینه منابع خواهد شد.  شما میتوانید تمام روز را مشغول نوشتن queryset باشید اما queryset ها حتی  یکبار هم به دیتابیس وصل نخواهند شد. به مثال زیر دقت کنید:&gt;&gt; p1 = Person.objects.get(id=2)
&gt;&gt; p2 = Person.objects.filter(name=&#039;john&#039;)
&gt;&gt; cars = Car.objects.order_by(&#039;speed&#039;)
&gt;&gt; cars.filter(name=&#039;benz&#039;)در هیچکدام از موارد فوق querysetها حتی یکبار هم به دیتابیس  وصل نشده‌اند. این querysetها فقط در حافظه موقت برنامه شما قرار دارند و  تا زمانی که این querysetها را  evaluate نکنید به دیتابیس متصل نخواهند  شد.برای evaluate کردن querysetها روش ها مختلفی وجود دارد.روش اول iteration: اگر داخل یک queryset حلقه بزنید مجبور خواهد بود به دیتابیس وصل شود:for p in Person.objects.all():
    print(p.name)روش دوم slicing: اگر querysetها را به روش list تکه کنید:Person.objects.all()[:3]روش سوم repr(): اگر از متد repr استفاده کنید:p1 = Person.objects.all()
repr(p1)روش چهارم len(): اگر از متد len استفاده کنید:p = Person.objects.all()
len(p)روش پنجم list(): برای مجبور کردن یک queryset برای evaluate شدن میتوانید از متد list() استفاده کنید:list(Person.objects.all())روش ششم bool(): اگر از شرط ها در کنار queryset استفاده کنید:if Person.objects.filter(name=&#039;admin&#039;):
    print(&#039;Hello admin...&#039;)برای آموزش های بیشتر جنگو به وبسایت زیر سر بزنید: https://www.mongard.ir/courses/ https://www.mongard.ir/courses/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Fri, 01 May 2020 10:55:20 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش عبارات F در جنگو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-f-%D8%AF%D8%B1-%D8%AC%D9%86%DA%AF%D9%88-wbgfv7mnwai2</link>
                <description>سلامامروز میخوام در رابطه با F expression براتون روضه بگم.عبارت F به شما اجازه میده که دو فیلد از یک آبجکت رو با هم مقایسه کنیددر این مقاله میخوام از مدل زیر استفاده کنم. این مدل برای ذخیره اطلاعات مربوط به فیلماست:class Movie(models.Model):
    name = models.CharField(max_length=30)
    budget = models.IntegerField()
    revenue = models.IntegerField()
    year = models.IntegerField()مدل بالا چهارتا فیلد داره: اسم فیلم, بودجه ساخت, فروش فیلم, سال ساخت.خب حالا فکر کنید به شما میگن داخل این جدول جوری query بزنید که فقط فیلم هایی که &quot;مقدار بودجه بیشتر از مقدار فروش بوده&quot; رو به ما نشون بده. چیکار میکنید؟ یا فکر کنید به شما بگن جوری query بزنید که فیلم ها بر اساس year ترتیب بندی بشن و فیلم هایی که مقدار year  اونها null هستش آخر نشون داده بشه. باز چیکار میکنید؟منتظر queryهاتون در نظرات هستم :)اینجا میتونید از F استفاده کنید. پاسخ query اول:Movie.objects.filter( budget__gt=F(&#039;revenue&#039;) )در مثال بالا گفتم اونهایی رو برام بیار که مقداره فیلد budget بیشتر باشه از مقدار revenueپاسخ query دوم:Movie.objects.order_by( F(&#039;year&#039;).asc(nulls_last=True) )در کد بالا گفتم نتایج رو بر اساس year ترتیب بندی کن و اونهایی که مقدار year برابر با null هستش رو آخر نشون بده.اگر دوست دارید مثال بیشتری در رابطه با این موضوع ببینید یا ترجیح میدید همین مبحث رو بشکل ویدیویی ببینید به لینک زیر سر بزنید: https://www.mongard.ir/one_part/67/django-f/ https://www.mongard.ir/one_part/67/django-f/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Mon, 13 Apr 2020 18:01:37 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش مدل های انتزاعی در جنگو</title>
                <link>https://virgool.io/@amirbig/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%AA%D8%B2%D8%A7%D8%B9%DB%8C-%D8%AF%D8%B1-%D8%AC%D9%86%DA%AF%D9%88-wobqsozwdc9s</link>
                <description>سلامامیدوارم روز بارانی خوبی رو پشت سر گذاشته باشید. (کرج بارون میومد)امروز میخوام در رابطه با modelهای abstract در جنگو براتون بگم.یک زمانی هست که شما دارید مدل هاتون رو طراحی میکنید و بعد یهو متوجه میشید که یکسری از فیلدها و متدها تکراری هستش. اینجا میتونید از مدلها abstract استفاده کنید که کد کمتری بنویسید:مثال زیر رو ببینید:class Student(models.Model):
    name = models.CharField(max_lenght=30)
    age = models.PositiveIntegerField()
    year = models.PositiveIntegerField()

    def __str__(self):
        return self.name

class Teacher(models.Model):
    name = models.CharField(max_lenght=30)
    age = models.PositiveIntegerField()
    major = models.CharField(max_length=30)
    
    def __str__(self):
        return self.name
در مثال بالا دوتا مدلی که داریم خیلی شبیه به هم هستند و کد تکراری زیادی نوشتیم که اصلا خوب نیست.بجاش چیکار میکنید؟! میایید از مدل های abstract استفاده میکنید.کد بالا رو به شکل زیر تغییر میدم:class Common(models.Model):
    name = models.CharField(max_lenght=30)
    age = models.PositiveIntegerField()

    def __str__(self):
        return self.name

    class Meta:
        abstract = True

class Student(Common):
    year = models.PositiveIntegerField()

class Teacher(Common):
    major = models.CharField(max_length=30)
در کد بالا یک کلاس به اسم Common ساختم و تمام موارد تکراری رو داخلش نوشتم. و بعد به عنوان metadata مقدار abstract رو True قرار دادم. حالا بقیه کلاس ها میتونند از این کلاس به عنوان کلاس پایه استفاده کنن.اگر دلتون میخواد بیشتر در رابطه با این مبحث بدونید یا ترجیح میدید به شکل ویدیویی ببینید به لینک زیر یه سر بزنید: https://www.mongard.ir/one_part/66/django-abstract-models/ https://www.mongard.ir/one_part/66/django-abstract-models/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Thu, 09 Apr 2020 17:56:27 +0430</pubDate>
            </item>
                    <item>
                <title>قوانین solid در پایتون (دو)</title>
                <link>https://virgool.io/@amirbig/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-solid-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%AF%D9%88-pe0nsursqama</link>
                <description>نکتهتوی این مقاله درمورد دومین قانون از قوانین پنجگانه solid براتون میگم.  لینک قانون اولOpen/Closed Principle:“Software entities (classes, modules, functions, etc) should be open for extension, but closed for modification.”این قانون میگه که شما باید جوری برنامه نویسی کنید که اگه برنامتون نیاز به گسترش داشت، ویژگی های جدید رو بتونید بدون تغییر دادن کدهای قبلی، به برنامه اضافه کنید.اصطلاحا کدتون برای گسترش(extension) باز باشه اما برای تغییر(modification) بسته باشه.مثالدر کد پایین کلاس Animal یک اسم از حیوان رو میگیره و داخل متد sound  براساس نوع اون حیوان صداش رو به ما میده. خیلی ساده.کد بالا با قانون open/closed مغایرت داره. چرا؟فکر کنید که ما میخوایم برناممون رو توسعه بدیم و صدای مار رو هم بهش اضافه کنیم در این صورت مجبوریم که متد sound رو تغییر بدیم که این خلاف قانون هستش. به شکل زیر:حالا برای اینکه کد ما از این قانون تبعیت کنه میتونیم به شکل زیر تغییرش بدیم:در کد بالا ما برای هر حیوان یک کلاس مجزا ایجاد میکنیم، در این صورت اگه بخوایم حیوان جدیدی رو اضافه کنیم دیگه نیازی نیست که کدهای قبلیمون رو تغییر بدیم.اگه دلتون میخواد همین مبحث رو به شکل ویدیویی ببینید به لینک زیر یه سر بزنید: https://www.mongard.ir/one_part/62/python-openclosed-principle/ https://www.mongard.ir/one_part/62/python-openclosed-principle/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Sat, 29 Feb 2020 16:56:51 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمایی همسر ایلان ماسک برای میلیاردر شدن</title>
                <link>https://virgool.io/@amirbig/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%DB%8C-%D9%87%D9%85%D8%B3%D8%B1-%D8%A7%DB%8C%D9%84%D8%A7%D9%86-%D9%85%D8%A7%D8%B3%DA%A9-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%DB%8C%D9%84%DB%8C%D8%A7%D8%B1%D8%AF%D8%B1-%D8%B4%D8%AF%D9%86-yuonwrt7x1lj</link>
                <description>در سال ۲۰۱۵ یکی از کاربران Quora پرسید که: آیا اگر من مصمم باشم و تمام کارها لازم رو انجام بدم، میلیاردر خواهم شد؟و justine musk همسر سابق ایلان ماسک اینطور پاسخ داد:نه. این سوالی که تو پرسیدی کاملا اشتباهه.یکی از توانایی هایی که میلیاردرهای خودساخته رو از بقیه مردم جدا میکنه، توانایی پرسیدن سوالات درست هستش.تو مصمم هستی. خب که چی؟تو هنوز با بدن برهنه بین کوسه ها شنا نکردی.آیا تو زمانی که تنها توی یه جزیره دور افتاده، با بدن خونی و کبود درحالی که داری به افق نگاه میکنی و میدونی هیچ راه نجاتی نیست، همین قدر مصمم خواهی بود؟تمرکز خودت رو از اون چیزی که میخوای(پول) دور کن و با کنجکاوی زیاد، دنبال این باش که بفهمی دنیا چی میخواد و به چه چیزی نیاز داره؟با خودت فکر کن ببین تو چه پتانسیلی داری، چه چیزی میتونی به این دنیا اضافه کنی که منحصر به فرد و بدرد بخور باشه، که هیچ کامپیوتری نتونه جایگزینت کنه، کسی نتونه محصول تو رو بدزده و بهترش کنه و تو رو به فراموشی بسپاره. بعد اون پتانسیل خودت رو توسعه بده.سعی کن در یک زمینه استاد بشی.بعد یک زمینه دیگه انتخاب کن و در اون هم استاد شو (مثلا مهندسی و تجارت)حالا تو میتونی اینها رو با هم ترکیب کنی تا:۱. ایده هایی ایجاد بشن که تا حالا هیچ کس ندیده۲. یک مزیت رقابتی بزرگ ایجاد کنی، چون تو میتونی بین دو جهان مختلف حرکت کنی و این جهان ها رو بهم وصل کنی، نظم دنیا رو بهم بزنی تا بینش خلاقانه تازه ای ایجاد بشه، تا اینکه با حماسه ای که زندگی تو رو تغییر میده از خواب بیدار شی.دنیا همینجوری نمیاد چند میلیارد پول رو به کسی بده که سخت کار میکنه، توی کارش مصممه و فکر میکنه که لیاقتش رو داره. در واقع دنیا اصلا اهمیتی نمیده که تو سخت کار میکنی یا لیاقت چیو داری.دنیا در ازای چیز با ارزشی که تو بهش میدی، بهت پول میده. چیزی که جنبه ای از فرهنگ رو تغییر بده، داستان زندگی مردم یا طرز تفکرشون رو تغییر بده.هیچ مسیری برای اینکار وجود نداره. هیچ حالت کلی وجود نداره.خیلی از مردم به تو توصیه های زیادی میکنن که خیلی هاشونه خوب نیستند و بعضی هاشون خوبه اما باید بدونی که اینها فایده ای برات نداره چون زندگی تو با بقیه فرق میکنه.تو تا زمانی که کاریزما و اعتبار کافی رو نداشته باشی تا بتونی افراد با استعداد رو با خودت همراه کنی، در این مسیر تنها خواهی بود.شجاعت داشته باش( بهش احتیاچ پیدا میکنی)خوش شانس باشی( به اینم احتیاج پیدا میکنی)لینک سوال</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Fri, 28 Feb 2020 19:46:29 +0330</pubDate>
            </item>
                    <item>
                <title>قوانین solid در پایتون (یک)</title>
                <link>https://virgool.io/coderlife/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-solid-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%DB%8C%DA%A9-ei2ooaosozof</link>
                <description>قوانین solid در سال ۲۰۰۰ توسط رابرت مارتین ایجاد شد. این پنج قانون در برنامه نویسی شی گرا برای ایجاد کردن برنامه های قابل فهم تر،  مقیاس پذیرتر و انعطافتر توسط برنامه نویس ها استفاده میشود.در این مقاله اولین قانون از این پنج قانون رو بررسی میکنیم:Single responsibility principle:“The Single Responsibility Principle requires that each class is responsible for only one thing.“به طور خلاصه این قانون میگه که هر کلاس باید فقط و فقط مسئول انجام دادن یک کار باشه. در نتیجه هر کلاسی فقط برای تغییر وظیفه خودش دستخوش تغییر خواهد شد. کلاس ها میتوانند ویژگی ها مختلفی داشته باشند اما تمام این ویژگی ها باید مربوط به وظیفه اصلی کلاس باشند.مثال:در کد زیر یک کلاس داریم که اسم و سن افراد رو میگیره و ذخیره میکنهدر تصویر بالا میبینید که کلاس Person علاوه بر اینکه مسئول مدیریت کردن ویژگی های افراد هست، وظیفه اتصال به دیتابیس و ذخیره اطلاعات رو هم داره. این کد قانون تک مسئولیتی رو نقض کرده.برای حل این مشکل این کد رو به دو کلاس مجزا تقسیم میکنیم:حالا بهتر شد. در کد بالا اگر برنامه نویس نیاز به تغییر در یک کلاس رو داشته باشه دیگه نگران ایجاد شدن مشکل برای بقیه کلاس ها رو نداره.اگر دلتون میخواد همین مطلب رو به شکل ویدیویی ببینید به لینک زیر یه سر بزنید: https://www.mongard.ir/one_part/61/python-single-responsibility/ https://www.mongard.ir/one_part/61/python-single-responsibility/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Wed, 26 Feb 2020 21:09:55 +0330</pubDate>
            </item>
                    <item>
                <title>ترجمه متن با پایتون</title>
                <link>https://virgool.io/@amirbig/%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D9%85%D8%AA%D9%86-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-zehqhua5n2hl</link>
                <description>سلام در این مقاله بهتون میگم که چطور متن های خودتون رو با استفاده از پایتون به یک زبان دیگه ترجمه کنید. برای اینکار میتونید از Google Translate Api استفاده کنید. اما از اونجایی که گوگل یکسری تحریم های ظالمانه علیه ما اعمال کرده، میتونیم از پکیج googletrans استفاده کنیم.برای شروع با دستور زیر این پکیج رو نصب کنید:pip install googletransبعد از نصب پیکیج میتونید با دستور زیر ببینید که چه زبانهایی رو پشتیبانی میکنه:import googletrans
print(googletrans.LANGUAGES)که به شکل زیر پاسخ رو میبینید. یک دیکشنری از تمام زبان ها:{&#039;af&#039;: &#039;afrikaans&#039;, &#039;sq&#039;: &#039;albanian&#039;, &#039;am&#039;: &#039;amharic&#039;, &#039;ar&#039;: &#039;arabic&#039;, &#039;hy&#039;: &#039;armenian&#039;, &#039;az&#039;: &#039;azerbaijani&#039;, &#039;eu&#039;: &#039;basque&#039;, &#039;be&#039;: &#039;belarusian&#039;, &#039;bn&#039;: &#039;bengali&#039;, &#039;bs&#039;: &#039;bosnian&#039;, &#039;bg&#039;: &#039;bulgarian&#039;, &#039;ca&#039;: &#039;catalan&#039;, &#039;ceb&#039;: &#039;cebuano&#039;, &#039;ny&#039;: &#039;chichewa&#039;, &#039;zh-cn&#039;: &#039;chinese (simplified)&#039;, &#039;zh-tw&#039;: &#039;chinese (traditional)&#039;, &#039;co&#039;: &#039;corsican&#039;, &#039;hr&#039;: &#039;croatian&#039;, &#039;cs&#039;: &#039;czech&#039;, &#039;da&#039;: &#039;danish&#039;, &#039;nl&#039;: &#039;dutch&#039;, &#039;en&#039;: &#039;english&#039;, &#039;eo&#039;: &#039;esperanto&#039;, &#039;et&#039;: &#039;estonian&#039;, &#039;tl&#039;: &#039;filipino&#039;, &#039;fi&#039;: &#039;finnish&#039;, &#039;fr&#039;: &#039;french&#039;, &#039;fy&#039;: &#039;frisian&#039;, &#039;gl&#039;: &#039;galician&#039;, &#039;ka&#039;: &#039;georgian&#039;, &#039;de&#039;: &#039;german&#039;, &#039;el&#039;: &#039;greek&#039;, &#039;gu&#039;: &#039;gujarati&#039;, &#039;ht&#039;: &#039;haitian creole&#039;, &#039;ha&#039;: &#039;hausa&#039;, &#039;haw&#039;: &#039;hawaiian&#039;, &#039;iw&#039;: &#039;hebrew&#039;, &#039;hi&#039;: &#039;hindi&#039;, &#039;hmn&#039;: &#039;hmong&#039;, &#039;hu&#039;: &#039;hungarian&#039;, &#039;is&#039;: &#039;icelandic&#039;, &#039;ig&#039;: &#039;igbo&#039;, &#039;id&#039;: &#039;indonesian&#039;, &#039;ga&#039;: &#039;irish&#039;, &#039;it&#039;: &#039;italian&#039;, &#039;ja&#039;: &#039;japanese&#039;, &#039;jw&#039;: &#039;javanese&#039;, &#039;kn&#039;: &#039;kannada&#039;, &#039;kk&#039;: &#039;kazakh&#039;, &#039;km&#039;: &#039;khmer&#039;, &#039;ko&#039;: &#039;korean&#039;, &#039;ku&#039;: &#039;kurdish (kurmanji)&#039;, &#039;ky&#039;: &#039;kyrgyz&#039;, &#039;lo&#039;: &#039;lao&#039;, &#039;la&#039;: &#039;latin&#039;, &#039;lv&#039;: &#039;latvian&#039;, &#039;lt&#039;: &#039;lithuanian&#039;, &#039;lb&#039;: &#039;luxembourgish&#039;, &#039;mk&#039;: &#039;macedonian&#039;, &#039;mg&#039;: &#039;malagasy&#039;, &#039;ms&#039;: &#039;malay&#039;, &#039;ml&#039;: &#039;malayalam&#039;, &#039;mt&#039;: &#039;maltese&#039;, &#039;mi&#039;: &#039;maori&#039;, &#039;mr&#039;: &#039;marathi&#039;, &#039;mn&#039;: &#039;mongolian&#039;, &#039;my&#039;: &#039;myanmar (burmese)&#039;, &#039;ne&#039;: &#039;nepali&#039;, &#039;no&#039;: &#039;norwegian&#039;, &#039;ps&#039;: &#039;pashto&#039;, &#039;fa&#039;: &#039;persian&#039;, &#039;pl&#039;: &#039;polish&#039;, &#039;pt&#039;: &#039;portuguese&#039;, &#039;pa&#039;: &#039;punjabi&#039;, &#039;ro&#039;: &#039;romanian&#039;, &#039;ru&#039;: &#039;russian&#039;, &#039;sm&#039;: &#039;samoan&#039;, &#039;gd&#039;: &#039;scots gaelic&#039;, &#039;sr&#039;: &#039;serbian&#039;, &#039;st&#039;: &#039;sesotho&#039;, &#039;sn&#039;: &#039;shona&#039;, &#039;sd&#039;: &#039;sindhi&#039;, &#039;si&#039;: &#039;sinhala&#039;, &#039;sk&#039;: &#039;slovak&#039;, &#039;sl&#039;: &#039;slovenian&#039;, &#039;so&#039;: &#039;somali&#039;, &#039;es&#039;: &#039;spanish&#039;, &#039;su&#039;: &#039;sundanese&#039;, &#039;sw&#039;: &#039;swahili&#039;, &#039;sv&#039;: &#039;swedish&#039;, &#039;tg&#039;: &#039;tajik&#039;, &#039;ta&#039;: &#039;tamil&#039;, &#039;te&#039;: &#039;telugu&#039;, &#039;th&#039;: &#039;thai&#039;, &#039;tr&#039;: &#039;turkish&#039;, &#039;uk&#039;: &#039;ukrainian&#039;, &#039;ur&#039;: &#039;urdu&#039;, &#039;uz&#039;: &#039;uzbek&#039;, &#039;vi&#039;: &#039;vietnamese&#039;, &#039;cy&#039;: &#039;welsh&#039;, &#039;xh&#039;: &#039;xhosa&#039;, &#039;yi&#039;: &#039;yiddish&#039;, &#039;yo&#039;: &#039;yoruba&#039;, &#039;zu&#039;: &#039;zulu&#039;, &#039;fil&#039;: &#039;Filipino&#039;, &#039;he&#039;: &#039;Hebrew&#039;}برای اینکه بتونید یک متن رو ترجمه کنید به شکل زیر کار کنید:from googletrans import Translator
g = Translator()
print(g.translate(&#039;سلام&#039;))که به شکل زیر جواب میده:Translated(src=fa, dest=en, text=Hi, pronunciation=Hi, extra_data=&amp;quot{&#039;translat...&amp;quot)این پکیج به طور اتوماتیک زبان مقصد رو انگلیسی قرار داده اما میتونید تغیریش بدین:from googletrans import Translator
g = Translator()
print(g.translate(&#039;سلام&#039;, &#039;th&#039;))در مثال بالا من زبان تایلندی رو انتخاب کردم که به شکل زیر پاسخ میده:Translated(src=fa, dest=th, text=สวัสดี, pronunciation=None, extra_data=&amp;quot{&#039;translat...&amp;quot)به همین سادگی، اگر دلتون میخواد همین مبحث رو به شکل ویدیویی ببینید به لینک زیر یه سر بزنید: https://www.mongard.ir/one_part/60/text-translation-google-translate-api-python/ https://www.mongard.ir/one_part/60/text-translation-google-translate-api-python/</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Sat, 01 Feb 2020 15:35:40 +0330</pubDate>
            </item>
                    <item>
                <title>چطور از بدبختی مردم پول در بیاریم</title>
                <link>https://virgool.io/@amirbig/%DA%86%D8%B7%D9%88%D8%B1-%D8%A7%D8%B2-%D8%A8%D8%AF%D8%A8%D8%AE%D8%AA%DB%8C-%D9%85%D8%B1%D8%AF%D9%85-%D9%BE%D9%88%D9%84-%D8%AF%D8%B1-%D8%A8%DB%8C%D8%A7%D8%B1%DB%8C%D9%85-amekxu9jbi9j</link>
                <description>سلامداستانی که امروز براتون میگم کاملا واقعیه.من و برادرم علاقه خاصی به بازاریابی داریم و در این زمینه مطالعه هم میکنیم. ما معتقدیم که هرچقدر بهتر مردم رو گول بزنی بیشتر میتونی پول دربیاری.یه بار برادرم خواست امتحان کنه که چطور میشه از بدبختی ملت سو استفاده کرد و پول درآورد. برای همین یه دونه کانال تلگرام زد با عنوان فروش پکیج افزایش قد و یه دونه عکس خانوم هم گذاشت و گفت ایشون دکتر فلانی هستند. بعد رفت از اینترنت چندتا فایل pdf رایگان دانلود کرد و به عنوان پکیج قرار داد و با قیمت ۲۴هزار تومن برای فروش گذاشت. بعد ۵۰۰ هزار تومن داد یکی از کانال ها معروف تلگرام(weedlash) و کانالش رو تبلیغ کرد. به احتمال زیاد میتونید حدس بزنید که چه اتفاقی افتاد.سیل عظیمی از افراد بدبخت که قد کوتاهی داشتند اومدند و در خواست پکیج کردند. یادم میاد یه پسره سرباز بود و این پکیج رو میخواست بخره و کلی هم التماس کرد که بهش تخفیف بدیم. یه پسر دیگه هم بود که چهره مناسبی داشت ولی به خاطر قد کوتاهش میگفت که نمیتونه با دخترا ارتباط خوبی ایجاد کنه.حالا چرا من به اینا گفتم بدبخت؟ حتما یکسری ها بر علیه من موضع میگیرن اما من به اینا به خاطر قد کوتاهشون نگفتم بدبخت، بلکه به خاطر طرز فکرشون گفتمدر آخر برادرم این کانال رو بست چون پول حروم خوردن نداره. اگه این کانال رو نمیبست به احتمال زیاد الآن یه دونه E250 سوار میشدیم.این داستان رو بهتون نگفتم که ایده بگیرید، این داستان رو براتون گفتم که اگه احیانا یک مشکلی دارید داخل تلگرام دنبال راه حل نگردید</description>
                <category>Amir big</category>
                <author>Amir big</author>
                <pubDate>Fri, 10 Jan 2020 16:29:01 +0330</pubDate>
            </item>
            </channel>
</rss>