<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های امیر بیات پور</title><link>https://virgool.ir/feed/@amirbayatp</link><description></description><language>fa</language><pubDate>2026-11-11 17:02:15</pubDate><image><url>https://files.virgool.ir/upload/users/267574/avatar/wNApXw.png</url><title>امیر بیات پور</title><link>https://virgool.ir/@amirbayatp</link></image><item><title>پکیج‌های پراستفاده در یک پروژه جنگو - قسمت اول</title><link>https://virgool.ir/iranpythoneers/پکیجهای-پراستفاده-در-یک-پروژه-جنگو-قسمت-اول-b2kdkkhilgim</link><description>منبع و صاحب عکس : geekboots.comآیا می‌خواهید یک پروژه جنگو را شروع کنید؟ پس احتمالا به دنبال پکیج‌هایی هستید که می‌توانند در هنگام استفاده از این فریم‌ورک به شما در کارتان کمک کنند. در این مطلب به توضیح کوتاهی از برخی از این پکیج‍ها می‌پردازیم که می‌توانند به راحت‌تر شدن کار شما کمک کنند.تفاوت ماژول و پکیج چیست؟گاهی اوقات ماژول‌ها و پکیج‌ها با هم اشتباه گرفته می‌شوند. پس در ابتدای کار بهتر است که تفاوت این دو روشن شود تا بعدا مشکلی پیش نیاید.ماژول یک فایل پایتون یگانه و به صورت تکی است ، در حالی که پکیج یک مجموعه از این گونه ماژول‌هاست. به گروهی از ماژول‌های پایتون که  در کنار هم قرارگرفته‌‌اند پکیج گفته می‌شود. باید دقت داشت که پکیج‌ها دارای یک فایل اضافه‌ی init__.py__ هستند تا بتوان آنها را از یک دایرکتوری عادی که چند فایل اسکریپت پایتون در آن وجود دارد تشخیص داد.1 - پکیج django-tinymce4-liteوقتی که تنظیمات پایه‌ای وب‌اپ خود را انجام دادید می‌توانید این پکیج را نصب کنید. این نسخه از این پکیج در اصل نسخه سبک‌تر django-tinymce4 است.در اصل  TinyMCE یک تکست‌ادیتور WYSIWYG (what you see is what you get) است که عناصر به زبان HTML را به متن و یا editor instance تبدیل می‌کند. این پکیج پایتون در مواردی که می‌خواهید یک بلاگ بسازید بسیار مناسب است، چون می‌توان به راحتی متن که بعدا به HTML تبدیل می‌شود را در خود template ادیت کرد.بعد از نصب این پکیج، باید tinymce را در لیست installed apps در فایل setting قرار دهید و سپس تنظیمات پیش فرض آن را وارد کنید. این تنظیمات پیش‌فرض مشخصات تولبارها، spellcheck، weight و height را تعیین می‌کنند.INSTALLED_APPS = [&#xA;    ...&#xA;    ...&#xA;    &#39;tinymce&#39;,&#xA;]&#xA;&#xA;TINYMCE_DEFAULT_CONFIG = {&#xA;    &#39;height&#39;: 400,&#xA;    &#39;width&#39;: 1000,&#xA;    &#39;cleanup_on_startup&#39;: True,&#xA;    &#39;custom_undo_redo_levels&#39;: 20,&#xA;    &#39;selector&#39;: &#39;textarea&#39;,&#xA;    &#39;browser_spellcheck&#39;: &#39;true&#39;,&#xA;    &#39;theme&#39;: &#39;modern&#39;,&#xA;    &#39;plugins&#39;: &#39; &#39; &#39;&#xA;                textcolor save link image media preview codesample contextmenu&#xA;                table code lists fullscreen insertdatetime nonbreaking&#xA;                contextmenu directionality searchreplace wordcount visualblocks&#xA;                visualchars code fullscreen autolink lists charmap print hr&#xA;                anchor pagebreak&#xA;                &#39; &#39; &#39;,&#xA;    &#39;toolbar1&#39;: &#39; &#39; &#39;&#xA;                fullscreen preview bold italic underline | fontselect,&#xA;                fontsizeselect | forecolor backcolor | alignleft alignright |&#xA;                aligncenter alignjustify | indent outdent | bullist numlist table |&#xA;                | link image media | codesample&#xA;                &#39; &#39; &#39;,&#xA;    &#39;toolbar2&#39;: &#39;&#39;&#39;&#xA;               visualblocks visualchars |&#xA;                charmap hr pagebreak nonbreaking anchor | code |&#xA;                &#39; &#39; &#39;,&#xA;    &#39;contextmenu&#39;: &#39;formats | link image&#39;,&#xA;    &#39;menubar&#39;: True,&#xA;    &#39;statusbar&#39;: True,&#xA;}بعد از انجام این کارها باید مسیر tinymce را به فایل url پروژه اضافه کنید.&#34;&#34;&#34;mysite URL Configuration&#xA;&#xA;The `urlpatterns` list routes URLs to views. For more information please see:&#xA;    https://docs.djangoproject.com/en/2.1/topics/http/urls/&#xA;Examples:&#xA;Function views&#xA;    1. Add an import:  from my_app import views&#xA;    2. Add a URL to urlpatterns:  path(&#39;&#39;, views.home, name=&#39;home&#39;)&#xA;Class-based views&#xA;    1. Add an import:  from other_app.views import Home&#xA;    2. Add a URL to urlpatterns:  path(&#39;&#39;, Home.as_view(), name=&#39;home&#39;)&#xA;Including another URLconf&#xA;    1. Import the include() function: from django.urls import include, path&#xA;    2. Add a URL to urlpatterns:  path(&#39;blog/&#39;, include(&#39;blog.urls&#39;))&#xA;&#34;&#34;&#34;&#xA;from django.contrib import admin&#xA;from django.urls import path, include&#xA;&#xA;&#xA;urlpatterns = [&#xA;    path(&#39;admin/&#39;, admin.site.urls),&#xA;    path(&#39;&#39;, include (&#39;main.urls&#39;)),&#xA;    path(&#39;tinymce/&#39;, include(&#39;tinymce.urls&#39;)), #add this&#xA;&#xA;]و در نهایت می‌توانید TinyMCE را به مدل جنگو خود با  import کردن HTMLField از آن و سپس صدا کردن آن داخل فیلد مدل موردنظر به راحتی اضافه کرد.from django.db import models&#xA;from tinymce import HTMLField&#xA;&#xA;class MyModel(models.Model):&#xA;    ...&#xA;    content = HTMLField() 2 - پکیج Pillowاگر در پروژه جنگو خود نیاز به قابلیت آپلود عکس و یا فایل دارید ، مثلا اگر نیاز به یک محل برای آپلود عکس در مدل خود دارید (برای مثال عکسی به عنوان کاور پست)، به این پکیج نیاز دارید. این پکیج از کتاب‌خانه‌ی Python Imaging فورک شده است تا به آپلود درست فایل‌ها کمک کند.بعد از نصب این پکیج، باید یک URLبرای فولدر محتوای خود و یک دایرکتوری ROOT به فایل ستینگ خود اضافه کنید. MEDIA_URL = &#39;/media/&#39;&#xA;&#xA;MEDIA_ROOT = os.path.join(BASE_DIR, &#39;media&#39;)و بعد از آن، باید در فایل URL پروژه، import های مناسب را انجام دهید و urlpattern به فولدر محتوا را مشخص کنید.from django.contrib import admin&#xA;from django.urls import path, include&#xA;from django.conf import settings #add this&#xA;from django.conf.urls.static import static #add this&#xA;&#xA;urlpatterns = [&#xA;    path(&#39;admin/&#39;, admin.site.urls),&#xA;    path(&#39;&#39;, include (&#39;main.urls&#39;)),&#xA;]حال برای آپلود عکس، باید به فایل مدل رفته و یک ImageField با آدرس آپلود با عنوان &#39;images/&#39; اضافه کنیم. در هنگام آپلود عکس در پروژه، عکس آپلود شده به فولدر images که در زیرشاخه‌ی media قرار دارد اضافه می‌شود (این فولدر بعد از آپلود عکس به طور اتوماتیک اضافه می‌شود).from django.db import models&#xA;&#xA;class MyModel(models.Model):&#xA;    ...&#xA;    image = models.ImageField(upload_to=&#39;images/&#39;)امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت اول این پست گذاشتید.در قسمت بعدی این مطلب به چند پکیج پراستفاده دیگر در پروژه‌های جنگو می‌پردازیم.من خودم هم به تازگی پروسه آشنایی با این فریم‌ورک و یادگیریش رو شروع کردم به همین دلیل کمی مطلب متن  زمخت‌تر از کار در اومد که سعی می‌شه در آینده با تمرین بیشتر و قسمت های بعدی بهتر و بشه.برای دیدن ویدیو های آموزشی که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.اگر موضوعی مدنظرتون هست که در قالب متن برای شما جذابیت داره، پیشنهاداتتون رو پذیراییم.منبع : www.ordinarycoders.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Wed, 25 Nov 2020 19:33:33 +0330</pubDate></item><item><title>معرفی 5 ابزار برای کمک به دیباگ در برنامه های پایتون</title><link>https://virgool.ir/iranpythoneers/معرفی-5-ابزار-برای-کمک-به-دیباگ-در-برنامه-های-پایتون-qnyilbjf23dw</link><description>تقریبا غیرممکنه که ما برنامه‌ای بنویسیم و در اجرای اول آن، به لیست بزرگی از مشکلات برنخوریم که نیاز به حل کردن دارند، معمولا در پروسه حل کردن این مشکلات است که ما به اهمیت پیدا کردن راه‌های بهینه‌تر و سریع‌تری برای پیدا کردن این مشکلات پی می‌بریم.در این پست می‌خواهیم که شما رو با چندتا از ابزارهایی که می‌توانند به شما در پیدا کردن این مشکلات کمک کنند آشنا کنیم. سطح این ابزارها متفاوت است و برای حل مشکلات در سطوح متفاوتی مورد استفاده قرار می‌گیرند.1 – استفاده از print و بررسی نتایجاستفاده از این ابزار احتمالا برای بسیاری از برنامه‌نویسان با سطح حتی کمی بالاتر از تازه‌کار خیلی بدیهی و اولیه است، ولی این پیش‌‌پاافتادگی آن از موثر بودن آن کم نمی‌کند و برای کامل بودن مبحث ذکر آن خالی از لطف نیست.راحت ترین راه برای پیدا کردن یک مشکل، استفاده از print برای نشان دادن مقدار متغیرهایمان و مقایسه آنها با مقداری که از هر متغیر انتظار داریم است.در مثال زیر، اگر به مشکلی بربخوریم می توانیم متغیری که به آن شک داریم را با print چاپ کرده و با مقداری که انتظار داریم مقایسه کنیم و براساس این مقایسه، راه حلی برای مشکلمان بیابیم.def divide100(num):&#xA;    n = int(num)&#xA;    return 100 / n&#xA;&#xA;print(divide100(&#39;Yang&#39;))&#xA;# Traceback (most recent call last):&#xA;# ...&#xA;# ValueError: invalid literal for int() with base 10: &#39;Yang&#39;در این مثال به ValueError بر می‌خوریم که ممکن است ندانیم به چه علت است، با استفاده از یک print در تابع می‌توانیم پی ببریم که مشکل ما به علت تقسیم یک مقدار غیر از int بر 100 است.بزرگترین مشکل print این است که بعد از حل مشکل، باید آن را حتما حذف کنیم تا در آینده برای ما مشکل ساز نشود، که خود این کار می‌تواند پروسه وقت‌گیری باشد. اگر مجبور باشیم با خروجی های print های متعددی که در کد قرار داده‌ایم سروکله بزنیم هم اجرای برنامه در آینده به مشکل برخواهد خورد. روش های بهتری هم برای دیباگ کردن و یافتن مشکلات هست.2 – استفاده از assert و بررسی نتایجهرجایی که از print برای کمک به پروسه دیباگ استفاده می‌شود، می‌توانیم ازassert  هم استفاده کنیم.def divide(num):&#xA;    n = int(num)&#xA;    return 100 / n&#xA;&#xA;print(divide(&#39;Yang&#39;))در این مثال هم مانند مثال قبلی به مشکل برخواهیم خورد، ولی با استفاده از assert می‌توانیم عبارتی تعیین کنیم که در صورتی که این عبارت False باشد، به ما یک AssertionError بازگردانده شود.برای حل مشکل این مثال، برای حالتی که ورودی غیر int است عبارتی را در نظر می‌گیریم و کد ما به صورت زیر می‌شود :def divide(num):&#xA;    assert type(num) == int, &#39;num must be a number&#39;&#xA;    n = int(num)&#xA;    return 100 / n(در این حالت اگر ورودی ما int نباشد عبارت type(num) == int غلط خواهد بود و عبارتی که بعد از آن تعیین کرده‌ایم به عنوان  AssertionError به ما بازگردانده می‌شود )print(divide(&#39;Yang&#39;))&#xA;# Traceback (most recent call last):&#xA;#   ...&#xA;# AssertionError: num must be a number&#xA;&#xA;print(divide(100))&#xA;#1.0می‌بینیم که وقتی ورودی ما به صورت string بود و به ما AssertionError داده شد ولی وقتی int بود بدون مشکلی انجام شد.بعد از اتمام دیباگ‌ می‌توانیم با عبارت زیر تمامی assert ها را بی‌اثر کنیم :python -0 assert.pyدر این حالت اگر باز هم ورودی اشتباه باشد، دیگر AssertionError نخواهیم داشت بلکه مثل حالت عادی به یک ValueError برخواهیم خورد.3 – استفاده از logging moduleپایتون یک ماژول بسیار پراستفاده به نام logging دارد. با استفاده از  logging به جای print و یا  assert امکانات بیشتری را برای دیباگ در اختیار ما قرار داده می‌شود. با کمک این ماژول می توانیم مشکلات برنامه را بهتر در نظر داشته باشیم.در مثال زیر، پیام های log را در یک فایل خارجی پرینت می‌کنیم و دیگر نیازی به خروجی گرفتن در کنسول محل اجرای برنامه نیست (تنها عبارتی که در قسمت warning ذکر شده در کنسول مشاهده خواهد شد)import logging&#xA;logging.basicConfig(filename=&#39;test.log&#39;, filemode=&#39;w&#39;, format=&#39;%(name)s - %(levelname)s - %(message)s&#39;)&#xA;logging.warning(&#39;This will get logged to a file&#39;)اگر اطلاعات موردنظر ما زیاد باشند و یا خواندن همه آنها به طور یک جا و در کنسول راحت نباشد، با این روش کار خودمان را خیلی راحت تر خواهیم کرد.4 – استفاده از pdbچهارمین ابزار کمک‌کننده در دیباگ، دیباگر pdb خود پایتون است. به کمک آن می‌توانیم برنامه را در مراحل تک قسمتی اجرا کنیم و وضعیت برنامه را در هر مرحله چک کنیم. ابزارهای دیگری هم شبیه این ابزار وجود دارند، مانند web-pdb و  یا pudb، ولی در اکثر مواقع pdb کار مورد نیاز ما را انجام می دهد.یک مثال سادهبرای مثال می توانیم از  pdb استفاده کنیم تا برنامه زیر را مرحله به مرحله اجرا کنیم :s = &#39;0&#39;&#xA; n = int(s)&#xA; print(1000 / n)ابتدا باید به کمک pdb فایل برنامه test.py را در ترمینال طبق روش زیر اجرا کنیم:$ python -m pdb test.pyحال خط اول برنامه ما در حال اجرا است :&gt; /home/yang/test.py(1)&lt;module&gt;()&#xA; -&gt; s = &#39;0&#39;می توانیم با وارد کردن 1 کل کد را مشاهده کنیم :(Pdb) 1&#xA; 1 -&gt; s = &#39;0&#39;&#xA; 2     n = int(s)&#xA; 3     print(1000 / n)با هر دفعه وارد کردن دستور n، خط بعدی کد ما اجرا خواهد شد :(Pdb) n&#xA; &gt; /home/yang/test.py(2)&lt;module&gt;()&#xA; -&gt; n = int(s)&#xA;&#xA; (Pdb) n&#xA; &gt; /home/yang/test.py(3)&lt;module&gt;()&#xA; -&gt; print(1000 / n)&#xA;&#xA; (Pdb) n&#xA; ZeroDivisionError: division by zero&#xA; &gt; /home/yang/test.py(3)&lt;module&gt;()&#xA; -&gt; print(1000 / n)در هرکدام از مراحل ما می توانیم با وارد کردن دستور p و نام یک متغیر در ادامه آن، مقدار آن را بررسی کنیم :(Pdb) p s&#xA; &#39;0&#39;&#xA; (Pdb) p n&#xA; 0اگر کد ما بیشتر از 4 – 5 خط باشد، شروع از خط اول و تک تک پایین رفتن با دستور n  می تواند بسیار وقت‌گیر باشد. می‌توانیم با استفاده از تابع pdb.set_trace() یک breakpoint در کدمان قرار دهیم که خواندن کد ما از همان محل شروع شود. برای مثال اگر کد ما به صورت زیر باشد :import pdb&#xA; &#xA; s = &#39;0&#39;&#xA; n = int(s)&#xA; pdb.set_trace() &#xA; print(1000 / n)با اجرای برنامه در محیط pdb مستقیم و بدون نیاز به دستورات اضافه، به خطی که در آن set_trace را قرار داده‌ایم خواهیم‌ رفت و کار ما خیلی راحت‌تر خواهد بود :&gt; /home/yang/test.py(7)&lt;module&gt;()&#xA; -&gt; print(1000 / n)&#xA; (Pdb)دستور breakpoint()از نسخه 3.7 پایتون یک دستور پیش فرض درون خود پایتون قرار داده شد که کاملا می تواند جایگزین set_trace شود،در حالتی که از این دستور به جای set_trace استفاده کنیم، کد ما به صورت زیر خواهد بود :s = &#39;0&#39;&#xA; n = int(s)&#xA; breakpoint()&#xA; print(1000 / n)نتیجه استفاده از این دستور و طرز استفاده از آن کاملا با pdb.set_trace() یکسان است، چون ()breakpoint باعث صدا زدن دستور sys.breakpointhook() می شود و این دستور به طور پیش فرض pdb.set_trace() را صدا می زند.استفاده از breakpoint فوائد دیگری هم دارد :با استفاده از breakpoint نیاز به import کردن ماژول pdb نداریم و کد خیلی کم کوتاه تر می شود.فایده مهم‌تر استفاده از این دستور این است که اگر دیگر مایل به استفاده از pdb نبودیم و خواستیم آن را با ابزار دیباگر دیگری جایگزین کنیم، نیازی به تغییر در کدمان برای حذف دستورات خاص به pdb نداریم و کدمان بدون تغییر قابل استفاده است.برای مثال اگر بخواهیم از  web-pdb (و یا هر ابزار دیباگر دیگری) استفاده کنیم که برای مورد استفاده ما مناسب‌تر است، در حالت قبلی باید تک تک دستورات pdb.set_trace() را به دستور web_pdb.set_trace() (و یا هر عبارت جایگزین دیگری که در آن ابزار برای دیباگ استفاده می شود) تبدیل می کردیم. با استفاده از breakpoint هیچ نیازی به تغییر کد نداریم، فقط باید متغیر PYTHONBREAKPOINT را با توجه به ابزار مورد استفاده همانند مثال زیر تغییر دهیم  :$ PYTHONBREAKPOINT = web_pdb.set_trace python3.7همچنین می توانیم مقدار این متغیر را برابر صفر قرار دهیم  تا برنامه ما در حالت عادی اجرا شود و تمامی breakpoint ها در نظر گرفته نشوند :$ PYTHONBREAKPOINT = 0 python3.75 – استفاده از امکانات IDEاگر علاقه به استفاده از IDE از برای نوشتن کدهای خود دارید، تعیین breakpoint ها و اجرای خط به خط کدها در این محیط ها بسیار ساده تر است.با تعیین breakpoint به کمک یک IDE دیگر نیاز به وhرد کردن دستورات اضافه ای نیست و خود برنامه همانند breakpoint که به کمک pdb قرار داده شد عمل می کند.از IDE های شناخته شده برای پایتون می توان به موارد زیر اشاره کرد :برنامه PyCharm : این IDE از ابتدا برای استفاده توسط برنامه نویسان پایتون ساخته شده است و IDE جامعی برای کار با پایتون است.برنامه Visual Studio Code : اگر با برنامه نویسی آشنایی قبلی داشته باشید احتمالا این code editor را می‌شناسید. می‌توانید با نصب افزونه‌های مناسب در این برنامه به همراه افزونه‌ی پایتون، به عنوان یه محیط مناسب برای توسعه‌ی برنامه‌های خودتون در پایتون از آن استفاده کنید .5 ابزار برای کمک به دیباگ به شما معرفی کردیم، ولی گاهی بهترین ابزار برای این‌ کار قلم و کاغذ است. در خیلی از موارد نوشتن فلوچارت برنامه و ارتباطات بین کلاس‌ها و قسمت‌‍‌های مختلف یک کد، می تواند کمک به‌سزایی به فهم بهتر و پیدا کردن مشکلات احتمالی آن کد بکند، این روش را هم از یاد نبرید.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن این پست گذاشتید.دیباگ کردن یکی از کارهای روزمره‌ای است که یک برنامه‌نویس باید انجام دهد و آشنایی بهتر با ابزارهای این کار می‌تواند کار برنامه‌نویس را بسیار راحت‌تر کند.امیدواریم که در این مطلب با ابزار جدیدی آشنا شده باشید و راحت‌تر به دیباگ کردن برنامه‌هاتون بپردازید.برای دیدن ویدیو‌های آموزشی دیگری که دوستانم برای شما ساخته‌اند، می‌تونید به کانال ما در آپارات، یوتیوب، تلگرام یا اینستاگرام مراجعه کنید.منبع : techtofreedom</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 09 Nov 2020 21:40:00 +0330</pubDate></item><item><title>فریم ورک جنگو چیست و چرا باید کار با آن را یاد گرفت؟</title><link>https://virgool.ir/iranpythoneers/فریم-ورک-جانگو-چیست-و-چرا-باید-کار-با-آن-را-یاد-گرفت-nr2ijrwtzfmb</link><description>امروزه، فرقی نمی کند که شما در چه عرصه برنامه نویسی فعال هستید، خواه ناخواه روزی خواهد آمد که شما نیاز به ساخت یک وب سایت یا وب اپ دارید.شما می توانید از صفر کارتان را شروع کنید و از پایه وب سایت مورد نظرتان را بسازید، یا با استفاده از فریم ورک های مناسب برای این کار در زمان کمتر و با کار کمتر، به هدف خود برسید.اگر با پایتون آشنا هستید و به دنبال یک فریم ورک برای انجام کارهای بک اند وب سایت و یا اپ خود بگردید، بیشتر جواب هایی که پیدا می کنید استفاده از فریم ورک جنگو است.با این فریم ورک شما می توانید سیستم هایی پیچیده با قابلیت مدیریت ترافیک بالا، سیستم لاگین و یا کامنت بسازید.به طور خلاصه، جنگو به شما در ساختن یک وب سایت از صفر کمک می کند و کار شما را راحت تر می کند. همین که شما مجبور به ساخت همه چیز از صفر نیستید، به شما کمک می کند تا زمان مورد نیاز برای ساخت وب سایت را پایین بیاورید.جنگو چیست؟جنگو  یک فریم ورک  وب/بک اند است که برای ساخت وب سایت های با بازدهی بالا و زیبایی ظاهری خوب استفاده می شود.این فریم ورک براساس زبان برنامه نویسی پایتون ساخته شده است،که خود یکی از پراستفاده ترین زبان های برنامه نویسی در حال حاضر است. به همین علت، اگر شما یک برنامه نویس پایتون هستید و یا یادگیری آن را آغاز کرده اید، جنگو یک فریم ورک مناسب برای یادگیری خواهد بود.یک فریم ورک مجموعه ای از کتاب خانه ها در کنار هم است، که هر کدام از این کتاب خانه ها به ما در ساخت سریع تر یک جنبه از سایت کمک خواهد کرد.مزایای جنگو جنگو یک سری مشخصه های خاص دارد که باعث می شود نسبت به دیگر فریم ورک های موجود برای ساخت وب سایت شناخته شده تر و پراستفاده تر باشد. از این ویژگی ها می توان موترد زیر را نام برد :1 – سرعتجنگو با این تفکر ساخته شده است که در عین حالی که توانایی های زیادی داشته باشد، فهم آن ساده و سرعت کد نویسی در آن بالا باشد.به همین علت است که در این فریم ورک کتاب خانه های متفاوتی وجود دارد، تا نیاز به ساخت چیزی از صفر و حل مشکلات پایه ای نداشته باشیم. در بسیاری از موارد حتی قسمت هایی از کد هم از پیش نوشته شده است و ما فقط باید قسمت هایی از آن را تغییر دهیم.2 – امنیتاگر امنیت مورد مهمی برای شما است، جنگو مناسب ترین فریم ورک برای شما است. این فریم ورک می تواند وب سایت و یا وب اپ شما رادر برابر حملاتی مانند SQL Injection، XSS، CSRF ، Clickjacking و بسیاری از انواع دیگر حملات محافظت کند.3 – پنل ادمیناین فریم ورک بصورت پیش فرض دارای پنل ادمین است که باز هم باعث می شود شما نیازی به ساخت آن نداشته باشید و زمان مورد نیاز برای ساخت کل پروژه کمتر شود.4 – اندازه اهمیتی ندارداهمیتی ندارد که شما فقط یک نفر باشید و یا شرکت بزرگ. با استفاده از پایتون می توانید وب سایت/وب اپ با هر گستردگی که می خواهید داشته باشید و اگر در آینده نیاز به سیستمی گسترده تر داشتید، به راحتی آن را گسترش دهید.5 – مناسب برای Data Science و آمارگفته شد که جنگو بر پایه پایتون نوشته شده است و پایتون برای اهمیت و استفاده اش در عرصه های هوش مصنوعی و Machine Learning شناخته شده است.به همین علت، اگر می خواهید که در پروژه خود از Machine Learningاستفاده کنید و یا هر کاری در زمینه Data Scienceبا آن انجام دهید، این فریم ورک گزینه بسیار مناسبی برای شماست.6 – جامعه فعالجنگو یکی از بهترین داکیومنت های موجود را دارد . در کنار این داکیومنت خیلی مناسب،جامعه ی استفاده کنندگان از جنگو با آغوش باز به سوالات افراد تازه کار پاسخ می دهند.شناخته شده ترین موارد استفاده از جنگو بسیاری از وب سایت های معروف و وب اپلیکیسن ها از جنگو استفاده می کنند. بعضی از این موادرد که بسورت روزمره از اکثر آنها استفاده می کنیم عبارتند از :1 – اینستاگرام : اینستاگرام یکی از شناخته شده ترین شبکه های اجتماعی برای به اشتراک گذاشتن عکس و فیلم است. در این پلتفرم از فریم ورک جنگو برای قسمت بک اند استفاده شده است که به خوبی به نیاز های میلیون ها کاربر روزانه رسیدگی می کندو2 – یوتیوب : نیازی به معرفی یوتیوب نیست و همگی آن را به عنوان شناخته شده ترین و پرطرفدار ترین پلتفرم برای به اشتراک گذاشتن ویدیو می شناسیم.3 – اسپاتیفای : اگر زمان زیادی رو به گوش دادن موسیقی می گذرانید، بدون شک با اسپاتیفای آشنا هستید. اسپاتیفای استفاده بسیار زیادی از Machine Learning جهت بهتر کردن تجربه کاربران و پیشنهاد آهنگ های مناسب به آنها می کند. استفاده از پایتون و فریم ورک های آن، ادغام  Machine Learning با دیگر قسمت های این سرویس را راحت تر می کند.4 – دراپ باکس : دراپ باکس هم که یکی از شرکت های شناخته شده در زمینه ذخیره سازی ابری اطلاعات است از این فریم ورک استفاده می کند.چگونه می توانیم جنگو را یاد بگیریم ؟یادگیری جنگو بسیار ساده است و به سرعت می توان استفاده از آن را شروع کرد.داکیومنت نوشته شده برای فریم ورک جنگو به عنوان یکی از بهترین داکیومنت های برنامه نویسی شناخته می شود. در داکیومنت، همه مطالب به صورتی توضیح داده شده که به راحتی قابل فهم است.در بسیاری از موارد افرادی که از جنگو استفاده می کنند تنها با کمک همین داکیومنت، کار با این فریم ورک را به خود یاد می دهند.اگر تازه کار با این فریم ورک را شروع می کنید هم نیاز به نگرانی نیست، جنگو یک راهنمای کامل برای شروع یک پروژه ابتدایی را در سایت خود قرار داده است که تمامی موضوعات اساسی فریم ورک و کار با آن را توضیح می دهد. بعد از اتمام ازین پروژه شما می توانید با رابط دیتابیس کار کنید، به پنل ادمین متصل شوید و باformها، مدل ها و تعریفات دیگری آشنا شوید.برای شروع این پروژه می توانید به این آدرس مراجعه کنید.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن این پست گذاشتید.در این مطلب سعی کردیم توضیحات کلی در مورد جنگو به شما بدیم و معرفیش کنیم.برای دیدن ویدیو های آموزشی که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.thecoderpedia.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 26 Oct 2020 20:07:17 +0330</pubDate></item><item><title>9 تابع پیش فرض در پایتون که باید با آنها آشنا باشید - قسمت دوم</title><link>https://virgool.ir/iranpythoneers/9-تابع-پیش-فرض-در-پایتون-که-باید-با-آنها-آشنا-باشید-قسمت-دوم-mzrjckvgcdxx</link><description>پایتون به طور پیش فرض شامل تعداد زیادی تابع است که می توانیم از آنها استفاده کنیم تا تجربه برنامه نویسی راحت تری رو برای خودمون بسازیم.در قسمت قبلی این مطلب به 5 تا از این توابع پرداختیم، امروز به 4 تابع بعدی می پردازیم.6 - تابع idدستور id برای هر جسم یک int به عنوان هویت آن جسم باز می گرداند. این عدد برای هر جسم منحصر به فرد است و در تمام زمان وجود آن جسم ثابت خواهد بود.این دستور مثلا برای اطمینان حاصل کردن از اینکه در حین کپی کردن اجسام یک جسم مستقل می سازیم، استفاده می شود. در پایتون دستور = یک جسم را در جسمی جدید کپی نمی کند، بلکه یک اسم جدید برای اشاره به همان جسم می سازد. این کار باعث می شود که اگر تغییری در جسم جدید بدهیم، این تغییر در جسم اصلی هم اعمال می شود.در مثال زیر این مشکل که دستور = یک جسم جدید نمی سازد را بررسی می کنیم :numbers = [1, 2, 3, 4, 5]&#xA;new_numbers = numbers&#xA;&#xA;print(&#39;numbers id: {}, new_numbers id: {}&#39;.format(id(numbers), id(new_numbers)))&#xA;numbers id: 1836112528136, new_numbers id: 1836112528136می بینیم که id هر دو جسم یکسان است.یک راه دیگر برای بررسی تشابه id دو جسم استفاده از دستورات is/is not است. با این کار می توانیم بفهمیم دو id به یک جسم اشاره می کنند یا خیر.دستور is به ما True باز خواهد گرداند اگر هردو طرف id یکسانی داشته باشند.دستور Is not به ما Trueباز خواهد گرداند اگر دو طرف id یکسانی نداشته باشند.numbers is new_numbers&#xA;True7 - تابع hexتابع hex یک متغیر int را به یک رشته هگزادسیمال تبدیل خواهد کرد. این رشته با عبارت &#34;0x&#34; شروع خواهد شد که برای خواننده و برنامه نشان دهنده ی این است که با یک عدد هگزادسیمال رو به رو هستیم. در مثال زیر، عدد 10 را به معادل هگزادسیمالش تبدیل می کنیم :hex_number = hex(10)&#xA;&#xA;print(hex_number)&#xA;0xa&#xA;print(type(hex_number))&#xA;&lt;class &#39;str&#39;&gt;اگر به این دستور ورودی به جز int داده شود، با ارور TypeError رو به رو خواهیم شد. در مثال زیر ورودی ما یک عدد float است :hex_number = hex(10.0)&#xA;TypeErrorبرای حل مشکل TypeError می توانیم از try و except استفاده کنیم که در تابع بعدی مثال یاز این کار ذکر شده است.یک استفاده از این دستور برای برنامه نویسان در مورد رنگ هاست.اعداد هگزادسیمال معمولا برای مشخص کردن رنگ ها توسط برنامه نویس ها استفاده می شود،علت استفاده از هگزادسیمال ها این است که با استفاده از هگزادسیمال ها می توان بازه خیلی دقیق تری از رنگ ها را داشت تا اینکه نام تک تک رنگ ها را در نظر داشته باشیم.پایتون رنگ ها را به صورت &#34;#RRGGBB&#34;درنظر دارد که در مکان های RRبرای رنگ قرمز، GG برای رنگ سبز  و BB برای رنگ آبی از اعداد هگزادسیمال 00تا FF برای مشخص کردن شدت آن رنگ استفاده می شود.رنگ ها را می توان به صورت یک tuple نیز نشان داد که در آن در 3 جایگاه به صورت (red,green,blue)، با استفاده از متغیر های intبین 0 تا 255 شدت هر رنگ را مشخص می کنیم.حال اگر بخواهیم در یک تابع این tuple را به رشته هگزادسیمال تبدیل کنیم، می توانیم طبق مثال زیر با کمک دستور hexاین تبدیل را انجام دهیم :def rgb_to_hex(rgb_triple):&#xA;hex_string = &#39;&#39; &#39;&#xA;for integer in rgb_triple:&#xA;    hexadecimal = hex(integer)[2:] # string slicing to elimininate the prefix &#39;0x&#39;&#xA;        if len(hexadecimal) == 1:&#xA;            hexadecimal = &#39;0&#39; + hexadecimal # pad the string to the left with a 0&#xA;        hex_string += hexadecimal&#xA;return &#39;#&#39; + hex_stringحال اگر به این تابع TUPLE های رنگ ها را به عنوان ورودی بدهیم، به ما یک رشته HEX برای آن رنگ باز خواهد گرداند : color_1 = (255, 255, 255)&#xA;color_2 = (255, 255, 0)&#xA;color_3 = (70, 90, 200)&#xA;color_1_hex = rgb_to_hex(color_1)&#xA; &#39;#ffffff&#39;&#xA;color_2_hex = rgb_to_hex(color_2)&#xA;&#39;#ffff00&#39;&#xA;color_3_hex = rgb_to_hex(color_3)&#xA;&#39;#465ac8&#39;8 - تابع binاین دستور، هر عدد intرا به یک رشته ی باینری که با عبارت &#34;0b&#34; شروع خواهد شد، تبدیل می کند.اگر به این دستور متغیری به جز intبه عنوان ورودی بدهیم، همانند hex، یک ارور TypeErrorبه ما خواهد داد.برای هر دو حالت این ارور(هم در تابع hex و هم در تابع bin)، می توانیم با استفاده از try,except در حین عملیات تبدیل int به باینری یا هگزادسیمال از متوقف شدن اجرای برنامه جلوگیری کنیم. در قسمت try باید کدی که ممکن است به ما ارور دهد را قرار دهیم و در قسمت exceptکدی که به ارور ما رسیدگی می کند و جلوی متوقف شدن برنامه را خواهد گرفت.در مثال زیر، سعی بر تبدیل یک intبه باینری داریم و در نظر داریم که اگر ورودی ما intنباشد نباید برنامه متوقف شود و به ارور بربخوریم (به عنوان یک قدم اضافه در هنگام بازگرداندن رشته باینری، &#34;0b&#34; را از اول  رشته حذف می کنیم و فقط قسمت باینری را باز می گردانیم) :def int2bin(integer):&#xA;    try:&#xA;        binary = bin(integer)&#xA;        return binary[2:] &#xA;&#xA;    except TypeError:&#xA;        print(&#39;An integer should be provided as input&#39;)&#xA;&#xA;&#xA;int2bin(5)&#xA;&#39;101&#39;&#xA;&#xA;int2bin(6)&#xA;&#39;110&#39;&#xA;&#xA;int2bin(4.0)&#xA;An integer should be provided as input 9 - تابع openما در پایتون از دستور open برای خواندن فایل ها و یا نوشتن در آنها استفاده می کنیم.خواندنبرای خواندن فایل، ما ابتدا باید با دستور open در حالت خواندن (mode = &#39;r&#39;) فایل را باز کنیم. این دستور یک متغیر fileبه ما باز می گرداند که می توان آن را در یک متغیر ذخیره کرد. سپس از دستور read استفاده می کنیم تا محتویات این متغیر شامل فایلمان را بخوانیم و به صورت یک رشته درآوریم و با دستور پرینت آن را مشاهده کنیم .بعد از اتمام فعالیت خواندن باید با دستور close دسترسی به فایل را به اتمام برسانیم و آن را ببندیم. حتما باید هر فایلی که کارمان با آن به اتمام رسیده است را ببندیم تا در هنگام اجرای برنامه به مشکل بر نخوریم. کار های این پاراگراف را با کد زیر می توانیم انجام دهیم :f = open(&#39;reading_file.txt&#39;, &#39;r&#39;)&#xA;content = f.read()&#xA;print(content)&#xA;f.close()در مثال های زیر برخی از دستوراتی که در موارد مختلف در ادامه دستور open استفاده می شود را برای شما آورده ایم :با استفاده دستور .readlines()می توانیم تمام خطوط فایل خوانده شده را به صورت یک لیست از رشته ها (که در آن هر عضو لیست یک خط از فایل ما خواهد بود) در بیاوریم. با استفاده از دستور print می توانیم این لیست را مشاهده کنیم  :f = open(&#39;reading_lines.txt&#39;, &#39;r&#39;)&#xA;content = f.readlines()&#xA;print(content)&#xA;[&#39;First line\n&#39;, &#39;Second line\n&#39;, &#39;Third line\n&#39;]&#xA;f.close()با دستور .readline() هم می توانیم خطوط فایل را تک تک بخوانیم و به عنوان رشته خروجی بگیریم :f = open(&#39;reading_lines.txt&#39;, &#39;r&#39;)&#xA;first_line = f.readline()&#xA;print(first_line)&#xA;# First line&#xA;second_line = f.readline()&#xA;print(second_line)&#xA;# Second line&#xA;third_line = f.readline()&#xA;print(third_line)&#xA;# Third line&#xA;f.close()نکته : به یاد داشتن اینکه فایل باز شده را در انتهای نیازمان به آن ببندیم ممکن است برای ما سخت باشد. به همین علت، در پایتون می توانیم با استفاده از عبارت with(…) کدمان را بنویسیم. در این نوع از نوشتن دستورات، فایل ما به صورت خودکار در انتهای دستورات درون قسمت زیرمجموعه with بسته میشود و نیاز به نوشنت دستور بستن فایل نخواهیم داشت :with open(&#39;reading_lines.txt&#39;, &#39;r&#39;) as f:&#xA;    content = f.readlines()&#xA;    print(content)&#xA;[&#39;First line\n&#39;, &#39;Second line\n&#39;, &#39;Third line\n&#39;]نوشتنبرای نوشتن به یک فایل در پایتون، باید از حالت خواندن در تابع open استفاده کنیم (mode = &#39;w&#39;). در این حالت، اگر فایل وجود نداشته باشد، پایتون به صورت خودکار این فایل را برای ما تشکیل می دهد. وقتی که فایل ما باز شد، با دستور write می توانیم درون آن متن موردنظرمان را بنویسیم. البته حتما در نظر داشته باشید که این دستور قبل از نوشتن محتوای جدید، محتوای قبلی فایل را پاک خواهد کرد. در این حالت هم ما باید دسترسی به فایل را در هنگام اتمام فعالیت هایمان با دستور closeببندیم، مگر آنکه از دستور with استفاده کنیم:f = open(&#39;new_file.txt&#39;, &#39;w&#39;)&#xA;f.write(&#39;This is a new file!&#39;)&#xA;f.close()امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت دوم این پست گذاشتید.در این مطلب دو قسمتی شما رو با 9 تا از توابعی که ممکنه در برنامه نویسی با پایتون به دردتون بخوره رو به شما معرفی کردم، امیدوارم که به دردتون بخوره.برای دیدن ویدیو های آموزشی که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.towardsdatascience.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Wed, 21 Oct 2020 19:28:03 +0330</pubDate></item><item><title>9 تابع پیش فرض در پایتون که باید با آنها آشنا باشید - قسمت اول</title><link>https://virgool.ir/iranpythoneers/9-تابع-پیش-فرض-در-پایتون-که-باید-با-آنها-آشنا-باشید-قسمت-اول-gsylyabl1nsp</link><description>پایتون به طور پیش فرض شامل تعداد زیادی تابع است که می توانیم از آنها استفاده کنیم تا تجربه برنامه نویسی راحت تری رو برای خودمون بسازیم.در این مطلب به 5 تا از این توابع و در قسمت بعدی به 4 تابع دیگر می پردازیم.1 - isinstanceدستور isinstance(object,class) به ما یک جواب True و یا Flase برای سوال اینکه آیا متغیر object از نوع class است فراهم می کند. ما می توانیم به جای اینکه در ورودی class یک نوع متغیر را به تابع بدهیم، یک tuple از انواع متغیرها به آن بدهیم. در این حالت در صورتی جواب Trueمی گیریم که نوع متغیر object یکی از اعضای این tuple باشد.برای مثال برای لیست زیر :numbers = [1, 2, 3, 4, 5]جواب های isinstance به صورت زیر خواهد بود :isinstance(numbers,list) &#xA;Trueisinstance(numbers,float) &#xA;Flaseisinstance(numbers,(float,list)) &#xA; True2 - zipتابع zip(inp1,inp2) به ما اشاره گر یک سری tuple بازخواهد گرداند که در آنها tuple شماره i، عضو iام inp1 و inp2 را خواهد داشت.تعداد این tuple ها وابسته به تعداد اعضای ورودی هایی است که به این دستور داده شده است.در مثال زیر، دو لیست به عنوان ورودی به این دستور داده شده است. نتیجه یک تعداد tuple  (برابر با طول لیست ها) است که هرکدام از این tupleها دو عضو دارد.products = [&#39;table&#39;, &#39;chair&#39;, &#39;sofa&#39;, &#39;bed&#39;, &#39;lamp&#39;]&#xA;prices = [50, 20, 200, 150, 10]&#xA;zip(products, prices) خروجی این کد به صورت زیر خواهد بود : &lt;zip at 0x1ab80c8b788&gt;تابع zip می تواند هر نوع ورودی را دریافت کند (لیست، رشته ها، tupleها و یا دیکشنری ها) ولی دیدیم که اگر تنها از این دستور استفاده کنیم، در خورجی یک اشاره گر دریافت خواهیم کرد که به tuple ها اشاره می کند. برای نشان دادن اعضای این tuple ها باید از دستور list() استفاده کنیم تا این tupleها را به عنوان یک لیست در خروجی داشته باشیم و بتوانیم از آن استفاده کنیم.list(zip(products, prices)) &#xA; [(&#39;table&#39;, 50), (&#39;chair&#39;, 20), (&#39;sofa&#39;, 200), (&#39;bed&#39;, 150), (&#39;lamp&#39;, 10)]یکی دیگر از مواردی که می توان از این دستور برای راحت تر کردن کار استفاده کرد، در حلقه هاست.در این موارد این دستور به ما کمک می کند که به طور خلاصه تر از لیست ها استفاده کنیم :products = [&#39;table&#39;, &#39;chair&#39;, &#39;sofa&#39;, &#39;bed&#39;, &#39;lamp&#39;]&#xA;prices = [50, 20, 200, 150, 10]&#xA;for product, price in zip(products, prices):&#xA;    print(&#39;Product: {}, Price: {}&#39;.format(product, price))خروجی کد به صورت زیر خواهد بود : Product: table, Price: 50&#xA;Product: chair, Price: 20&#xA;Product: sofa, Price: 200&#xA;Product: bed, Price: 150&#xA;Product: lamp, Price: 10از ترکیب این تابع با تابع dict() هم می توانیم از دو لیست یک دیکشنری بسازیم:products = [&#39;table&#39;, &#39;chair&#39;, &#39;sofa&#39;, &#39;bed&#39;, &#39;lamp&#39;]&#xA;prices = [50, 20, 200, 150, 10]&#xA;dict(zip(products, prices))در این حالت خروجی ما یک دیکشنری به صورت زیر خواهد بود : {&#39;table&#39;: 50, &#39;chair&#39;: 20, &#39;sofa&#39;: 200, &#39;bed&#39;: 150, &#39;lamp&#39;: 10}از این تابع می توانیم برای باز کردن یک توالی و تبدیل آن به چند توالی دیگر (unzip کردن) هم استفاده کرد، برای این کار باید از * در ورودی تابع استفاده کنیم. در مثال زیر ما از این دستور برای باز کردن یک لیست تشکیل شده از tuple به دو tuple جداگانه استفاده می کنیم:products_and_prices = [(&#39;table&#39;, 50), (&#39;chair&#39;, 20), (&#39;sofa&#39;, 200), (&#39;bed&#39;, 150), (&#39;lamp&#39;, 10)]&#xA;products, prices = zip(*products_and_prices)الان در products عضو اول tupleها و در prices عضو دوم tuple ها ذخیره شده است :print(products)&#xA;(&#39;table&#39;, &#39;chair&#39;, &#39;sofa&#39;, &#39;bed&#39;, &#39;lamp&#39;)&#xA;print(prices)&#xA;(50, 20, 200, 150, 10)3 - mapدستور map، برای اعمال یک تابع مشخص به تمامی اعضای یک جسم است. خروجی این تابع خود یک اشاره گر map object است که می توان آن را به راحتی با همراه کردن آن با توابع پیش فرض پایتون به نمایش درآورد (مثل دستور zip که به تنهایی خروجیش قابل نشان دادن به کاربر نبود).اولین ورودی تابع  map یک تابع دیگر خواهد بود. در این ورودی نه تنها می توانیم از توابع پیش فرض موجود در پایتون استفاده کنیم، بلکه حتی می توانیم از توابع ساخته شده توسط خود برنامه نویس (با def) و یا از یک تابع anonymous (با lambda) استفاده کنیم.ورودی دوم، جسم مورد نظر ما است که می خواهیم بر روی تمامی اعضای آن تابع در ورودی اول را تاثیر دهیم . این ورودی می تواند یک لیست، ست، tupleو یا دیکشنری باشد.این تابع در مواردی که می خواهیم یک عملیات ریاضی را بر روی تمامی اعضای یک جسم انجام دهیم بسیار پراستفاده است. در مثال زیر 3 عملیات ریاضی بر روی اعضای لیست ما اعمال خواهد شد :numbers = [1, 2, 3, 4, 5]list(map(lambda x: x + 1, numbers))&#xA;# [2, 3, 4, 5, 6]list(map(lambda x: x * 2, numbers))&#xA;[2, 4, 6, 8, 10]list(map(lambda x: x ** 3, numbers))&#xA; [1, 8, 27, 64, 125]در مثال بالا از آنجایی که ما نیاز به استفاده دوباره از توابع ریاضی نداشتیم، از توابع anonymous استفاده کرده ایم. ولی حتما نیاز به استفاده از این نوع توابع نیست و همانگونه که گفتیم، می توانیم از توابع دست ساز و یا توابع پیش فرض موجود در پایتون استفاده کنیم :numbers = [1, 2, 3, 4, 5]def add_one(element):&#xA;    return element + 1&#xA;&#xA;list(map(add_one, numbers))&#xA;[2, 3, 4, 5, 6]4 – filterتابع filter هم مانند تابع map یک تابع و یک جسم از ما به عنوان ورودی می گیرد. تفاوت آن این است که در این مورد خروجی filter اعضایی از آن جسم خواهد بود که با وارد کردن آنها در تابع ورودی، مقدار Trueبازگردانده شود. همانند تابع map، می توانیم هر 3 نوع توابع (نوشته شده توسط کاربر، توابع anonymous و توابع پیش فرض موجود در پایتون) را به عنوان ورودی به filter بدهیم.خروجی این تابع هم مانند map و zip یک اشاره گر خواهد بود که می توان آن را با دستور list() نمایش داد.برای مثال در کد زیر، ما اعداد فرد را به عنوان خروجی خواهیم داشت :numbers = [1, 2, 3, 4, 5, 6]list(filter(lambda x: x % 2, numbers))&#xA;[1, 3, 5]در ورودی دوم تابع اجسامی مانند لیست ها، رشته ها، tupleها و یا دیکشنری ها را می توان استفاده کرد. در مثال قبلی از یک لیست استفاده کردیم و در این مثال از لیستی از رشته ها استفاده می کنیم و اعضای آن را که با Vو یا M شروع شده است به عنوان خروجی می دهیم :cities = (&#39;Madrid&#39;, &#39;Valencia&#39;, &#39;Barcelona&#39;, &#39;Munich&#39;, &#39;Stuttgart&#39;)tuple(filter(lambda x: x.startswith((&#39;M&#39;, &#39;V&#39;)), cities))&#xA;(&#39;Madrid&#39;, &#39;Valencia&#39;, &#39;Munich&#39;)5 – inputدستور input یک ورودی از کاربر می گیرد و آن را به صورت یک رشته باز می گرداند. این تابع یک ورودی اختیاری نیز می تواند بگیرد که در آن متنی که به کاربر در حین درخواست ورودی نشان داده می شود را می توانیم بنویسیم.برای مثال کد زیر از کاربر می خواهد که اسم خود را وارد کند :name = input(&#39;Enter your name: &#39;)و از آن برای سلام کردن به کاربر استفاده کنیم : print(&#39;Hello {}&#39;.format(name))&#xA;Hello Amandaاگر بخواهیم از ورودی به عنوان یک عدد استفاده کنیم حتما باید آن را به int و یا float تبدیل کنیم، چون متغیر ما توسط input به عنوان یک رشته ذخیره می شود. در مثال زیر تبدیل ورودی به float با کمک دستور float() نشان داده شده است:number_1 = float(input(&#39;Enter a number: &#39;))&#xA;Enter a number: 2.5&#xA;number_2 = float(input(&#39;Enter another number: &#39;))&#xA;Enter another number: 3.4برای جمع زدن دو عدد اعشاری نیاز به تبدیل آنها به float داریم :print(&#39;The sum is: {}&#39;.format(number_1 + number_2))&#xA;The sum is: 5.9امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت اول این پست گذاشتید.در این قسمت به 5 تا از 9 تابع هایی که در پایتون بصورت پیش فرض وجود داره  پرداختیم. در قسمت دوم این پست باقی این توابع رو برای شما می نویسیم.برای دیدن ویدیو های آموزشی که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.towardsdatascience.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 19 Oct 2020 19:03:42 +0330</pubDate></item><item><title>تغییرات پایتون 3.9</title><link>https://virgool.ir/iranpythoneers/پایتون-39-yhd1otauvkw8</link><description>نسخه نهایی ورژن 3.9 زبان پایتون به تازگی عرضه شده است، در این نوشته برخی از تغییرات این نسخه را به شما معرفی خواهیم کرد.با تغییرات موجود در این نسخه مشخص است که پایتون از مسیر تکاملی گذشته خود جدا شده است و قدم در مسیر جدیدی گذاشته است.در این نسخه جدید شاهد دو تغییر بزرگ هستیم، که البته تاثیر آنها را فورا مشاهده نخواهیم کرد ولی در بلندمدت متوجه تغییرات تاثیر گرفته از این آپدیت در تکامل و پیشرفت زبان پایتون خواهیم بود.یک پارسر جدیدحدود 30 سال پیش، Guido van Rossum برنامه pgen را نوشت، یکی از اولین برنامه هایی که با زبان پایتوننوشته شد. این برنامه تاکنون به عنوان پارسر زبان برنامه نویسی پایتون استفاده شده است.پایتون از نوعی از گرامر بر پایه (1)LL استفاده می کند. استفاده از این نوع از گرامر به این معناست که پارسرما به ترتیب از بالا به پایین و در هر خط به صورت چپ به راست کد را می خواند و در هنگام خواندن هر کلمه از کد ما، یک کلمه جلوتر را نیز در نظر دارد.استفاده از این گرامر توسعه پایتون را بسیار سخت کرده است، به علت هایی مثل :در نظر داشتن فقط یک کلمه جلوتر از محل فعلی پارسر، باعث پیچیده شدن قواعد گرامر زبان میشود . پایتون در حال حاضر شامل گرامر های دیگری به جز (1)LL نیز هست. این گوناگونی باعث می شود پارسر فعلی زبان مجبور به انجام کارهای پیچیده ای برای اجرای برنامه می شود که پروسه کار زبان را بسیار پیچیده می کند.با وجود اینکه راه حل های موجود تا حدی مشکلات (1)LL را حل می کند، ولی این راه حل ها هم محدود هستند و باز هم مجبور به پیروی از قوانین (1)LL هستند و نمی توانند آنها را نقض کنند.این مشکلات پارسر به علت استفاده از (1)LL باعث محدودیت در کارهایی که پایتون می تواند انجام دهد می شود.پایتون 3.9 با استفاده از یک پارسر جدید بر پایه PEG از این مشکلات رهایی یافته است.ما بلافاصله متوجه تغییرات بر اثر این تغییر نخواهیم شد، چون هیچ تغییری که از این پارسر جدید استفاده کند قبل از عرضه نسخه 3.10 پایتون عملی نخواهد شد. ولی بعذ از نسخه 3.10 زبان از محدودیت های (1)LL آزاد خواهد شد.چرخه آپدیت جدید پایتونقبل از نسخه 3.9 پایتون یک نسخه جدید پایتون 18 ماه یکبار معرفی می شد، ولی از این به بعد یک نسخه جدید پایتون هر 12 ماه ارایه شود.پس، از این به بعد به جای اینکه هر یک سال و نیم یک نسخه جدید پایتون ارایه شود، این اتفاق به صورت سالانه خواهد افتاد. این تغییر در زمان بندی به این معناست که :نسخه های جدید ویژگی های جدید کمتری خواهند داشت.تغییرات در زبان به صورت تدریجی تری خواهند بود و سرعت رفع باگ های موجود بیشتر خواهد بود. خاطر سپردن تاریخ عرضه نسخه جدید پایتون راحت تر خواهد شد و برای فهمیدن آن نیاز به حل معادله ریاضی و یا سرچ در اینترنت نداریم، دیگر می دانیم که اکتبر هر سال یک نسخه جدید ارائه خواهد شد.البته سرعت پیشرفت کلی زبان تحت تاثیر این تغییر در زمان بندی ارائه نسخه جدید قرار نخواهد گرفت و تنها تغییر این خواهد بود که در آینده شاهد تغییرات کوچک تر در دوره های 12 ماهه به جای تغییرات بزرگ و ناگهانی در دوره های 18 ماهه خواهیم بود.دیگر ویژگی های جدید در نسخه 3.9تا الان از تغییرات پایه ای در پشت صحنه زبان و تغییر در زمان بندی ارائه آن صحبت کردیم، چه ویژگی های جدیدی به زبان ارائه شده است که ما بتوانیم آنها را مشاهده و از آنها به طور مستقیم اضافه کنیم؟1 - توانایی مشخص کردن نوع متغیرها (type hinting)در پایتون 3.9 ما می توانیم نوع متغیرهایمان را مشخص کنیم. پس اگر یک مقدار نامرتبط به آن اختصاص دادیم (مثلا اختصاص دادن یک رشته به یک متغیر عددی)، ادیتور به ما هشدار خواهد داد.البته در صورت اشتباه اختصاص دادن نوع متغیر برنامه با اروری مواجه نخواهد شد و فقط به ما هشدار خواهد داد، ولی همان هشدار هم می تواند در کار با کد های پیچیده به ما کمک کند.در حالت حالت عادی ما اگر بخواهیم یک تابع برای بدست آوردن مربع یک عدد بنویسیم کد ما به صورت زیر خواهد بود :def add_int(val):&#xA;    return val*valاز این نسخه بعد اگر بخواهیم از type hinting  برای نوشتن این تابع استفاده کنیم و ورودی خود را به عنوان یک عدد مشخص کنیم، تابع ما به صورت زیر خواهد بود :def add_int(val: int):&#xA;    return val*valمی بینیم که برای این کار کافیست از یک : و سپس نوع متغیرمان استفاده کنیم.البته این مثال برای مشخص کردن نوع متغیر ورودی بود، می توانیم نوع متغیر خروجی تابع و یا حتی نوع متغیر های یک دیکشنری را نیز مشخص کنیم.برای مثال در تابع زیر که برای جمع زدن عدد های مقادیر یک دیکشنری است، نوع متغیر ورودی تابع به عنوان یک دیکشنری و خروجی آن به عنوان یک متغیر عددی مشخص شده است :def sum_dict(var : dict) -&gt;int:&#xA;    return sum(var[key] for key in var)در تابع زیر، برنامه انتظار یک رشته و یک عدد به عنوان کلید و مقدار یک دیکشنری ورودی را خواهد داشت :def sum_dict(var : dict[str, int]):&#xA;    return sum(var[key] for ley in var)پس اگر مثلا دیکشنری {1:5, 2:7}=test  را به عنوان متغیر ورودی به این تابع بدهیم، به ما هشداری برای اشتباه بودن نوع ورودی خواهد داد، چون انتظار یک رشته به عنوان کلید دیکشنری دارد.2 - دستورات جدید برای ایجاد تغییرات بر روی رشته هااین تغییر به بزرگی و مهمی تغییراتی که قبلا ذکر شده نیست، ولی این دستورات جدید می توانند کمک به راحت تر شدن کار برنامه نویس ها بکنند.این دستورات جدید روش مستقیمی برای حذف عبارات از ابتدا و انتهای عبارات به ما می دهد. دستور               ( &#34;اضافی&#34; )removesuffix. را اگر در انتهای اسم یک متغیر رشته بیاوریم، به دنبال عبارت &#34;اضافی&#34; در انتهای رشته ما خواهد بود و در صورت وجود آن را حذف خواهد کرد.دستور ( &#34;اضافی&#34; )removeprefix. هم همین کار را برای حذف عبارت &#34;اضافی&#34; از ابتدای رشته ما تلاش خواهد کرد.مثال :&#34;foo bar&#34;.removeprefix(&#34;fo&#34;)خروجی این کد عبارت &#39;o bar&#39; خواهد بود.&#34;foo bar&#34;.removesuffix(&#34;ar&#34;)خروجی این کد عبارت &#39;foo b&#39; خواهد بود.3 - الحاق دیکشنری هادر این نسخه 2 دستور جدید برای به هم چسباندن دیکشنری ها اضافه شده است.یکی از آنها دستور | است که برای ادغام دیکشنری ها است. این دستور دو دیکشنری را با هم ترکیب می کند و ترتیب در آن اهمیت ندارد . نحوه استفاده این دستور به صورت زیر است :a = {1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;}&#xA;b = {4: &#39;d&#39;, 5: &#39;e&#39;}c = a | b&#xA;print(c)که خروجی به صورت زیر خواهد بود : [Out]: {1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;d&#39;, 5: &#39;e&#39;}دستور دوم |= است که برای به هم چسباندن دیکشنری ها است به طرزی که که در آن ترتیب دیکشنری ها حفظ می شود.a = {1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;}&#xA;&#xA;b = {4: &#39;d&#39;, 5: &#39;e&#39;}a |= b&#xA;&#xA;print(a)خروجی : [Out]: {1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;d&#39;, 5: &#39;e&#39;}نگاهی به آیندهپایتون به عنوان یک زبان پراستفاده آینده ی روشنی در پیش رو دارد و ما امیدوارانه منتظر پیشرفت پایتون به کمک پارسر جدید و چرخه آپدیت جدید ی که در این نسخه معرفی شدند هستیم.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت دوم این پست گذاشتید.ما به تازگی استفاده از پلتفرم ویرگول رو شروع کردیم و به زودی مطالب بیشتری هم اینجا قرار داده میشه.برای دیدن ویدیو های آموزشی دیگری که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب ، تلگرام یا اینستاگرام مراجعه کنید.منبع : towardsdatascience.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 12 Oct 2020 19:15:58 +0330</pubDate></item><item><title>9 اشتباه متداول بین برنامه نویسان پایتون - قسمت دوم</title><link>https://virgool.ir/iranpythoneers/9-اشتباه-متداول-بین-برنامه-نویسان-پایتون-قسمت-دوم-xgaoes58nsqd</link><description>سینتکس به ظاهر ساده پایتون می تواند برنامه نویسانی که از این زبان استفاده می کنند، علی الخصوص برنامه نویسان تازه کار، را دراستفاده مناسب از دستورات این زبان گیج کند.این گیجی می تواند باعث شود که از بعضی ریزه کاری های این زبان نادانسته رد شوند و از تمام قدرت این زبان استفاده نکنند.در قسمت گذشته به 5 تا از این اشتباهات احتمالی پرداختیم. در این پست به 4 اشتباه دیگر می پردازیم.اشتباه 6 – ساختن یک حلقه بسته (closed loop) از وابستگی هافرض کنید که دو فایل a.py و b.py را داریم که در هرکدام دیگری را import می کنیم.به گونه ای که در a.py داشته باشیم :import b&#xA;def f():&#xA;    return b.x&#xA;print f()و در b.py داشته باشیم :import a&#xA;x = 1&#xA;def g():&#xA;    print a.f()حالااگر  a.py را import کنیم، خواهیم داشت :&gt;&gt;&gt; import a&#xA;1شاید برای شما سوال باشد که در برنامه ما که وابستگی import به صورت یک حلقه بسته بود که از نظر عملی خطاست (a وابسته به b  و b وابسته به a)، چرا اروری به ما داده نشد؟جواب شما این است که حضور یک حلقه بسته از وابستگی import به تنهایی باعث مشکلی در پایتون نخواهد شد. ولی با توجه به محلی که هر ماژول سعی می کند به محتویات ماژول دیگر دسترسی پیدا کند، این نوع از وابستگی ها می تواند مشکل زا باشد (اگر در قسمتی از کد که اجرا نمی شود باشد ممکن است باعث مشکل نشود).در مثال وقتی که ما a.py را import کردیم، پایتون هیچ مشکلی برای import کردن b.py نداشت، چون b.py نیازی به مشخص بودن هیچ مقداری از a.py در هنگام import شدن ندارد. تنها اشاره ای که به a.py در b.py شده است در قسمت ()g است که در لحظه ای که a را import می کنیم درخواست نمی شود، پس مشکلی در این زمینه نخواهیم داشت.ولی اگر بخواهیم b.py را import کنیم (بدون آنکه ابتدا a.py را import کرده باشیم)، به مشکل برخواهیم خورد.&gt;&gt;&gt; import b&#xA;Traceback (most recent call last):&#xA;          File &#34;&lt;stdin&gt;&#34;, line 1, in &lt;module&gt;&#xA;          File &#34;b.py&#34;, line 1, in &lt;module&gt;&#xA;    import a&#xA;          File &#34;a.py&#34;, line 6, in &lt;module&gt;&#xA;         print f()&#xA;          File &#34;a.py&#34;, line 4, in f&#xA;         return b.x&#xA;AttributeError: &#39;module&#39; object has no attribute &#39;x&#39;مشکل اینجاست که در پروسه import کردن b.py، پایتون برای import کردن a.py نیز تلاش می کند. این اتفاق باعث درخواست شدن تابع()f است که در نتیجه باعث درخواست شدن مقدار b.x است، ولی این مقدار تاکنون تعریف نشده است، پس به ارور AttributeError  بر می خوریم.یک راه آسان برای حل کردن این مشکل این است که به جای اینکه در ابتدای b.py فایل a را import کنیم، درون تابع g() سعی بر import کنیم، پس b.py بدین شکل خواهد بود :x = 1&#xA;def g():&#xA;    import a  &#xA;    print a.f()که باعث می شود خروجی ما بعد از درخواست کردن b.g() اینگونه باشد :&gt;&gt;&gt; import b&#xA;&gt;&gt;&gt; b.g()&#xA;1&#xA;1که عدد 1 اول توسط قسمت ()print f موجود در انتهای a.py (که در ()b.g فراخوانی شده است) چاپ شده است و عدد 1 دوم توسط دستور ()print a.f در انتهای ()b.g چاپ شده است.اشتباه 7 – انتخاب کردن نام نامناسب برای ماژول هایکی از ویژگی های برجسته پایتون، وسعت و عظمت کتابخانه هایی است که پایتون به طور پیش فرض شامل آنان است. ولی بر اثر این وسعت، احتمال این وجود دارد که نام یک ماژول نوشته شده توسط برنامه نویس با یکی از ماژول های کتاب خانه ی استاندارد پایتون یکسان باشد (برای مثال ممکن است برنامه نویس یک ماژول برای دسترسی به ایمیل نوشته باشد که نام آن را email.py گذاشته باشد، این نام با نام یکی از ماژول های موجود در کتاب خانه ی پیش فرض پایتون یکسان است و باعث مشکل خواهد شد).این اشتباه می تواند به مشکلات بسیار پیچیده ای منجر شود. پایتون نه تنها در هنگام استفاده از ماژول نوشته شده توسط برنامه نویس به مشکل خواهد خورد، بلکه ممکن است یک ماژول نامرتبط نیاز به استفاده از ماژولی در کتاب خانه ی استاندارد پایتون داشته باشد که هم نام ماژول دست ساز ماست. این اشتباه در نام گذاری ماژول باعث می شود که آن ماژول نامرتبط، ماژول اشتباه را برای کار خودش استفاده کند که منجر به ارور و کار نکردن برنامه می شود.به همین علت، در هنگام نام گذاری باید حداکثر دقت را به کار برد که از اینگونه نام های موجود در کتاب خانه های استاندارد پایتون استفاده نشود. عوض کردن نام یک ماژول دست نویس توسط خودتان در برنامه خودتان بسیار راحت تر از پرکردن و ارسال یک درخواست تغییر نام ماژول پیش فرض پایتون (در یک فرم Python Enhancement Proposalیا PEP) خواهد بود.اشتباه 8 – بی دقتی به تفاوت های موجود میان پایتون 2 و پایتون 3کد زیر (foo.py) را در نظر داشته باشید :import sys&#xA;def bar(i):&#xA;    if i == 1:&#xA;        raise KeyError(1)&#xA;    if i == 2:&#xA;        raise ValueError(2)&#xA;&#xA;def bad():&#xA;    e = None&#xA;    try:&#xA;        bar(int(sys.argv[1]))&#xA;    except KeyError as e:&#xA;        print(&#39;key error&#39;)&#xA;    except ValueError as e:&#xA;        print(&#39;value error&#39;)&#xA;    print(e)&#xA;&#xA;bad()این کد در پایتون 2 بدون هیچ مشکلی اجرا خواهد شد :$ python foo.py 1&#xA;key error&#xA;1&#xA;$ python foo.py 2&#xA;value error&#xA;2ولی اگر همین برنامه را در پایتون 3 اجرا کنیم به مشکل برخواهیم خورد :$ python3 foo.py 1&#xA;key error&#xA;Traceback (most recent call last):&#xA;File &#34;foo.py&#34;, line 19, in &lt;module&gt;&#xA;bad()&#xA;File &#34;foo.py&#34;, line 17, in bad&#xA;print(e)&#xA;UnboundLocalError: local variable &#39;e&#39; referenced before assignmentچه شد؟ چرا به مشکل برخوردیم؟مشکل این است که در پایتون 3، جسم exception خارج از حدود قسمت except در کد قابل دسترسی نخواهد بود.یک راه برای حل این مشکل این است که یک اشاره خارج از قسمت except در کد به جسم exception داشته باشیم تا بتوان به آن دسترسی داشت. کد زیر از این روش استفاده می کند و به این علت با پایتون 2 و 3 قابل اجراست و خروجی مورد نظر ما را خواهد داشت : import sys&#xA;def bar(i):&#xA;    if i == 1:&#xA;        raise KeyError(1)&#xA;    if i == 2:&#xA;        raise ValueError(2)&#xA;&#xA;def good():&#xA;    exception = None&#xA;    try:&#xA;        bar(int(sys.argv[1]))&#xA;    except KeyError as e:&#xA;        exception = e&#xA;        print(&#39;key error&#39;)&#xA;    except ValueError as e:&#xA;        exception = e&#xA;        print(&#39;value error&#39;)&#xA;    print(exception)&#xA;&#xA;good()اگر این کد را در پایتون 3 اجرا کنیم می بینیم که بدون مشکلی اجرا خواهد شد :$ python3 foo.py 1&#xA;key error&#xA;1&#xA;$ python3 foo.py 2&#xA;value error&#xA;2اشتباه 9 – استفاده اشتباه از __del__سطح این اشتباه کمی بالاتر از اشتباهات قبلیست.اگر کد زیر را در فایلی به نام mod.py داشته باشیم :import foo&#xA;&#xA;class Bar(object):&#xA;...&#xA;    def __del__(self):&#xA;        foo.cleanup(self.myhandle)و بخواهیم از یک کد دیگر مثل کد زیر به آن دسترسی پیدا کنیم :import mod&#xA;mybar = mod.Bar()می بینیم که به ارور AttributeError بر می خوریم.چرا؟ مشکل این است که وقتی کار مفسر زبان پایتون به اتمام می رسد و خاموش می شود، مقدار متغیرهای عمومی ماژول ما برابر با None خواهد شد. در نتیجه این رفتار، وقتی به مرحله ای میرسیم که دستور __del__ اجرا می شود، مقدار متغیر foo قبلا برابر None شده است.یکی از راه حل های موجود برای این مشکل می تواند استفاده از ()atexit.register باشد. با استفاده از این دستور، وقتی اجرای برنامه شما به اتمام می رسد، هندلرهای برنامه قبل از خاموش شدن مفسر از بین می روند.برای اجرای این راه حل، شکل کد ما اینگونه خواهد بود:import foo&#xA;import atexit&#xA;&#xA;def cleanup(handle):&#xA;    foo.cleanup(handle)&#xA;&#xA;class Bar(object):&#xA;    def __init__(self):&#xA;...&#xA;        atexit.register(cleanup, self.myhandle)این روش استفاده از این دستور، راه مناسب و قابل اعتمادی برای اجرای پاکسازی های موردنیاز در هنگام اتمام اجرای برنامه است.در این پست دو قسمتی سعی شده به برخی از اشتباهاتی که ممکن است در هنگام استفاده از پایتون توسط برنامه نویسان انجام شود بپردازیم. امیدواریم که این نوشته مفید باشه براتون.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت دوم این پست گذاشتید.ما به تازگی استفاده از پلتفرم ویرگول رو شروع کردیم و به زودی مطالب بیشتری هم اینجا قرار داده میشه.برای دیدن ویدیو های آموزشی دیگری که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب ، تلگرام یا اینستاگرام مراجعه کنید.منبع : www.toptal.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Wed, 07 Oct 2020 19:20:57 +0330</pubDate></item><item><title>9 اشتباه متداول بین برنامه نویسان پایتون - قسمت اول</title><link>https://virgool.ir/iranpythoneers/9-اشتباه-متداول-بین-برنامه-نویسان-پایتون-قسمت-اول-y7okujsyctnz</link><description>سینتکس به ظاهر ساده پایتون می تواند برنامه نویسانی که از این زبان استفاده می کنند، علی الخصوص برنامه نویسان تازه کار، را دراستفاده مناسب از دستورات این زبان گیج کند.این گیجی می تواند باعث شود که از بعضی ریزه کاری های این زبان نادانسته رد شوند و از تمام قدرت این زبان استفاده نکنند.برای آشنایی با این ریزه کاری ها و اشکالات متداول در برنامه های نوشته شده در پایتون، در این نوشته به 9 تا از این اشتباهات که حتی ممکن است توسط افراد خبره تر هم انجام شود می پردازیم.اشتباه 1 – استفاده اشتباه از ورودی های پیش فرض توابعپایتون به شما این انتخاب را می دهد که مشخص کنید که ورودی های یک تابع اختیاری هستند. این کار با مشخص کردن یک مقدار پیش فرض برای آن ورودی امکان پذیر است.  با اینکه داشتن این انتخاب ویژگی بسیار خوبی است، ولی اگر مقدار این ورودی قابل تغییر باشد، می تواند باعث سردرگمی برنامه نویس شود. برای مثال تعریف تابع زیر را در نظر داشته باشید :&gt;&gt;&gt; def foo(bar=[]):&#xA;           bar.append(&#34;baz&#34;)    &#xA;           Return barخط اول ما در حال تعریف تابع و ورودی آن هستیم. bar نامی است که برای متغیر ورودی تابع  در نظر گرفته ایم و مقدار پیش فرض آن (مقداری که اگر در هنگام استفاده از تابع به آن ورودی ندهیم به عنوان ورودی پیش فرض در نظر گرفته می شود)  را برابر [](لیست خالی، تهی) در نظر گرفته ایم. خط دوم تابع کاری است که می خواهیم بر روی ورودی انجام دهیم و خط سوم برای برگرداندن خروجی تابع است.اشتباهی که در این حالت صورت می گیرد تصور این است هر دفعه تابع را بدون ورودی استفاده می کنیم، ورودی ما با مقدار پیش فرض برابر خواهد بود. مثلا اگر در ادامه کد بالا چندبار تابع ()foo را بدون دادن ورودی استفاده کنیم، از آنجایی که تصور این است که هردفعه که تابع را بدون ورودی استفاده می کنیم ورودی برابر مقدار پیش فرضش (یک لیست تهی) خواهد بود، پس انتظار می رود که در هر دفعه خروجی ما همواره لیستی شامل عبارت &#39;baz&#39; باشد( چون ورودی ما با اسم bar یک لیست تهی است و در خط دوم کد به انتهای آن لیست عبارت &#39;baz&#39; را اضافه می کنیم انتظار می رود خروجی ما لیستی که تنها شامل عبارت&#39;baz&#39; است، باشد).حال اگر این کار را در واقعیت انجام دهیم (تابع را چندبار بدون مقدار ورودی صدا بزنیم)، نتیجه به شکل زیر خواهد بود :&gt;&gt;&gt; foo()&#xA;[&#34;baz&#34;]&#xA;&gt;&gt;&gt; foo()&#xA;[&#34;baz&#34;, &#34;baz&#34;]&#xA;&gt;&gt;&gt; foo()&#xA;[&#34;baz&#34;, &#34;baz&#34;, &#34;baz&#34;]چی شد؟ چرا به جای اینکه هردفعه فقط یک لیست شامل عبارت &#39;baz&#39; برگردونه، هردفعه عبارت &#39;baz&#39; رو به یک لیست قدیمی اضافه می کنه؟جواب این سوال این هستش که مقدار پیش فرض ورودی یک تابع فقط یک بار در نظر گرفته می شود و این کار در زمانی که تابع تعریف می شود اتفاق می افتد. به همین علت مقدار پیش فرض ورودی ما فقط در هنگامی که تابع در کد تعریف می شود، برابر یک لیست تهی است و در استفاده اول از این لیست خالی استفاده خواهد شد. در دفعات بعدی دیگر یک لیست خالی ساخته نمی شود، بلکه از همان لیست قدیمی که دارای عضو است استفاده می شود. راه حل معمول این مشکل، نوشتن کد به شکل زیر است :&gt;&gt;&gt; def foo(bar=None):&#xA;...        if bar is None:&#xA;...            bar = []&#xA;...        bar.append(&#34;baz&#34;)&#xA;...        return barکه باعث می شود در هردفعه صدا کردن این تابع، از یک لیست تهی به عنوان ورودی پیش فرض استفاده شود.اشتباه 2 – استفاده نامناسب از متغیر های کلاس (class variables)کد زیر رو در نظر بگیرید :&gt;&gt;&gt; class A(object):&#xA;...     x = 1&#xA;...&#xA;&gt;&gt;&gt; class B(A):&#xA;...     pass&#xA;...&#xA;&gt;&gt;&gt; class C(A):&#xA;...     passحال اگر دستور زیر رو وارد کنیم :&gt;&gt;&gt; print A.x, B.x, C.xخروجی ها به این شکل خواهند بود:1 1 1که کاملا مطابق انتظارات است و مشکلی ندارد.اگر در ادامه متغیر x یکی از دو کلاس B و یا C را تغییر دهیم و دوباره دستور بالا را وارد کنیم  :&gt;&gt;&gt; B.x = 2&#xA;&gt;&gt;&gt; print A.x, B.x, C.x&#xA;1 2 1می بینیم که خروجی ما مشکلی ندارد و مطابق انتظار ماست.ولی اگر مقدار متغیر x برای کلاس A را تغییر دهیم و همین کار را تکرار کنیم می بینیم که نتیجه متفاوت خواهد بود.&gt;&gt;&gt; A.x = 3&#xA;&gt;&gt;&gt; print A.x, B.x, C.x&#xA;3 2 3چی شد؟ ما که تنها متغیر xبرای کلاس A را تغییر داده ایم، چرا مقدار C.xهم تغییر کرد؟در کد بالا از آنجایی که متغیر xبرای کلاس C تعریف نشده است، برای این ویژگی در کلاس های پایه ای آن جستجو خواهد شد (که در مثال بالا در کلاس A پیدا خواهد شد). به عبارت دیگر، متغیر xکلاس C یک متغیر وابسته به کلاس Aخواهد بود و درواقع فراخوانی متغیر C.x باعث فراخوانی A.x خواهد شد.این مشکل به این علت برای کلاس B در قسمت دوم کد بوجود نیامد که به آن در قسمت دوم دستورات به طور جداگانه و مستقیم مقداری اختصاص داده شد.اشتباه 3 – به اشتباه مشخص کردن پارامترهای یک دستور استثنا (exception) در کدکد زیر را در نظر بگیرید&gt;&gt;&gt; try:&#xA;...        l = [&#34;a&#34;, &#34;b&#34;]&#xA;...        int(l[2])&#xA;...   except ValueError, IndexError:&#xA;...        passقسمت جلوی exceptبرای گرفتن دو ارورValueError وIndex Error نوشته شده است و مشکلی ندارد دیگر، نه؟وقتی کد را اجرا کنیم با پیام زیر روبه رو خواهیم شد :Traceback (most recent call last):&#xA;File &#34;&lt;stdin&gt;&#34;, line 3, in &lt;module&gt;&#xA;IndexError: list index out of rangeپس مشکل ما چیست؟مشکل این است که دستور except یک لیست از مشکلات را به این نحو دریافت نمی کند.برای این کار باید یک tuple معرفی کرده که در آن تمامی مشکلات مورد نظر موجود باشند. برای کمتر کردن مشکلات احتمالی و راحت تر کردن انتقال کد از یک as در انتهای کد نیز می توانید استفاده کنید، با این کار این دستور هم با پایتون 2 و هم پایتون 3 سازگار خواهد بود. بدین شکل :&gt;&gt;&gt;  try:&#xA;...        l = [&#34;a&#34;, &#34;b&#34;]&#xA;...        int(l[2])&#xA;...  except (ValueError, IndexError) as e:&#xA;...      passاشتباه 4 – تغییردادن یک لیست در حین خواندن آنکد زیر را در نظر داشته باشید :&gt;&gt;&gt; odd = lambda x : bool(x % 2)&#xA;&gt;&gt;&gt; numbers = [n for n in range(10)]&#xA;&gt;&gt;&gt; for i in range(len(numbers)):&#xA;...       if odd(numbers[i]):&#xA;...           del numbers[i]اگر این کد را اجرا کنیم، با ارورهای زیر روبه رو خواهیم شد:Traceback (most recent call last):&#xA;File &#34;&lt;stdin&gt;&#34;, line 2, in &lt;module&gt;&#xA;IndexError: list index out of rangeمشکل این کد چیست؟مشکل این کد در خط 4 آن است. دستور آن خط جسمی که ما در حال خواندن از روی آن هستیم را حذف می کند که باعث خطا در اجرای کد می شود. این اشتباه بین افرادی که بیشتر با پایتون آشناتر هستند شناخته شده است، ولی گاهی ممکن است حتی آنان نیز به اشتباه این کار را انجام دهند.در پایتون راه های زیادی برای جلوگیری از این خطا داریم. یکی از راه هایی که برای جلوگیری از این مشکل داریم نوشتن کد بالا به نحوه زیر است :&gt;&gt;&gt; odd = lambda x : bool(x % 2)&#xA;&gt;&gt;&gt; numbers = [n for n in range(10)]&#xA;&gt;&gt;&gt; numbers[:] = [n for n in numbers if not odd(n)]با نوشتن کد به این روش دیگر یک عضو یک لیست را در حین خواندن حذف نمی کنیم. بلکه در حین خواندن لیست یک لیست ثانویه از اعدادی که شرایط ما را شامل می شوند می سازیم و در نهایت، بعد از اتمام خواندن، لیست اولیه را تماما با لیست ثانویه جایگزین می کنیم (اعضای لیست ثانویه را در لیست اولیه میریزیم).اشتباه 5 – دقت نکردن به نحوه ای که پایتون با متغیرها برخورد می کندکد زیر را در نظر داشته باشید :&gt;&gt;&gt; def create_multipliers():&#xA;...       return [lambda x : i * x for i in range(5)]&#xA;&gt;&gt;&gt; for multiplier in create_multipliers():&#xA;...       print multiplier(2)قاعدتا شما انتظار خروجی زیر را خواهید داشت :0&#xA;2&#xA;4&#xA;6&#xA;8ولی خروجی که شما دریافت خواهید کرد به شکل زیر خواهد بود :8&#xA;8&#xA;8&#xA;8&#xA;8عجیبه! چرا؟این اتفاق به دلیل نحوه برخورد پایتون با متغیر هاست. این نحوه برخورد باعث می شود مقدار متغیرهایی که در یک قسمت استفاده می شوند، تازه در هنگامی درخواست شوند که تابع شروع به کار میکند. پس در کد بالا، هردفعه که قسمت دوم نتیجه return را درخواست می کند مقدار متغیر در لحظه درخواست به آن تحویل داده می شود، که در نتیجه کامل شدن حلقه قسمت اول قبل از دومی برابر 4 خواهد بود.راه حل این مشکل نوشتن کد به صورت زیر خواهد بود :&gt;&gt;&gt; def create_multipliers():&#xA;...       return [lambda x, i=i : i * x for i in range(5)]&#xA;...&#xA;&gt;&gt;&gt; for multiplier in create_multipliers():&#xA;...       print multiplier(2)که به ما خروجی موردنظر را خواهد داد.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت اول این پست گذاشتید.در این قسمت به 5 تا از 9 اشتباه متداولی که برنامه نویسان پایتون انجام میدن پرداختیم. در قسمت دوم این پست باقی این اشتباهات رو برای شما می نویسیم.ما به تازگی استفاده از پلتفرم ویرگول رو شروع کردیم و به زودی مطالب بیشتری هم اینجا قرار داده میشه.برای دیدن ویدیو های آموزشی دیگری که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.toptal.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 05 Oct 2020 18:04:19 +0330</pubDate></item><item><title>معرفی زبان برنامه نویسی پایتون - قسمت دوم</title><link>https://virgool.ir/iranpythoneers/معرفی-زبان-برنامه-نویسی-پایتون-قسمت-دوم-obvi4bf306lk</link><description>در قسمت گذشته به ویژگی های زبان برنامه نویسی پایتون و چند علت برای پرطرفداری آن پرداختیم. در این قسمت به مقایسه ورژن های مختلف آن، روشن کردن چندتا از اشکالاتی که به این زبان گرفته میشه و معرفی کوتاه بعضی کتاب خانه های آن می پردازیم.پایتون 2 دربرابر پایتون 3پایتون امروزه در 2 نسخه موجود است که انتخاب بین آنها می تواند افراد تازه کار را گمراه کند.پایتون 2 نسخه قدیمی تر این زبان است که تا انتهای سال 2020 آپدیت های رسمی دریافت خواهد کرد (البته این زبان بعد از این تاریخ نیز ممکن است به حیات خود ادامه دهد !) . پایتون 3 نسخه به روز شده ی زبان پایتون است. به این نسخه از زبان پایتون ویژگی های مفید زیادی اضافه شده است، ویژگی هایی مانند یک مترجم کارآمد تر از گذشته و کنترل بهتر بر هم زمانی عملیات ها.گسترده شدن استفاده از پایتون 3 به دلیل کم بودن تعداد کتاب خانه های نوشته شده برای آن در ابتدای حیات آن بسیار کند بوده است و در ابتدا بسیاری از کتاب خانه ها تنها پایتون 2 را پشتیبانی می کردند. این مشکل، استفاده از پایتون 3 در برنامه ها را بسیار سخت می کرد. ولی در طی چندسال گذشته، تعداد کتاب خانه هایی که تنها پایتون 2 را پشتیبانی می کردند کم شده است و بیشتر کتاب خانه ها از هردو نسخه پایتون پشتیبانی می کنند.امروزه استفاده از پایتون 3 برای پروزه های جدید بهترین کار است، مگر آنکه مجبور به استفاده از ابزارهایی باشید که از پایتون 3 پشتیبانی نمی کنند.کتاب خانه های پایتونموفقیت پایتون برگرفته از اکوسیستم غنی این زبان است که شامل کتاب خانه های پیش فرض خود پایتون و تعداد زیادی کتاب خانه نوشته شده توسط دیگر برنامه نویسان است (که دسترسی و استفاده از آنها در برنامه های خودمان بسیار آسان است) .کتاب خانه های پیش فرض پایتون ماژول هایی برای انجام کارهای متداول برنامه نویسی مانند عملیات های ریاضی، کار با رشته های متنی، دسترسی به فایل ها و کارهای پیشرفته تری مانند خواندن و نوشتن فایل هایی با فرمت های XMLو JSON و .. دارد. پایتون بصورت پیش فرض دارای یک کتاب خانه جهت اجرای رابط گرافیکی ساده (Tkinter) و یک نسخه از کتاب خانه SQLite 3 نیز هست.ما علاوه بر کتاب خانه های پیش فرض پایتون، به هزاران کتاب خانه ساخته شده توسط برنامه نویسان دیگر هم از طریق PyPi دسترسی داریم. از این کتاب خانه ها میتوان به نام های زیر اشاره کرد :کتاب خانه ی BeautifulSoup یک مجموعه ی کامل و بسیار توانمند جهت اسکرپینگ HTML و خارج کردن اطلاعات از آن برای ما فراهم می کند.کتاب خانه ی Requests کار با درخواست های HTTP را برای ما بسیار راحت خواهد کرد.فریم ورک هایی مانند Django و Flask به ما برای توسعه سریع سرویس های وب (چه ساده و چه پیچیده) کمک می کند.از طریق Apache Libcloud میتوانیم چندین سرویس ابری را به طور همزمان مدیریت کنیم.کتاب خانه های NumPy، Pandas، Matplotlib هم می توانند به ما در محاسبات ریاضی و آماری و تجسم داده ها کمک کنند.مشکلات پایتونلازم به ذکر است که بعضی کارها وجود دارند که پایتون برای آنها مناسب نیست. پایتون یک زبان سطح بالاست، پس برای برنامه های در سطح نزدیک به سخت افزار سیستم (مانند درایور ها و کرنل سیستم عامل ها) اصلا مناسب نیست.همچنین پایتون برای نوشتن برنامه های standalone که نیاز به اجرا در چند محیط مختلف دارد اصلا مناسب نخواهد بود (منظور برنامه ای است که برای اجرا شدن نیاز به نصب نداشته باشد). به وسیله پایتون میتوان یک برنامه برای ویندوز، لینوکس و مک نوشت، ولی این کار اصلا ساده نخواهد بود و برنامه پیچیده ای خواهد بود.پایتون در محیط هایی که سرعت مهم ترین ویژگی برنامه است هم بهترین انتخاب نیست. در این شرایط باید از زبان هایی مثل Cو یا C++ استفاده کنید.مانند جاوا، C#و Go پایتون هم دارای قابلیت مدیریت حافظه به کمک garbage collection است. این توانایی به این معناست که برنامه نویس نیازی به در نظر داشتن پروسه ی تولید و از بین رفتن اجسام درون برنامه ندارد. درحالت عادی این کار به صورت اتوماتیک انجام می شود، اما اگر در جایی ما نیاز داشتیم می توانیم آن را به صورت دستی انجام دهیم، آن را به کل خاموش کنیم و یا قسمت های خاصی از کد را را از این قاعده مستثنا کنیم.یک جنبه مهم پایتون پویایی آن است.با هر چیزی در این زبان، از توابع و حتی خود ماژول ها، به عنوان یک جسم برخورد می شود. هزینه این کار کم شدن سرعت زبان خواهد بود، ولی این کار نوشتن کد پیچیده را در این برنامه بسیار راحت می کند. برنامه نویس ها می توانند کارهای بسیار پیچیده ای را با چند دستور ساده انجام دهند و با هر قسمتی از برنامه که می خواهند ، به عنوان انتزاعاتی برخورد کنند که می توانند در آن هر تغییری ایجاد کنند.استفاده پایتون از فضای خالی قبل از بعضی خط های کد، توسط برخی به عنوان یکی از بهترین و در عین حال در نظر یک گروه دیگر بدترین ویژگی های پایتون شناخته می شود. جلوتر بودن خط پایینی از خط بالایی در کد زیر تنها برای راحتی خواندن کد نیست، بلکه قسمتی از سینتکس برنامه است. مترجم های پایتون برنامه هایی که فاصله گذاری مناسب برای مشخص کردن قسمت های مختلف کد نداشته باشد را قبول نمی کنند.12with open(‘myfile.txt’) as my_file:&#xA;     file_lines = [x.rstrip(‘\n’) for x in my_file]استفاده از فضای خالی سفید در سینتکس ممکن است باعث ناراحتی برخی شود. ولی قوانین سخت گیرانه در فاصله گذاری در واقعیت بسیار کمتر از آنچه فکر می شود مزاحم هستند و باعث می شوند که ما در نهایت کدی خواناتر و تمیزتر داشته باشیم.یکی دیگر از مسائلی که میتواند افرادی که شروع به یادگیری پایتون می کنند، به خصوص افرادی که از زبان هایی مثل Cیا جاوا به سراغ این زبان آمده اند، این است که در پایتون به صورت پیش فرض نوع متغیر ها به صورت پویا (duck typing) تعیین شده است که به بالا بردن سرعت کدنویسی کمک می کند، ولی در برنامه های بزرگتر این موضوع می تواند باعث مشکل شود. پایتون در نسخه های جدیدتر امکان استفاده از type hinting را فراهم کرده است تا برنامه هایی که نیاز به استفاده از متغیرهای ثابت (static typing) دارند بتوانند این کار را انجام دهد.پایتون کند است؟ نه خیلییکی از مشکلاتی که درمورد پایتون بسیار ذکر می شود این است که این زبان، زبان کندی است. این موضوع تا حدی درست است. اگر سرعت اجرای برنامه ای که با پایتون نوشته شده است را با سرعت برنامه ی یکسانی که با C، C++ و یا JAVA نوشته شده است مقایسه کنیم شاهد این تفاوت سرعت خواهیم بود.علت این کاهش سرعت چیست؟ به دلیل انعطاف پذیری ذاتی نوع متغیرها در پایتون، بهینه سازی برنامه ی نوشته شده با این زبان برای افزایش سرعت انجام آن بسیار سخت است.بهینه سازی عملکرد در پایتونبرنامه های نوشته شده با پایتون حتما به علت استفاده از پایتون کند نیستند. بسیاری از برنامه های پایتون به خاطر عدم استفاده مناسب از توانایی های در دسترس برنامه نویس است که کند هستند. برای مثال سرعت عملیات های ریاضی و آماری را می توان با استفاده از کتاب خانه هایی مثل Pandas و یا NumPy بسیار افزایش داد.برای معرفی یک راه بهینه سازی دیگر باید یک اصطلاح برایتان تعریف کنیم.یک اصطلاح معروف در بین برنامه نویسان این است که 90 درصد کارایی یک برنامه در 10 درصد کد آن است. پس برنامه نویس می تواند با بهینه کردن این 10 درصد کد، شاهد پیشرفت زیادی در سرعت انجام برنامه باشد. حتی می توان آن 10 درصد از کد را به زبان سریعتری مانند اسمبلی و یا C (با پروژه هایی مثل Cythom یا Numba) تبدیل کرد، نتیجه این کار برنامه ای خواهد بود که سرعت انجام آن اختلاف کمی با برنامه ی تماما نوشته شده با C دارد و پیچیدگی آن از برنامه ای که کاملا با زبان C نوشته شده است بسیار کمتر خواهد بود.البته باید دقت داشت که در بسیاری از موارد زمان مورد نیاز برای ساخت برنامه، بسیار بیشتر از زمان مورد نیاز برای اجرای برنامه است.یگ برنامه پایتون ممکن است 6 ثانیه برای اجرا شدن زمان نیاز داشته باشد، در حالی که این عدد برای برنامه ی نوشته شده در یک زبان دیگر می تواند نیم ثانیه باشد. این نیز باید در نظر داشت که نوشتن برنامه در پایتون 10 دقیقه وقت نیاز خواهد داشت و همان برنامه در زبان دیگر نیاز به یک ساعت و یا بیشتر زمان برای ساخته شدن نیاز دارد. مقدار زمانی که به خاطر نوشتن برنامه توسط پایتون صرفه جویی کرده ایم، بسیار بیشتر از زمانی است که به علت اجرای کندتر برنامه در پایتون از دست داده ایم.البته این نسبت در برنامه هایی کمی که نیاز به سرعت خالص بالا و همزمانی زیاد دارند، مثل برنامه های معاملاتی بورس و یا سیستم های شبیه آن اهمیتی ندارد و تنها سرعت انجام برنامه مهم است. ولی در بیشتر برنامه های نوشته شده، سرعت پایتون کافی خواهد بود.البته علاوه بر کافی بودن سرعت پایتون برای بیشتر برنامه ها، باید در نظر داشت که انعطاف پذیری، سرعت و راحتی که پایتون در حین نوشتن برنامه در اختیار ما می گذارد، دست مارا برای ساختن برنامه هایی که در دیگر زبان ها بسیار پیچیده تر می شد باز می گذارد.به طور خلاصه، وقتی سرعت ساخت برنامه و راحتی ساخت آن از چند دهم ثانیه کمتر بودن زمان کار برنامه اهمیت بالاتری داشته باشد، پایتون راه مناسبی برای آن کار خواهد بود.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن قسمت دوم این پست گذاشتید.ما به تازگی استفاده از پلتفرم ویرگول رو شروع کردیم و به زودی مطالب بیشتری هم اینجا قرار داده میشه.برای دیدن ویدیو های آموزشی دیگری که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.infoworld.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Wed, 30 Sep 2020 21:01:47 +0330</pubDate></item><item><title>معرفی زبان برنامه نویسی پایتون - قسمت اول</title><link>https://virgool.ir/iranpythoneers/what-is-python-ntukmsribaz3</link><description>زبان برنامه نویسی پایتون از سال 1991 به عنوان یک زبان *کار راه انداز* برای نوشتن اسکریپت هایی که کارهای تکراری و خسته کننده را خودکار می کنند و یا ساخت نمونه کوچک و اولیه برنامه هایی که در انتها با زبان های دیگری ساخته می شدند در حال استفاده شدن است.ولی در چندسال گذشته، پایتون به عنوان یک زبان برنامه نویسی سطح اول در برنامه نویسی عمومی، مدیریت زیرساخت و آنالیز داده مطرح شده است. پایتون دیگر یک زبان شناخته نشده و کم استفاده نیست، بلکه به یک بازیگر بزرگ در عرصه ساخت وب اپلیکیشن ها(Web Application) و مدیریت سیستم ها تبدیل شده است. پیشرفت های این زبان را می توان یکی از عوامل اصلی پیشرفت عرصه آنالیز کلان داده ها(big data analytics) و هوش مصنوعی دانست.ویژگی های مهم پایتونپایتون برای برنامه نویسان با سطوح مختلف (از تازه کار تا خبره) امکانات مناسبی فراهم می کند.سادگی یادگیری و استفاده از آن پایتون بصورت پیش فرض امکانات مناسبی در اختیار برنامه نویس قرار می دهد و تولید برنامه های اولیه با آن زمان و تلاش نسبتا کمی نیاز دارد. سینتکس(syntax) پایتون به نحوی طراحی شده است که خواندن و فهمیدن آن آسان باشد، این ویژگی به افراد تازه کار کمک می کند تا راحت تر بتوانند با این زبان ارتباط برقرار کنند و به برنامه نویسان خبره تر این امکان را می دهد که زمان اضافه ای که برای فهم متن کد نوشته شده در زبان های دیگر نیاز بود را به حل مشکلات پیش روی خود اختصاص دهند.پراستفاده بودن و پشتیبانی مناسب از آنامروزه پایتون زبان شناخته شده و پراستفاده ای است. رتبه بالای پایتون در شاخص Tiobe و تعداد بالای پروژه های پایتون در گیت هاب نشان دهنده ی این موضوع هستند. پایتون برروی تمام سیستم عامل ها و پلتفورم های بزرگ و حتی اکثر کوچک ها اجرا می شود. بسیاری از سرویس های API ، از پایتون برای ارتباط با دیگر قسمت های سیستم استفاده می کنند.مناسب برای کارهای ساده تا پیچیدهبا وجود اینکه مقدار زیادی از استفاده های پایتون در خودکار کردن کارهای تکراری و نوشتن اسکریپت هاست، پایتون برای ساخت برنامه های حرفه ای نیز استفاده می شود، چه به عنوان یک برنامه مستقل و چه به عنوان یک سرویس آنلاین. اگرچه این زبان از سرعت خیلی بالایی نسبت به زبان های سطح پایین (C/C++) برخوردار نیست، ولی گسترده بودن استفاده های آن می تواند سرعت کمش را جبران کند. زبانی در حال پیشرفت در هر نسخه جدید زبان پایتون ویژگی های جدیدی به این زبان اضافه می شود که به این زبان کمک می کند تا پابه پای روش های جدید برنامه نویسی پیشرفت کند. برای مثال در نسخه های جدید، عملیات های غیرهم زمان(asynchronous operations) یکی از اجزای استاندارد این زبان شده اند که به برنامه های نوشته شده با پایتون، قابلیت انجام چند کار هم زمان را می دهد.استفاده های پایتونهمان گونه که گفته شد، پایه ای ترین و ساده ترین استفاده از پایتون ساخت اسکریپت ها و برنامه هایی برای خودکار کردن فرآیندهای تکراری است. پایتون نه تنها در کارهایی که قبلا با اسکریپت نویسی در شل (shell scripting) انجام می شد جایگزین آن شده است، بلکه به کمک پایتون میتوان کارهایی که قبلا قابل انجام نبود مثل تعامل با مرورگرها یا رابط گرافیکی برنامه ها و یا حتی تشکیل ، پیکربندی و سرپرستی سیستم های مختلف (با استفاده از Ansible و Salt) را انجام داد. ولی اسکریپت نویسی تنها قسمت کوچکی از توانایی های پایتون است. نوشتن برنامه های عادیشما به وسیله ی پایتون می توانید هم برنامه های قابل اجرا در محیط کامند لاین بسازید و هم برنامه هایی دارای محیط گرافیکی و از آنها به عنوان یک فایل اجرایی مستقل استفاده کنید. (البته پایتون توانایی تولید برنامه های مستقل قابل اجرا از اسکریپت نوشته شده در این زبان را به خودی خود ندارد، ولی به وسیله ی پکیج هایی مانند cx_Freeze  و PyInstaller می توان این کار را انجام داد).استفاده در علوم داده(Data Science) و یادگیری ماشین(Machine Learning) آنالیز داده های پیچیده امروزه به یکی از قسمت های مهم و به سرعت درحال پیشرفت فناوری های اطلاعات تبدیل شده است. بیشتر کتاب خانه های مورد استفاده در علوم داده و یادگیری ماشین دارای رابط های پایتون هستند که این ویژگی، پایتون را به پراستفاده ترین زبان رابط برای این گونه کارها تبدیل کرده است.سرویس های وب و REST APIها کتاب خانه های بومی پایتون و فریم ورک های ساخته شده برای آن راه های سریع و ساده ای برای ساخت انواع سرویس ها برای ما فراهم می کند، از سرویس ساده ای مانند REST API گرفته تا موضوعات پیچیده ای مانند یک سایت کامل را برای ما فراهم می کند. همانگونه که ذکر شد، نسخه های جدید پایتون توانایی پشتیبانی از عملیات های غیرهمزمان (asynchronous operations) را پیدا کرده اند، که به سایت ساخته شده با پایتون اجازه می دهد پاسخگوی درخواست ده ها هزار کاربر در هر ثانیه باشند. پایتون، زبانی برای صلح بین زبان ها :)پایتون به عنوان یک زبان رابط/زبان ارتباط دهنده(glue language) شناخته می شود، این اسم از توانایی پایتون در برقرار کردن ارتباط بین کدهای مختلف آمده است. ما اگر برنامه های مختلفی داشته باشیم که بخواهیم با هم در ارتباط باشند، ولی خود آن برنامه ها نمی توانند مستقیم با هم در ارتباط باشند، در بسیاری از موارد می توانیم از پایتون برای برقرار کردن این رابطه استفاده کنیم.پایتون چگونه به ساده شدن برنامه نویسی کمک می کندهمانگونه که گفته شد دستورات پایتون به نحوی ساخته شده اند که خواندن و فهمیدن آن آسان باشد. برای نوشتن برنامه ای که به ما خروجی &#39;Hello world&#39; را می دهد در پایتون 3 تنها نیاز به یک خط کد داریم:print(“Helloworld!”)پایتون بصورت پیش فرض دستورات زبانی زیادی برای انجام پروسه های معمول برنامه نویسی دارد. برای مثال اگر در یک برنامه بخواهیم که خط های یک فایل متنی را به یک لیست وارد کنیم و و در حین این کار، دستور ایجاد خط جدید که در انتهای هر خط وجود دارد را حذف کنیم، تنها نیاز به 2خط کد زیر داریم :with open(‘myfile.txt’) as my_file:&#xA;     file_lines = [x.rstrip(‘\n’) for x in my_file]دستور  with/as برای مدیریت محتوا فایل های مختلف است. این دستور برای فراهم کردن یک محتوا برای یک قسمت از کد ما است که در هنگام خروج از آن قسمت کد، آن آن محتوا نیز از بین می رود. در این مثال محتوایی که نام آن my_file است بوسیله ی دستور open بوجود می آید که کل فایل را باز می کند (این دستور جایگزین کوتاه تری برای تکرار چندباره دستور باز کردن فایل برای خواندن خط جدید و دوباره بستن آن است).در خط دوم قسمت [for x in my_file] یکی از راه های پایتون برای خواندن اجزای یک لیست است. این قسمت به ما اجازه می دهد که محتوای داخل یک جسم خارجی را مطالعه کنیم(در این مثال ما تک به تک خط های داخل my_file را به عنوان اجسام متفاوت مطالعه می کنیم و هر خط آن را به عنوان جسم x باز می گردانیم) و در هر عنصر خوانده شده به طور اتوماتیک تغییرات دلخواه را انجام دهیم (در این مثال، دستور ما حذف دستور رفتن به خط بعد از انتهای هر خط، با دستور x.strip است) و به یک لیست اضافه کنیم.زبان پایتون ویژگی های دیگری که باعث راحت تر شدن استفاده روزمره از آن است نیز دارد. بیشتر انواع شی های مدرن(مانند رشته های یونیکد) درون خود زبان تعریف شده اند. سازه های داده متفاوتی مانند لیست ها، دیکشنری ها، tuple  ها و ست ها هم به طور پیش فرض در خود زبان قابل دسترسی هستند.امیر هستم از ایران پایتونیرز، ممنونم از وقتی که برای خوندن این پست گذاشتید.این پست قسمت اول از یک مطلب دو قسمتی هستش که قسمت دوم آن روز چهارشنبه پست میشه. این قسمت رو به ویژگی های خوب پایتون پرداختیم، درقسمت بعدی این پست به نسخه های متفاوت پایتون، اشکالاتی که به پایتون گرفته میشه و کتاب خانه های پایتون می پردازیم و بیشتر با اونها آشناتون می کنیم.ما به تازگی استفاده از پلتفرم ویرگول رو شروع کردیم و به زودی مطالب بیشتری هم اینجا قرار داده میشه.برای دیدن ویدیو های آموزشی دیگری که دوستانم برای شما ساخته اند، می تونید به کانال ما در آپارات ، یوتیوب و یا تلگرام مراجعه کنید.منبع : www.infoworld.com</description><category>امیر بیات پور</category><author>امیر بیات پور</author><pubDate>Mon, 28 Sep 2020 18:46:47 +0330</pubDate></item></channel></rss>