diff --git a/source/_static/logo/python-3-11.png b/source/_static/logo/python-3-11.png new file mode 100644 index 0000000..490cdb3 Binary files /dev/null and b/source/_static/logo/python-3-11.png differ diff --git a/source/_static/sitemap-index.xml b/source/_static/sitemap-index.xml index ae0e530..0e5e865 100644 --- a/source/_static/sitemap-index.xml +++ b/source/_static/sitemap-index.xml @@ -15,28 +15,28 @@ 0.80 - https://python.coderz.ir/lessons/l01.html - 2021-03-17T17:10:25+00:00 + https://python.coderz.ir/lessons/l01-introduction-to-python.html + 2023-03-17T17:10:25+00:00 0.80 - https://python.coderz.ir/lessons/l02.html - 2021-03-17T17:10:25+00:00 + https://python.coderz.ir/lessons/l02-setup-python.html + 2023-03-17T17:10:25+00:00 0.80 - https://python.coderz.ir/lessons/l03.html - 2021-03-17T17:10:25+00:00 + https://python.coderz.ir/lessons/l03-create-and-run-a-python-project.html + 2023-03-17T17:10:25+00:00 0.80 - https://python.coderz.ir/lessons/l04.html - 2021-03-17T17:10:25+00:00 + https://python.coderz.ir/lessons/l04-python-interactive-mode.html + 2023-03-17T17:10:25+00:00 0.80 - https://python.coderz.ir/lessons/l05.html - 2021-03-17T17:10:25+00:00 + https://python.coderz.ir/lessons/l05-object-oriented-programming.html + 2023-03-17T17:10:25+00:00 0.80 diff --git a/source/_templates/sphinx_minoo_theme/includes/header.html b/source/_templates/sphinx_minoo_theme/includes/header.html index da109bb..6fdece4 100644 --- a/source/_templates/sphinx_minoo_theme/includes/header.html +++ b/source/_templates/sphinx_minoo_theme/includes/header.html @@ -39,7 +39,7 @@ {% if theme_direction == "ltr" %} {% else %} - + {% endif %} {%- block linktags %} @@ -100,7 +100,7 @@ {% endif %} - + diff --git a/source/_templates/sphinx_minoo_theme/static/minoo-20230203.css b/source/_templates/sphinx_minoo_theme/static/minoo-20230401.css similarity index 100% rename from source/_templates/sphinx_minoo_theme/static/minoo-20230203.css rename to source/_templates/sphinx_minoo_theme/static/minoo-20230401.css diff --git a/source/_templates/sphinx_minoo_theme/static/minoo-20210403.js b/source/_templates/sphinx_minoo_theme/static/minoo-20230401.js similarity index 97% rename from source/_templates/sphinx_minoo_theme/static/minoo-20210403.js rename to source/_templates/sphinx_minoo_theme/static/minoo-20230401.js index 0009e38..eadb36e 100644 --- a/source/_templates/sphinx_minoo_theme/static/minoo-20210403.js +++ b/source/_templates/sphinx_minoo_theme/static/minoo-20230401.js @@ -152,6 +152,13 @@ $( document ).ready(function() { $('#sidebar-bottom').animate({scrollTop: pos.top - 232 }, "slow"); + // Fixing the lists + // $("ul li p").each(function(){ + // var value = $(this).html(); + // $(this).replaceWith(value); + // }); + + }); $( window ).resize(function() { diff --git a/source/conf.py b/source/conf.py index f413f7e..90b71f5 100644 --- a/source/conf.py +++ b/source/conf.py @@ -6,7 +6,7 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'PythonPersianTutorial' +project = 'پایتون به پارسی' copyright = '2015, Saeid Darvish' author = 'Saeid Darvish' @@ -27,4 +27,6 @@ html_theme = 'sphinx_minoo_theme' html_theme_path = ["_templates"] +html_title = 'کتاب ' + project + html_static_path = ['_static'] diff --git a/source/index.rst b/source/index.rst index e0ea0d3..fec8fa4 100644 --- a/source/index.rst +++ b/source/index.rst @@ -1,37 +1,39 @@ .. role:: emoji-size .. meta:: - :description: کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون به فارسی - صفحه نخست + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - صفحه نخست :keywords: پایتون, آموزش, آموزش برنامه نویسی, آموزش پایتون, برنامه نویسی, کتاب آموزش, آموزش فارسی, کتاب آزاد, پایتون نسخه +.. _home-page: -کتاب آزاد آموزش زبان برنامه‌نویسی پایتون -================================================== +پایتون به پارسی +==================== :: .-=-. .--. __ .' '. / " ) - _ .' '. / .-. \ / .-'\ PYTHON TUTORIAL + _ .' '. / .-. \ / .-'\ PYTHON ( \ / .-. \ / / \ \ / / ^ IN PERSIAN \ `-` / \ `-' / \ `-` / "BATTERIES INCLUDED", ENJOY! jgs`-.-` '.____.' `.____.' -این کتاب تلاشی است برای آموزش زبان برنامه‌نویسی پایتون (Python) بر پایه‌ پیاده‌سازی استاندارد آن (CPython)، به شکلی کامل و ساده که بتواند هر دو شاخه از پایتون (نسخه‌های 3x و 2x) را البته با محوریت نسخه 3x (به خصوص از درس هفدهم به بعد) پوشش دهد و همچنین برای افرادی که تاکنون سابقه‌ برنامه‌نویسی نداشته‌اند نیز کاربردی و مفید باشد. یادگیری پایتون نیازی به پیش‌زمینه برنامه‌نویسی ندارد و تنها پیش‌نیاز آن علاقه خوانندگان به فن برنامه‌نویسی است. +این کتاب تلاشی است برای آموزش زبان برنامه‌نویسی پایتون (Python) بر پایه‌ پیاده‌سازی استاندارد آن (CPython)، به زبانی ساده و روان که بتواند برای افرادی که تاکنون پیشینه برنامه‌نویسی نداشته‌اند نیز کاربردی و مفید باشد. مطالعه این کتاب نیازی به پیش‌زمینه برنامه‌نویسی ندارد و تنها پیش‌نیاز آن علاقه خوانندگان به فن برنامه‌نویسی است. + .. toctree:: :maxdepth: 6 preface - lessons/l01 - lessons/l02 - lessons/l03 - lessons/l04 - lessons/l05 - lessons/l06 + lessons/l01-introduction-to-python + lessons/l02-setup-python + lessons/l03-create-and-run-a-python-project + lessons/l04-python-interactive-mode + lessons/l05-object-oriented-programming + lessons/l06-python-syntax lessons/l07 lessons/l08 lessons/l09 @@ -60,9 +62,12 @@ ---- -**شروع:** فروردین ۱۳۹۴ **و** **آخرین بروزرسانی:** آذر ۱۴۰۰ [`گزارش توسعه `__] - +.. figure:: /_static/logo/python-3-11.png + :align: center + :scale: 60 % + :alt: بروز شده با نسخه 3.11 +**شروع:** فروردین ۱۳۹۴ **و** **آخرین بروزرسانی:** فروردین ۱۴۰۲ [`گزارش توسعه `__] - **در حال بروزرسانی با نسخه ۳.۱۱ پایتون** diff --git a/source/lessons/l01.rst b/source/lessons/l01-introduction-to-python.rst similarity index 58% rename from source/lessons/l01.rst rename to source/lessons/l01-introduction-to-python.rst index f31d350..46b66df 100644 --- a/source/lessons/l01.rst +++ b/source/lessons/l01-introduction-to-python.rst @@ -1,10 +1,11 @@ .. role:: emoji-size .. meta:: - :description: کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون به فارسی - درس یکم آشنایی با پایتون + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس یکم: آشنایی با پایتون :keywords: معرفی پایتون, تاریخچه پایتون, کارایی پایتون, نسخه های پایتون, ویژگی های پایتون, آشنایی با پایتون, آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون +.. _lesson-01: درس ۰۱: آشنایی با زبان برنامه‌نویسی پایتون ================================================= @@ -17,7 +18,9 @@ Photo by `Michael Olsen `__ -این درس با بیان تاریخچه ایجاد **زبان برنامه‌نویسی پایتون** شروع و با توصیفی کوتاه و شرح ویژگی‌های آن ادامه می‌یابد؛ در شرح ویژگی‌ها سعی شده است کمی نیز توضیحات غیرپایتونی برای درک بهتر موضوعات ارایه گردد. همچنین در مورد کارایی پایتون و این موضوع که چرا در حال حاضر دو شاخه متفاوت از این زبان وجود دارد نیز صحبت شده است. هدف این درس ایجاد یک پیش‌زمینه‌ بدون ابهام از پایتون است! به این امید که مفید باشد و بتواند شما را به یادگیری این زبان تشویق کند :emoji-size:`😉`. +این درس با بیان تاریخچه ایجاد **زبان برنامه‌نویسی پایتون** شروع و با توصیفی کوتاه و شرح ویژگی‌های آن ادامه می‌یابد؛ در شرح ویژگی‌ها سعی شده است کمی نیز توضیحات غیرپایتونی برای درک بهتر موضوعات ارایه گردد. همچنین در مورد کارایی پایتون و سابقه نسخه‌های آن نیز صحبت شده است. هدف این درس ایجاد یک پیش‌زمینه‌ بدون ابهام از پایتون است! به این امید که مفید باشد و بتواند شما را به یادگیری این زبان تشویق کند :emoji-size:`😉`. + + :emoji-size:`✔` سطح: پایه @@ -28,33 +31,73 @@ ---- + +.. _python-history: + تاریخچه --------- + داستان [#f1]_ پایتون از اواخر سال ۱۹۸۲ میلادی آغاز می‌شود، سالی که آقای `روسوم `_ پس از پایان دانشگاه به عنوان یک برنامه‌نویس وارد تیم توسعه‌ زبان ABC در مرکز `CWI `_ واقع در آمستردام هلند می‌شود. `ABC `_ یک زبان برنامه‌نویسی تفسیر‌شده (Interpreted) با اهداف آموزشی است که از اواخر دهه هفتاد میلادی، تحت پروژه‌ای در این مرکز آغاز شده بود. وی چهار یا پنج سال بعد، زمانی که از پروژه‌ زبان ABC نتیجه‌ مطلوب حاصل نمی‌گردد از آن خارج و به تیم توسعه‌ `سیستم عامل آمیب `_ می‌پیوندد. این موضوع از آن جهت دارای اهمیت است که در هنگام کار بر روی این سیستم عامل بود که آقای روسوم به فکر ایجاد یک زبان اسکریپتی (Scripting Language) جدید می‌افتد. در دسامبر سال ۱۹۸۹ میلادی، تعطیلات کریسمس فرصتی می‌شود تا آقای روسوم به ایده سرگرم کننده‌ [#f2]_ خود بپردازد. البته پس از آن نیز زمان زیادی از وقت‌های آزاد خود را برای پیشرفت پروژه‌ای که ”Python“ نامیده بود صرف می‌کند. در این مسیر، تجربه‌ کار بر روی زبان ABC و همینطور مطالعات وی بر روی زبان‌ `Modula-3 `_ نقش فراوانی داشته است، در‌ واقع او یک نسخه‌ شخصی از بخش‌های مورد علاقه‌ خود از ABC ایجاد نمود. او یک ماشین مجازی ساده، یک تجزیه‌کننده (پارسرParser) ساده و یک سیستم زمان‌اجرا (Runtime System) ساده ایجاد کرد؛ یک زبان با نحو (سینتکس Syntax) اولیه که از تو‌رفتگی (Indentation) برای بلاک‌بندی بهره می‌برد و از انواع داده [#f3]_ دیکشنری، لیست، رشته و اعداد پشتیبانی می‌کرد و بر خلاف ABC توسعه‌پذیر می‌بود. یک سال بعد آقای روسوم از پایتون در پروژه‌ آمیب استفاده می‌کند؛ نتیجه‌ مطلوب و نیز بازخورد آن در بین همکارانش موجب می‌شود تا وی به بسیاری از بهینه سازی‌های اولیه در پایتون اقدام نماید. این روند ادامه می‌یابد تا اینکه سرانجام در ماه دوم از سال ۱۹۹۱ میلادی این زبان را با نسخه 0.9.0 و تحت پروانه‌ای مشابه با پروانه‌ `MIT `_ از طریق یکی از «گروه‌های خبری» (یوزنت Usenet) با عنوان `alt.sources `_ منتشر می‌سازد که با استقبال بالایی نیز رو به رو می‌گردد. +.. pull-quote:: + + "Python version 0.9.0 is released" + منشا انتخاب نام پایتون توسط آقای روسوم برخلاف تصور عمومی یا آنچه که از لوگوی آن مشاهده می‌شود به نوع خاصی از مار مربوط نمی‌شود!؛ در حقیقت این نام برگرفته از یک سریال کمدی تولید انگلستان با عنوان ”`Monty Python's Flying Circus `_“ می‌باشد که پخش اصلی آن در طی سال‌های ۱۹۶۹ تا ۱۹۷۴ میلادی از شبکه‌ BBC One بوده است. + +.. _python-introduction: + توصیفی کوتاه -------------- -سادگی و خوانایی از ویژگی‌های بارز زبان برنامه‌نویسی پایتون است، آنچنان ساده که حتی کودکان نیز قادر به آموختن آن هستند و قدرت در کنار این سادگی و خوانایی، معجزه‌ پایتون می‌باشد. از نگاه هر برنامه‌نویسی، برنامه‌های پایتون مجموعه‌ای از کد‌های زیبا هستند، بدون هیچ آشفتگی و پیچیدگی. این زبان به جای این که برنامه‌نویس را درگیر فهم ساختارش کند، به ابزاری قدرتمند برای تحقق تمام آنچه که در فکر برنامه‌نویس است تبدیل می‌شود، اگر در اجرای نخست کدهای پایتون خود هیچ خطایی نگرفتید؛ تعجب نکنید! و اگر هم گرفتید، خوشحال باشید!. این زبان به شدت دوست داشتنی است :emoji-size:`😍`. `ilovepython# `_ +سادگی و خوانایی از ویژگی‌های بارز زبان برنامه‌نویسی پایتون است، آنچنان ساده که حتی کودکان نیز قادر به آموختن آن هستند و قدرت در کنار این سادگی و خوانایی، معجزه‌ پایتون می‌باشد. از نگاه هر برنامه‌نویسی، برنامه‌های پایتون مجموعه‌ای از سطرهای منظم هستند، بدون هیچ آشفتگی و پیچیدگی. این زبان به جای این که برنامه‌نویس را درگیر فهم ساختارش کند، به ابزاری قدرتمند برای تحقق تمام آنچه که در فکر اوست تبدیل می‌شود، اگر در اجرای نخست کدهای پایتون خود هیچ خطایی نگرفتید؛ تعجب نکنید! و اگر هم گرفتید، خوشحال باشید!. این زبان به شدت دوست داشتنی است :emoji-size:`😍`. `ilovepython# `_ + +زبان برنامه‌نویسی پایتون همانطور که اشاره شد در سال ۱۹۹۱ میلادی توسط آقای روسوم خلق شده و توسعه‌ آن نیز زیر نظر مستقیم اوست. آقای روسوم زاده‌ سال ۱۹۵۶ میلادی و نخستین دارنده‌ عنوان `BDFL `_ (دیکتاتور خیرخواه جاویدان)‌ است. او پس از حضور در شرکت‌های گوگل و دراپ‌باکس، هم اکنون (سال 2023) در مایکروسافت مشغول به فعالیت است. `(صفحه شخصی) `_ + +توسعه‌ پایتون با عصر توسعه و محبوبیت زبان‌های متن باز دیگری همچون Perl و Ruby هم‌ زمان بوده که این امر به پیشرفت و توسعه‌ آن کمک زیادی کرده است. + +پایتون یک جامعه‌ کاربری بسیار بزرگ و پویا به همراه خود دارد که عامل پیشرفت و توسعه‌ بسیار مهمی برای هر زبان برنامه‌نویسی به شمار می‌رود. این جامعه هر ساله با برپایی `همایش‌های گوناگون `_ در سراسر جهان به تبادل آموخته‌ها می‌پردازد. یکی از رایج‌ترین این همایش‌ها `PyCon `_ (پای‌کان) می‌باشد که هر ساله در سراسر جهان برگزار می‌شود. + +این زبان علاوه بر اینکه در توسعه برنامه‌های کاربردی زیادی به کار گرفته شده است، توسط شرکت یا سازمان‌های مطرح زیادی نیز در امور گوناگون در حال استفاده است که از جمله این موارد می‌توان به: reddit ،Pinterest ،Instagram (شبکه‌های اجتماعی) / Google (موتور جستجوگر و نیز سرویس‌های یوتیوب و نقشه) / Yahoo (سرویس نقشه) / IBM ،Intel ،Cisco ،Seagate (تست سخت‌افزار) / Netflix ،Spotify ،Uber ،Facebook ،Amazon ،Microsoft (تحلیل داده و ماشین لرنینگ) / Dropbox (سرویس میزبانی ابری فایل) / EVE Online (بازی‌های آنلاین) / NASA ،Los Alamos (امور علمی) / iRobot (رباتیک) / Pixar ،Industrial Light and Magic ،Disney (ساخت فیلم‌های انیمیشن) / BitTorrent (اشتراک فایل نظیر به نظیر) / CIA (وب‌سایت) / PayPal (سیستم انتقال پول آنلاین) / Mercurial (سیستم کنترل نسخه) / ESRI (نقشه‌برداری در برنامه GIS) و بسیاری دیگر [#f4]_ اشاره نمود. `(پایتون در stackshare) `_ -زبان برنامه‌نویسی پایتون همانطور که اشاره شد در سال ۱۹۹۱ میلادی توسط آقای روسوم خلق شده و توسعه‌ آن نیز زیر نظر مستقیم اوست. آقای روسوم زاده‌ سال ۱۹۵۶ میلادی و نخستین دارنده‌ عنوان `BDFL `_ (دیکتاتور خیرخواه جاویدان)‌ می‌باشد و هم اکنون (سال ۲۰۱۵) در شرکت Dropbox مشغول به کار است. `(صفحه شخصی) `_ -توسعه‌ پایتون با عصر توسعه و محبوبیت زبان‌های متن باز دیگری همچون Tcl ،Perl و Ruby هم‌ زمان بوده که این امر به پیشرفت و توسعه‌ آن کمک زیادی کرده است. +.. _python-interpreter: + +مفسر زبان پایتون +----------------- + +تنها زبان قابل فهم و اجرا برای هر ماشین (یا رایانه‌)، زبان ماشین (Machine Language) خاص آن است که متناسب با معماری پردازنده آن تعیین می‌شود. درک و پیاده‌سازی این زبان برای انسان کاری طاقت فرساست، از این رو با پیشرفت دانش پردازش داده، زبان‌های دیگر برنامه‌نویسی که به زبان انسان نزدیک‌تر هستند، توسعه یافته که تمامی آن‌ها پیش از اجرا می‌بایست به زبان ماشین ترجمه شوند. چگونگی فرآیند این ترجمه، عاملی است که سبب تفاوت زبان‌های برنامه‌نویسی و کاربرد آن‌ها شده است. عمل ترجمه برای کدهای اسمبلی توسط اسمبلر (`Assembler `_) و برای باقی زبان‌ها توسط کامپایلر (`Compiler `_) یا مفسر (`Interpreter `_) انجام می‌پذیرد. + + +یک کامپایلر (در زبان‌های کامپایلری مانند C) تمامی سطرهای سورس کد برنامه را به صورت یکجا خوانده و سپس با ساخت یک فایل جدید و مستقل از سورس کد با نام «کد مقصد یا آبجکت کد» (Object Code) یا فایل اجرایی (Executable) عمل ترجمه به زبان ماشین را پایان می‌بخشد. خروجی حاصل از کامپایلر توانایی هر چند بار اجرا در رایانه مقصد، بدون نیاز به کامپایل دوباره را دارد، اما فاقد حمل‌پذیری بوده و برای اجرا در ماشینی با معماری متفاوت نیازمند کامپایل دوباره با یک کامپایلر سازگار می‌باشد. البته این ضعف در زبان‌هایی به مانند Java ‌با ایجاد بایت‌کد (ByteCode) کاملا از بین رفته است. در طرفی دیگر، یک مفسر (در زبان‌های تفسیر‌ی) سورس کد برنامه را به صورت سطر به سطر می‌خواند و هر سطر را به صورت جداگانه به زبان ماشین ترجمه و سپس بلافاصله آن را اجرا می‌کند. به این صورت که هنگامی یک سطر در حال اجراست در همان لحظه سطر بعدی در حال ترجمه به زبان ماشین می‌باشد. برنامه‌های نوشته شده با زبان‌های برنامه‌نویسی تفسیر‌ی برای هر بار اجرا در رایانه هدف نیاز به تفسیر دوباره دارند. این تفاوت عملکرد گرچه باعث کاهش سرعت اجرای زبان‌های تفسیر‌ی نسبت به کامپایلری می‌شود ولی خواندن سطر به سطر کدها در مفسر علاوه بر قابلیت تشخیص خطای بهتر، این امکان را بوجود می‌آورد که بتوان حتی در زمان اجرا نیز سورس کد را ویرایش و تغییر داد. این دسته از زبان‌ها در مواقعی که پیوسته نیاز به ویرایش کد و اعمال تغییر است، بسیار مورد توجه قرار گرفته‌اند. + +**پایتون** در دسته زبان‌های تفسیری قرار می‌گیرد که در ادامه با خصوصیات آن بیشتر آشنا خواهید شد. کدها و دستورات تهیه شده به این زبان برای به اجرا درآمدن توسط پردازنده (CPU) ماشین به یک مفسر نیاز دارد. تا‌کنون پیاده‌سازی‌های گوناگونی و با اهداف متفاوتی از مفسر پایتون توسعه یافته است. در این بین، CPython (سی‌پایتون) پیاده‌سازی استاندارد و رسمی مفسر پایتون می‌باشد که با استفاده از زبان برنامه‌نویسی C توسعه می‌یابد. توسط CPython می‌توان علاوه بر کدهای پایتون، کدهای توسعه یافته به‌‌ زبان‌های C و ++C را نیز در قالب یک پروژه به اجرا درآورد. + +از دیگر پیاده‌سازی های مهم مفسر پایتون می‌توان به `Jython `_ (خاص ماشین مجازی جاوا)، `IronPython `_ (خاص چارچوب NET. مایکروسافت)، `PyPy `_ (با هدف سرعت اجرای بیشتر)، `Stackless `_ (با هدف اجرای بهتر برنامه‌های چند‌نخی - Multithread) اشاره نمود. [#f5]_ + +با این توضیحات اکنون می‌دانیم که مفسر پایتون وظیفه خواندن سورس کد برنامه، ترجمه به زبان ماشین و در نهایت اجرای آن را برعهده دارد. عمل ترجمه و اجرای سورس کد توسط CPython که مورد توجه این کتاب است، در دو مرحله متوالی زیر خلاصه می‌شود: + +۱- کامپایل یا ترجمه سورس کد به بایت‌کد (ByteCode) + +۲- تفسیر بایت‌کد به زبان ماشین و اجرای آن + +به این صورت که ابتدا سورس کد برنامه‌ به یک زبان میانی نزدیک به زبان ماشین با نام بایت‌کد ترجمه می‌شود و سپس بایت‌کد حاصل به ماشین مجازی (Virtual Machine) - به عنوان موتور زمان‌اجرای پایتون - فرستاده و در آن تفسیر و اجرا می‌گردد. + +.. note:: + با این که پایتون (پیاده‌سازی CPython) به عنوان یک زبان تفسیر‌ی شناخته می‌شود ولی در زمان‌اجرا (RunTime) کدها را یکبار به بایت‌کد ترجمه می‌کند (با استفاده از یک کامپایلر). -پایتون یک جامعه‌ کاربری بسیار بزرگ و پویا به همراه خود دارد که عامل پیشرفت و توسعه‌ بسیار مهمی برای هر زبان برنامه‌نویسی به شمار می‌رود. این جامعه هر ساله با برپایی `همایش‌های گوناگون `_ در سراسر جهان به تبادل آموخته‌ها می‌پردازد. یکی از رایج‌ترین این همایش‌ها `PyCon `_ (پای‌کان) می‌باشد که خوشبختانه ‌در ایران (`PyCon Iran یا PyIran `_) نیز برگزار می‌شود. -این زبان تاکنون توسط شرکت یا سازمان‌های مطرح زیادی مورد استفاده قرار گرفته و در برنامه‌های کاربردی زیادی نیز از آن استفاده شده است که از جمله این موارد می‌توان به: reddit ،Pinterest ،Instagram (شبکه‌های اجتماعی) / Google (موتور جستجوگر و نیز سرویس یوتیوب) / Yahoo (سرویس نقشه) / IBM ،Intel ،Cisco ،Seagate (تست سخت‌افزار) / Dropbox (سرویس میزبانی ابری فایل) / EVE Online (بازی‌های آنلاین) / NASA ،Los Alamos (امور علمی) / iRobot (رباتیک) / Pixar ،Industrial Light and Magic ،Walt Disney (ساخت فیلم‌های انیمیشن) / BitTorrent (اشتراک فایل نظیر به نظیر) / CIA (وب‌سایت) / PayPal (سیستم انتقال پول آنلاین) / Mercurial (سیستم کنترل نسخه) / ESRI (نقشه‌برداری در برنامه GIS) و بسیاری دیگر [#f4]_ اشاره نمود. `(پایتون در stackshare) `_ +.. note:: + ماشین مجازی پایتون (CPython VM) به صورت یک حلقه تکرار است که دستورات بایت‌کد را یکی یکی می‌خواند، به زبان ماشین تفسیر و بلافاصله اجرا می‌کند. -یک نکته مهم در مورد زبان برنامه‌نویسی پایتون، انواع پیاده‌سازی‌ (Implementation)‌ آن است. تا‌کنون از این زبان پیاده‌سازی‌های گوناگون و با اهداف متفاوتی توسعه یافته است که از این بین می‌توان به `Jython `_ (خاص ماشین مجازی جاوا)، `IronPython `_ (خاص چارچوب NET. مایکروسافت)، `PyPy `_ (با هدف سرعت اجرای بیشتر)، `Stackless `_ (با هدف اجرای بهتر برنامه‌های چند‌نخی) و البته `CPython `_ اشاره نمود. [#f5]_ -CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصلی زبان پایتون می‌باشد که با استفاده از زبان برنامه‌نویسی C توسعه می‌یابد. توسط CPython می‌توانید علاوه بر کتابخانه‌ پایتون از کتابخانه‌‌ زبان‌های C و ++C نیز بهره ببرید. +مفسر پایتون همچنین وظیفه اختصاص و آزاد‌سازی حافظه (Memory) را به عهده دارد. CPython، برای آزاد‌سازی حافظه از روش «شمارش ارجاع» (`Reference Counting `_) استفاده می‌کند. -توجه داشته باشید، پایتون (Python) نام یک زبان برنامه‌نویسی است و CPython (یا دیگر پیاده‌سازی‌‌های زبان پایتون) در واقع برنامه‌ایست که توسط آن می‌توان کد منبع (سورس کد Source Code) یک برنامه به زبان پایتون را اجرا نمود. به بیانی دیگر CPython یک پردازنده‌ برای زبان پایتون است. +.. _python-features: ویژگی‌ها --------- @@ -66,13 +109,11 @@ CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصل **پایتون** یک زبان برنامه‌نویسی همه منظوره (General-Purpose) است به این معنی که می‌توان از آن در توسعه طیف گسترده‌ای از انواع برنامه‌ها در حوزه‌های نرم‌افزاری گوناگون بهره برد؛ از جمله در توسعه برنامه‌های تحت وب و برنامه‌هایی با قابلیت «واسط گرافیکی کاربر» (`GUI `_). -**پایتون** یک زبان برنامه‌نویسی به همراه مجموعه‌ بزرگی از قابلیت‌های از پیش آماده و قابل حمل است که به عنوان کتابخانه‌ استاندارد آن شناخته می‌شود. همچنین در کنار این کتابخانه‌ می‌توان از طیف بسیار وسیعی از کتابخانه‌های شخص ثالث (Third-Party) پایتون [#f6]_ نیز بهره برد. کتابخانه‌های شخص ثالث ابزارهای مفیدی را در امور فروانی همچون: برنامه‌نویسی علمی ~ NumPy ،SciPy / پردازش زبان‌های طبیعی ~ NLTK / ارتباط درگاه سریال ~ PySerial / ایجاد بازی ~ PyGame ،Pyglet ،PyOpenGL ،PySoy / هوش مصنوعی ~ PyBrain / ایجاد وب سایت ~ Django ،Flask ،Bottle ،CherryPy / پردازش تصویر ~ PIL/Pillow ،PythonMagick / واسط گرافیکی کاربر ~ PyGtk ،PyQt ،WxPython / کار با اسناد rdflib ~ pdf / رمزنگاری ~ PyCrypto ،pyOpenSSL ،cryptography و بسیاری دیگر... که مدام در حال توسعه هستند و بر تعداد و تنوع آن‌ها نیز افزوده می‌شود را در اختیار برنامه‌نویسان پایتون قرار می‌دهند. +**پایتون** یک زبان برنامه‌نویسی به همراه مجموعه‌ بزرگی از قابلیت‌های از پیش آماده و قابل حمل است که به عنوان کتابخانه‌ استاندارد آن شناخته می‌شود. همچنین در کنار این کتابخانه‌ می‌توان از طیف بسیار وسیعی از کتابخانه‌های شخص ثالث (Third-Party) پایتون [#f6]_ نیز بهره برد. کتابخانه‌های شخص ثالث ابزارهای مفیدی را در امور فروانی همچون: برنامه‌نویسی علمی ~ SciPy / پردازش زبان‌های طبیعی ~ NLTK / ارتباط درگاه سریال ~ PySerial / ایجاد بازی ~ PyGame ،Pyglet ،PyOpenGL ،PySoy / هوش مصنوعی و ماشین لرنینگ ~ PyBrain ،TensorFlow ،PyTorch ،NumPy ،Pandas ،Matplotlib / ایجاد وب سایت ~ Django ،Flask ،Bottle ،CherryPy / پردازش تصویر ~ PIL/Pillow ،PythonMagick / واسط گرافیکی کاربر ~ PyGtk ،PyQt ،WxPython / کار با اسناد rdflib ~ pdf / رمزنگاری ~ PyCrypto ،pyOpenSSL ،cryptography و بسیاری دیگر... که مدام در حال توسعه هستند و بر تعداد و تنوع آن‌ها نیز افزوده می‌شود را در اختیار برنامه‌نویسان پایتون قرار می‌دهند. -**پایتون** یک زبان برنامه‌نویسی پویا (Dynamic) بوده و نیز از قابلیت مدیریت خودکار حافظه برخوردار است. این زبان شباهت‌هایی با TCL ،Perl ،Ruby ،PHP یا دیگر زبان‌های برنامه‌نویسی پویا دارد. در این نوع زبان‌ها بر‌خلاف زبان‌های ایستا (Static) مانند C++ ،C و Java نیازی به تعریف صریح نوع متغیرها [#f7]_ (Variables) نیست و همچنین نوع متغیر در طول برنامه قابل تغییر است. در زبان‌های پویا متغیرها از خود نوعی ندارند و تصمیم گیری برای تخصیص نوع در «زمان اجرا» (RunTime) انجام می‌پذیرد. +**پایتون** یک زبان برنامه‌نویسی پویا (Dynamic) است. این زبان شباهت‌هایی با Perl ،Ruby ،PHP یا دیگر زبان‌های برنامه‌نویسی پویا دارد. در این نوع زبان‌ها بر‌خلاف زبان‌های ایستا (Static) مانند C++ ،C و Java نیازی به تعریف صریح نوع متغیرها [#f7]_ (Variables) نیست و همچنین نوع متغیر در طول برنامه قابل تغییر است. در زبان‌های پویا متغیرها از خود نوعی ندارند و تصمیم گیری برای تخصیص نوع در «زمان اجرا» (RunTime) انجام می‌پذیرد. -بر خلاف زبان C، در پایتون اختصاص و آزاد‌سازی حافظه (Memory) به صورت خودکار انجام می‌شود. پایتون برای آزاد‌سازی حافظه از دو روش «شمارش ارجاع» (Reference Counting) و «زباله روبی» [#f8]_ (Garbage Collection) بهره می‌گیرد. (البته فراموش نشود که صحبت در مورد پیاده‌سازی CPython است) - -با اینکه پایتون یک زبان پویاست ولی در عین حال یک زبان «وابسته شدید به نوع» (Strongly Typed) نیز می‌باشد. در این نوع زبان‌ها (به مانند Java) تغییر ناگهانی و خودکار نوع داده (یا شی) انجام نمی‌شود؛ به عنوان نمونه چنانچه در پایتون عمل جمع بین یک نوع داده عددی مانند ``3`` و یک نوع داده غیر عددی مانند ``"7"`` صورت گیرد، یک Exception یا استثنای ``TypeError`` گزارش می‌گردد. در مقابل، زبان‌های «وابسته ضعیف به نوع» (Weak Typed) قرار دارند؛ در این زبان‌ها (به مانند Perl) نوع بر حسب موقعیت به صورت خودکار تغییر داده می‌شوند. در این مورد زبان‌های برنامه‌نویسی رفتارهای متفاوتی دارند،‌ به عنوان نمونه حاصل عبارت ``"7" + 3`` در زبان Perl با تبدیل (Convert)‌ خودکار نوع داده غیر عددی ``"7"`` به عدد (``7``)، مقدار ``10`` محاسبه می‌گردد. +با اینکه پایتون یک زبان پویاست ولی در عین حال یک زبان «وابسته شدید به نوع» (Strongly Typed) نیز می‌باشد. در این نوع زبان‌ها (به مانند Java) تغییر خودکار نوع داده انجام نمی‌شود؛ به عنوان نمونه چنانچه در پایتون عمل جمع بین یک نوع داده عددی مانند ``3`` و یک نوع داده غیر عددی مانند ``"7"`` صورت گیرد، یک Exception یا استثنای ``TypeError`` گزارش می‌گردد. در مقابل، زبان‌های «وابسته ضعیف به نوع» (Weak Typed) قرار دارند؛ در این زبان‌ها (به مانند Perl) نوع بر حسب موقعیت به صورت خودکار تغییر داده می‌شود. در این مورد زبان‌های برنامه‌نویسی رفتارهای متفاوتی دارند،‌ به عنوان نمونه حاصل عبارت ``"7" + 3`` در زبان Perl با تبدیل (Convert)‌ خودکار نوع داده غیر عددی ``"7"`` به عدد (``7``)، مقدار ``10`` محاسبه می‌گردد. .. tip:: استثنا‌ در واقع وضعیت یا خطایی (Error) است که در برنامه پیش‌بینی شده و بروز آن‌ به مانند یک اعتراض گزارش می‌شود. از طرفی در برنامه برای هر اعتراض، چگونگی رسیدگی به آن نیز تعریف می‌شود. @@ -88,76 +129,46 @@ CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصل Machine < Assembly < C < C++ < Java < Python -.. tip:: - تنها زبان قابل فهم و اجرا برای هر ماشینی (یا رایانه‌ای)، زبان ماشین (Machine Language) خاص آن است و تمامی برنامه‌های نوشته شده در هر سطحی از انتزاع که باشند، پیش از اجرا می‌بایست به این زبان ترجمه شوند. بدیهی است که نیاز این پردازش اضافی به نسبت از سرعت اجرای برنامه می‌کاهد. عمل ترجمه برای کدهای اسمبلی توسط اسمبلر (`Assembler `_) و برای باقی زبان‌ها توسط کامپایلر (`Compiler `_) یا مفسر (`Interpreter `_) انجام می‌پذیرد. **پایتون** یک زبان برنامه‌نویسی چند‌ الگویی (Multi-Paradigm) است و برنامه‌نویس را مجبور به رعایت الگوی خاصی نمی‌کند. این زبان از الگوهای: دستوری (`Imperative `_) یا رویه‌ای (`Procedural `_)، تابعی (`Functional `_) و شی‌گرایی (`Object-Oriented `_) پشتیبانی می‌کند؛ البته همانظور که گفته شد نمی‌توان پایتون را به صورت خالص (Pure) متعلق به هر یک از این الگوها دانست [#f10]_. جدا از پشتیبانی الگوی برنامه‌نویسی شی‌گرا، ساختار پایتون به صورت کامل شی‌گراست و هر چیزی در این زبان یک شی (Object) است؛ در آینده بیشتر در این مورد صحبت خواهیم کرد. -**پایتون** (پیاده‌سازی CPython) به عنوان یک زبان تفسیر‌شده (Interpreted) شناخته می‌شود. با یک تعریف کلی در این نوع زبان‌ها کار خواندن سورس کد برنامه، ترجمه به زبان ماشین و در نهایت اجرای آن توسط یک مفسر انجام می‌گیرد. در پایتون عمل ترجمه و اجرای سورس کد را می‌توان در دو مرحله متوالی خلاصه نمود: - -۱- کامپایل سورس کد به بایت‌کد (ByteCode) - -۲- تفسیر بایت‌کد به زبان ماشین و اجرای آن - -به این صورت که ابتدا سورس کد برنامه‌ به یک زبان میانی نزدیک به زبان ماشین با نام بایت‌کد ترجمه می‌شود و سپس بایت‌کد حاصل به ماشین مجازی (Virtual Machine) - به عنوان موتور زمان‌اجرای پایتون - فرستاده و توسط آن تفسیر و اجرا می‌گردد. - -.. note:: - با این که پایتون (پیاده‌سازی CPython) به عنوان یک زبان تفسیر‌شده شناخته می‌شود ولی در زمان‌اجرا (RunTime) برای ترجمه‌ سورس کد به بایت‌کد از یک کامپایلر استفاده می‌کند. - - -تفاوت عملکرد کامپایلر و مفسر -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -به صورت خیلی کلی، کوتاه و ساده: - -یک کامپایلر (در زبان‌های کامپایل‌شده) تمامی سطرهای سورس کد برنامه را به صورت یکجا خوانده و سپس با ساخت یک فایل جدید و مستقل از سورس کد با نام «کد مقصد یا آبجکت کد» (Object Code) یا فایل اجرایی (Executable) عمل ترجمه به زبان ماشین را پایان می‌بخشد. برنامه حاصل از کامپایلر توانایی هر چند بار اجرا در رایانه مقصد، بدون نیاز به کامپایل دوباره را دارد، اما فاقد حمل‌پذیری بوده و کاربر نهایی نیز به هیچ عنوان توانایی دسترسی به سورس کد برنامه و تغییر یا ویرایش آن را نخواهد داشت. اما یک مفسر (در زبان‌های تفسیر‌شده) سورس کد برنامه را به صورت سطر به سطر می‌خواند و هر سطر را به صورت جداگانه به زبان ماشین ترجمه و سپس بلافاصله آن را اجرا می‌کند. به این صورت که هنگامی یک سطر در حال اجراست در همان لحظه سطر بعدی در حال ترجمه به زبان ماشین می‌باشد. برنامه‌های نوشته شده با زبان‌های برنامه‌نویسی تفسیر‌شده برای هر بار اجرا در رایانه هدف نیاز به تفسیر دوباره دارند. این تفاوت عملکرد گرچه باعث کاهش سرعت اجرای برنامه‌های تفسیر‌شده نسبت به برنامه‌های کامپایل‌شده می‌شود ولی خواندن سطر به سطر کدها در مفسر علاوه بر قابلیت تشخیص خطای بهتر، این امکان را بوجود می‌آورد که هر کاربری بتواند حتی در زمان اجرای برنامه سورس کد را ویرایش و تغییر دهد؛ این دسته از زبان‌ها در مواقعی که پیوسته نیاز به افزودن ویژگی‌های متفاوت به برنامه است بسیار مورد توجه قرار گرفته‌اند. - -.. note:: - ماشین مجازی پایتون (CPython VM) به صورت یک حلقه تکرار است که دستورات بایت‌کد را یکی یکی می‌خواند، به زبان ماشین تفسیر و بلافاصله اجرا می‌کند. - -**پایتون** یک زبان برنامه‌نویسی قابل‌حمل (Portable) است. می‌توان گفت سورس کد برنامه‌ای به این زبان قابلیت اجرا در هر رایانه‌ای را دارد. بایت‌کد پایتون شبیه به زبان ماشین است ولی با این تفاوت که مخصوص هیچ ماشین (یا رایانه) خاصی نیست. در مقابل،‌ وقتی سورس کد برنامه‌ای توسط کامپایلر به زبان ماشین ترجمه می‌شود، نتیجه آن فایلی است که تنها در ماشین‌هایی که این کد برای آن‌ها (متناسب با معماری `پردازنده `_) ترجمه شده است، قابل اجرا می‌باشد ولی بایت‌کد پایتون به کمک ماشین مجازی خود این توانایی را دارد که در هر ماشینی اجرا گردد. - -.. tip:: - هر ماشین، زبان ماشین مخصوص به خود را دارد و به همین دلیل در حالت عادی اجرای یک برنامه در ماشین‌هایی با معماری متفاوت، در مواردی نیازمند تغییر سورس کد برنامه و نیز ترجمه‌ مجدد آن توسط یک کامپایلر متناسب با معماری آن ماشین خاص می‌باشد. - - ماشین مجازی، بسته‌ایست نرم‌افزاری که قابلیت نصب بر روی انواع ماشین‌ها را داراست و وظیفه‌ آن ایجاد یک ماشین مجزا (بر روی ماشین مقصد) برای اجرای مستقل کدها (بایت‌کدها) می‌باشد. به این نوع ماشین مجازی «ماشین مجازی پردازش» [#f11]_ گفته می‌شود. - -بر همین اساس، هم اکنون سورس کد یک برنامه به زبان پایتون بدون نیاز به هیچ تغییری در تمام سیستم‌های عامل‌ مطرح قابل اجراست. **پایتون** یک زبان برنامه‌نویسی توسعه‌پذیر (Extensible) است. کدهای نوشته شده با پایتون را می‌توان به دیگر سورس کدهای این زبان افزود و همچنین می‌توان از کتابخانه‌ها و کدهای نوشته شده با دیگر زبان‌های برنامه‌نویسی در میان کدهای پایتون استفاده کرد (مانند C و ++C در پیاده‌سازی CPython یا Java در پیاده‌سازی Jython). -**پایتون** دارای دستور زبانی تمیز و خوانایی (Readability) بالای کد است. خوانایی در طراحی پایتون مورد تاکید بوده و در کنار شی‌گرایی از مهم‌ترین ویژگی‌های یک کد به جهت استفاده مجدد می‌باشد. پایتون به مانند زبان ABC از روش «تو‌رفتگی» بوسیله‌ فضاهای خالی برای بلاک‌بندی [#f12]_ استفاده می‌کند. در پایتون اجباری به استفاده از نقطه ویرگول (Semicolon) ``;`` و برخی پرانتز گذاری‌ها نمی‌باشد و البته وجود انواع داده (Data Types) - البته به بیانی درست‌تر «انواع شی» - متنوع و نیز پویایی پایتون موجب کمتر شدن حجم کد‌نویسی و صرفه‌جویی در زمان توسعه نسبت به زبان‌هایی به مانند C++ ،C و حتی Java می‌شود. `تحقیقات `_ نشان می‌دهند: کاری که یک برنامه‌نویس پایتون می‌تواند در مدت زمان دو ماه به انجام برساند، دو برنامه‌نویس ++C در مدت یک سال قادر به تکمیل آن نخواهند بود! +**پایتون** دارای دستور زبانی تمیز و خوانایی (Readability) بالای کد است. خوانایی در طراحی پایتون مورد تاکید بوده و در کنار شی‌گرایی از مهم‌ترین ویژگی‌های یک کد به جهت استفاده مجدد می‌باشد. پایتون به مانند زبان ABC از روش «تو‌رفتگی» بوسیله‌ فضاهای خالی برای بلاک‌بندی [#f12]_ استفاده می‌کند. در پایتون اجباری به استفاده از نقطه ویرگول (Semicolon) ``;`` و برخی پرانتز گذاری‌ها نمی‌باشد و البته وجود انواع داده (Data Types) متنوع و نیز پویایی پایتون موجب کمتر شدن حجم کد‌نویسی و صرفه‌جویی در زمان توسعه نسبت به زبان‌هایی به مانند C++ ،C و حتی Java می‌شود. `تحقیقات `_ نشان می‌دهند: کاری که یک برنامه‌نویس پایتون می‌تواند در مدت زمان دو ماه به انجام برساند، دو برنامه‌نویس ++C در مدت یک سال قادر به تکمیل آن نخواهند بود! **پایتون** یک زبان حساس به حرف (Case Sensitive) است. در این نوع زبان‌ها (مانند C ،C++ ،Java ،Perl و غیره...) بین حروف کوچک (Lowercase) و بزرگ (Uppercase) به مانند a و A تفاوت وجود دارد. با توجه به این موضوع، مفسر پایتون بین کلمات True ،true و TRUE تمایز می‌گذارد. +.. _python-performance: + کارایی -------- -معمولا افراد در مواجه با یادگیری زبان پایتون نگرانی‌هایی در مورد کارایی (Performance) برنامه‌های توسعه یافته با این زبان خواهند داشت به خصوص در جایگاه مقایسه با زبان Java، به هر حال پایتون یک زبان تفسیر‌شده است و در اجرا سرعت کمتری نسبت به زبان‌های کامپایل‌شده مانند C و Java خواهد داشت. معمولا کارایی بالا برابر با سرعت بالاست ولی قضاوت در مورد کارایی به این سادگی درست نیست! +معمولا افراد در مواجه با یادگیری زبان پایتون نگرانی‌هایی در مورد کارایی (Performance) برنامه‌های توسعه یافته با این زبان خواهند داشت به خصوص در جایگاه مقایسه با زبان Java، به هر حال پایتون یک زبان تفسیری است و در اجرا سرعت کمتری نسبت به زبان‌های کامپایلی مانند C و Java خواهد داشت. معمولا کارایی بالا برابر با سرعت بالاست ولی قضاوت در مورد کارایی به این سادگی درست نیست! در هر پروژه‌ای بسته به چیزی که می‌خواهیم می‌بایست انتخاب نماییم. اگر مبنای کارایی برای یک پروژه در سرعت بالای اجرا باشد (مانند برنامه‌های سیستمی)؛‌ زبان C همیشه بهترین انتخاب است ولی اگر مبنا در سرعت بالای توسعه و صرفه جویی در منابع از جمله هزینه باشد انتخاب مناسب پایتون است. گاهی نیز بهترین کارایی با استفاده ترکیبی از زبان‌های متفاوت به دست می‌آید. -در بسیاری از کاربردها سرعت پایتون کاملا قابل قبول است، وجود بایت‌کد‌ موجب افزایش سرعت در اجراهای بعدی برنامه می‌شود و نکات برنامه‌نویسی زیادی برای بهبود سرعت اجرا در پایتون وجود دارد که در این کتاب به تدریج اشاره خواهد شد. نباید فراموش کرد که یکی از مهمترین عامل‌های کارایی داشتن الگوریتمی بهینه است و البته نوشتن ماژول‌ها به زبان C نیز موجب افزایش قابل توجه کارایی پایتون می‌شود - `پایتون کند است اگر اشتباه استفاده شود `_ - با این وجود در حالت عادی اگر هزار مورد وجود داشته باشد که پایتون برای آن‌ها بهترین انتخاب باشد، سرعت یکی از آن‌ها نخواهد بود و برای توسعه برنامه‌هایی که سرعت اجرا نقش بسیار تعیین کننده‌‌ای دارد باید از زبان‌های دیگری استفاده نمایید. +در بسیاری از کاربردها سرعت پایتون کاملا قابل قبول است، وجود بایت‌کد‌ موجب افزایش سرعت در اجراهای بعدی برنامه می‌شود و نکات برنامه‌نویسی زیادی برای بهبود سرعت اجرا در پایتون وجود دارد که در این کتاب به تدریج اشاره خواهد شد. نباید فراموش کرد که یکی از مهمترین عامل‌های کارایی داشتن الگوریتمی بهینه است و البته نوشتن ماژول‌ها به زبان C نیز باعث افزایش قابل توجه سرعت اجرای پایتون می‌شود - `پایتون کند است اگر اشتباه استفاده شود `_ - با این وجود در حالت عادی اگر هزار مورد وجود داشته باشد که پایتون برای آن‌ها بهترین انتخاب باشد، رقابت در سرعت یکی از آن‌ها نخواهد بود و برای توسعه برنامه‌هایی که سرعت اجرا نقش بسیار تعیین کننده‌‌ای دارد باید از زبان‌های دیگری استفاده نمایید. لازم است به این نکته هم توجه داشته باشیم که تمام این صحبت‌ها در مورد پیاده‌سازی CPython از زبان پایتون بوده و پیاده‌سازی‌های دیگری نیز از زبان پایتون با هدف سرعت بالای اجرا (به مانند `PyPy `_) توسعه یافته است. +.. _python-versions: + نسخه‌ها ------- -هم اکنون دو شاخه از پایتون به صورت موازی (Parallel) در کنار یکدیگر در دسترس هستند: نسخه‌های 2x و 3x. در یک سیر تاریخی، نسخه‌ پایدار 2.0 در شانزدهم اکتبر سال ۲۰۰۰ میلادی و در ادامه‌ نسخه 1.6 منتشر (Release) می‌شود؛ پس از آن نیز توسعه‌ پایتون به همان صورت پیشین ادامه می‌یابد تا این که در دسامبر سال ۲۰۰۸ میلادی نسخه‌ای از پایتون با شماره‌ 3.0 که از آن با عنوان ”Python 3000“ یا ”Py3K“ نیز یاد می‌شود، با رویکرد شکستن «سازگاری با نسخه‌های پیشین» (`Backward Compatibility `_) منتشر می‌گردد. به بیان دیگر: مفسر نسخه‌های جدید (3x) پایتون قادر به اجرای سورس کدی که بر پایه‌ مفسر نسخه‌های پیشین تهیه شده است، نخواهد بود. (که این اتفاق در جامعه پایتون بسیار بحث برانگیز بوده و هست!) ظاهرا آقای روسوم خیلی پیش از این زمان نیاز به ایجاد یک سری تغییرات در ساختار و سینتکس این زبان را احساس کرده بود. شاید نخستین نشانه‌ از لزوم ایجاد تغییرات در پایتون را بتوان از صحبت‌های ایشان در همایش متن باز اوریلی (OSCON) سال ۲۰۰۲ با عنوان «پشیمانی‌های پایتون» (`Python Regrets `_) دریافت کرد. به هر صورت تیم توسعه‌ پایتون در پی رفع این نیاز، از بین حفظ گذشته‌ پایتون و پایبندی به فلسفه‌ سادگی آن؛ دومی را انتخاب می‌کند، ویژگی‌های کهنه کنار گذاشته و ویژگی‌های جدید جایگزین می‌گردند. -با انتشار یک نسخه‌ جدید به صورت معمول می‌بایست توسعه‌ نسخه‌ قدیمی متوقف شود، ولی از آنجا که زیر‌ساخت شرکت‌های بزرگی به پایتون وابسته بوده (مانند Google) و ارتقا نسخه برای آن‌ها حداقل بسیار زمان‌بر خواهد شد، برنامه‌ها و کتابخانه‌های کوچک و بزرگ بسیار زیادی توسط کاربران جامعه‌ پایتون برای نیاز‌های ریز و کلان گوناگونی توسعه یافته است که سازگار شدن تمام آن‌ها با نسخه‌ جدید پایتون بعید به نظر می‌رسد و از همه مهم‌تر خود برنامه‌نویسان پایتون می‌باشند که پس از سال‌ها اکنون مجبور هستند کارهای دیروز خود را با سینتکس و در مواقعی حتی با کتابخانه و ماژول‌هایی متفاوت به انجام برسانند؛ تیم توسعه‌ پایتون، برای پر کردن شکاف به وجود آمده بین دیروز و امروز پایتون یا به بیانی هموار کردن مسیر مهاجرت به نسخه‌ جدید پایتون،‌ علاوه بر اینکه از پیش سعی کرده بود تا ویژگی‌های جدید و سینتکس نسخه‌ 3.0 را به نسخه‌ 2.6 (که دو ماه زودتر منتشر شده بود) پورت (Port) کند، به توسعه‌ نسخه قدیمی پایان نمی‌دهد و نسخه‌ دیگری را با شماره‌ 2.7 در سوم جولای ۲۰۱۰، تقریبا یک سال پس از انتشار نسخه‌ 3.1 به همراه بسیاری از ویژگی‌های جدید آن منتشر می‌سازد. +با انتشار یک نسخه‌ جدید به صورت معمول می‌بایست توسعه‌ نسخه‌ قدیمی متوقف شود، ولی از آنجا که زیر‌ساخت شرکت‌های بزرگی به پایتون وابسته بوده (مانند Google) و ارتقا نسخه برای آن‌ها حداقل بسیار زمان‌بر خواهد شد، برنامه‌ها و کتابخانه‌های کوچک و بزرگ بسیار زیادی توسط کاربران جامعه‌ پایتون برای نیاز‌های ریز و کلان گوناگونی توسعه یافته بود که سازگار شدن تمام آن‌ها با نسخه‌ جدید پایتون در یک فاصله زمانی کوتاه بعید به نظر می‌رسید و از همه مهم‌تر خود برنامه‌نویسان پایتون قرار داشتند که پس از سال‌ها مجبور به پذیرش تغییرات شده بودند؛ تیم توسعه‌ پایتون، برای پر کردن شکاف به وجود آمده در پایتون یا به بیانی هموار کردن مسیر مهاجرت به نسخه‌ جدید پایتون،‌ علاوه بر اینکه از پیش سعی کرده بود تا ویژگی‌های جدید و سینتکس نسخه‌ 3.0 را به نسخه‌ 2.6 (که دو ماه زودتر منتشر شده بود) پورت (Port) کند، به توسعه‌ نسخه قدیمی پایان نمی‌دهد و نسخه‌ دیگری را با شماره‌ 2.7 در سوم جولای ۲۰۱۰، تقریبا یک سال پس از انتشار نسخه‌ 3.1 به همراه بسیاری از ویژگی‌های جدید آن منتشر می‌سازد. -بر طبق سند [#f13]_ `PEP 404 `_، هرگز نسخه‌ای با شماره‌ 2.8 به صورت رسمی منتشر نخواهد شد و نسخه‌ 2.7 با یک پشتیبانی طولانی مدت، نقطه‌ پایان نسخه‌ قدیمی پایتون خواهد بود. ابتدا قرار شد از این نسخه به مدت پنج سال پشتیبانی (تلاش برای رفع باگ‌ها) شود ولی چند ماه پیش، این زمان به ده سال یعنی تا سال ۲۰۲۰ افزایش یافت. +بر طبق سند [#f13]_ `PEP 404 `_، هرگز نسخه‌ای با شماره‌ 2.8 به صورت رسمی منتشر نخواهد شد و نسخه‌ 2.7 با یک پشتیبانی طولانی مدت، نقطه‌ پایان نسخه‌ قدیمی پایتون خواهد بود. ابتدا قرار شد از این نسخه به مدت پنج سال پشتیبانی (تلاش برای رفع باگ‌ها) شود ولی کمی مانده تا پایان، این زمان به ده سال یعنی تا سال ۲۰۲۰ افزایش یافت. نسخه‌ پایدار (Stable) پایتون با قالب A.B.C؛ مانند 3.4.2 شماره‌‌گذاری و منتشر می‌شود. عدد A، بخش اصلی (Major) شماره نسخه است و زمانی افزایش می‌یابد که واقعا تغییرات بزرگ و زیادی در زبان پایتون ایجاد شده باشد. عدد B، بخش جزئی (Minor) شماره نسخه را نشان می‌دهد و با ایجاد یک سری تغییرات مهم در زبان پایتون افزایش خواهد یافت. عموما شماره‌ نسخه‌ پایتون تنها به صورت A.B نشان داده می‌شود، زیرا عدد C تنها با رفع اشکال (Bug) احتمالی نسخه‌ منتشر شده افزایش می‌یابد (از عدد صفر) که این امر نیز شامل همه‌ نسخه‌های پایتون نمی‌شود. -کدام نسخه؟ برای شروع یادگیری و اهداف آموزشی نسخه‌ 3x مناسب است و در صورت نیاز تنها با مطالعه‌ مقایسه بین این دو نسخه می‌توانید با نسخه‌ قدیمی نیز آشنا شوید. همچنین اگر قصد توسعه‌ برنامه‌های دسکتاپ را داشته (یعنی زمانی که محدود به نسخه‌ نصب شده بر روی سرور نیستید) یا مواقعی که در ایجاد برنامه‌ خود نیازی به کتابخانه‌هایی که هنوز (اوایل ۲۰۱۵) با نسخه‌ 3x سازگار نشده‌اند (مانند Twisted) را ندارید؛‌ استفاده از نسخه‌ 3x بسیار خوب است. به هر حال تلاش می‌شود که این کتاب بتواند به دور از آشفتگی هر دو نسخه را پوشش دهد. - +.. _lesson-01-footer: پی‌نوشت -------- @@ -166,7 +177,7 @@ CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصل .. [#f2] ”...در دسامبر سال ۱۹۸۹ دنبال یک پروژه‌ برنامه‌نویسی به عنوان سرگرمی می‌گشتم تا اوقات فراغت به وجود آمده از تعطیلات کریسمس را پر کنم. دفتر کارم (یک آزمایشگاه تحقیقاتی دولتی در آمستردام) بسته بود، ولی یک رایانه‌ شخصی داشتم و چیزی بیش از این هم در اختیارم نبود. تصمیم گرفتم تا مفسری برای یک زبان اسکریپتی جدید بنویسم. قبلا در مورد آن فکر کرده بودم: از نسل زبان ABC و جذاب برای هکرهای Unix/C. نام پایتون را برای عنوان کاری این پروژه انتخاب کردم، کمی گستاخانه ( و یک طرفدار بزرگ Monty Python’s Flying Circus)...“ - نقل از آقای روسوم [`منبع `_] -.. [#f3] در دروس آینده به انواع داده (Data Types) در زبان پایتون به صورت کامل پرداخته می‌شود. البته خواهید دید که این مبحث در پایتون با عنوان «انواع شی» ارايه می‌گردد. +.. [#f3] در دروس آینده به انواع داده (Data Types) در زبان پایتون به صورت کامل پرداخته می‌شود. .. [#f4] برای مشاهده‌ موارد استفاده بیشتر پایتون می‌توانید به صفحه‌های [`درباره پایتون `_] و [`ویکی پایتون `__] مراجعه نمایید. @@ -177,14 +188,10 @@ CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصل .. [#f7] متغیر در پایتون، نامی است که به یک شی (Object) در حافظه اشاره می‌کند. (در دروس آینده به آن پرداخته خواهد شد) -.. [#f8] از نسخه 2.0 و جدیدتر به پایتون (پیاده‌سازی CPython) افزوده شده است. - .. [#f9] دسته‌بندی رایج دیگر، بر مبنای نسل (Generation) است. زبان‌های نسل اول زبان‌های ماشین، نسل دوم زبان‌های اسمبلی، نسل سوم زبان‌های سطح بالایی مانند C# ،C++ ،C ،Lisp ،Cobol ،Fortran و Java هستند. زبان‌های نسل چهارم آن‌هایی هستند که برای کاربرد‌هایی خاص طراحی شده‌اند مانند NOMAD برای تولید گزارش، SQL برای پرس و جوهای (Queries) پایگاه‌ داده و Postscript برای قالب‌بندی متن. اصطلاح زبان نسل پنجم به زبان‌های مبتنی بر منطق و شرط (logic- and constraint-based) مانند Prolog و OPS5 گفته می‌شود. (آورده شده از کتاب: کامپایلرها... نوشته Aho و...، ویرایش دوم، صفحه ۱۳) - زبان پایتون یک زبان همه منظوره است و در دسته زبان‌های نسل سوم قرار می‌گیرد،‌ هر چند که نسبت به برخی از زبان‌های این نسل سطح بالاتری دارد. .. [#f10] با توجه به نوشته‌ Jeremy Jones با عنوان `Python's (Weak) Functional Programming Paradigm `_. -.. [#f11] منظور از ماشین مجازی در اینجا ”Process Virtual Machine“ است و نباید با «ماشین مجازی سیستمی» (System Virtual Machine) اشتباه گرفته شود. - .. [#f12] برای نمونه: این کار در زبان Pascal توسط کلمات Begin و End، در زبان‌های C و Java توسط آکولاد ``{ }`` صورت می‌گیرد. .. [#f13] PEPs یا Python Enhancement Proposals (طرح‌های توسعه‌ پایتون) در واقع مجموعه اسنادی است که تیم توسعه‌ پایتون از آن‌ها برای توصیف شیوه‌ طراحی، ویژگی‌های جدید یا منطق، فرآیند و راهبردهای آینده پایتون استفاده می‌کنند. فهرست: `PEP 0 `_ @@ -200,7 +207,6 @@ CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصل :emoji-size:`😊` امیدوارم مفید بوده باشه -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ diff --git a/source/lessons/l02.rst b/source/lessons/l02-setup-python.rst similarity index 87% rename from source/lessons/l02.rst rename to source/lessons/l02-setup-python.rst index e6bcf30..449b116 100644 --- a/source/lessons/l02.rst +++ b/source/lessons/l02-setup-python.rst @@ -1,10 +1,11 @@ .. role:: emoji-size .. meta:: - :description: کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون به فارسی - درس دوم نصب و راه‌اندازی پایتون + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس دوم: نصب و راه‌اندازی پایتون :keywords: پایتون, آموزش برنامه نویسی, آموزش پایتون, نصب پایتون در ویندوز, نصب پایتون در لینوکس, سیستم مدیریت بسته پایتون, pip, راه اندازی پایتون, دانلود پایتون, آموزش pip +.. _lesson-02: درس ۰۲: نصب و راه‌اندازی پایتون ================================ @@ -28,6 +29,8 @@ ---- +.. _download: + دانلود -------- برای ترجمه و اجرای سورس کد ایجاد شده به زبان پایتون لازم است «بسته نصبی پایتون» (همان CPython یا اگر ساده بگوییم: پایتون) که شامل مفسر، کتابخانه استاندارد، برنامه `IDLE `_ (ویرایشگر پیش‌فرض پایتون) و... است را دانلود و بر روی سیستم عامل نصب نماییم. @@ -41,16 +44,21 @@ `Path `_ یکی از «متغیر‌های محیطی» (`Environment Variables `_) سیستم عامل است. این متغیر حاوی فهرست دایرکتوری‌هایی می‌باشد که سیستم عامل در آن‌ها به دنبال یک فایل اجرایی هم نام با دستور وارد شده در خط فرمان می‌گردد. -هم اکنون این بسته بر پایه دو نسخه‌ متفاوت پایتون (2x و 3x) از `صفحه‌ دانلود آن `_، متناسب با نوع سیستم عامل و معماری پردازنده قابل دانلود است (اندازه:‌ تقریبا بین ۱۲ تا ۲۵ مگابایت) که برای نصب در ویندوز به شکل یک `فایل نصبی `_ (با قالب msi) و متناسب با دو معماری 32 (x86) و 64 (AMD64 ،EM64T ،x64 ،x86-64) بیتی منتشر می‌گردد و در صورت نیاز برای نصب آن در گنو‌لینوکس می‌بایست `سورس کد آن `_ (که به زبان C است) را دانلود نمایید. +هم اکنون این بسته از `صفحه‌ دانلود آن `_، متناسب با نوع سیستم عامل و معماری پردازنده قابل دانلود است (اندازه:‌ تقریبا ۲۵ مگابایت) که برای نصب در ویندوز به شکل یک `فایل نصبی `_ (با قالب msi) و متناسب با دو معماری 32 (x86) و 64 (AMD64 ،EM64T ،x64 ،x86-64) بیتی منتشر می‌گردد و در صورت نیاز برای نصب آن در گنو‌لینوکس می‌بایست `سورس کد آن `_ (که به زبان C است) را دانلود نمایید. .. note:: - امکان نصب نسخه‌های متفاوت پایتون (حتی از یک شاخه) در کنار یکدیگر وجود دارد. + امکان نصب نسخه‌های متفاوت پایتون در کنار یکدیگر وجود دارد. + +در هنگام آخرین ویرایش این درس نسخه‌ 3.11.2 جدیدترین نسخه‌ منتشر یافته‌ پایتون است. برای دسترسی به جدید‌ترین ویژگی‌ها، پیشنهاد می‌شود همیشه جدیدترین نسخه‌ موجود از پایتون را دانلود نمایید. + +**با توجه به اینکه تغییر ملموسی در شیوه نصب پایتون ایجاد نگردیده، از بروزرسانی تصاویر و دستورات صرف نظر گردیده است.** + -در هنگام نگارش این درس دو نسخه‌ 2.7.9 و 3.4.2 جدیدترین نسخه‌های منتشر یافته‌ پایتون هستند. برای دسترسی به جدید‌ترین ویژگی‌ها، پیشنهاد می‌شود همیشه جدیدترین نسخه‌ موجود از پایتون را دانلود نمایید. +.. _setup-on-windows: نصب در ویندوز --------------- -درست به مانند هر برنامه‌ دیگری در ویندوز، نصب به راحتی تنها با چند بار کلیک بر روی دکمه‌ Next به پایان می‌رسد. پیشنهاد می‌شود مسیر پیش‌فرض نصب (مثلا برای نصب نسخه‌ 3.4.2:‌ \\C:\\Python34) را تغییر ندهید. +درست به مانند هر برنامه‌ دیگری در ویندوز، نصب به راحتی تنها با چند بار کلیک بر روی دکمه‌ Next به پایان می‌رسد. پیشنهاد می‌شود مسیر پیش‌فرض نصب (مثلا برای نصب نسخه‌ 3.4.2:‌ ``C:\Python34``) را تغییر ندهید. قابل ذکر است که در نسخه‌های جدیدتر این مسیر به داخل فولدر Program Files انتقال یافته است، برای مثال برای نسخه 3.11.2 مسیر پیش‌فرض نصب ``C:\Program Files\Python311`` خواهد بود. در هنگام نصب نسخه‌‌ای که قصد دارید از آن به صورت نسخه‌ پیش‌فرض پایتون خود استفاده نمایید، به این نکته توجه داشته باشید که در مرحله‌ سفارشی‌سازی (Customize) گزینه‌ افزودن خودکار مسیر مفسر پایتون به متغیر Path ویندوز را فعال نمایید (همانند تصویر پایین). در این صورت با وارد کردن دستور ``python`` در خط فرمان ویندوز، مفسر پایتون (این نسخه) فراخوانی می‌شود. برای شروع، با وارد کردن دستور ``python –V`` یا ``python --version`` می‌توانید از نسخه‌ پایتون نصب شده آگاهی یابید: @@ -77,7 +85,8 @@ البته امکان دستکاری Path در هر زمانی وجود دارد: -مسیر Control Panel > System > Advanced system settings > Advanced را طی کرده و سپس با کلیک بر روی Environment Variables پنجره‌ جدیدی باز می‌گردد که در قسمت System variables آن Path را پیدا و انتخاب نمایید. بر روی Edit در پایین همان پنجره کلیک کرده و عبارت ``;C:\Python34;C:\Python34\Scripts`` (برای نسخه 3.4) یا ``;C:\Python27;C:\Python27\Scripts`` (برای نسخه 2.7) را به ابتدای متن موجود در قسمت Variable value پنجره‌ جدید وارد و سپس بر روی دکمه‌ OK کلیک نمایید. :) +مسیر Control Panel > System > Advanced system settings > Advanced را طی کرده و سپس با کلیک بر روی Environment Variables پنجره‌ جدیدی باز می‌گردد که در قسمت System variables آن Path را پیدا و انتخاب نمایید. بر روی Edit در پایین همان پنجره کلیک کرده و عبارت ``;C:\Python34;C:\Python34\Scripts`` (برای نسخه 3.4) را به ابتدای متن موجود در قسمت Variable value پنجره‌ جدید وارد و سپس بر روی دکمه‌ OK کلیک نمایید. :) + .. image:: /_static/l02-add-path-on-windows.png :align: center @@ -100,6 +109,7 @@ > py -3.3 --version 3.3.5 +.. _setup-on-linux: نصب در گنولینوکس ------------------ @@ -117,7 +127,7 @@ python 3.4.0 .. note:: - از آنجا که هنوز (اوایل ۲۰۱۵) نسخه‌ 2x، نسخه‌ پیش‌فرض پایتون در اکثر توزیع‌های گنولینوکس است، بنابراین دستور ``python --version`` نیز موجب فراخوانی مفسر پایتون نسخه‌ 2x و نمایش نسخه‌ آن می‌شود. + هم اکنون نسخه‌ 3x، نسخه‌ پیش‌فرض پایتون در اکثر توزیع‌های گنولینوکس است، بنابراین دستور ``python --version`` نیز موجب فراخوانی مفسر پایتون نسخه‌ 3x و نمایش نسخه‌ آن می‌شود. `Arch Linux `_ نخستین توزیع از گنولینوکس است که نسخه‌ 3x را به عنوان نسخه پیش‌فرض پایتون خود قرار داده است. @@ -251,14 +261,17 @@ Python 3.4.2 .. note:: - به صورت کلی برای فراخوانی پایتون نسخه 3x از یکی از دستورات ``python3.4`` ،``python3`` یا ``python3.x`` که x بیانگر بخش جزئی نسخه پایتون می‌باشد و برای نسخه 2x نیز از دستورات ``python2.7`` ،``python2`` ،``python`` یا ``python2.x`` استفاده می‌گردد. در این راستا چنانچه پایتون در مسیری خاص نصب گردد لازم است مسیر آن به متغیر Path اضافه شود. برای فراخوانی pip و IDLE هر نسخه نیز از همین رویه پیروی می‌شود. + به صورت کلی برای فراخوانی پایتون نسخه 3x از یکی از دستورات ``python3.4``، ``python3``، ``python`` یا ``python3.x`` که x بیانگر بخش جزئی نسخه پایتون می‌باشد و برای نسخه 2x نیز از دستورات ``python2.7`` ،``python2`` یا ``python2.x`` استفاده می‌گردد. در این راستا چنانچه پایتون در مسیری خاص نصب گردد لازم است مسیر آن به متغیر Path اضافه شود. برای فراخوانی pip و IDLE هر نسخه نیز از همین رویه پیروی می‌شود. + + +.. _python-pip: سیستم مدیریت بسته ------------------- `pip `_ (پِپ) سیستم مدیریت بسته‌‌ پایتون است. pip ابزاری است مبتنی بر خط فرمان که از آن برای نصب، حذف، بروز رسانی و در کل مدیریت بسته‌های (یا کتابخانه‌ها‌ی شخص ثالث) پایتون استفاده می‌گردد. برنامه‌نویس پس از یافتن بسته‌ مورد نیاز خود در PyPI یا وب‌سایت‌ها و سرویس‌های دیگری به مانند github.com و bitbucket.com می‌تواند به وسیله دستور pip در خط فرمان، اقدام به نصب آن در پایتون نماید. .. tip:: - `PyPI `_ (پای‌پِ) یا مخزن بسته‌های پایتون (Python Package Index) محلی است که بسیاری از کتابخانه‌ها یا برنامه‌های شخص ثالث پایتون در آن نگه داری می‌شود. کاربران پایتون می‌توانند از طریق PyPI پروژه (یا بسته) خود را منتشر یا اقدام به جستجو و دانلود بسته‌های مورد نیاز خود نمایند. + `PyPI `_ (پای‌پِ) یا مخزن بسته‌های پایتون (Python Package Index) محلی است که بسیاری از کتابخانه‌ها یا برنامه‌های شخص ثالث پایتون در آن نگه داری می‌شود. کاربران پایتون می‌توانند از طریق PyPI پروژه (یا بسته) خود را منتشر یا اقدام به جستجو و دانلود بسته‌های مورد نیاز خود نمایند. آشنایی با مخازنی همچون PyPI و استفاده از pip در توسعه پروژه‌های پایتونی اهمیت بالایی دارد. برای مثال فرض نمایید در پروژه خود می‌بایست تاریخ را با فرمت جلالی نمایش دهید. راه‌حل ابتدایی، توسعه کدها یا ماژولی برای تبدیل تاریخ میلادی (پیش‌فرض در پایتون) به جلالی توسط خودتان می‌باشد. راه‌حل دیگر اما جستجو برای یافتن کتابخانه‌ یا ماژول‌هایی است که پیش‌تر توسط دیگران توسعه یافته و در مخازنی همانند PyPI منتشر یافته است. در این شرایط برای دسترسی به این کتابخانه‌ها‌ی شخص ثالث تنها کافی است با استفاده از pip آن‌ها را مجموعه کتابخانه‌های داخل رایانه خود اضافه نمایید. @@ -363,12 +376,13 @@ pip از زمان انتشار نسخه‌ 3.4 به بسته‌ نصبی پای user> pip show SomePackage -* نصب تمام بسته‌هایی که درون یک فایل متنی به مانند requirements.txt مشخص شده است (`فایل نمونه `__):: +* نصب تمام بسته‌هایی که درون یک فایل متنی به مانند requirements.txt مشخص شده است (`فایل نمونه `__):: root> pip install -r requirements.txt +.. _python-pip-user: user-- ~~~~~~~~ @@ -381,7 +395,7 @@ user-- شیوه دیگر استفاده از ``user--`` در میان دستور ماژول pip می‌باشد. این یک روش ساده برای پرهیز از نیاز به دسترسی root (دستور sudo) یا Administrator می‌باشد. در این شرایط ماژول pip هر بسته مورد نیاز را در محیط کاربری، کاربر جاری نگهداری می‌کند:: - user> pip3 install --user bottle + user> pip install --user bottle | @@ -389,6 +403,4 @@ user-- :emoji-size:`😊` امیدوارم مفید بوده باشه -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - diff --git a/source/lessons/l03.rst b/source/lessons/l03-create-and-run-a-python-project.rst similarity index 50% rename from source/lessons/l03.rst rename to source/lessons/l03-create-and-run-a-python-project.rst index 326836e..9a3832b 100644 --- a/source/lessons/l03.rst +++ b/source/lessons/l03-create-and-run-a-python-project.rst @@ -1,10 +1,12 @@ .. role:: emoji-size .. meta:: - :description: کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون به فارسی - درس سوم ایجاد و اجرای پروژه از پایتون + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس سوم: چگونگی ایجاد و اجرای یک پروژه پایتون :keywords: پایتون,آموزش پایتون, آموزش برنامه نویسی, ایجاد پروژه پایتون, اسکریپت پایتون, ماژول پایتون, بسته پایتون, ساختار پایتون, پروژه پایتون, سورس کد, سورس کد پایتون, اجرای پایتون, اسکریپت, ماژول, pyvenv, virtualenv +.. _lesson-03: + درس ۰۳: چگونگی ایجاد و اجرای یک پروژه پایتون ============================================= @@ -15,7 +17,7 @@ Photo by `Sam Moqadam `__ -این درس به چگونگی ایجاد پروژه‌‌های برنامه‌نویسی پایتون و اجرای آن‌ها اختصاص یافته است. درس با بیان تعاریف و رسم ساختار معمول یک پروژه شروع و اشاره‌ای نیز به ساختار پروژه‌های قابل انتشار در PyPI می‌شود. در بخش یکم تلاش شده است که تصویر کاملی از ساختار یک پروژه در ذهن خواننده ایجاد و از این طریق او با تعاریف «بسته»، «ماژول» و «اسکریپت» در زبان پایتون آشنا شود. در دو بخش‌ بعدی نیز ضمن اشاره به دو شیوه‌ اجرای دستورات پایتون، به شیوه ایجاد اسکریپت و چگونگی اجرای آن تمرکز شده است؛ چرا که پروژه‌های پایتون به این شیوه اجرا می‌گردند. در ادامه هم به روند اجرای کد توسط مفسر پایتون و همچنین معرفی بایت‌کد توجه و در نهایت نیز به معرفی virtualenv و pyvenv پرداخته شده است. +این درس به چگونگی ایجاد پروژه‌‌های برنامه‌نویسی پایتون و اجرای آن‌ها اختصاص یافته است. درس با بیان تعاریف و رسم ساختار معمول یک پروژه شروع و اشاره‌ای نیز به ساختار پروژه‌های قابل انتشار در PyPI می‌شود. در بخش یکم تلاش شده است که تصویر کاملی از ساختار یک پروژه در ذهن خواننده ایجاد و از این طریق او با تعاریف «بسته»، «ماژول» و «اسکریپت» در زبان پایتون آشنا شود. در دو بخش‌ بعدی نیز ضمن اشاره به دو شیوه‌ اجرای دستورات پایتون، به شیوه ایجاد اسکریپت و چگونگی اجرای آن تمرکز شده است؛ چرا که پروژه‌های پایتون به این شیوه اجرا می‌گردند. در ادامه هم به روند اجرای کد توسط مفسر پایتون و همچنین به معرفی بایت‌کد و در نهایت نیز به معرفی virtualenv و pyvenv پرداخته شده است. :emoji-size:`✔` سطح: پایه @@ -27,9 +29,10 @@ ---- -ساختار پروژه +.. _definations: + +تعاریف -------------- -نخستین گام در توسعه‌ یک برنامه پایتون ایجاد یک پروژه است که پس از آن نوشتن کدها یا ایجاد سورس کد (`Source code `_) برنامه آغاز می‌شود. سورس کد یک پروژه به زبان پایتون در قالب یک یا چند «ماژول» (Module) توسعه می‌یابد که در سورس کدهایی با بیش از یک ماژول بهتر است ماژول‌هایی که از نظر منطقی با یکدیگر مرتبط هستند را درون دایرکتوری‌هایی مجزا قرار دهیم که به این نوع دایرکتوری‌ها در زبان پایتون «بسته» (Package) گفته می‌شود. @@ -37,155 +40,88 @@ یک یا چند ماژول درون یک دایرکتوری مشخص تشکیل یک بسته را می‌دهند و هر بسته خود می‌تواند حاوی بسته‌(های) دیگری باشد. .. note:: - از نسخه 3.3 پایتون با افزوده شدن ویژگی جدیدی به نام «بسته فضانام» (Namespace Package - `PEP 420 `_)، تعریف بسته پایتون به دو شاخه «بسته عادی» (Regular Package) که همان تعریف قدیمی از بسته می‌باشد و بسته فضانام گسترش یافته است. [در درس مربوط به ماژول‌ها بیشتر توضیح داده خواهد شد] + از نسخه 3.3 پایتون با افزوده شدن ویژگی جدیدی به نام «بسته فضانام» (Namespace Package - `PEP 420 `_)، تعریف بسته پایتون به دو شاخه «بسته عادی» (Regular Package) که همان تعریف قدیمی از بسته می‌باشد و بسته فضانام گسترش یافته است. + + در واقع، تا قبل از پایتون 3.3 هر بسته پایتون می‌بایست حاوی یک فایل ``init__.py__`` باشد ولی دیگر نیازی به این فایل نیست و مفسر پایتون اکنون می‌تواند تمامی بسته‌های داخل پرو‌ژه را محل‌یابی کند. در این درس به منظور شفاف‌سازی بسته‌ها از روش Regular Package استفاده خواهد شد. در تعریف زبان پایتون دو نوع ماژول وجود دارد: -۱- Pure Module (ماژول ناب)، همان تعریف عادی از ماژول پایتون است؛ فایل‌هایی با پسوند py که کد (تعاریف و دستورات) پایتون در آن‌ها نوشته می‌شوند. +۱- Pure Module (ماژول عادی)، همان تعریف عادی از ماژول پایتون است؛ فایل‌هایی با پسوند py که کد (تعاریف و دستورات) به زبان پایتون در آن‌ها نوشته می‌شود. -۲- Extension Module (ماژول توسعه)، ماژول‌هایی که توسط زبان‌های برنامه‌نویسی دیگری به غیر از پایتون ایجاد شده‌اند. از درس یکم به خاطر داریم که پایتون یک زبان توسعه‌پذیر است و در کنار آن می‌توان از کد‌های نوشته شده با دیگر زبان‌های برنامه‌نویسی استفاده نمود: به مانند C و ++C در پیاده‌سازی CPython یا Java در پیاده‌سازی Jython یا #C در پیاده‌سازی IronPython - [ایجاد و استفاده از این نوع ماژول در درسی جداگانه بررسی خواهد شد.] +۲- Extension Module (ماژول توسعه)، ماژول‌هایی که توسط زبان‌های برنامه‌نویسی دیگری به غیر از پایتون تهیه شده‌اند. از درس یکم به خاطر داریم که پایتون یک زبان توسعه‌پذیر است و در کنار آن می‌توان از کد‌های نوشته شده با دیگر زبان‌های برنامه‌نویسی استفاده نمود: به مانند C و ++C در پیاده‌سازی CPython یا Java در پیاده‌سازی Jython یا #C در پیاده‌سازی IronPython - بررسی این نوع ماژول خارج از حوزه این کتاب است. در صورت علاقه برای مطالعه بیشتر می‌توانید به مستندات پایتون مراجعه (`Python/C API Reference `_) یا کتاب Python 3.6 Extending and Embedding Python نوشته Guido Van Rossum را تهیه نمایید. .. note:: - از این پس هر جایی از کتاب که گفته شود «ماژول» منظور Pure Module خواهد بود، مگر اینکه نام «ماژول توسعه» به صراحت ذکر گردد. + از این پس هر جایی از این کتاب که گفته شود «ماژول» منظور Pure Module خواهد بود، مگر اینکه نام «ماژول توسعه» به صراحت ذکر گردد. -در ایجاد یک پروژه از پایتون هیچ اجباری به رعایت ساختار خاصی نیست و حتی سورس کد یک پروژه می‌تواند تنها شامل یک ماژول باشد. به عنوان نمونه، شمای پایین از پروژه فرضی SampleProject را در نظر بگیرید: +در ایجاد یک پروژه از پایتون هیچ اجباری به رعایت ساختار خاصی نیست و سورس کد یک پروژه می‌تواند تنها شامل یک ماژول (فایل با پسوند py.) باشد. به عنوان نمونه، شمای پایین از پروژه فرضی SampleProject را در نظر بگیرید: .. code:: SampleProject . - ├── sample_project.py - ├── module_one.py - └── pakage/ - ├── __init__.py - ├── module_two.py - └── module_three.py - -.. tip:: - در پایتون هر بسته‌ (عادی) می‌بایست حاوی فایل ویژه‌‌‌ init\_\_.py_\_\ باشد که البته الزامی به کدنویسی درون این فایل وجود ندارد. این فایل دایرکتوری خود را به عنوان یک بسته (محلی برای یافتن ماژول‌ها) به مفسر پایتون معرفی می‌کند. - -در ایجاد سورس کد باید به صورتی عمل شود که با اجرای یک ماژول‌ مشخص تمام برنامه اجرا گردد. این ماژول معمولا هم نام پروژه در نظر گرفته و با عنوان «اسکریپت» (Script) از آن یاد می‌شود (اینجا:‌ sample_project.py). در واقع اسکریپت، ماژولی است که با هدف اجرای برنامه توسعه می‌یابد و ایجاد سورس کد نیز از آن شروع می‌گردد. از طرفی همانطور که می‌دانیم یکی از ویژگی‌های پایتون امکان برنامه نویسی ماژولار (`Modular `_) است به این صورت که می‌توان کد‌های خود را بر حسب نیاز در ماژول‌هایی جداگانه نوشت و با وارد کردن (Import) آن‌ها در اسکریپت (یا ماژول‌های دیگر) از کد درون آن‌ها استفاده نمود. با این منطق می‌شود سورس کد یک پروژه از پایتون را تنها شامل یک اسکریپت تصور کرد که می‌تواند توسط تعدادی ماژول گسترش یابد؛ البته ممکن است ماژول‌ها نیز بر حسب نیاز در بسته‌هایی جداگانه قرار گرفته باشند. - -.. tip:: - [`PEP 8 `_]: در نام‌گذاری ماژول‌ها تنها از حروف کوچک استفاده می‌شود و در صورت نیاز می‌توان از کاراکتر خط زیرین (``_``) نیز استفاده نمود. نام بسته‌ها کوتاه بوده و از حروف کوچک تشکیل می‌گردد؛ استفاده از ``_`` در نام بسته پیشنهاد نمی‌شود. - -اکنون اطلاعات کافی برای شروع یک پروژه از پایتون را دارید ولی چنانچه می‌خواهید با ساختار مناسب پروژه‌ای که قرار است برای استفاده افراد دیگر از طریق PyPI یا سرویس‌هایی نظیر github.com منتشر شود (مانند یک کتابخانه کاربردی) آشنا شوید، ادامه این بخش را نیز مطالعه نمایید. در غیر این صورت می‌توانید به بخش بعدی از همین درس `پرش <#id7>`_ نمایید. - -جدا از سورس کد لازم است موارد دیگری نیز در ساختار این نوع پروژه‌ها در نظر گرفته شود؛ به ساختار پایین توجه نمایید: + └── sample_project.py +یا کمی پیچیده‌تر: .. code:: SampleProject . - ├── docs/ - ├── LICENSE.txt - ├── MANIFEST.in - ├── README.rst - ├── requirements.txt - ├── sampleproject/ - │ ├── __init__.py - │ ├── module_one.py - │ ├── pakage/ - │ │ ├── __init__.py - │ │ ├── module_two.py - │ │ └── module_three.py - │ ├── sample_project.py - │ └── test/ - ├── setup.cfg - └── setup.py - -ساختار ابتدایی تنها شامل سورس کد می‌بود ولی در این ساختار تمام سورس کد در قالب یک بسته پایتون بخشی از مجموعه بزرگتری است که در آن یک سری فایل به مانند requirements.txt ،README.rst و setup.py به همراه دو دایرکتوری docs و test افزوده شده است. -در ادامه کمی از کاربرد این موارد توضیح داده می‌شود ولی تاکید می‌شود که در حال حاضر نیازی به رعایت این ساختار نیست و در انتهای کتاب با ایجاد یک پروژه عملی و قرار دادن آن بر روی github.com و PyPI به صورت کاربردی با آن‌ها آشنا خواهید شد. [برای کسب اطلاعات بیشتر می‌توانید از `اسناد پایتون `_ استفاده نمایید] - -**setup.py**: این فایل مهم دو کارکرد دارد: -۱- پیکربندی پروژه که از طریق آرگومان‌های تابع آماده ``()setup`` درون این فایل صورت می‌پذیرد. -۲- یک رابط خط فرمان برای اجرای دستورات کاربردی مرتبط با پروژه (الگویی مشابه: ```_ داشته و در صورت نیاز گزینه‌های مربوط به دستورات خط فرمان setup.py در این فایل تعریف می‌گردند. برای مشاهده فهرست گزینه‌های یک دستور مشخص می‌توانید از الگوی ```_ استفاده می‌گردد و به همین دلیل این اسناد پسوند rst دارند که البته اجباری به این مورد نیست و می‌توانید برای ایجاد این فایل از `Markdown `_ (پسوند md) نیز استفاده نمایید. - -**MANIFEST.in**: معمولا از این فایل برای معرفی فایل‌های غیر پایتونی موجود در پروژه استفاده می‌شود. زمانی که قصد ایجاد «سورس توزیع» یا sdist از پروژه را داشته باشید (دستوری مشابه: ``python setup.py sdist``) تنها `فایل‌های مشخصی `_ از پروژه شناسایی می‌شوند و شناساندن باقی فایل‌ها (در صورت وجود) می‌بایست توسط این فایل (البته با `الگویی خاص `_) انجام گیرد. - -**requirements.txt**: از این فایل برای معرفی کتابخانه‌های خاصی که در پروژه استفاده شده‌اند و در زمان نصب یا اجرای سورس کد، وجود یا نصب بودن آن‌ها نیز ضروری است، استفاده می‌گردد. + ├── sample_project.py + └── pakage/ + ├── __init__.py + ├── module_two.py + └── module_one.py -**LICENSE.txt**: این فایل پروانه‌ انتشار پروژه را شامل می‌شود و اغلب حاوی یک کپی از متن پروانه‌های متن باز رایج به مانند `MIT `_ ،`GPL `_ یا `BSD `_ می‌باشد. +.. tip:: + در پایتون هر **Regular Package** می‌بایست حاوی فایل ویژه‌‌‌ ``init__.py__`` باشد که البته الزامی به کدنویسی درون این فایل وجود ندارد. این فایل دایرکتوری خود را به عنوان یک بسته (محلی برای یافتن ماژول‌های مرتبط) به مفسر پایتون معرفی می‌کند. -.. note:: - لازم است تمامی فایل‌های یاد شده و دایرکتوری docs در بالاترین شاخه از دایرکتوری پروژه قرار داده شوند. +در ایجاد سورس کد باید به صورتی عمل شود که با اجرای یک ماژول‌ مشخص تمام برنامه اجرا گردد. این ماژول معمولا هم نام پروژه در نظر گرفته و با عنوان «اسکریپت» (Script) از آن یاد می‌شود (اینجا:‌ sample_project.py). در واقع اسکریپت، ماژولی است که با هدف اجرای برنامه توسعه می‌یابد و ایجاد سورس کد نیز از آن شروع می‌گردد. -**docs**: در این دایرکتوری اسناد (راهنما، آموزش و...) پروژه قرار داده می‌شوند. ایجاد این اسناد توسط `Sphinx `_ در درسی جداگانه بررسی خواهد شد. +.. tip:: + هر پروژه پایتون باید حاوی یک اسکریپت باشد ولی می‌تواند هیچ، یک یا چند ماژول داشته باشد که این ماژول‌ها نیز می‌توانند در قالب بسته‌هایی جداگانه سازمان‌دهی شوند. -**test**: این دایرکتوری محل نگهداری برنامه تست پروژه می‌باشد. ایجاد تست پروژه نیز در درسی جداگانه بررسی می‌گردد. این دایرکتوری می‌تواند هم در بالا ترین شاخه از پروژه و هم در داخل دایرکتوری سورس کد قرار داده شود. +.. tip:: + [`PEP 8 `_]: در نام‌گذاری ماژول‌ها تنها از حروف کوچک استفاده می‌شود و در صورت نیاز می‌توان از کاراکتر خط زیرین (``_``) نیز استفاده نمود (اما پیشنهاد نمی‌شود). نام بسته‌ها کوتاه بوده و از حروف کوچک تشکیل می‌گردد. -با ایجاد یک توزیع (Distribution) از این ساختار و انتشار آن [که در آینده خواهید آموخت]، امکان نصب پروژه از طریق pip به وجود می‌آید. معمولا به جای واژه «توزیع» از واژه «بسته» (Package) استفاده می‌گردد؛ همانطور که pip نیز «سیستم مدیریت بسته پایتون» نامیده می‌شود و هیچگاه نباید آن را با مفهوم «بسته» که تا پیش از این مطرح شده است اشتباه گرفت. +.. _source-code: ایجاد سورس کد --------------- برای ایجاد فایل‌های سورس کد (ماژول‌ها و اسکریپت) نیاز به هیچ برنامه یا ابزار خاصی نیست و تنها با استفاده از یک ویرایشگر ساده متن (مانند برنامه Notepad در ویندوز) می‌توانید آن‌ها را ایجاد و ویرایش نمایید. -در ادامه پروژه‌ای به نام FirstProject که سورس کد آن تنها شامل یک اسکریپت است را ایجاد می‌نماییم. وظیفه این اسکریپت فرستادن حاصل عبارت ``4÷(6×5-50)`` به خروجی (Output) خواهد بود. - -برنامه‌ ویرایشگر متن پیش‌فرض سیستم عامل را اجرا نموده و به کمک آن یکی از کدهای پایین را (متناسب با نسخه پایتون مورد نظر خود) در فایلی با نام مشابه first_project و پسوند py نوشته و بر روی دیسک (در مسیر دایرکتوری Documents سیستم عامل) ذخیره می‌نماییم. - -برای نسخه 2x، ساختار FirstProject و محتوای فایل first_project_2x.py را به صورت پایین در نظر می‌گیریم: +در ادامه پروژه‌ای (یا در واقع یک فولدر) به نام FirstProject که تنها حاوی یک فایل اسکریپت (first_project.py) خواهد بود را ایجاد می‌نماییم. وظیفه این اسکریپت فرستادن حاصل عبارت ``4÷(6×5-50)`` به خروجی (Output) خواهد بود. .. code:: FirstProject . - └── first_project_2x.py - -.. code-block:: python - :linenos: - - #-*- coding: utf-8 -*- - - # Python 2.x - # File Name: first_project_2x.py - # This script prints a value to the screen. - - print "(50-5×6)÷4 =", (50-5*6)/4 - + └── first_project.py -و برای نسخه 3x، ساختار FirstProject و محتوای فایل first_project_3x.py را به صورت پایین در نظر می‌گیریم: - -.. code:: - - FirstProject - . - └── first_project_3x.py +داخل فولدر پروژه فایل first_project.py را ایجاد و سپس به کمک یک برنامه‌ ویرایشگر متن آن را ویرایش و کد پایین را در آن درج و سپس ذخیره می‌نماییم. .. code-block:: python - :linenos: + :caption: first_project.py - # Python 3.x - # File Name: first_project_3x.py # This script prints a value to the screen. print("(50-5×6)÷4 =", (50-5*6)/4) -در بخش بعدی به اجرای سورس کد FirstProject خواهیم پرداخت؛ در این بخش بهتر است کمی به بررسی کدهای آن بپردازیم: +در بخش بعدی به اجرای پروژه FirstProject خواهیم پرداخت؛ در این بخش بهتر است کمی به بررسی کدهای آن بپردازیم: -متن ماژول‌های پایتون 2x به صورت پیش‌فرض از استاندارد یونیکد (`Unicode `_) پشتیبانی نمی‌کنند و توسط اسکی (`ASCII `_) کدگذاری (Encoding) می‌شوند که تنها امکان استفاده از ۱۲۸ کاراکتر را می‌دهد. می‌توان با افزودن سطری مطابق الگوی ``-*- coding: encoding -*-#`` در ابتدای ماژول‌های پایتون (سطر یکم یا دوم) شیوه کدگذاری را به شکل دلخواه تعیین نماییم. [`PEP 263 `_] +در زبان پایتون هر متنی که بعد از کاراکتر ”Number sign“ یا # (در همان سطر) قرار بگیرد توسط مفسر پایتون نادیده گرفته می‌شود و تاثیری در روند ترجمه و اجرای کدها ندارد، به این نوع متن‌ «توضیح» (کامنت Comment) گفته می‌شود و از آن برای مستندسازی (Documentation) ماژول، یعنی ارایه توضیح در مورد بخشی از کد استفاده می‌گردد. ارایه توضیح نقش زیادی در خوانایی ماژول دارد و کمک می‌کند تا افراد دیگر - حتی خودتان - بتوانند عملکرد کدهای ماژول (یا اسکریپت) را بفهمند. -بر همین اساس کدگذاری اسکریپت first_script_2x.py را به دلیل استفاده از کاراکترهایی خارج از مجموعه ASCII (÷ و ×) به UTF-8 تغییر داده‌ایم. **پایتون 3x به صورت پیش‌فرض از استاندارد یونیکد پشتیبانی می‌کند.** +سطرهای خالی (Blank Lines) نیز توسط مفسر پایتون نادیده گرفته می‌شوند و تاثیری در روند ترجمه و اجرای کدها ندارند. استفاده درست از سطرهای خالی بر خوانایی کدهای ماژول می‌افزاید. -در زبان پایتون هر متنی که بعد از کاراکتر ”Number sign“ یا # (در همان سطر) قرار بگیرد توسط مفسر پایتون نادیده گرفته می‌شود و تاثیری در روند ترجمه و اجرای کدها ندارد، به این نوع متن‌ «توضیح» (کامنت Comment) گفته می‌شود و از آن برای مستندسازی (Documentation) ماژول یعنی ارایه توضیح در مورد بخشی از کد استفاده می‌گردد. ارایه توضیح نقش زیادی در خوانایی ماژول دارد و کمک می‌کند تا افراد دیگر - حتی خودتان - بتوانند عملکرد کدهای ماژول (یا اسکریپت) شما را بفهمند. +روش رایج فرستادن داده به خروجی (اینجا:‌ چاپ بر روی صفحه نمایش) در پایتون، استفاده از تابع ``()print`` است. تابع در برنامه‌نویسی همان مفهوم ریاضی خود را دارد، موجودیتی که مقادیری را به عنوان ورودی دریافت و بر اساس آن خروجی تولید می‌کند، بحث تابع بسیار گسترده است که طی دروس دوازدهم تا چهاردهم به صورت کامل شرح داده خواهد شد. -.. note:: - کاراکتر نخست عبارت تعیین کدگذاری نیز # است ولی این سطر کامنت نبوده و درک آن برای مفسر با ارزش می‌باشد. +تابع print توانایی دریافت هر تعداد داده و از هر نوع را دارد و در صورت دریافت یک عبارت محاسباتی (Arithmetic) یا منطقی (Logical) ابتدا حاصل آن را محاسبه یا ارزیابی کرده و پس از تبدیل به نوع داده string در خروجی قرار می‌دهد. در هنگام فرستادن چندین داده گوناگون به خروجی می‌بایست آن‌ها را توسط کاما (Comma) از یکدیگر جدا نماییم. در اینجا نیز print دو داده برای فرستادن به خروجی دریافت کرده است؛ یک نوع داده string و یک عبارت محاسباتی. -سطرهای خالی (Blank Lines) نیز توسط مفسر پایتون نادیده گرفته می‌شوند و تاثیری در روند ترجمه و اجرای کدها ندارند. استفاده درست از سطرهای خالی بر خوانایی کدهای ماژول می‌افزاید. -روش رایج فرستادن داده به خروجی (اینجا:‌ چاپ بر روی صفحه نمایش) در پایتون، استفاده از دستور ``print`` (در نسخه 2x) یا تابع ``()print`` (در نسخه 3x) است. بارزترین تفاوت نسخه 3.0 پایتون با نسخه‌های پیش از خود،‌ تبدیل دستور ``print`` به تابع (Function) می‌باشد. برای تابع، داده درون پرانتز قرار داده می‌شود. [در درسی جداگانه به بررسی تابع‌ها در پایتون خواهیم پرداخت] +به دنباله‌ای از کاراکترها که بین دو نماد نقل قول (Quotation): ``" "`` یا ``' '`` محصور شده‌ باشند، نوع داده string گفته می‌شود. -دستور (یا تابع) print توانایی دریافت هر تعداد داده و از هر نوع را دارد و در صورت دریافت یک عبارت محاسباتی (Arithmetic) یا منطقی (Logical) ابتدا حاصل آن را محاسبه یا ارزیابی کرده و پس از تبدیل به نوع داده string در خروجی قرار می‌دهد. در هنگام فرستادن چندین داده گوناگون به خروجی می‌بایست آن‌ها را توسط کاما (Comma) از یکدیگر جدا نماییم. در اینجا نیز print دو داده برای فرستادن به خروجی دریافت کرده است؛ یک نوع داده string و یک عبارت محاسباتی. -به دنباله‌ای از کاراکترها که بین دو نماد نقل قول (Quotation) یا ``" "`` محصور شده‌ باشند، string گفته می‌شود. +.. _running: اجرای سورس کد @@ -196,10 +132,10 @@ .. code:: - user> python - Python 2.7.9 (default, Jan 12 2015, 12:41:47) - [GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux2 + > python + Python 3.10.5 (main, Jul 22 2022, 17:09:35) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. + >>> >>> >>> a = 3 >>> b = 2 @@ -207,75 +143,63 @@ 6 >>> -شیوه دیگر که موضوع همین بخش است، ایجاد اسکریپت می‌باشد. پیش از این با ایجاد سورس کد و اسکریپت آشنا شده ایم و می‌دانیم که اسکریپت، ماژولی است که برای اجرای سورس کد توسعه یافته و اجرای سورس کد همیشه از اسکریپت شروع می‌شود. +شیوه دیگر که موضوع همین بخش است، ایجاد اسکریپت می‌باشد. می‌دانیم که اسکریپت، ماژولی است که برای اجرای سورس کد توسعه یافته و اجرای یک برنامه پایتونی همیشه از اسکریپت شروع می‌شود. برای اجرای اسکریپت می‌بایست در خط فرمان سیستم عامل دستور فراخوانی مفسر پایتون را به همراه نام کامل اسکریپت (نشانی + نام + پسوند) وارد نمایید. نمونه‌های پایین،‌ نتیجه اجرای اسکریپت بخش پیش را از طریق رابط خط فرمان گنولینوکس نمایش می‌دهد: - -.. code:: - - user> python2 Documents/FirstProject/first_project_2x.py - (50-5×6)÷4 = 5 .. code:: - user> python3 Documents/FirstProject/first_project_3x.py + user> python /home/user/Documents/FirstProject/first_project.py (50-5×6)÷4 = 5.0 -اگر به حاصل عبارت ``4÷(6×5-50)`` در خروجی دو اسکریپت دقت کرده باشید حتما متوجه تفاوت آن شده‌اید. پایتون 2x حاصل تقسیم دو عدد صحیح (Integer) را به صورت یک عدد صحیح محاسبه و از مقدار بعد از ممیز (در صورت وجود) صرف نظر می‌کند ولی پایتون 3x همواره حاصل تقسیم را به صورت یک عدد اعشاری (Floating Point) و با دقتی بیشتر بر می‌گرداند. باز هم در این مورد صحبت خواهیم کرد. +یا: + +.. code:: + + user> cd /home/user/Documents/FirstProject + user> python first_project.py + (50-5×6)÷4 = 5.0 -نتیجه اجرای دو اسکریپت یاد شده در هر سیستم عاملی همان است که در بالا مشاهده می‌نمایید. چنانچه کاربر سیستم عامل ویندوز هستید به این نکته توجه داشته باشید که به دلیل وجود کاراکترهای خاصی (÷ و ×) که قرار است توسط print بر روی خط فرمان نمایش داده شوند و همچنین عدم پشتیبانی پیش‌فرض خط فرمان ویندوز از کدگذاری UTF-8، به هنگام اجرای اسکریپت خطایی گزارش می‌شود که ارتباطی با کد پایتون ندارد. در این مواقع پیشنهاد می‌شود از پایتون 3x و برنامه PowerShell استفاده نموده و پیش از اجرای اسکریپت دستور ``chcp 65001`` را وارد نمایید - به صورت پایین: +چنانچه کاربر سیستم عامل ویندوز هستید به این نکته توجه داشته باشید که به دلیل وجود کاراکترهای خاصی (÷ و ×) که قرار است توسط print بر روی خط فرمان نمایش داده شوند و همچنین امکان عدم پشتیبانی پیش‌فرض خط فرمان ویندوز از کدگذاری UTF-8، به هنگام اجرای اسکریپت خطایی گزارش می‌شود که ارتباطی با کد پایتون ندارد. در این مواقع پیشنهاد می‌شود از برنامه PowerShell استفاده نموده و پیش از اجرای اسکریپت دستور ``chcp 65001`` را وارد نمایید - به صورت پایین: .. code:: PS > chcp 65001 Active code page: 65001 - PS > python Documents\FirstProject\first_script_3x.py + PS > python C:\Users\user\Documents\FirstProject\first_script.py (50-5×6)÷4 = 5.0 چگونگی اجرای اسکریپت‌های پایتون چیزی بیش از این نیست، البته می‌توان در هنگام اجرای اسکریپت داده‌هایی را نیز به عنوان آرگومان به آن ارسال نمود که این مورد در درس بعدی بررسی می‌شود. -معمولا در گنولینوکس سطری به مانند پایین به ابتدای اسکریپت‌های پایتون (فقط در سطر یکم) اضافه می‌کنند، در این صورت به هنگام اجرا دیگر نیازی به فراخوانی مفسر پایتون نبوده و تنها می‌بایست پس از تغییر حالت (Mode) اسکریپت مورد نظر به حالت اجرا (توسط دستور `chmod `_)، آن را به روش معمول در یونیکس اجرا نماییم: +معمولا در گنولینوکس سطری به مانند پایین به ابتدای اسکریپت‌های پایتون (فقط در سطر یکم) اضافه می‌کنند، در این صورت به هنگام اجرا دیگر نیازی به فراخوانی مفسر پایتون نبوده و تنها می‌بایست پس از تغییر حالت (Mode) اسکریپت مورد نظر به حالت قابل اجرا (توسط دستور `chmod `_)، آن را به روش معمول در یونیکس اجرا نماییم: -.. code-block:: python - :linenos: +:: - #!/usr/bin/env python3 + #!/usr/bin/env python -``env`` یک دستور شل (Shell) یونیکس است که در زمان اجرای اسکریپت مفسر پایتون را می‌یابد و نشانی آن را جایگزین می‌کند. به جای استفاده از ``env`` می‌توان نشانی مفسر پایتون مورد نظر را به صورت صریح مانند ``usr/bin/python3/!#`` نوشت که البته در مواردی که پایتون به صورت جداگانه نصب شده باشد (نشانی مفسر در این حالت: usr/local/bin/python3/)، کارایی ندارد و موجب شکست در اجرا می‌گردد. +``env`` یک دستور شل (Shell) یونیکس است که در زمان اجرای اسکریپت مفسر پایتون را می‌یابد و نشانی آن را جایگزین می‌کند. به جای استفاده از ``env`` می‌توان نشانی مفسر پایتون مورد نظر را به صورت صریح مانند ``usr/bin/python/!#`` نوشت که البته در مواردی که پایتون به صورت جداگانه نصب شده باشد (نشانی مفسر در این حالت: usr/local/bin/python/)، کارایی ندارد و موجب شکست در اجرا می‌گردد. -اکنون برای نمونه اگر اسکریپت first_script_2x.py را برای اجرا در گنولینوکس کامل‌تر سازیم: +اکنون برای نمونه اگر اسکریپت first_script.py را برای اجرا در گنولینوکس کامل‌تر سازیم: .. code-block:: python - :linenos: #!/usr/bin/env python - #-*- coding: utf-8 -*- - # Python 2.x - # File: first_project_2x.py # This script prints a value to the screen. - print "(50-5×6)÷4 =", (50-5*6)/4 -پس از تغییر حالت، به دو صورت پایین می‌توان آن را در توزیع‌های گنولینوکس اجرا نمود: - -.. code:: - - user> chmod +x Documents/FirstProject/first_project_2x.py - - user> Documents/FirstProject/first_project_2x.py - (50-5×6)÷4 = 5 +پس از تغییر حالت، می‌توان آن را به صورت زیر در توزیع‌های گنولینوکس اجرا نمود: .. code:: - user> cd Documents/FirstProject/ + user> cd /home/user/Documents/FirstProject - user> chmod +x first_project_2x.py + user> chmod +x first_project.py - user> ./first_project_2x.py + user> ./first_project.py (50-5×6)÷4 = 5 .. note:: @@ -284,13 +208,13 @@ | -ایجاد اسکریپت پایتون و اجرای آن همان‌طور که مشاهده کردید بسیار ساده است و وابسته به وجود هیچ ابزار خاصی نمی‌باشد ولی برای پایتون نیز مانند هر زبان پر کاربرد دیگری تعداد زیادی `IDE `_ توسعه داده شده است که در ادامه به معرفی چند نمونه مطرح‌تر از این دست ابزار خواهیم پرداخت. - -* `PyDev `_: یک IDE کامل، متن باز و رایگان است که برای پلتفرم `Eclipse `_ ارایه می‌شود. +ایجاد اسکریپت پایتون و اجرای آن همان‌طور که مشاهده کردید بسیار ساده است و وابسته به وجود هیچ ابزار خاصی نیست ولی برای پایتون نیز مانند هر زبان پر کاربرد دیگری تعداد زیادی `IDE `_ توسعه داده شده است که در ادامه به معرفی چند نمونه محبوب از آن‌ها خواهیم پرداخت. * `PyCharm `_: محصولی از شرکت فوق‌العاده JetBrains است که البته نسخه کامل آن فروشی است ولی نسخه کامیونیتی (Community) آن رایگان و متن باز می‌باشد که از بسیاری ویژگی‌ها و امکانات ویژه برخوردار است. (`مقایسه نسخه‌ها `_) -* `NetBeans `_: یک IDE کامل، متن باز و رایگان است که طرفداران بسیاری دارد. NetBeans به صورت پیش‌فرض از پایتون پشتیبانی نمی‌کند و باید پلاگین مربوط به آن نصب گردد. (`صفحه راهنمای نصب `_) +* `PyDev `_: یک IDE کامل، متن باز و رایگان است که برای پلتفرم `Eclipse `_ ارایه می‌شود. + +* `NetBeans `_: یک IDE کامل، متن باز و رایگان است که طرفداران بسیاری دارد. NetBeans به صورت پیش‌فرض از پایتون پشتیبانی نمی‌کند و باید پلاگین مربوط به آن نصب گردد. (`پلاگین nbPython `_) @@ -298,16 +222,160 @@ IDE یا Integrated development environment به ابزارهایی گفته می‌شود که علاوه‌بر یک ویرایشگر متن پیشرفته، امکانات بسیار کاربردی دیگری را نیز به مانند دیباگر (`Debugger `__) در اختیار برنامه‌نویس قرار می‌دهد. +.. admonition:: تمرین + + یک اسکریپت پایتون ایجاد کنید که نام و سن شما را تنها با یکبار استفاده از تابع ``()print`` به صورت پایین بر روی خروجی نمایش دهد: + + ``Name: Hideyoshi Nagachika - Age: 19`` + + ** حالت‌های مختلفی که می‌توان به این ساختار از خروجی رسید را امتحان نمایید (ورودی‌های متفاوت) + + +.. _modular-programming: + +برنامه‌نویسی ماژولار +----------------------- +یک الگوی توصیه شده در برنامه‌نویسی، توسعه برنامه در واحدهایی کوچک از کد است. به گونه‌ای که هر واحد یک نقش مشخص و مستقل از دیگر واحدها داشته باشد. مستقل به این معنی که تغییر یا جایگزینی یک واحد نباید بر روی عملکرد دیگر واحدها تاثیرگذار باشد. به این ترتیب فرآیند خطایابی، نگهداری و توسعه برنامه به مراتب بهبود می‌یابد. یکی از امکانات پایتون در رسیدن به این اصل، استفاده درست از مفاهیم بسته و ماژول است. +[برای مطالعه بیشتر: `Modular programming `_ و `Loose coupling `_] + + +پروژه پایین که تنها شامل یک اسکریپت است را در نظر بگیرید: + +.. code:: + + TokyoGhoul + . + └── tokyo_ghoul.py + +.. code-block:: python + :linenos: + :caption: tokyo_ghoul.py + + print("Name:") + print("Actor_1:", "Hideyoshi Nagachika") + + print("Name:") + print("Actor_2:", "Ken Kaneki") + + print("Age:") + print("Actor_1:", 19) + + print("Age:") + print("Actor_2:", 18) + +می‌توان این پروژه را با ساختاری به شکل پایین نیز توسعه داد: + +.. code:: + + TokyoGhoul + . + ├── tokyo_ghoul.py + │ + └── actors/ + │ + ├── __init__.py + │ + ├── ages/ + │ ├── __init__.py + │ ├── actor1.py + │ └── actor2.py + │ + └── names/ + ├── __init__.py + ├── actor1.py + └── actor2.py + + +.. code-block:: python + :linenos: + :caption: actors.ages.actor1.py + + print("Age:") + print("Actor_1:", 19) + +.. code-block:: python + :linenos: + :caption: actors.ages.actor2.py + + print("Age:") + print("Actor_2:", 18) + +.. code-block:: python + :linenos: + :caption: actors.names.actor1.py + + print("Name:") + print("Actor_1:", "Hideyoshi Nagachika") + +.. code-block:: python + :linenos: + :caption: actors.names.actor2.py + + print("Name:") + print("Actor_2:", "Ken Kaneki") + +.. code-block:: python + :linenos: + :caption: tokyo_ghoul.py + + import actors.names.actor1 + + from actors.names import actor2 + + import actors.ages.actor1 + + from actors.ages import actor2 + +خروجی اجرای ``tokyo_ghoul.py`` در هر دو حالت یکی است:: + + Name: + Actor_1: Hideyoshi Nagachika + Name: + Actor_2: Ken Kaneki + Age: + Actor_1: 19 + Age: + Actor_2: 18 + +اما در حالت دوم امکان توسعه بیشتر بوده و به راحتی می‌توان اطلاعات (نام و سن) جدید را به برنامه افزود. همچنین موارد سن و نام را می‌توان به دفعات در برنامه استفاده نمود بدون آنکه مجبور به نوشتن کدهای تکراری شویم (`DRY - Don't repeat yourself `_). البته این مثال با توجه به اطلاعات پایتونی جاری ارایه شده است و دارای ضعفی است که در آینده خود متوجه آن خواهید شد :) + +همانطور که مشاهده می‌شود در پایتون برای ایجاد دسترسی به دیگر ماژول‌ها می‌بایست ابتدا آن‌ها را ``import`` کرد و این عمل در هر جایی از بدنه ماژول یا اسکریپت جاری ممکن است. البته باید توجه داشت که اجرای کدهای پایتون سطر به سطر از بالا به پایین می‌باشد و در صورت نیاز به هر ماژول می‌بایست پیش‌تر آن را ``import`` نمایید. + +برای ``import`` هر ماژول می‌بایست نام تمام بسته‌های موجود از ابتدا تا ماژول مورد نظر به ترتیب ذکر گردد به صورتی که همگی با یک کاراکتر ``.`` به یکدیگر متصل شده باشند. در پایان نیز نام ماژول مورد نظر ذکر می‌گردد:: + + import actors.names.actor1 + + +ماژول‌های داخل هر بسته را می‌توان به صورت زیر نیز ``import`` کرد:: + + from actors.names import actor1 + +استفاده از روش دوم مزایایی دارد که در کامیونیتی پایتون آن را به مراتب پر استفاده‌تر ساخته است. برای مثال فراخوانی اجزای داخلی ماژول را ساده‌تر می‌سازد و دیگر نیازی به ذکر نام بسته ها نخواهد بود. این مورد را به همراه نکات دیگر پیرامون ``import`` کردن ماژول‌ها طی دروس آتی خواهید دید. ذکر تمام ویژگی‌ها و کاربردهای موجود بدون آشنایی با دیگر اجزای زبان برنامه‌نویسی پایتون بیهوده است و در ادامه این کتاب به ترتیب با این اجزا آشنا خواهید شد. + + +.. tip:: + مفسر پایتون دستورات داخل هر ماژول را یکبار به صورت کامل در نخستین ``import`` اجرا می‌کند. + + +.. admonition:: تمرین + + تمرین قبل را در ساختار چند ماژولی پیاده‌سازی کنید به گونه‌ای که نام در سطر یکم و سن در سطر دوم چاپ شود. + + ** سعی کنید مسیر ماژول‌های خود را چندین بار تغییر دهید و متناسب با آن‌ها برنامه خود را اصلاح و تست نمایید. + + +.. _interpreter-background: + پشت صحنه اجرا --------------- -زمانی که اقدام به اجرای یک اسکریپت می‌کنید؛ ابتدا، اسکریپت و تمام ماژول‌های وارد شده در آن به بایت‌کد کامپایل و سپس بایت‌کد‌های حاصل جهت تفسیر به زبان ماشین و اجرا، به ماشین مجازی فرستاده می‌شوند. آنچه ما از آن به عنوان مفسر پایتون (پیاده‌سازی CPython) یاد می‌کنیم در واقع ترکیبی از یک کامپایلر و یک ماشین مجازی است. تصویر پایین به خوبی روند اجرای کدهای پایتون را نمایش می‌دهد. +زمانی که اقدام به اجرای یک اسکریپت می‌کنید؛ ابتدا، اسکریپت و تمام ماژول‌های ``import`` شده در آن به بایت‌کد کامپایل و سپس بایت‌کد‌های حاصل جهت تفسیر به زبان ماشین و اجرا، به ماشین مجازی فرستاده می‌شوند. آنچه ما از آن به عنوان مفسر پایتون (پیاده‌سازی CPython) یاد می‌کنیم در واقع ترکیبی از یک کامپایلر و یک ماشین مجازی است. تصویر پایین به خوبی روند اجرای کدهای پایتون را نمایش می‌دهد. .. image:: /_static/l03-interpreter.png :align: center :target: http://trizpug.org/Members/cbc/wyntkap/compiler.html -بایت‌کد هر ماژول‌ پایتون در قالب فایلی با پسوند pyc که یاد‌آور py Compiled است، ذخیره می‌گردد. این فایل در یک زیردایرکتوری با نام __pycache__ داخل همان دایرکتوری ماژول ذخیره می‌شود و نام گذاری آن نیز با توجه به نام ماژول و نسخه‌ مفسر پایتون مورد استفاده، انجام می‌گیرد (نمونه: module.cpython-34.pyc). مفسر پایتون از این فایل ذخیره شده جهت افزایش سرعت اجرا در آینده بهره خواهد برد؛ به این صورت که در نوبت‌های بعدی اجرا چنانچه تغییری در کدهای ماژول یا نسخه‌ مفسر پایتون صورت نگرفته باشد، مفسر با بارگذاری فایل بایت‌کد از کامپایل مجدد سورس کد به بایت‌کد صرف نظر می‌کند. +بایت‌کد هر ماژول‌ پایتون در قالب فایلی با پسوند pyc که یاد‌آور py Compiled است، ذخیره می‌گردد. این فایل در یک زیردایرکتوری با نام __pycache__ داخل همان دایرکتوری ماژول ذخیره می‌شود و نام‌گذاری آن نیز با توجه به نام ماژول و نسخه‌ مفسر پایتون مورد استفاده، انجام می‌گیرد (نمونه: module.cpython-34.pyc). مفسر پایتون از این فایل ذخیره شده جهت افزایش سرعت اجرا در آینده بهره خواهد برد؛ به این صورت که در نوبت‌های بعدی اجرا چنانچه تغییری در کدهای ماژول یا نسخه‌ مفسر پایتون صورت نگرفته باشد، مفسر با بارگذاری فایل بایت‌کد موجود از کامپایل مجدد صرف نظر می‌کند. .. note:: مفسر پایتون تنها برای ماژول‌های وارد شده در اسکریپت اقدام به ذخیره کردن فایل بایت‌کد بر روی دیسک می‌کند و برای اسکریپت‌ این عمل صورت نمی‌گیرد. @@ -323,6 +391,8 @@ کدنویسی در حالت تعاملی را در درس بعدی خواهید آموخت ولی به یاد داشته باشید که مفسر پایتون محیط کدنویسی در این حالت را به مانند یک اسکریپت در نظر می‌گیرد. +.. _virtual-environments: + ایجاد محیط مجازی ------------------ حالتی را در نظر بگیرید که در ایجاد پروژه‌های مختلف به نسخه‌های متفاوتی از برخی کتابخانه‌ها نیاز دارید؛ در این صورت چگونه می‌توانید چندین نسخه‌ متفاوت از یک کتابخانه‌ را در پایتون نصب نمایید؟ برای نمونه، فرض نمایید می‌خواهیم بر روی توسعه دو وب‌سایت؛ یکی توسط نسخه جدید (1.8) وب فریم‌ورک جنگو (`Django `_) و دیگری بر روی یک نسخه قدیمی (0.96) از آن کار کنیم، ولی نمی‌توانیم!؛ زیرا که نمی‌شود هر دوی این نسخه‌ها را با هم در پایتون (دایرکتوری site-packages) نصب داشت. در این وضعیت راه حل ایجاد محیط‌هایی مجازی (Virtual Environments) برای توسعه پروژه‌های مورد نظر است؛ محیطی که توسعه و اجرای هر پروژه پایتون را به همراه تمام وابستگی‌های (Dependencies) آن از پروژه‌های دیگر جدا یا ایزوله (isolate) می‌کند. در ادامه به بررسی دو ابزار رایج در این رابطه می‌پردازیم. @@ -401,7 +471,7 @@ virtualenv pyvenv ~~~~~~ -در نسخه‌های 3x پایتون و از 3.3 به بعد ماژولی با نام `venv `_ برای ایجاد محیط مجازی به کتابخانه استاندارد پایتون افزوده شده است که می‌توان از آن به جای نصب virtualenv استفاده نمود؛ برای این منظور از دستور pyvenv (پای وی اِنو) و با الگویی مشابه ``pyvenv ENV`` استفاده می‌گردد. +از نسخه 3.3 پایتون به بعد ماژولی با نام `venv `_ برای ایجاد محیط مجازی به کتابخانه استاندارد پایتون افزوده شده است که می‌توان از آن به جای نصب virtualenv استفاده نمود؛ برای این منظور از دستور pyvenv (پای وی اِنو) و با الگویی مشابه ``pyvenv ENV`` استفاده می‌گردد. *در گنولینوکس:* :: @@ -438,14 +508,70 @@ pyvenv > +.. note:: + به عنوان یک رفتار توصیه شده بهتر است، در ازای هر پروژه پایتونی که آغاز می‌کنید یک محیط مجازی مخصوص نیز ایجاد نمایید. همچنین هر پروژه نیز بهتر است همواره حاوی فایل requirements.txt مخصوص به خود باشد تا مراحل آماده‌سازی (نصب بسته‌های پیش‌نیاز یا مورد استفاده در پروژه - dependencies) در این محیط به مراتب ساده‌تر گردد. + + +.. _packaging-projects: + +انتشار پروژه +-------------- + + +اکنون اطلاعات کافی برای شروع یک پروژه از پایتون را دارید ولی چنانچه می‌خواهید با ساختار مناسب پروژه‌ای که قرار است برای استفاده افراد دیگر از طریق PyPI یا سرویس‌هایی نظیر github.com منتشر شود (مانند یک کتابخانه کاربردی) آشنا شوید، ادامه این بخش را نیز مطالعه نمایید. + +در یک پروژه کامل که میخواهیم آن را در کامیونیتی پایتون منتشر سازیم، جدا از سورس کد لازم است موارد دیگری نیز در ساختار آن در نظر گرفته شود؛ به ساختار پایین توجه نمایید: + + +.. code:: + + my_project + . + ├── pyproject.toml + │ + ├── LICENSE.txt + ├── README.rst + ├── requirements.txt + │ + ├── src/ + │ └── unique_pakage_name/ + │ ├── __init__.py + │ └── main.py + │ + ├── docs/ + └── test/ + + +ساختار ابتدایی تنها شامل سورس کد می‌بود ولی در این ساختار تمام سورس کد در قالب یک بسته پایتون بخشی از مجموعه بزرگتری است که در آن یک سری فایل به مانند requirements.txt ،README.rst و pyproject.toml افزوده شده است. تاکید می‌شود که در حال حاضر نیازی به رعایت این ساختار و ایجاد تمامی این فایل‌ها نیست. + +**pyproject.toml**: تمام اطلاعات مورد نیاز برای فرآیند تولید (Build) یک Distribution یا یک بسته قابل انتشار از پروژه مورد نظر توسط این فایل تعریف می‌گردد. [`اسناد پایتون `__] + + +**README.rst**: تمام پروژه‌ها می‌بایست شامل سندی برای توصیف خود باشند. در پایتون برای ایجاد اسناد معمولا از زبان نشانه‌گذاری `reStructuredText `_ استفاده می‌گردد و به همین دلیل این اسناد پسوند rst دارند که البته اجباری به این مورد نیست و می‌توانید برای ایجاد این فایل از `Markdown `_ (پسوند md) نیز استفاده نمایید. + +**requirements.txt**: از این فایل برای معرفی کتابخانه‌های خاصی که در پروژه استفاده شده‌اند و در زمان نصب یا اجرای سورس کد، وجود یا نصب بودن آن‌ها نیز ضروری است، استفاده می‌گردد. + +**LICENSE.txt**: این فایل پروانه‌ انتشار پروژه را مشخص می‌کند و اغلب حاوی یک کپی از متن پروانه‌های متن باز رایج به مانند `MIT `_ ،`GPL `_ یا `BSD `_ می‌باشد. + +.. note:: + لازم است تمامی فایل‌های یاد شده و دایرکتوری docs در بالاترین شاخه از دایرکتوری پروژه قرار داده شوند. + +**docs**: در این دایرکتوری اسناد (راهنما، آموزش و...) پروژه قرار داده می‌شوند. ایجاد این اسناد در کامیونیتی پایتون معمولا توسط `Sphinx `_ انجام می‌شود. قابل ذکر است که در تولید این کتاب نیز از همین ابزار استفاده شده است. + +**test**: این دایرکتوری محل نگهداری کدهای مربوط به تست پروژه می‌باشد. تست‌نویسی یک امر ضروری در روند توسعه هر پروژه برنامه‌نویسی است. این دایرکتوری می‌تواند هم در بالا ترین شاخه از پروژه و هم در داخل دایرکتوری سورس کد قرار داده شود. + +اکنون می توان از روی این پروژه یک توزیع (Distribution) ایجاد و آن را با استفاده از ابزارهایی به مانند `Twine `_ یا `Poetry `_ بر روی PyPI منتشر ساخت. [برای کسب اطلاعات بیشتر می‌توانید از `اسناد پایتون `_ استفاده نمایید] + +در صورت علاقه می‌توانید نگاهی نیز به پروژه `saeiddrv/PackagingPythonProjects `_ بیاندازید که تمامی مراحل را به صورت کاربردی بر پایه Poetry پیاده‌سازی کرده است. + + + | ---- :emoji-size:`😊` امیدوارم مفید بوده باشه -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - diff --git a/source/lessons/l04.rst b/source/lessons/l04-python-interactive-mode.rst similarity index 73% rename from source/lessons/l04.rst rename to source/lessons/l04-python-interactive-mode.rst index e4c15ab..63a0506 100644 --- a/source/lessons/l04.rst +++ b/source/lessons/l04-python-interactive-mode.rst @@ -1,10 +1,11 @@ .. role:: emoji-size .. meta:: - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، برنامه نویسی تعاملی، محیط تعاملی (Interactive) پایتون، راهنمای پایتون - :keywords: پایتون,آموزش پایتون, آموزش برنامه نویسی,حالت تعاملی پایتون, محیط تعاملی, دریافت راهنمایی, راهنمایی, گزینه های فراخوانی, + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس چهارم: برنامه‌نویسی تعاملی با پایتون + :keywords: پایتون,آموزش پایتون, آموزش برنامه نویسی,حالت تعاملی پایتون, محیط تعاملی, دریافت راهنمایی, راهنمایی, گزینه های فراخوانی, interactive +.. _lesson-04: درس ۰۴: برنامه‌نویسی تعاملی با پایتون ====================================== @@ -30,28 +31,22 @@ ---- +.. _python-interactive-mode: + + حالت تعاملی ------------- از درس پیش به خاطر داریم که کدهای پایتون را می‌توان به دو روش اجرا نمود: ۱- ایجاد اسکریپت و معرفی آن به مفسر پایتون که در همان درس بررسی شد ۲- به شکل تعاملی با مفسر پایتون که موضوع همین درس است. پایتون یک زبان برنامه‌نویسی با قابلیت «حالت تعاملی» (Interactive Mode) است؛ این قابلیت که مبتنی بر خط فرمان است، امکانی را برای پردازش و اجرای کدهای (دستورها، عبارت‌ها [#f1]_ و تعریف‌ها) زبان پایتون فراهم می‌آورد. کدنویسی در این حالت به مانند زمانی است که یک اسکریپت را ایجاد می‌نمایید؛ ولی با هر بار فشردن کلید Enter صفحه کلید، مفسر پایتون آن را به صورت خودکار اجرا می‌کند. -البته حالت تعاملی محدودیت‌هایی دارد که خواهید دید ولی از برخی زوایا بسیار مناسب و کاربردی است؛ به عنوان نمونه ممکن است قصد آزمودن یکی از قابلیت‌های زبان پایتون را داشته باشید یا اینکه بخواهید خروجی یک قطعه کد کوتاه را مشاهده نمایید که در این صورت ایجاد اسکریپت و سپس اجرای آن می‌تواند کار پر زحمتی به نظر برسد!،‌ از طرفی دریافت راهنمایی نیز از دیگر مزایای آن است که در یادآوری، شناخت و کسب آگاهی از موارد زبان پایتون (کلمه‌های کلیدی، تابع‌ها، کلاس‌ها، ماژول‌ها و...) بسیار کاربردی و مفید می‌باشد، حتی برخی نیز از این حالت پایتون به عنوان یک ماشین حساب بهره می‌گیرند!. +البته حالت تعاملی محدودیت‌هایی دارد که خواهید دید ولی از برخی زوایا بسیار مناسب و کاربردی است؛ به عنوان نمونه ممکن است قصد آزمودن یکی از قابلیت‌های زبان پایتون را داشته باشید یا اینکه بخواهید خروجی یک قطعه کد کوتاه را مشاهده نمایید که در این صورت ایجاد اسکریپت و سپس اجرای آن می‌تواند کار پر زحمتی به نظر برسد!،‌ از طرفی دریافت راهنمایی نیز از دیگر مزایای آن است که در یادآوری، شناخت و کسب آگاهی از اجزای زبان پایتون (کلمه‌های کلیدی، تابع‌ها، کلاس‌ها، ماژول‌ها و...) بسیار کاربردی و مفید می‌باشد، حتی برخی نیز مانند خود من از این قابلیت پایتون به عنوان یک ماشین حساب بهره می‌گیرند!. برای ورود به حالت تعاملی پایتون از دستور فراخوانی مفسر (حالت عمومی: ``python``) - به شکل تنها و بدون آرگومان‌ - در رابط خط فرمان سیستم عامل، استفاده می‌شود. + :: -*ورود به حالت تعاملی پایتون 2x - ویندوز:* :: - - > cd C:\\Python27 - > python - Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32 - Type "help", "copyright", "credits" or "license" for more information. - >>> - -*ورود به حالت تعاملی پایتون 3x - گنولینوکس:* :: - - user> python3 + user> python Python 3.4.2 (default, Jan 25 2015, 20:02:16) [GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux Type "help", "copyright", "credits" or "license" for more information. @@ -84,13 +79,13 @@ (50-5×6)÷4 = 5.0 .. caution:: - در پایتون برای تعریف یک تابع از کلمه کلیدی ``def`` استفاده می‌گردد که به دنبال آن نام و سپس پارامتر‌های تابع (در صورت نیاز) که درون پرانتز قرار می‌گیرند، آورده می‌شود. بعد از کاراکتر دو‌نقطه (Colon یا ``:``) و در سطرهای بعدی با رعایت یکنواخت تورفتگی، دستورهای بدنه تابع نوشته می‌شوند. با فراخوانی تابع (وارد کردن نام تابع) بدنه تابع اجرا می‌گردد. چنانچه در تعریف تابع پارامترهایی نیز در نظر گرفته شده باشد، در هنگام فراخوانی می‌بایست مقدار متناظر آن‌ها نیز مشخص شود (درون پرانتز جلوی نام تابع) - در کد بالا تابع ``func`` فاقد پارامتر بوده بنابراین در هنگام فراخوانی آن مقداری ارسال نشده است. [فقط برای آگاهی اولیه - تابع‌ پایتون در درسی جداگانه بررسی خواهد شد] + در پایتون برای تعریف یک تابع از کلمه کلیدی ``def`` استفاده می‌گردد که به دنبال آن نام و سپس پارامتر‌های تابع (در صورت نیاز) که درون پرانتز قرار می‌گیرند، آورده می‌شود. بعد از کاراکتر دو‌نقطه (Colon یا ``:``) و در سطرهای بعدی با رعایت یکنواخت تورفتگی، دستورهای بدنه تابع نوشته می‌شوند. با فراخوانی تابع (وارد کردن نام تابع) بدنه تابع اجرا می‌گردد. چنانچه در تعریف تابع پارامترهایی نیز در نظر گرفته شده باشد، در هنگام فراخوانی می‌بایست مقدار متناظر آن‌ها نیز مشخص شود (درون پرانتز جلوی نام تابع) - در کد بالا تابع ``func`` فاقد پارامتر بوده بنابراین در هنگام فراخوانی آن مقداری ارسال نشده است. [فقط برای آگاهی اولیه - تابع‌ در پایتون توسط دروس دوازدهم تا چهاردهم بررسی خواهد شد] .. note:: برای پایان دادن به دستورهای چند سطری می‌بایست سطر پایانی را خالی رها کرده و کلید Enter را بفشارید. -برای پاک کردن صفحه از کلید‌های ترکیبی Ctrl–L استفاده نمایید. به منظور خروج نیز می‌توانید عبارت ()quit را وارد کرده یا از کلیدهای ترکیبی Ctrl–D در *گنولینوکس* و Ctrl–Z با یک Enter پس از آن در *ویندوز* استفاده نمایید. +برای پاک کردن صفحه از کلید‌های ترکیبی Ctrl–L استفاده نمایید. به منظور خروج نیز می‌توانید دستور ()quit را وارد کرده یا از کلیدهای ترکیبی Ctrl–D در *گنولینوکس* و Ctrl–Z با یک Enter پس از آن در *ویندوز* استفاده نمایید. از مزایای حالت تعاملی این است که در بیشتر مواقع برای مشاهده نتیجه، نیازی به استفاده از print نمی‌باشد: @@ -135,9 +130,21 @@ >>> math.sin(_) 1.0 -*برای وارد کردن یک ماژول به اسکریپت (یا ماژولی دیگر) از دستور import استفاده می‌گردد. در یک درس جداگانه به صورت کامل صحبت خواهد شد ولی برای ادامه این درس تا همین حد بدانید که برای فراخوانی تابع‌های موجود در یک ماژول import شده از الگوی «نام ماژول + نقطه + نام تابع مورد نظر» استفاده می‌گردد - در دستور import پسوند ماژول نوشته نمی‌شود.* +اکنون می‌دانیم که برای وارد کردن یک ماژول به یک اسکریپت (یا ماژولی دیگر) از دستور import استفاده می‌گردد. پس از آن، برای دستیابی اجزای داخل آن مانند فراخوانی یک تابع نیز می‌بایست از الگوی «نام ماژول + نقطه + نام تابع مورد نظر» استفاده گردد. + +و اگر از روش ``... from ... import`` استفاده کنیم: در این صورت می‌توان به جای کل ماژول، تنها اجزای مورد نیاز خود را import نماییم و دیگر نیازی به ذکر نام ماژول نیز نخواهد بود:: + + >>> from math import sqrt, pow, radians, sin + >>> sqrt(36) + 6.0 + >>> pow(3, 2) + 9.0 + >>> radians(90) + 1.5707963267948966 + >>> sin(_) + 1.0 -مثالی دیگر - ``sys`` یکی از ماژول‌های مهم پایتون است؛ این ماژول امکان دسترسی به برخی از متغیرهای مورد استفاده مفسر (در زمان اجرا) و همچنین تابع‌هایی که با مفسر در ارتباط هستند را فراهم می‌آورد [`اسناد پایتون `__]: +مثالی دیگر - ``sys`` یکی از ماژول‌های مهم پایتون است؛ این ماژول امکان دسترسی به برخی از متغیرهای مورد استفاده توسط مفسر (در زمان اجرا) و همچنین تابع‌هایی که با مفسر در ارتباط هستند را فراهم می‌آورد [`اسناد پایتون `__]: .. code-block:: python @@ -155,7 +162,27 @@ >>> sys.getdefaultencoding() 'utf-8' -دستور ``()sys.exit`` نیز موجب توقف اجرا (در اینجا: خروج از حالت تعاملی پایتون) می‌گردد. برای کنترل خطاها کاربرد دارد و همچنین می‌توان پیامی مرتبط را به خروجی فرستاد (معمولا گزارش رویدادی که موجب اتمام ناگهانی برنامه شده‌ است):: +یا: + +.. code-block:: shell + + >>> from sys import version, version_info, platform, getdefaultencoding + + >>> version + '3.4.2 (default, Jan 25 2015, 20:02:16) \n[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)]' + + >>> version_info + sys.version_info(major=3, minor=4, micro=2, releaselevel='final', serial=0) + + >>> platform + 'linux' + + >>> getdefaultencoding() + 'utf-8' + +دستور ``()sys.exit`` نیز موجب توقف اجرا (در اینجا: خروج از حالت تعاملی پایتون) می‌گردد. برای کنترل خطاها کاربرد دارد و همچنین می‌توان پیامی مرتبط را به خروجی فرستاد (معمولا گزارش رویدادی که موجب اتمام ناگهانی برنامه شده‌ است): + +.. code-block:: shell >>> import sys @@ -164,6 +191,23 @@ user> +یا + +.. code-block:: shell + + >>> from sys import exit as bye + + >>> bye("Error: Goodbye! :| ") + Error: Goodbye! :| + + user> + + +با استفاده از ``as`` می‌توان برای اجزای import شده (به هر دو روش)، یک نام دلخواه تنظیم کرد. این ویژگی در زمانی که نام اصلی طولانی بوده یا با یکی از اجزای داخل ماژول همنام باشد (برای جلوگیری از تداخل) کاربرد دارد. + + +.. _python-help: + دریافت راهنمایی ----------------- @@ -175,7 +219,7 @@ به دو روش می‌توان از امکان راهنمایی استفاده کرد که در ادامه بررسی می‌شود. .. note:: - در هر دو روش برای مرور توضیحات طولانی از کلیدهای Enter (سطر به سطر) و Space (صفحه به صفحه) بهره بگیرید و برای خروج از توضیحات نیز از کلید q صفحه کلید استفاده نمایید؛ انتهای توضیحات نیز توسط عبارت ``(END)`` مشخص می‌شود. + در هر دو روش برای مرور توضیحات طولانی از کلیدهای Enter (سطر به سطر) و Space (صفحه به صفحه) بهره بگیرید و برای خروج از توضیحات نیز از کلید q صفحه کلید استفاده نمایید؛ همواره انتهای توضیحات توسط عبارت ``(END)`` مشخص شده است. .. rubric:: روش یکم: رفتن به حالت راهنمای تعاملی @@ -209,8 +253,6 @@ :: - # Python 3.x - help> keywords Here is a list of the Python keywords. Enter any keyword to get more help. @@ -264,64 +306,14 @@ >>> -.. tip:: - ``print`` در نسخه 3x پایتون به صورت یک تابع تعریف شده است و تابع‌ها در پایتون یک نوع شی هستند. - -از این روش با الگوی دیگری هم استفاده می‌شود. الگوی ``("help("string`` یعنی قرار دادن نام موردی که می‌خواهید درباره آن اطلاعات بگیرید درون پرانتز به شکلی محصور با دو نماد نقل قول ( " " ) - این الگو عملکردی مشابه با روش قبل (روش یکم) دارد با این تفاوت که دریافت اطلاعات به صورت مستقیم و بدون ورود به راهنمای تعاملی انجام می‌پذیرد. در واقع برای به دست آوردن اطلاعات درباره موردی که شی نمی‌باشد (مانند هر یک از دستورهای ``symbols`` ،``keywords`` ،``modules`` و ``topics`` یا دستور ``print`` در پایتون 2x یا نام ماژول‌ها یا...) لازم است به این صورت اقدام گردد:: +از این روش با الگوی دیگری هم استفاده می‌شود. الگوی ``("help("string`` یعنی قرار دادن نام موردی که می‌خواهید درباره آن اطلاعات بگیرید درون پرانتز به شکلی محصور با دو نماد نقل قول ( " " ) - این الگو عملکردی مشابه با روش قبل (روش یکم) دارد با این تفاوت که دریافت اطلاعات به صورت مستقیم و بدون ورود به راهنمای تعاملی انجام می‌پذیرد. در واقع برای به دست آوردن اطلاعات درباره موردی که شی نمی‌باشد (مانند هر یک از دستورهای ``symbols`` ،``keywords`` ،``modules`` و ``topics`` یا...) لازم است به این صورت اقدام گردد. - # Python 2.x - - >>> help("keywords") - - Here is a list of the Python keywords. Enter any keyword to get more help. - - and elif if print - as else import raise - assert except in return - break exec is try - class finally lambda while - continue for not with - def from or yield - del global pass - - >>> help("print") - - The "print" statement - ********************* - - print_stmt ::= "print" ([expression ("," expression)* [","]] - | ">>" expression [("," expression)+ [","]]) - - "print" evaluates each expression in turn and writes the resulting - object to standard output (see below). If an object is not a string, - it is first converted to a string using the rules for string - conversions. The (resulting or original) string is then written. A - space is written before each object is (converted and) written, unless - the output system believes it is positioned at the beginning of a - line. This is the case (1) when no characters have yet been written - to standard output, (2) when the last character written to standard - output is a whitespace character except "' '", or (3) when the last - write operation on standard output was not a "print" statement. (In - some cases it may be functional to write an empty string to standard - output for this reason.) - - Note: Objects which act like file objects but which are not the - built-in file objects often do not properly emulate this aspect of - the file object's behavior, so it is best not to rely on this. - - : - +.. _python-arguments: گزینه‌های فراخوانی ------------------- -در کنار دستور فراخوانی پایتون در خط فرمان، می‌توان از گزینه‌ها و دستورهای گوناگونی بهره برد. البته قبلا هم از آن‌ها استفاده کردیم؛ مانند زمانی که قصد داشتیم نسخه پایتون مورد نظر خود را بیابیم یا حتی زمانی که قصد داشیم یک اسکریپت را اجرا کنیم. واقعیت این است که دستور فراخوانی پایتون الگویی دارد که شکل کامل آن در پایین آورده شده است. - -در *پایتون 2x* [`اسناد پایتون `__]:: - - python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args] - -در *پایتون 3x* [`اسناد پایتون `__]:: +در کنار دستور فراخوانی پایتون در خط فرمان، می‌توان از گزینه‌ها و دستورهای گوناگونی بهره برد. البته قبلا هم از آن‌ها استفاده کردیم؛ مانند زمانی که قصد داشتیم نسخه پایتون مورد نظر خود را بیابیم یا حتی زمانی که قصد داشیم یک اسکریپت را اجرا کنیم. واقعیت این است که دستور فراخوانی پایتون الگویی دارد که شکل کامل آن در پایین آورده شده است. [`اسناد پایتون `__]:: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args] @@ -331,19 +323,17 @@ شامل برخی از حروف الفباست که به همراه یک کاراکتر خطِ فاصله (Dash) ``-`` بعد از دستور اصلی یعنی ``python`` می‌آیند؛ برخی از این گزینه‌ها به شرح زیر است: -* ``q−`` (تنها در پایتون 3x) - در هنگام ورود به حالت تعاملی پایتون از نمایش پیغام ابتدایی صرف نظر می‌شود:: +* ``q−`` در هنگام ورود به حالت تعاملی پایتون از نمایش پیغام ابتدایی صرف نظر می‌شود:: - user> python3 -q + user> python -q >>> 2 + 2 4 -* ``Q-`` (تنها در پایتون 2x) - در هنگام اجرای یک اسکریپت و برای کنترل عملگرهای تقسیم ``/`` موجود در آن به کار می‌رود؛ به این صورت که پس از آن می‌بایست یکی از کلمه‌های warn ،new ،old و warnall ذکر گردد. - - * Qold: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد. + * Qold: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد. (پیکربندی چگونگی محاسبات ریاضی) - * Qnew: حاصل تقسیم دو عدد صحیح یک عدد ممیز شناور باشد - مانند نسخه 3x پایتون. + * Qnew: حاصل تقسیم دو عدد صحیح یک عدد ممیز شناور باشد. (پیکربندی چگونگی محاسبات ریاضی) - * Qwarn: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد، به همراه نمایش پیام هشدار به ازای هر عملگر. + * Qwarn: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد، به همراه نمایش پیام هشدار به ازای هر عملگر. (پیکربندی چگونگی محاسبات ریاضی) * Qwarnall: به مانند Qwarn است ولی به ازای تمام عملگرهای تقسیم به کار رفته در اسکریپت تنها یک پیام هشدار نمایش داده می‌شود. @@ -361,15 +351,15 @@ .. tip:: در صورت استفاده از این گزینه‌ها، به جای فایل ``pyc.`` (بایت‌کد معمولی)، فایلی با پسوند ``pyo.`` (بایت‌کد بهینه شده) ایجاد می‌گردد. -* ``B-`` - مفسر پایتون از ذخیره بایت‌کد ماژول‌های import شده بر روی دیسک خودداری می‌کند:: +* ``B-`` مفسر پایتون از ذخیره بایت‌کد ماژول‌های import شده بر روی دیسک خودداری می‌کند:: python -B script.py -* ``d-`` - برخی از گزارش‌های اضافه خطایابی (در صورت وجود) نمایش داده می‌شوند:: +* ``d-`` برخی از گزارش‌های اضافه خطایابی (در صورت وجود) نمایش داده می‌شوند:: python -d script.py -* ``i-`` - پس از اجرای اسکریپت، خط فرمان به حالت تعاملی پایتون وارد می‌شود:: +* ``i-`` پس از اجرای اسکریپت، خط فرمان به حالت تعاملی پایتون وارد می‌شود:: python -i script.py @@ -381,7 +371,7 @@ python -h -* ``S-`` - از import شدن ماژول ``site`` جلوگیری می‌شود:: +* ``S-`` از import شدن ماژول ``site`` جلوگیری می‌شود:: python -S @@ -391,7 +381,7 @@ هر زمان که ماژولی import می‌شود مفسر پایتون در داخل دایرکتوری‌های مشخصی به دنبال آن می‌گردد؛ این دایرکتوری‌ها در ``sys.path`` فهرست شده‌اند. - برای نمونه - *پایتون 3x در ویندوز*: + برای نمونه در ویندوز: :: @@ -403,11 +393,11 @@ >>> - برای نمونه - *پایتون 3x در گنولینوکس*: + در گنولینوکس: :: - user> python3 -qS + user> python -qS >>> import sys >>> sys.path @@ -429,44 +419,44 @@ فایل mypath.pth را با یک ویرایشگر متن باز کرده و مشابه پایین فهرست دایرکتوری‌های مورد نظر خود را در آن وارد می‌نماییم:: - /home/saeid/Documents - /home/saeid/Documents/me + /home/user/Documents + /home/user/Documents/me اکنون تمام ماژول‌های موجود در این دایرکتوری‌ها قابل import هستند؛ به فهرست ``sys.path`` توجه نمایید:: - user> python3 -q + user> python -q >>> import sys >>> sys.path - ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages', '/home/saeid/Documents', '/home/saeid/Documents/me'] + ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages', '/home/user/Documents', '/home/user/Documents/me'] >>> همین کار را می‌توان از طریق برنامه‌نویسی نیز انجام داد، البته پس از اتمام اجرای اسکریپت (در اینجا: خروج از حالت تعاملی) اثر آن از بین می‌رود:: - user> python3 -q + user> python -q >>> import sys - >>> sys.path.append('/home/saeid/Documents') - >>> sys.path.append('/home/saeid/Documents/me') + >>> sys.path.append('/home/user/Documents') + >>> sys.path.append('/home/user/Documents/me') تابع ``append`` دایرکتوری مورد نظر را به انتهای فهرست ``sys.path`` اضافه می‌کند. البته می‌توان با استفاده از تابع ``insert`` به جای ``append`` جایگاه دایرکتوری دلخواه خود را با استفاده از آرگومان نخست آن در ``sys.path`` مشخص نمود؛ با این کار دایرکتوری مورد نظر زودتر از دایرکتوری‌های بعد خودش توسط مفسر مورد جستجو قرار می‌گیرد - فایده این کار زمانی مشخص می‌شود که در دایرکتوری‌هایی مجزا، ماژولی با نام یکسان وجود داشته باشد؛ در این صورت ماژولی که زودتر توسط مفسر دیده شود به عنوان ماژول مورد نظر import می‌شود:: - user> python3 -q + user> python -q >>> import sys - >>> sys.path.insert(1,'/home/saeid/Documents/me') + >>> sys.path.insert(1,'/home/user/Documents/me') >>> sys.path - ['', '/home/saeid/Documents/me', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages'] + ['', '/home/user/Documents/me', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages'] >>> - چند درس جلوتر خواهید آموخت که مقدار ``sys.path`` در واقع یک شی از نوع ``list`` است؛ ``append`` و ``insert`` نیز تابع‌هایی [#f4]_ هستند که توسط یک شی از نوع ``list`` می‌توانند فراخوانی گردند. در این مرحله تنها به یاد داشته باشید که موقعیت‌ها در یک شی از نوع ``list`` از عدد صفر شماره‌گذاری می‌گردند. + چند درس جلوتر خواهید آموخت که مقدار ``sys.path`` در واقع یک شی از نوع ``list`` است؛ ``append`` و ``insert`` نیز تابع‌هایی هستند که توسط یک شی از نوع ``list`` ارایه می‌گردد. در این مرحله تنها به یاد داشته باشید که موقعیت‌ها در یک شی از نوع ``list`` از عدد صفر شماره‌گذاری می‌گردند. .. rubric:: دسته دوم: -* ``c command-`` - این الگو امکان اجرای دستورهای پایتون را بدون ورود به حالت تعاملی یا ایجاد اسکریپت، فراهم می‌سازد:: +* ``c command-`` این الگو امکان اجرای دستورهای پایتون را بدون ورود به حالت تعاملی یا ایجاد اسکریپت، فراهم می‌سازد:: - user> python3 -c "import sys; print(sys.path)" + user> python -c "import sys; print(sys.path)" ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages'] .. note:: @@ -474,18 +464,11 @@ استفاده از سمی‌کالن ( ``;`` )‌ در پایان دستورهای پایتون اجباری نیست ولی چنانچه بخواهیم چند دستور را در یک سطر قرار بدهیم می‌بایست از آن استفاده نماییم. -* ``m module-name-`` - این الگو امکان اجرای یک ماژول (از میان فهرست ``sys.path``) را به عنوان ماژول ``__main__`` فراهم می‌سازد. - - جالب‌ترین نمونه برای بیان کاربرد این الگو، اجرای ماژول ``SimpleHTTPServer`` است. زمانی که نیاز به راه‌اندازی سریع یک وب سرور را دارید و نمی‌خواهید خود را درگیر نصب و پیکربندی Apache یا دیگر وب سرور‌ها نمایید؛ می‌توانید از این ماژول پایتون بهره بگیرید. این ماژول امکانات یک وب سرور ساده را در اختیار شما قرار می‌دهد. البته این ماژول در نسخه 3x پایتون در ماژول ``http.server`` ادغام شده است. - - در *پایتون 2x* [`اسناد پایتون `__]:: - - user> python -m SimpleHTTPServer 8080 +* ``m module-name-`` این الگو امکان اجرای یک ماژول (از میان فهرست ``sys.path``) را به عنوان ماژول ``'__main__'`` فراهم می‌سازد. + جالب‌ترین نمونه برای بیان کاربرد این الگو، اجرای ماژول ``http.server`` است. زمانی که نیاز به راه‌اندازی سریع یک وب سرور دارید و نمی‌خواهید خود را درگیر نصب و پیکربندی Nginx یا دیگر وب سرور‌ها نمایید؛ می‌توانید از این ماژول پایتون بهره بگیرید. این ماژول امکانات یک وب سرور ساده را در اختیار شما قرار می‌دهد. [`اسناد پایتون `__]:: - در *پایتون 3x* [`اسناد پایتون `__]:: - - user> python3 -m http.server 8080 + user> python -m http.server 8080 .. note:: در استفاده از این الگو نیز همانند زمان import، پسوند ماژول (py) نوشته نمی‌شود. @@ -493,14 +476,13 @@ می‌توان شماره پورت را وارد نکرد که در این حالت به صورت پیش‌فرض پورت 8000 در نظر گرفته می‌شود. - ولی منظور از ماژول ``__main__`` چیست؟ + ولی منظور از ماژول ``'__main__'`` چیست؟ - هنگامی که ماژولی (برای نخستین بار) import می‌شود، مفسر پایتون به صورت خودکار تمام کد‌های درون آن را اجرا می‌کند. در مواردی ممکن است یک فایل py. حاوی کدهایی باشد که تنها می‌بایست در حالت اسکریپت به اجرا درآید؛ در این شرایط با import شدن فایل، این کد‌ها نیز اجرا می‌گردند که خواست برنامه‌نویس نمی‌باشد!. از طرفی در پایتون یک سری مقادیر و متغیرهای ویژه و از پیش تعریف شده به مانند ``__name__`` وجود دارد. متغیر ``__name__`` به نام ماژول اشاره دارد؛ در حالت اسکریپت (اجرای یک ماژول به صورت مستقیم - نمونه دستور: ``python script.py`` - درس پیش توضیح داده شد) مقدار ``__name__`` برابر با یک مقدار ویژه به نام ``__main__`` می‌گردد که از این موضوع می‌توان برای کنترل اجرای کدها استفاده کرد. + هنگامی که ماژولی (برای نخستین بار) import می‌شود، مفسر پایتون به صورت خودکار تمام کد‌های درون آن را اجرا می‌کند. در مواردی ممکن است یک فایل py. حاوی کدهایی باشد که تنها می‌بایست در حالت اسکریپت به اجرا درآید؛ در این شرایط با import شدن فایل، این کد‌ها نیز اجرا می‌گردند که خواست برنامه‌نویس نمی‌باشد!. از طرفی در پایتون یک سری مقادیر و متغیرهای ویژه و از پیش تعریف شده به مانند ``__name__`` وجود دارد. متغیر ``__name__`` به نام ماژول اشاره دارد؛ در حالت اسکریپت (اجرای یک ماژول به صورت مستقیم - نمونه دستور: ``python script.py`` - درس پیش توضیح داده شد) مقدار ``__name__`` برابر با یک مقدار ویژه به نام ``'__main__'`` می‌گردد که از این موضوع می‌توان برای کنترل اجرای کدها استفاده کرد. - معمولا کدهای اسکریپت به گونه‌ای نوشته می‌شوند که اجرای آن‌ها وابسته به اجرای یک تابع اصلی باشد که معمولا ``()main`` نامیده می‌شود که در انتها بتوان با قرار دادن شرط برابری مقدار ``__name__`` با ``__main__`` برای اجرای تابع یاد شده، از اجرای کد‌های مورد نظر تنها در حالت اجرا به صورت اسکریپت (و نه در زمان import) مطمئن شد. + معمولا کدهای اسکریپت به گونه‌ای نوشته می‌شوند که اجرای آن‌ها وابسته به اجرای یک تابع اصلی باشد که معمولا ``()main`` نامیده می‌شود که در انتها بتوان با قرار دادن شرط برابری مقدار ``__name__`` با ``'__main__'`` برای اجرای تابع یاد شده، از اجرای کد‌های مورد نظر تنها در حالت اجرا به صورت اسکریپت (و نه در زمان import) مطمئن شد. .. code-block:: python - :linenos: def main(): print("this runs only when executed directly") @@ -509,7 +491,7 @@ main() -* ``script`` - این الگو (``python script.py``) بیان‌‌گر همان روش اجرای اسکریپت است که در درس پیش به صورت کامل راجب آن صحبت شد. +* ``script`` این الگو (``python script.py``) بیان‌‌گر همان روش اجرای اسکریپت است که در درس پیش به صورت کامل بررسی شد. .. rubric:: دسته سوم (Arguments): @@ -518,26 +500,31 @@ .. code-block:: python - :linenos: - - # file: Documents/script-argv-3x.py - # Python 3.x import sys - - print(sys.argv) - print(sys.argv[0]) - print(sys.argv[1]) - print(sys.argv[2]) + + def main(): + print(sys.argv) + print(sys.argv[0]) + print(sys.argv[1]) + print(sys.argv[2]) + + if __name__ == '__main__': + main() + +.. tip:: + از آنجا که عملکرد و خروجی مورد نظر این ماژول تنها در حالت اجرای اسکریپت است (دریافت آرگومان‌ها) و نه import آن در برنامه، بنابراین با بررسی نام ماژول در زمان اجرا از این موضوع اطمینان حاصل کردیم. + اسکریپت بالا را با ارسال دو آرگومان ``arg_1`` و ``arg_2`` اجرا می‌نماییم: :: - user> python3 Documents/script-argv-3x.py arg_1 arg_2 - - ['/home/saeid/Documents/script-argv-3x.py', 'arg_1', 'arg_2'] - /home/saeid/Documents/script-argv-3x.py + user> cd /home/user/Documents + + user> python script.py arg_1 arg_2 + ['/home/user/Documents/script-argv.py', 'arg_1', 'arg_2'] + /home/user/Documents/script-argv.py arg_1 arg_2 @@ -545,23 +532,35 @@ عضو نخست ``sys.argv`` یا ``[sys.argv[0`` همواره حاوی نام اسکریپت است. البته به جز در مواقعی که از ``c-`` استفاده کرده‌ایم که در این صورت برابر مقدار ``'c-'`` خواهد بود:: - user> python3 -c "import sys; print(sys.argv)" 2 + user> python -c "import sys; print(sys.argv)" 2 ['-c', '2'] +.. admonition:: تمرین + + یک اسکریپت ایجاد نمایید که دو پارامتر نام و سن را به صورت آرگومان‌های اسکریپت دریافت و بر روی خروجی نمایش دهد. + + نمونه دستور اجرای اسکریپت: + + ``python script.py "Hideyoshi Nagachika" 19`` + + نمونه خروجی اسکریپت: + + ``Name: Hideyoshi Nagachika - Age: 19`` + + +.. _lesson-04-footer: پی‌نوشت ------- -.. [#f1] «عبارت» (Expression) یک قطعه از سینتکس است که می‌تواند به یک مقدار ارزیابی گردد، عبارت شامل «کلمه‌های کلیدی» (Keywords) نمی‌شود و «دستور» (Statement) بخشی از یک بلاک کد است که شامل کلمه‌های کلیدی بوده و کاری را به انجام می‌رساند. [کلمه‌های کلیدی در آینده بررسی می‌شوند.] +.. [#f1] «عبارت» (Expression) یک قطعه از کد است که می‌تواند به یک مقدار ارزیابی گردد، عبارت شامل «کلمه‌های کلیدی» (Keywords) نمی‌شود و «دستور» (Statement) بخشی از یک بلاک کد است که شامل کلمه‌های کلیدی بوده و کاری را به انجام می‌رساند. [کلمه‌های کلیدی در آینده بررسی می‌شوند.] .. [#f2] درست این بود که به جای واژه «مقدار» (Value) از «شی» (Object) استفاده می‌شد؛ چرا که هر چیزی در پایتون یک شی است. به عنوان نمونه، عدد 5 یک شی از کلاس «اعداد صحیح» (Integers) می‌باشد. .. [#f3] توضیحی است که در ابتدای تابع‌ها، کلاس‌ها و ماژول‌ها می‌آید و توسط مفسر نادیده گرفته نمی‌شود. [docstring در آینده بررسی می‌شود] -.. [#f4] واژه «تابع» در مفهوم شی، مناسب نیست. در تعریف شی‌گرا از واژه «متد» (Method) به جای «تابع» (Function) استفاده می‌گردد؛ ولی در این مرحله که هنوز به شی‌گرایی پرداخته نشده است، ترجیح داده شد تا از واژه «تابع» استفاده گردد. - | @@ -570,6 +569,4 @@ :emoji-size:`😊` امیدوارم مفید بوده باشه -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - diff --git a/source/lessons/l05-object-oriented-programming.rst b/source/lessons/l05-object-oriented-programming.rst new file mode 100644 index 0000000..30b9cb5 --- /dev/null +++ b/source/lessons/l05-object-oriented-programming.rst @@ -0,0 +1,219 @@ +.. role:: emoji-size + +.. meta:: + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس پنجم: مفهوم شی‌گرایی + :keywords: شی گرایی, مفهوم شی گرایی, اصول و مبانی شی گرایی, کلاس, شی, متد, صفت, سازنده, نمونه سازی, کپسوله سازی, وراثت, چندریختی, انتزاع, تجرید, برنامه نویسی شی گرا, اشیا در پایتون, کلاس ها در پایتون, آموزش برنامه نویسی, آموزش پایتون,آموزش, سلسله مراتب وراثت, is-a,has-a, ترکیب + +.. _lesson-05: + +درس ۰۵: مفهوم شی‌گرایی +======================== + + +.. figure:: /_static/pages/05-python-object-oriented-programming-concept.jpg + :align: center + :alt: مفهوم شی گرایی (Object-Oriented Programming) + :class: page-image + + Photo by `Lucas Benjamin `__ + +این درس به توضیح مفاهیم پایه «برنامه‌نویسی شی‌گرا» (Object-Oriented Programming) اختصاص یافته است و آخرین درس از سطح «پایه» در این کتاب می‌باشد. هدف از این درس آشنایی خوانندگان با مفاهیم عمومی شی‌گرایی بوده و نه آموزش آن؛ جزییات بیشتر از برنامه‌نویسی شی‌گرا به همراه آموزش پیاده‌سازی مفاهیم آن در زبان پایتون از درس هفدهم تا بیست و دوم به صورت کامل بررسی خواهد شد. البته در این درس کمی به ساختار اشیا و کلاس‌ها در زبان پایتون اشاره‌ شده است که پیش‌نیاز دروس آتی خواهد بود. + + +:emoji-size:`✔` سطح: پایه + +---- + +.. contents:: سرفصل‌ها + :depth: 2 + +---- + + +.. _object-oriented-programming: + +برنامه‌نویسی شی‌گرا +-------------------- +«برنامه‌نویسی شی‌گرا» (`Object-Oriented Programming `_) یا به اختصار OOP یک الگو یا شیوه تفکر در برنامه‌نویسی است که برگرفته از دنیای واقعی بوده و از دهه ۱۹۶۰ میلادی مطرح گشته است. به زبانی که از این الگو پشتیبانی کند، «زبان شی‌گرا» گفته می‌شود؛ `Simula 67 `_ و `Smalltalk `_ نخستین زبان‌های برنامه‌نویسی شی‌گرا هستند. ایده شی‌گرایی در پاسخ به برخی از نیازها که الگوهای موجود پاسخ‌گو آن‌ها نبودند به وجود آمد؛ نیازهایی مانند: توانایی پیاده‌سازی مسائل پیچیده (Complex)، «پنهان‌سازی داده» (Data Hiding)، «قابلیت استفاده مجدد» (Reusability) بیشتر، وابستگی کمتر به توابع، انعطاف بالا و... + +رویکرد برنامه‌نویسی شی‌گرا «از پایین به بالا» (Bottom-Up) است؛ یعنی ابتدا واحدهایی کوچک از برنامه ایجاد می‌شوند و سپس با پیوند این واحدها، واحدهایی بزرگتر و در نهایت شکلی کامل از برنامه به وجود می‌آید. برنامه‌نویسی شی‌گرا در قالب دو مفهوم «**کلاس**» (Class) و «**شی**» (Object) ارایه می‌گردد. هر کلاس واحدی از برنامه است که بخشی از عملیات‌ها و داده‌های یک برنامه را تعریف می‌کند و هر شی نیز یک نمونه پیاده‌سازی شده از یک کلاس است. می‌توان هر تعداد شی از یک کلاس ایجاد کرد. هر شی مستقل از دیگر اشیای ایجاد شده خواهد بود که می‌تواند مقادیر متفاوتی را در خود نگهداری کند (در چهارچوبی که توسط کلاس آن تعریف شده است). در برنامه‌نویسی شی‌گرا، تمامی عملیات‌های قابل انتظار یک برنامه از تعامل اشیای گوناگون با یکدیگر حاصل می‌شود. + + +برای مثال، کارخانه تولید یک مدل خودرو را می‌توانیم به شکل یک ساختار بزرگ در نظر بگیریم. بدیهی است که این کارخانه شامل بخش‌های تولیدی کوچکتری به مانند: سیستم الکتریکی، سیستم چرخ‌ها، سیستم سوخت، سیستم خنک کننده، موتور و... است که هر کدام نیز در نوع خود می‌تواند به واحدهایی کوچکتر تقسیم گردد. طراحی شی‌گرای این کارخانه به این صورت می‌شود که ابتدا می‌بایست کلاس‌های کوچکترین واحدها را ایجاد کرد که کاملا ایزوله از یکدیگر هستند. پس از آن به ترتیب کلاس‌هایی بزرگتر تعریف می‌گردند که در آنها بخشی از عملیات‌های مرتبط با یکدیگر هماهنگ می‌شوند، این کلاس‌ها در تعریف خود حاوی اشیای کلاس‌های کوچکتر خواهند بود. با گسترش این طرح به تعریف کلاس نهایی می‌رسیم که در اینجا همان کلاس کارخانه است. اکنون این کلاس با هماهنگ کردن اشیای واحدهای کوچکتر از خود و تعریف عملیات‌های مورد نیاز، آماده تولید نمونه‌های کامل و مورد انتظار خواهد بود. به این صورت که با ایجاد یک شی از آن، یک موجودیت اجرایی (خودرو) پدید می‌آید. + +.. _oop-concepts: + +مفاهیم شی‌گرایی +-------------------- + + +گفته شد که هر کلاس ساختاری است که تعدادی داده و عملیات مرتبط را تعریف می‌کند. از دید برنامه‌نویسی، هر کلاس از دو بخش «اعضای داده» (Data Members) و «توابع عضو» (Member Functions) تشکیل شده است. اعضای داده در واقع همان متغیر‌های درون کلاس هستند که خصوصیات یا صفات شی را بیان می‌کنند و در شی‌گرایی با عنوان «**فیلد**» (Field) یا «**صفت**» (Attribute) از آن‌ها یاد می‌شود. توابع عضو نیز عملیات یا کارهایی هستند که یک شی از کلاس قادر به انجام آن‌ها می‌باشد؛ در شی‌گرایی به این توابع «**متد**» (Method) گفته می‌شود. + +تا به اینجا با مفاهیم «کلاس»، «صفت»، «متد» و «شی» آشنا شده‌ایم؛ در ادامه به توضیح مفاهیم اصلی از برنامه‌نویسی شی‌گرا خواهیم پرداخت. + + +.. _python-oop-instantiation: + +نمونه‌سازی +~~~~~~~~~~~~~~~~~~~ + +به هر شی از یک کلاس، یک نمونه (Instance) از آن کلاس گفته می‌شود و به عمل ایجاد شی از کلاس در شی‌گرایی «**نمونه‌سازی**» (Instantiation) گفته می‌شود. در این مفهموم، هدف نهایی از تعریف کلاس‌ها در برنامه، تنها تولید شی نیست. گاهی نیز وجود یک کلاس تنها برای درج تعاریف مشترک بین چند کلاس دیگر کاربرد پیدا می‌کند. بر همین اساس دو نوع کلاس در شی‌گرایی وجود دارد: ۱- کلاس‌های عادی که توانایی نمونه‌سازی دارند و به آن‌ها **”Concrete Class“** گفته می‌شود ۲- کلاس‌هایی که توانایی نمونه‌سازی ندارند و به آن‌ها **”Abstract Class“** گفته می‌شود. + +همانطور که در دروس مربوط به پیاده‌سازی کلاس خواهید دید؛ با ایجاد هر نمونه از کلاس یک متد خاص در آن به صورت خودکار اجرا می‌گردد. این متد «**سازنده**» (Constructor) نام دارد و کار آن «**مقداردهی اولیه**» (Initialization) شی است. این کار موجب اطمینان از مقداردهی تمامی اعضای داده پیش از استفاده شی در برنامه می‌گردد. + + +برای مثال یک کلاس خودرو ساده را در نظر بگیرید که در آن صفات: رنگ بدنه، ظرفیت باک، بیشینه سرعت و متدهای: راندن، دریافت میزان سوخت، سوخت گیری، تنظیم سرعت، توقف تعریف شده است. در همان ابتدا یعنی زمان نمونه‌سازی می‌توانیم با تنظیم صفات توسط متد سازنده، اشیا هم نوع ولی با صفات متفاوتی را ایجاد نماییم. برای مثال: دو خودروی آبی با ظرفیت باک ۲۰ لیتر و بیشینه سرعت ۸۰ کیلومتر-ساعت یا یک خودروی صورتی با ظرفیت باک ۴۰ لیتر و بیشینه سرعت ۱۶۰ کیلومتر-ساعت که البته هر سه آن‌ها تمام متدهای کلاس را در خود دارند: + +.. image:: /_static/l05-car-class-sample.jpg + :align: center + +.. image:: /_static/l05-car-class-object-sample.jpg + :align: center + + +.. _python-oop-encapsulation: + +کپسوله‌سازی +~~~~~~~~~~~~~~~~~~~ + + +یک مفهوم دیگر در برنامه‌نویسی شی‌گرا، «**کپسوله‌سازی**» (Encapsulation) است. کپسوله‌سازی به معنی پنهان‌سازی داده‌ها یا عملیات‌های درون یک شی است که با محدودسازی دسترسی به آن‌ها به دست می‌آید. در این شرایط اشیا باید بدون آگاهی از ساختار درونی و چگونگی انجام عملیات یکدیگر به تعامل بپردازند. این امر از پیچیدگی برنامه جلوگیری و تغییر را ساده‌تر می‌کند. + + +.. _python-oop-inheritance: + +وراثت +~~~~~~~~~~~~~~~~~~~ + + +وراثت (Inheritance) یکی از شکل‌های «قابلیت استفاده مجدد» کد بوده که برنامه‌نویس را قادر می‌سازد تا با ارث‌بری صفات و متدهای یک یا چند کلاس موجود، کلاس‌های جدیدی را ایجاد نماید. + + +برای نمونه فرض کنیم طراح کلاس خودروی پیش، قصد طراحی یک مدل خودرو جدید با رویکرد باربری دارد؛ بنابراین می‌بایست کلاسی جدید برای تولید آن تهیه نماید. ولی کلاس جدید علاوه‌بر صفات (ظرفیت بارگیری و..) و متدهای (انجام بارگیری، تخلیه بار و...) خاص خودش به صفات (رنگ بدنه، ظرفیت باک و...) و متدهای (راندن، سوخت گیری، توقف و...) مشابه در کلاس قبل هم نیاز دارد؛ در این حالت نیازی به تعریف مجدد آن‌ها نیست و می‌توان صفات و متدهای کلاس پیش را در کلاس جدید به ارث برد یا یک Abstract Class برای درج تعاریف مشترک هر دو کلاس ایجاد کرد که این دو مدل خورد می‌توانند آن را به ارث ببرند. + +به کلاسی که از آن ارث‌بری می‌شود **”Parent Class“** یا **”Base Class“** (کلاس پایه) یا **”Superclass“** و به کلاسی که اقدام به ارث‌بری می‌کند **”Child Class“** (کلاس فرزند) یا **”Derived Class“** یا **”Subclass“** گفته می‌شود. + +ارث‌بری توسط «نسبت **هست-یک**» (IS-A Relationship) بیان می‌شود؛ این نسبت می‌گوید کلاس فرزند یک نوع از چیزی است که کلاس پایه هست. کلاس A از کلاس B ارث‌بری دارد؛ در این حالت می‌گوییم: A is a type of B، یعنی درست است اگر بگوییم: «سیب» یک نوع «میوه» است یا «خودرو» یک نوع «وسیله نقلیه» است ولی توجه داشته باشید که این یک ارتباط یک‌طرفه از کلاس فرزند به کلاس پایه است و نمی‌توانیم بگوییم: «میوه» یک نوع «سیب» است یا «وسیله نقلیه» یک نوع «خودرو» است. + +کلاس‌ها می‌توانند مستقل باشند ولی هنگامی که وارد رابطه‌های وراثت می‌شوند، یک ساختار سلسله مراتب (Hierarchy) به شکل درخت را تشکیل می‌دهند. برای نمونه به ساختار سلسله مراتب وراثت پایین که مربوط به برخی اشکال هندسی است توجه نمایید، پیکان‌ها نشانگر نسبت is-a هستند. + +.. image:: /_static/l05-Inheritance-Hierarchy-Sample.png + :align: center + + +.. _python-oop-composition: + +ترکیب +~~~~~~~~~~~~~~~~~~~ + + +در برنامه‌نویسی شی‌گرا نسبت دیگری نیز با عنوان «نسبت **دارد-یک**» (HAS-A Relationship) وجود دارد که بیانگر مفهومی به نام «**ترکیب**» (Composition) است که شکل دیگری از قابلیت استفاده مجدد کد می‌باشد ولی مفهومی متفاوت با وراثت دارد. این نسبت زمانی بیان می‌شود که درون یک کلاس (مانند: C) از کلاس دیگری (مانند: D) نمونه‌سازی شده باشد؛ یعنی شی کلاس C درون خودش شی‌ای از کلاس D را داشته باشد؛ در این حالت می‌گوییم: C has a D. به یاد دارید خواندیم کلاس کارخانه خودروسازی با هماهنگ کردن اشیای واحدهای کوچکتر، عملیات خود را تعریف می‌کند. مثلا کلاس موتور - یعنی درون این کلاس یک شی از کلاس موتور ایجاد شده است، اکنون می‌توانیم بگوییم: «خودرو» یک «موتور» دارد. + +.. image:: /_static/l05-has-a-Sample.png + :align: center + + +.. _python-oop-polymorphism: + +چندریختی +~~~~~~~~~~~~~~~~~~~ + +مفهوم چندریختی (Polymorphism) بیانگر توانایی کلاس فرزند در بازتعریف متدهایی است که در کلاس پایه موجود می‌باشند. برای نمونه دو کلاس «ماهی» و «گربه» را که هر دو آن‌ها از کلاسی به نام «حیوان» ارث‌بری دارند را در نظر بگیرید؛ در کلاس حیوان متدی با عنوان «غذا خوردن» که عملی مشترک در میان تمام حیوانات است وجود دارد ولی از آنجا که چگونگی انجام آن در ماهی و گربه متفاوت است، بنابراین هر دو این کلاس‌ها نیاز دارند تا متد «غذا خوردن» مخصوص خود را داشته باشند - در این جاست که این متد در کلاس‌های فرزند بازتعریف می‌شود، به این عمل **”Method Overriding“** گفته می‌شود. با Override کردن یک متد، متد کلاس پایه زیر سایه متد مشابه در کلاس فرزند قرار می‌گیرد و از نظر اشیا کلاس فرزند پنهان می‌شود. + +.. _python-oop-abstraction: + +تجرید +~~~~~~~~~~~~~~~~~~~ + +تجرید (Abstraction) در برنامه‌نویسی شی‌گرا به همراه چندریختی می‌آید و توسط دو مفهوم «**کلاس‌های مجرد**» (Abstract Classes) و «**متدهای مجرد**» (Abstract Methods) ارایه می‌گردد. + +«کلاس مجرد» کلاسی است که شامل یک یا چند «متد مجرد» باشد و «متد مجرد» متدی است که اعلان (Declare) شده ولی بدنه آن ‌تعریف (Define) نشده است. کلاس‌های مجرد قابلیت نمونه‌سازی ندارند و نمی‌توان از آن‌ها شی ایجاد نمود؛ چرا که هدف از توسعه آن‌ها قرار گرفتن در بالاترین سطح (یا چند سطح بالایی) درخت وراثت، به عنوان کلاس پایه برای ارث‌بری کلاس‌های پایین‌تر می‌باشد. ایده طراحی کلاس مجرد در تعیین یک نقشه توسعه برای کلاس‌های فرزند آن است؛ تعیین صفات و متدهای لازم ولی واگذاردن تعریف متدها بر عهده کلاس‌های فرزند. + +به عنوان نمونه سه کلاس «ماهی»، «گربه» و «کبوتر» را در نظر بگیرید. این کلاس‌ها جدا از رفتارهای خاص خود (مانند: «پرواز کردن» در کبوتر یا «شنا کردن» در ماهی)، در یک سری رفتار به مانند «نفس کشیدن»، «غذا خوردن» و... مشترک هستند. راه درستِ توسعه این کلاس‌ها تعیین یک «کلاس پایه» برای رفتارهای مشترک و ارث‌بری هر سه آن‌ها می‌باشد. ولی از آنجا که هر یک، این رفتارهای مشترک را به گونه‌ای دیگر انجام می‌دهد؛ راه درست‌تر آن است که یک «کلاس مجرد» به عنوان «کلاس پایه» آن‌ها در نظر بگیریم؛ در این حالت هر کدام از کلاس‌ها ضمن دانستن رفتارهای لازم می‌تواند آن‌‌ها را متناسب با خواست خود تعریف نمایند. + + +.. note:: + + آنچه در ادامه این درس آورده شده است، چکیده‌ای از پیاده‌سازی برنامه‌نویسی شی گرا در پایتون است. شی گرایی در زبان برنامه نویسی پایتون به صورت کامل از درس هفدهم تا بیست و دوم به صورت کامل شرح داده می‌شود. + + +.. _object-in-python: + +اشیا در پایتون +---------------- + +علاوه‌بر اینکه پایتون یک زبان برنامه‌نویسی شی‌گراست، ساختار آن نیز بر مبنای شی‌گرایی توسعه یافته است و اینطور بیان می‌شود که **هر چیزی در پایتون یک شی است**. اشیا، انتزاعِ پایتون برای ارایه «انواع داده‌» (Data Types) هستند. به بیان دیگر تمام داده‌های یک برنامه پایتونی یا به صورت مستقیم یک شی است یا از روابط بین اشیا ایجاد می‌گردد. برای نمونه: ``56``، ``"!Hello World"``، توابع و... حتی خود کلاس‌ها نیز توسط یک نوع شی ارایه می‌شوند. + +هر شی در پایتون حاوی یک «**شناسه**» (identity)، یک «**نوع**» (type) و یک «**مقدار**» (value) است. + +* «شناسه» در زمان ایجاد شی به آن اختصاص می‌یابد و غیر قابل تغییر است. تابع ``()id`` شناسه شی را به صورت یک عدد صحیح برمی‌گرداند که این مقدار در CPython بیانگر نشانی (Address) شی در حافظه (Memory) است:: + + + >>> id(5) + 140468674877440 + + >>> num = 0.25 + >>> id(num) + 140468676592120 + + >>> msg = "Hello World!" + >>> id(msg) + 140468675425264 + + +* هر شی در پایتون دارای یک «نوع» یا ”type“ است که در واقع معرف کلاسی است که شی از آن ایجاد گردیده است. نوع هر شی توسط تابع ``()type`` قابل مشاهده است:: + + >>> type(127) + + + >>> msg = "Hello World!" + >>> type(msg) + + + >>> type(print) + + + .. caution:: + تمام اعداد صحیح (Integers) در پایتون یک شی از نوع ``int`` می‌باشند. [با انواع آماده (Built-in) شی در پایتون توسط دروس آینده آشنا خواهید شد.] + + +* «مقدار» برخی اشیا در پایتون قابل تغییر است که به این دسته از اشیا **”mutable“** (تغییر پذیر) گفته می‌شود؛ ولی مقدار برخی دیگر قابل تغییر نمی‌باشد (مانند اعداد: شی ``127``) که به آن‌ها اشیا **”immutable“** (تغییر ناپذیر) می‌گویند. + + +.. _class-in-python: + +کلاس‌ها در پایتون +----------------- + +از نسخه 2.2 طراحی کلاس‌ها در پایتون تغییر کرده است. [`New-style Classes `_] در ساختار جدید مفهوم ”type“ برابر مفهوم ”class“ طراحی شده است. در این ساختار هر کلاس، خود یک شی از کلاسی به نام ``type`` می‌باشد و همچنین تمامی کلاس‌ها از کلاسی به نام ``object`` ارث‌بری دارند:: + + + >>> num = 3 + + >>> num.__class__ + + + >>> type(num) + + + >>> type(type(num)) + + + >>> type(num).__class__ + + + >>> type(num).__bases__ + (,) + + +.. caution:: + صفت ``__class__`` نام کلاس یک شی و صفت ``__bases__`` نام کلاس‌های پایه یک کلاس را نمایش می‌دهد. + + +| + +---- + +:emoji-size:`😊` امیدوارم مفید بوده باشه + + diff --git a/source/lessons/l05.rst b/source/lessons/l05.rst deleted file mode 100644 index 3b5b6e7..0000000 --- a/source/lessons/l05.rst +++ /dev/null @@ -1,299 +0,0 @@ -.. role:: emoji-size - -.. meta:: - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش مفهوم شی گرایی، شی گرایی یا Object-Oriented Programming چیست؟، آموزش مفاهیم شی گرایی در پایتون، تعریف کلاس در پایتون، شی چیست؟، شی در پایتون چیست؟ - :keywords: شی گرایی, مفهوم شی گرایی, اصول و مبانی شی گرایی, کلاس, شی, متد, صفت, سازنده, نمونه سازی, کپسوله سازی, وراثت, چندریختی, انتزاع, تجرید, برنامه نویسی شی گرا, اشیا در پایتون, کلاس ها در پایتون, آموزش برنامه نویسی, آموزش پایتون,آموزش, سلسله مراتب وراثت, is-a,has-a, ترکیب - - -درس ۰۵: مفهوم شی‌گرایی -======================== - - -.. figure:: /_static/pages/05-python-object-oriented-programming-concept.jpg - :align: center - :alt: مفهوم شی گرایی (Object-Oriented Programming) - :class: page-image - - Photo by `Lucas Benjamin `__ - -این درس به توضیح مفاهیم پایه «برنامه‌نویسی شی‌گرا» (Object-Oriented Programming) اختصاص یافته است و آخرین درس از سطح‌بندی «پایه» در این کتاب می‌باشد. هدف از این درس آشنایی خوانندگان با مفاهیم عمومی شی‌گرایی بوده و نه آموزش آن؛ جزییات بیشتر از برنامه‌نویسی شی‌گرا به همراه آموزش پیاده‌سازی مفاهیم آن در زبان پایتون از درس هفدهم به بعد بررسی خواهد شد. در این درس همچنین به ساختار اشیا و کلاس‌ها در زبان پایتون اشاره‌ شده است که پیش‌نیاز دروس آتی خواهد بود. - - -:emoji-size:`✔` سطح: پایه - ----- - -.. contents:: سرفصل‌ها - :depth: 2 - ----- - - -برنامه‌نویسی شی‌گرا --------------------- -«برنامه‌نویسی شی‌گرا» (`Object-Oriented Programming `_) یا به اختصار OOP یک الگو یا شیوه تفکر در برنامه‌نویسی است که برگرفته از دنیای واقعی بوده و از دهه ۱۹۶۰ میلادی مطرح گشته است. به زبانی که از این الگو پشتیبانی کند، «زبان شی‌گرا» گفته می‌شود؛ `Simula 67 `_ و `Smalltalk `_ نخستین زبان‌های برنامه‌نویسی شی‌گرا هستند. ایده شی‌گرایی در پاسخ به برخی از نیازها که الگوهای موجود پاسخ‌گو آن‌ها نبودند به وجود آمد؛ نیازهایی مانند: توانایی حل تمامی مسائل پیچیده (Complex)، «پنهان‌سازی داده» (Data Hiding)، «قابلیت استفاده مجدد» (Reusability) بیشتر، وابستگی کمتر به توابع، انعطاف بالا و... - -رویکرد برنامه‌نویسی شی‌گرا «از پایین به بالا» (Bottom-Up) است؛ یعنی ابتدا واحدهایی کوچک از برنامه ایجاد می‌شوند و سپس با پیوند این واحدها، واحدهایی بزرگتر و در نهایت شکلی کامل از برنامه به وجود می‌آید. برنامه‌نویسی شی‌گرا در قالب دو مفهوم «**کلاس**» (Class) و «**شی**» (Object) ارایه می‌گردد. هر کلاس واحدی از برنامه است که تعدادی داده و عملیات‌ را در خود نگه‌داری می‌کند و هر شی نیز حالتی (State) مشخص از یک کلاس می‌باشد. - -در برنامه‌نویسی شی‌گرا، هر برنامه در قالب موجودیت‌های کوچکی که در واقع همان اشیا هستند و با یکدیگر تعامل دارند در نظر گرفته می‌شود. برای داشتن این اشیا می‌بایست ابتدا کلاس‌های برنامه را تعریف نماییم؛ هر کلاس «**رفتار**» (Behavior) و «**صفات**» (Attributes) اشیایی که قرار است از آن ایجاد شوند را تعریف می‌کند. از یک کلاس می‌توان هر تعداد که بخواهیم شی ایجاد نماییم. هر شی بیانگر یک «**حالت**» یا یک «**نمونه**» (Instance) از کلاس خود است. - -برای مثال، کارخانه تولید یک مدل خودرو را می‌توانیم به شکل یک کلاس بزرگ در نظر بگیریم. بدیهی است که این کارخانه شامل بخش‌های کوچکتری به مانند: سیستم الکتریکی، سیستم چرخ‌ها، سیستم سوخت، سیستم خنک کننده، موتور و... می‌باشد؛ در این مثال هر یک از این بخش‌ها کلاسی است که باید پیش از کلاس کارخانه ایجاد شود که البته آن‌‌ها هم به جای خود می‌توانند شامل کلاس‌های کوچکتر دیگری باشند. از آنجا که هر کلاس توسط اشیا خود موجودیت می‌یابد؛ می‌بایست درون کلاس کارخانه نمونه‌هایی از این کلاس‌های نام برده ایجاد گردد. قرار گرفتن اشیا در ساختار کلاسی دیگر موجودیت بزرگتری را ایجاد می‌کند. اکنون با ایجاد هر نمونه از کلاس کارخانه، یک شی‌ یا یک موجودیت جدید ایجاد می‌گردد که در درون خود شامل تمامی اشیای این کلاس‌ها می‌باشد. شی حاصل از کلاس کارخانه در این مثال، یک خودرو است. - -به هر شی کلاس، یک نمونه از آن کلاس گفته می‌شود و هر زمان که یک شی از کلاسی ایجاد می‌گردد در واقع یک نمونه از آن ساخته می‌شود. به این عمل در شی‌گرایی «**نمونه‌سازی**» (Instantiation) گفته می‌شود. بر همین اساس دو نوع کلاس در شی‌گرایی وجود دارد: ۱- کلاس‌های عادی که توانایی نمونه‌سازی دارند و به آن‌ها **”Concrete Class“** گفته می‌شود ۲- کلاس‌هایی که توانایی نمونه‌سازی ندارند و به آن‌ها **”Abstract Class“** گفته می‌شود. - -یکی از مفاهیم دیگر در برنامه‌نویسی شی‌گرا، «**کپسوله‌سازی**» (Encapsulation) است. کپسوله‌سازی به معنی قرار دادن عناصر یک ساختار در قالب موجودیتی جدید می‌باشد. در برنامه‌نویسی شی‌گرا با ایجاد هر نمونه از کلاس، عناصر آن (صفات و رفتارها) در قالب یک موجودیت جدید به نام «شی» قرار می‌گیرد. کپسوله‌سازی در شی‌گرایی امکانی است برای پنهان‌سازی داده‌ها؛ در این شرایط اشیا بدون اینکه از درون یکدیگر و چگونگی کارکرد هم کوچکترین آگاهی داشته باشند به تعامل با یکدیگر می‌پردازند. - - -گفتیم هر کلاس از تعدادی داده و عملیات درون خود نگهداری می‌کند و همچنین گفتیم هر کلاس رفتار و صفات اشیایی که قرار است از آن ایجاد شوند را تعریف می‌کند؛ اکنون با ارایه تعریفی کامل‌تر خواهیم گفت که: هر کلاس از دو بخش «اعضای داده» (Data Members) و «توابع عضو» (Member Functions) تشکیل شده است. اعضای داده در واقع همان متغیر‌های درون کلاس هستند که خصوصیات یا صفات شی را بیان می‌کنند و در شی‌گرایی با عنوان «**فیلد**» (Field) یا «**صفت**» (Attribute) از آن‌ها یاد می‌شود. توابع عضو نیز عملیات یا کارهایی هستند که یک شی از کلاس قادر به انجام آن‌ها می‌باشد؛ می‌توان توابع عضو را بیانگر رفتار اشیا کلاس دانست. در شی‌گرایی به این توابع «**متد**» (Method) گفته می‌شود. - -پس از نمونه‌سازی، شی حاوی تمامی اعضای داده و توابع عضوی است که توسط کلاس مربوط به آن تعریف شده است و برای دسترسی به آن‌ها از الگو: «نام شی + نقطه + نام صفت یا متد()» استفاده می‌گردد. همانند:: - - car_object.color - car_object.drive() - -همانطور که در زمان پیاده‌سازی کلاس خواهید دید؛ با ایجاد هر نمونه از کلاس یک متد خاص در آن به صورت خودکار اجرا می‌گردد. این متد «**سازنده**» (Constructor) نام دارد و کار آن «**مقداردهی اولیه**» (Initialization) شی است. این کار موجب اطمینان از مقداردهی تمامی اعضای داده پیش از استفاده شی در برنامه می‌گردد. - - -برای مثال به کلاس خودرو برگردیم و برای آن صفات: رنگ بدنه، ظرفیت باک، بیشینه سرعت و متدهای: راندن، دریافت میزان سوخت، سوخت گیری، تنظیم سرعت، توقف را در نظر بگیریم. اکنون می‌توانیم با تنظیم صفات، نمونه‌ها یا اشیای مورد نظر خود را از این کلاس ایجاد نماییم. برای مثال: دو خودروی آبی با ظرفیت باک ۲۰ لیتر و بیشینه سرعت ۸۰ کیلومتر-ساعت یا یک خودروی صورتی با ظرفیت باک ۴۰ لیتر و بیشینه سرعت ۱۶۰ کیلومتر-ساعت که البته هر سه آن‌ها تمام متدهای کلاس را در خود دارند: - -.. image:: /_static/l05-car-class-sample.jpg - :align: center - -.. image:: /_static/l05-car-class-object-sample.jpg - :align: center - -تا به اینجا با مفاهیم «کلاس»، «صفت»، «متد»، «شی»، «نمونه‌سازی» و «کپسوله‌سازی» آشنا شده‌ایم؛ در ادامه به توضیح سه مفهوم مهم دیگر از برنامه‌نویسی شی‌گرا که عبارتند از: «**وراثت**» (Inheritance)، «**چندریختی**» (Polymorphism) و «**انتزاع**» یا «**تجرید**» (Abstraction) خواهیم پرداخت. - -.. rubric:: وراثت: - -وراثت یکی از شکل‌های «قابلیت استفاده مجدد» کد بوده که برنامه‌نویس را قادر می‌سازد تا با ارث‌بری صفات و متدهای یک یا چند کلاس موجود، کلاس‌های جدیدی را ایجاد نماید. - - -برای نمونه فرض کنیم صاحب کلاس کارخانه خودروسازی مثال پیش، قصد تولید یک مدل خودرو جدید با رویکرد باربری دارد؛ بنابراین می‌بایست کلاسی جدید برای تولید آن تهیه نماید. ولی کلاس جدید علاوه‌بر صفات (ظرفیت بارگیری و..) و متدهای (انجام بارگیری، تخلیه بار و...) خاص خودش به صفات (رنگ بدنه، ظرفیت باک و...) و متدهای (راندن، سوخت گیری، توقف و...) مشابه در کلاس قبل هم نیاز دارد؛ در این حالت نیازی به تعریف مجدد آن‌ها نیست و می‌توان صفات و متدهای کلاس پیش را در کلاس جدید به ارث برد. - -به کلاسی که از آن ارث‌بری می‌شود **”Parent Class“** یا **”Base Class“** (کلاس پایه) یا **”Superclass“** و به کلاسی که اقدام به ارث‌بری می‌کند **”Child Class“** (کلاس فرزند) یا **”Derived Class“** یا **”Subclass“** گفته می‌شود. - -ارث‌بری توسط «نسبت **هست-یک**» (IS-A Relationship) بیان می‌شود؛ این نسبت می‌گوید کلاس فرزند یک نوع از چیزی است که کلاس پایه هست. کلاس A از کلاس B ارث‌بری دارد؛ در این حالت می‌گوییم: A is a type of B، یعنی درست است اگر بگوییم: «سیب» یک نوع «میوه» است یا «خودرو» یک نوع «وسیله نقلیه» است ولی توجه داشته باشید که این یک ارتباط یک‌طرفه از کلاس فرزند به کلاس پایه است و نمی‌توانیم بگوییم: «میوه» یک نوع «سیب» است یا «وسیله نقلیه» یک نوع «خودرو» است. - -کلاس‌ها می‌توانند مستقل باشند ولی هنگامی که وارد رابطه‌های وراثت می‌شوند، یک ساختار سلسله مراتب (Hierarchy) به شکل درخت را تشکیل می‌دهند. برای نمونه به ساختار سلسله مراتب وراثت پایین که مربوط به برخی اشکال هندسی است توجه نمایید، پیکان‌ها نشانگر نسبت is-a هستند. - -.. image:: /_static/l05-Inheritance-Hierarchy-Sample.png - :align: center - -در برنامه‌نویسی شی‌گرا نسبت دیگری نیز با عنوان «نسبت **دارد-یک**» (HAS-A Relationship) وجود دارد که بیانگر مفهومی به نام «**ترکیب**» (Composition) است که شکل دیگری از قابلیت استفاده مجدد کد می‌باشد ولی مفهومی متفاوت با وراثت دارد. این نسبت زمانی بیان می‌شود که درون یک کلاس (مانند: C) از کلاس دیگری (مانند: D) نمونه‌سازی شده باشد؛ یعنی شی کلاس C درون خودش شی‌ای از کلاس D را داشته باشد؛ در این حالت می‌گوییم: C has a D. به یاد دارید خواندیم کلاس خودرو از کلاس‌های کوچکتری ساخته شده است؛ مثلا کلاس موتور - یعنی درون این کلاس یک شی از کلاس موتور ایجاد شده است، اکنون می‌توانیم بگوییم: «خودرو» یک «موتور» دارد. - -.. image:: /_static/l05-has-a-Sample.png - :align: center - -.. rubric:: چندریختی: - -مفهوم چندریختی بیانگر توانایی کلاس فرزند در تعریف متدهایی است که در کلاس پایه موجود می‌باشند. برای نمونه دو کلاس «ماهی» و «گربه» را که هر دو آن‌ها از کلاسی به نام «حیوانات» ارث‌بری دارند را در نظر بگیرید؛ در کلاس حیوانات متدی با عنوان «غذا خوردن» که عملی مشترک در میان تمام حیوانات است وجود دارد ولی از آنجا که چگونگی انجام آن در ماهی و گربه متفاوت است، بنابراین هر دو این کلاس‌ها نیاز دارند تا متد «غذا خوردن» مخصوص خود را داشته باشند - در این جاست که این متد در کلاس‌های فرزند بازتعریف می‌شود، به این عمل **”Method Overriding“** گفته می‌شود. با Override کردن یک متد، متد کلاس پایه زیر سایه متد مشابه در کلاس فرزند قرار می‌گیرد و از نظر اشیا کلاس فرزند پنهان می‌شود. - -.. rubric:: تجرید: - -تجرید در برنامه‌نویسی شی‌گرا به همراه مفهوم چندریختی می‌آید و توسط دو مفهوم «**کلاس‌های مجرد**» (Abstract Classes) و «**متدهای مجرد**» (Abstract Methods) ارایه می‌گردد. - -«کلاس مجرد» کلاسی است که شامل یک یا چند «متد مجرد» باشد و «متد مجرد» متدی است که اعلان (Declare) شده ولی بدنه آن ‌تعریف (Define) نشده است. کلاس‌های مجرد قابلیت نمونه‌سازی ندارند و نمی‌توان از آن‌ها شی ایجاد نمود؛ چرا که هدف از توسعه آن‌ها قرار گرفتن در بالاترین سطح (یا چند سطح بالایی) درخت وراثت، به عنوان کلاس پایه برای ارث‌بری کلاس‌های پایین‌تر می‌باشد. ایده طراحی کلاس مجرد در تعیین یک نقشه توسعه برای کلاس‌های فرزند آن است؛ تعیین صفات و متدهای لازم ولی واگذاردن تعریف متدها بر عهده کلاس‌های فرزند. - -به عنوان نمونه سه کلاس «ماهی»، «گربه» و «کبوتر» را در نظر بگیرید. این کلاس‌ها جدا از رفتارهای خاص خود (مانند: «پرواز کردن» در کبوتر یا «شنا کردن» در ماهی)، در یک سری رفتار به مانند «نفس کشیدن»، «غذا خوردن» و... مشترک هستند. راه درستِ توسعه این کلاس‌ها تعیین یک «کلاس پایه» برای رفتارهای مشترک و ارث‌بری هر سه آن‌ها می‌باشد. ولی از آنجا که هر یک، این رفتارهای مشترک را به گونه‌ای دیگر انجام می‌دهد؛ راه درست‌تر آن است که یک «کلاس مجرد» به عنوان «کلاس پایه» آن‌ها در نظر بگیریم؛ در این حالت هر کدام از کلاس‌ها ضمن دانستن رفتارهای لازم می‌تواند آن‌‌ها را متناسب با خواست خود تعریف نماید. - - -.. note:: - - آنچه در ادامه این درس آورده شده است، چکیده‌ای از پیاده‌سازی برنامه‌نویسی شی گرا در پایتون است. شی گرایی در زبان برنامه نویسی پایتون به صورت کامل از درس هفدهم به بعد شرح داده می‌شود. - - -اشیا در پایتون ----------------- - -علاوه‌بر اینکه پایتون یک زبان برنامه‌نویسی شی‌گراست، ساختار آن نیز بر مبنای شی‌گرایی توسعه یافته است و اینطور بیان می‌شود که **هر چیزی در پایتون یک شی است**. اشیا، انتزاعِ پایتون برای ارایه «انواع داده‌» (Data Types) هستند. به بیان دیگر تمام داده‌های یک برنامه پایتونی یا به صورت مستقیم یک شی است یا از روابط بین اشیا ایجاد می‌گردد. برای نمونه: ``56``، ``"!Hello World"``، توابع و... حتی خود کلاس‌ها نیز توسط یک نوع شی ارایه می‌شوند. - -هر شی در پایتون حاوی یک «**شناسه**» (identity)، یک «**نوع**» (type) و یک «**مقدار**» (value) است. - -* «شناسه» در زمان ایجاد شی به آن اختصاص می‌یابد و غیر قابل تغییر است. تابع ``()id`` شناسه شی را به صورت یک عدد صحیح برمی‌گرداند که این مقدار در CPython بیانگر نشانی (Address) شی در حافظه (Memory) است:: - - - >>> id(5) - 140468674877440 - - >>> num = 0.25 - >>> id(num) - 140468676592120 - - >>> msg = "Hello World!" - >>> id(msg) - 140468675425264 - - -* هر شی در پایتون دارای یک «نوع» یا ”type“ است که عملیات قابل پشتیبانی و نیز مقادیر ممکن برای شی را تعریف می‌کند. نوع هر شی توسط تابع ``()type`` قابل مشاهده است و همانند شناسه غیر قابل تغییر می‌باشد:: - - >>> # python 3.x - >>> type(127) - - - >>> # python 2.x - >>> type(127) - - - .. caution:: - تمام اعداد صحیح (Integers) در پایتون یک شی از نوع ``int`` می‌باشند. [با انواع آماده (Built-in) شی در پایتون توسط دروس آینده آشنا خواهید شد.] - - -* «مقدار» برخی اشیا در پایتون قابل تغییر است که به این دسته از اشیا **”mutable“** (تغییر پذیر) گفته می‌شود؛ ولی مقدار برخی دیگر قابل تغییر نمی‌باشد (مانند اعداد: شی ``127``) که به آن‌ها اشیا **”immutable“** (تغییر ناپذیر) می‌گویند. - - -کلاس‌ها در پایتون ------------------ - -از نسخه 2.2 طراحی کلاس‌ها در پایتون تغییر کرد [`New-style Classes `_] که البته ساختار قدیمی همچنان در نسخه 2x باقی مانده است. [مبنای آموزش در این کتاب طراحی جدید می‌باشد.] - -در ساختار جدید مفهوم ”type“ برابر مفهوم ”class“ طراحی شده است. در این ساختار هر کلاس خود یک شی از کلاسی به نام ”type“ می‌باشد و همچنین تمامی کلاس‌ها از کلاسی به نام ”object“ ارث‌بری دارند:: - - - >>> # Python 3.x - >>> num = 3 - - >>> num.__class__ - - - >>> type(num) - - - >>> type(type(num)) - - - >>> type(num).__class__ - - - >>> type(num).__bases__ - (,) - - -.. caution:: - صفت ``__class__`` نام کلاس یک شی و صفت ``__bases__`` نام کلاس‌های پایه یک کلاس را نمایش می‌دهد. - -تعریف کلاس -~~~~~~~~~~~ -در پایتون برای تعریف کلاس از کلمه کلیدی ``class`` استفاده می‌گردد؛ همانند الگو پایین:: - - class ClassName: - - . - . - . - - -کلمه کلیدی تعریف کلاس - ``class`` - یک دستور اجراپذیر (Executable Statement) است. یک کلاس پیش از اجرای دستور خود هیچ تاثیری در برنامه ندارد. این شرایط سبب می‌شود که حتی بتوان یک کلاس را در میان بدنه دستور شرط (``if``) یا درون بدنه یک تابع تعریف کرد. [در پشت صحنه]: با اجرای دستور تعریف کلاس، یک شی از نوع type در حافظه ایجاد می‌گردد و از نام کلاس برای اشاره به آن شی استفاده می‌شود. - -بعد از کلمه کلیدی ``class`` نام کلاس (به دلخواه کاربر) نوشته می‌شود. سطر نخست تعریف مانند تمام دستورات مرکب (Compound) که به صورت معمول در چند سطر نوشته می‌شوند و سرآیند دارند، به کاراکتر ``:`` ختم می‌شود. از سطر دوم با رعایت یکنواخت تورفتگی دستورات بدنه کلاس نوشته می‌شوند:: - - >>> # Python 3.x - - >>> class MyClassName: - ... pass - ... - >>> - - >>> type(MyClassName) - - - >>> MyClassName.__bases__ - (,) - >>> - -.. caution:: - در مواردی که هنوز نمی‌خواهیم دستورات مربوط به بدنه یک دستور به مانند کلاس را بنویسیم؛ می‌توانیم از دستور ``pass`` استفاده کنیم. با اجرای این دستور هیچ کاری انجام نمی‌شود. - -:: - - >>> # Python 2.x - - >>> class MyClassName(object): - ... pass - ... - >>> - - >>> type(MyClassName) - - - >>> MyClassName.__bases__ - (,) - >>> - -تمامی کلاس‌ها در پایتون 3x به صورت ضمنی از کلاس object ارث‌بری دارند و نیازی به درج آن توسط برنامه‌نویس نیست؛ ولی در نسخه 2x چنانچه قصد داشته‌ باشیم از طراحی جدید کلاس‌ها پیروی کنیم، می‌بایست به صورت صریح از این کلاس ارث‌بری نماییم. - -در بحث ارث‌بری نام کلاس(های) پایه مورد نظر درون پرانتز جلوی نام کلاس نوشته می‌شود. در صورت ارث‌بری از چند کلاس می‌بایست نام آن‌ها را توسط کاما (Comma) از یکدیگر جدا ساخت:: - - >>> # Python 3.x - - >>> class ChildClassName(BaseClassNameOne, BaseClassNameTwo): - ... pass - ... - >>> - - >>> ChildClassName.__bases__ - (, ) - -.. caution:: - همانطور که می‌دانیم،‌ ``__main__`` اشاره به نام ماژول دارد. - - با دقت در نمونه کد بالا متوجه می‌شوید که دیگر از کلاس object در میان کلاس‌های پایه خبری نیست. دلیل این اتفاق در این است که کلاس فرزند (ChildClassName) اکنون در یک سلسله مراتب وراثت قرار گرفته و کلاس‌های پایه او از این کلاس ارث‌بری دارند. - -:: - - >>> # Python 2.x - - >>> class BaseClassNameOne(object): - ... pass - ... - >>> - - >>> class BaseClassNameTwo(object): - ... pass - ... - >>> - - >>> class ChildClassName(BaseClassNameOne, BaseClassNameTwo): - ... pass - ... - >>> - - >>> ChildClassName.__bases__ - (, ) - - -برای دریافت نام تمام کلاس‌های پایه موجود در سلسله مراتب وراثت یک کلاس مشخص می‌توانیم از تابع ``()getmro`` درون ماژول ``inspect`` استفاده نماییم [`اسناد پایتون `__]؛ همانند پایین:: - - >>> # Python 3.x - - >>> import inspect - >>> inspect.getmro(ChildClassName) - (, , , ) - -:: - - >>> # Python 2.x - - >>> import inspect - >>> inspect.getmro(ChildClassName) - (, , , ) - -.. caution:: - خروجی تابع ``()getmro`` مرتب شده است؛ به این صورت که در یک سلسله مراتب از خود کلاس مورد نظر شروع می‌شود و به کلاس object پایان می‌یابد. کلاس‌های پایه هم سطح نیز بر اساس ترتیب نوشتن آن‌ها در کلاس فرزند مرتب می‌شوند. - - - -.. note:: - - آنچه در این درس آورده شده است، چکیده‌ای از پیاده‌سازی برنامه‌نویسی شی گرا در پایتون است. شی گرایی در زبان برنامه نویسی پایتون به صورت کامل از درس هفدهم به بعد شرح داده می‌شود. - - -| - ----- - -:emoji-size:`😊` امیدوارم مفید بوده باشه - -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - - diff --git a/source/lessons/l06.rst b/source/lessons/l06-python-syntax.rst similarity index 77% rename from source/lessons/l06.rst rename to source/lessons/l06-python-syntax.rst index d49e6ae..66552e9 100644 --- a/source/lessons/l06.rst +++ b/source/lessons/l06-python-syntax.rst @@ -1,11 +1,13 @@ .. role:: emoji-size .. meta:: - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش سینتکس (Syntax) در پایتون، آموزش دستور نحو در زبان برنامه نویسی پایتون - :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, سینتکس, سطر, متغیر, شناسه, ثابت, عملگرها, دستور, کامنت, توضیح, داک استرینگ, مستند سازی, دستور زبان + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس ششم: سینتکس زبان پایتون + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, سینتکس, سطر, متغیر, شناسه, ثابت, عملگرها, دستور, کامنت, توضیح, داک string, مستند سازی, دستور زبان -درس ۰۶: سینتکس یا دستور نحو زبان پایتون +.. _lesson-06: + +درس ۰۶: سینتکس زبان پایتون ========================================== @@ -16,9 +18,9 @@ Photo by `Tim J `__ -در این درس به معرفی اجزای پایه در برنامه‌نویسی پایتون پرداخته شده و اینکه چه هستند، چه گرامری دارند، چه کاری انجام می‌دهند یا... مورد بررسی قرار گرفته است. همچنین در موارد بسیاری نکته‌هایی از شیوه استاندارد پایتون‌نویسی که توسط سند `PEP 8 `__ به برنامه‌نویسان پایتون پیشنهاد می‌شود نیز آورده شده است؛ رعایت این اصول به یکدستی کدهای جامعه پایتون کمک می‌کند. +در این درس به معرفی اجزای پایه در زبان برنامه‌نویسی پایتون پرداخته شده و اینکه چه هستند، چه گرامری دارند، چه کاری انجام می‌دهند یا... مورد بررسی قرار گرفته است. همچنین در موارد بسیاری نکته‌هایی از شیوه استاندارد پایتون‌نویسی که توسط سند `PEP 8 `__ به برنامه‌نویسان پایتون پیشنهاد می‌شود نیز آورده شده است؛ رعایت این اصول به یکدستی کدهای جامعه پایتون کمک می‌کند. -سینتکس (`Syntax `_ یا دستور نحو) مجموعه‌ای از قواعد است که چگونگی برنامه‌نویسی به یک زبان مشخص را تعریف می‌کند؛ برای نمونه اینکه یک متن چطور نوشته شود که توسط مفسر پایتون به عنوان توضیح در نظر گرفته شود یا یک شی رشته، به رعایت سینتکس تعریف شده در پایتون بستگی دارد و چنانچه مفسر نتواند متن را با هیچ قاعده‌ تعریف شده‌ای مطابقت دهد یک استثنا گزارش خواهد شد. سینتکس پایتون تنها محدود به این درس نیست و موارد بسیار دیگری به مانند چگونگی تعریف اشیا گوناگون را در طی درس‌های آتی مشاهده خواهید کرد. +سینتکس (`Syntax `_) مجموعه‌ای از قواعد است که چگونگی برنامه‌نویسی به یک زبان مشخص را تعریف می‌کند؛ برای نمونه اینکه یک متن چطور نوشته شود که توسط مفسر پایتون به عنوان توضیح در نظر گرفته شود یا یک شی رشته، به رعایت سینتکس تعریف شده در پایتون بستگی دارد و چنانچه مفسر نتواند متن را با هیچ قاعده‌ تعریف شده‌ای مطابقت دهد یک استثنا گزارش خواهد شد. سینتکس پایتون تنها محدود به این درس نیست و موارد بسیار دیگری به مانند چگونگی تعریف اشیا گوناگون را در طی درس‌های آتی مشاهده خواهید کرد. :emoji-size:`✔` سطح: مقدماتی @@ -31,26 +33,28 @@ ---- +.. _python-lines: + سطرها ------ -مفسر پایتون و همچنین کاربر، کدهای درون هر ماژول را در قالب تعدادی سطر می‌بینند؛ سطرهای **فیزیکی** (Physical Lines) و **منطقی** (Logical Lines). سطرهای فیزیکی در واقع همان سطرهایی است که توسط ویرایشگرهای متن شماره‌گذاری می‌شوند و به راحتی توسط کاربر قابل تشخیص هستند ولی سطرهای منطقی برداشت مفسر از اجزای برنامه است؛ هر سطر منطقی بیانگر یک دستور (Statement) پایتون است. برای نمونه دستور ``print`` در نسخه 2x پایتون را در نظر بگیرید: +مفسر پایتون و همچنین کاربر، کدهای درون هر ماژول را در قالب تعدادی سطر می‌بینند؛ سطرهای **فیزیکی** (Physical Lines) و **منطقی** (Logical Lines). سطرهای فیزیکی در واقع همان سطرهایی است که توسط ویرایشگرهای متن شماره‌گذاری می‌شوند و به راحتی توسط کاربر قابل تشخیص هستند ولی سطرهای منطقی برداشت مفسر از اجزای برنامه است؛ هر سطر منطقی بیانگر یک دستور (Statement) پایتون است. برای نمونه دستور انتساب (Assign): .. code-block:: python :linenos: - msg = "Welcome!" - print msg + msg = "Hello World!" + print(msg) -در نمونه کد بالا: سطر یکم، یک دستور انتساب (Assign) را نشان می‌دهد؛ این دستور مقدار سمت راست خودش را به متغیر ``msg`` نسبت می‌دهد. کم و بیش با دستور سطر دوم نیز آشنا هستید این دستور مقدار مربوط به متغیر دریافتی را بر روی خروجی نمایش می‌دهد. در اینجا دو دستور یعنی دو سطر منطقی وجود دارد که هر یک در قالب یک سطر فیزیکی پیاده‌سازی شده است. +در نمونه کد بالا: سطر یکم، یک دستور انتساب (Assign) را نشان می‌دهد؛ این دستور مقدار سمت راست خودش را به متغیر ``msg`` نسبت می‌دهد. کم و بیش با دستور سطر دوم نیز آشنا هستید، این دستور با فراخواندن تابع ``print`` مقدار مربوط به متغیر دریافتی را بر روی خروجی نمایش می‌دهد. در اینجا دو دستور یعنی دو سطر منطقی وجود دارد که هر یک در قالب یک سطر فیزیکی پیاده‌سازی شده است. هر چند که پیشنهاد می‌شود همیشه هر سطر فیزیکی تنها شامل یک سطر منطقی باشد ولی یک سطر فیزیکی را می‌توان شامل چند سطر منطقی نیز در نظر گرفت: .. code-block:: python :linenos: - msg = "Welcome!"; print msg + msg = "Hello World!"; print(msg) در این حالت می‌بایست سطرهای منطقی (یا همان دستور‌ها)، توسط کاراکتر ``;`` (Semicolon) از یکدیگر جدا گردند. @@ -61,7 +65,7 @@ msg = "Python Programming \ Language." # This is a message. - print msg + print(msg) در نمونه کد بالا: دو سطر فیزیکی نخست از دید مفسر به شکل تنها یک سطر منطقی دیده می‌شود. در پایتون برای شکستن یک دستور در چند سطر فیزیکی از کاراکتر ``\`` (Backslash) استفاده می‌گردد. البته توجه داشته باشید که از ``\`` نمی‌توان برای شکستن سطر توضیح (Comment) استفاده کرد و همچنین نمی‌توان پس از آن هیچ توضیحی درج کرد. @@ -90,10 +94,15 @@ print power(2, 3) + +.. _python-documentation: + مستند‌سازی ----------- هر چند اساس طراحی زبان پایتون بر خوانایی بالای کد است ولی «مستندسازی» (Documentation) برنامه یعنی استفاده از امکاناتی همچون ارایه توضیح در کدها می‌تواند به درک و خوانایی هر چه بهتر کدهای برنامه برای مراجعات آینده برنامه‌نویس و افراد دیگری که می‌خواهند بر روی توسعه آن فعال باشند یا از آن استفاده کنند نیز بسیار مفید خواهد بود. در این بخش به بررسی دو امکان درج **Comment** و **Docstring** برای مستند‌سازی برنامه می‌پردازیم. +.. _python-comment: + توضیح ~~~~~~~ یک «**توضیح**» (Comment) در زبان پایتون توسط کاراکتر ``#`` آغاز می‌شود و با پایان سطر فیزیکی هم پایان می‌پذیرد. توضیح‌ها نیز مانند سطرهای خالی توسط مفسر نادیده گرفته شده و به بایت‌کد ترجمه نمی‌شوند. @@ -108,20 +117,22 @@ .. code-block:: python :linenos: - # A comment, this is so you can read your program later. - # Anything after the # is ignored by python. + # This is a comment, it helps you to understand the code later on. + # Anything that comes after the # symbol is ignored by Python. + + print("I could have code like this.") # This comment explains that the following comment will be ignored. - print "I could have code like this." # and the comment after is ignored + # You can also use a comment to temporarily "disable" or comment out a piece of code: + # print ("This won't run.") - # You can also use a comment to "disable" or comment out a piece of code: - # print "This won't run." + print("This will run.") - print "This will run." +.. _python-docstring: Docstring ~~~~~~~~~~ -در کنار «توضیح»؛ **”Docstring“** نیز امکان دیگری در پایتون برای ارایه توضیح بیشتر درباره کدهای برنامه است. متن Docstring توسط سه علامت نقل قول (``"""`` یا ``'''``) شروع و پایان می‌یابد [`PEP 257 `_] و معمولا از آن به عنوان نخستین دستور در ماژول، کلاس، تابع و متد استفاده می‌شود که در این شرایط Docstring توسط مفسر نادیده گرفته **نمی‌شود** و در زمان اجرا نیز با استفاده از صفت ``__doc__`` قابل دستیابی است: +در کنار «توضیح»؛ **”Docstring“** نیز امکان دیگری در پایتون برای ارایه توضیح بیشتر درباره کدهای برنامه است. متن Docstring توسط سه علامت نقل قول (``"""`` یا ``'''``) شروع و پایان می‌یابد [`PEP 257 `_] و معمولا از آن به عنوان نخستین دستور در ماژول، کلاس، تابع و متد استفاده می‌شود. Docstring توسط مفسر نادیده گرفته **نمی‌شود** و در زمان اجرا نیز با استفاده از صفت ``__doc__`` قابل دستیابی است: .. code-block:: python :linenos: @@ -153,10 +164,9 @@ Docstring مخاطب متن «توضیح‌» موجود در کد، کاربرانی می‌باشند که آن کد را توسعه می‌دهند در حالی که مخاطب اصلی Docstring‌ها کاربرانی است که از کد مربوط به آن استفاده می‌کنند بنابراین Docstring باید به توضیح چگونگی استفاده از کد (به صورت خاص: ماژول، تابع، کلاس و متد) بپردازد. -Docstring باید به عنوان دستور نخست درج گردد و این نکته برای یک ماژول در صورت وجود سطرهای اجرای مفسر و تعیین کد‌گذاری به صورت پایین در نظر گرفته می‌شود:: +Docstring باید به عنوان دستور نخست درج گردد و این نکته برای یک ماژول در صورت وجود سطر اجرای مفسر به صورت پایین در نظر گرفته می‌شود:: #!/usr/bin/env python - #-*- coding: utf-8 -*- """ Module docstring. @@ -170,12 +180,13 @@ Docstring باید به عنوان دستور نخست درج گردد و این .. tip:: Docstring‌ها در هر جای دیگری از کدهای برنامه نیز به عنوان جایگزینی برای توضیح‌های چند سطری قابل استفاده هستند که در این حالت مفسر آن‌ها نادیده گرفته و دیگر قابل دستیابی نیستند. +.. _python-indentation: + تورفتگی -------- -**بلاک‌بندی** در زبان پایتون توسط «**تورفتگی**» (Indentation) سطرها مشخص می‌گردد؛ این عمل در زبان‌هایی مانند C توسط آکولاد ``{ }`` انجام می‌شود. تورفتگی در واقع عبارت است از میزان فضای خالی (Spaceها و Tabها) هر دستور از ابتدای سطر فیزیکی خود. نکته مهم این است که تمام دستورهای موجود در یک بلاک می‌بایست به یک میزان فاصله نسبت به سرآیند خود تورفتگی داشته باشند: +**بلاک‌بندی** در زبان پایتون توسط «**تورفتگی**» (Indentation) سطرها مشخص می‌گردد؛ این عمل در زبان‌هایی مانند C و Java توسط آکولاد ``{ }`` انجام می‌شود. تورفتگی در واقع عبارت است از میزان فضای خالی (Spaceها و Tabها) هر دستور از ابتدای سطر فیزیکی خود. نکته مهم این است که تمام دستورهای موجود در یک بلاک می‌بایست به یک میزان فاصله نسبت به سرآیند خود تورفتگی داشته باشند: .. code-block:: c - :linenos: // C @@ -186,7 +197,6 @@ Docstring باید به عنوان دستور نخست درج گردد و این .. code-block:: python - :linenos: # Python @@ -202,7 +212,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این .. tip:: [`PEP 8 `__]: در ایجاد تورفتگی استفاده از کلید Space نسبت به کلید Tab ترجیح داده می‌شود - برای هر مرتبه تورفتگی از چهار کلید Space استفاده نمایید. -روش رایج ایجاد تورفتگی استفاده از کلید Space است و سعی کنید هرگز به صورت ترکیبی از کلیدهای Sapce و Tab استفاده نکنید هر چند که در نسخه 3x پایتون امکان استفاده ترکیبی از این دو کلید وجود ندارد! اگر مایل به استفاده از کلید Tab هستید باید به صورت یکدست تمام تورفتگی‌های برنامه خود را فقط با استفاده از آن ایجاد نمایید. +روش رایج ایجاد تورفتگی استفاده از کلید Space است و سعی کنید هرگز به صورت ترکیبی از کلیدهای Sapce و Tab استفاده نکنید چرا که از نسخه 3 پایتون امکان استفاده ترکیبی از این دو کلید وجود ندارد! اگر مایل به استفاده از کلید Tab هستید باید به صورت یکدست تمام تورفتگی‌های برنامه خود را فقط با استفاده از آن ایجاد نمایید. اجباری به تورفتگی آن بخشی از دستورها که به سطرهای فیزیکی دیگر شکسته شده‌اند وجود ندارد اما بهتر است برای خوانایی بالاتر، این بخش‌ها را با کمی تورفتگی بیشتر نسبت به دستور‌های بدنه بلاک جاری نوشته شوند: @@ -224,15 +234,16 @@ Docstring باید به عنوان دستور نخست درج گردد و این var_three, var_four) +.. _python-statement: دستور ------- «**دستور**» (Statement) واحدی از کد است که شامل کلمه‌های کلیدی بوده، اجرا می‌گردد و کاری را به انجام می‌رساند. در پایتون دو نوع دستور وجود دارد: -دستورهای ساده (`Simple Statements `_): دستورهایی هستند که تنها در یک سطر منطقی پیاده‌سازی می‌شوند. مانند دستور ``import``، دستور ``pass``، دستور انتساب، فراخوانی تابع و... +دستورهای ساده (`Simple Statements `_): دستورهایی هستند که تنها در یک سطر منطقی پیاده‌سازی می‌شوند. مانند دستور ``import``، دستور انتساب، فراخوانی تابع و... -دستورهای مرکب (`Compound Statements `_): گروهی از دستورها هستند که می‌توانند یک بخشی (مانند: دستور ``def`` - تعریف تابع) یا چند بخشی (مانند: دستور شرط ``if`` / ``elif`` / ``else``) باشند؛ هر بخش (Clause) نیز شامل یک سرآیند (Header) و یک بدنه (Suite) است. هر سرآیند با یک کلمه کلیدی آغاز می‌شود و با یک ``:`` (Colon) نیز پایان می‌پذیرد. بدنه پس از سرآیند و با رعایت سطح تورفتگی بیشتر نسبت به آن نوشته می‌شود: +دستورهای مرکب (`Compound Statements `_): گروهی از دستورها هستند که می‌توانند یک بخشی (مانند: دستور ``def`` - تعریف تابع) یا چند بخشی (مانند: دستور شرط ``if`` / ``elif`` / ``else``) باشند؛ هر بخش (Clause) نیز شامل یک سرآیند (Header) و یک بدنه (Suite) است. هر سرآیند با یک کلمه کلیدی آغاز می‌شود و با یک ``:`` (Colon) نیز پایان می‌پذیرد. بدنه پس از سرآیند و با رعایت سطح تورفتگی بیشتر نسبت به آن نوشته می‌شود: .. code-block:: python :linenos: @@ -250,15 +261,18 @@ Docstring باید به عنوان دستور نخست درج گردد و این return mid return False +.. _python-identifier: + شناسه ------- + «**شناسه**» (**Identifier**) نامی است نمادین که به دلخواه کاربر تعیین و از آن برای شناسایی (identify) متغیر‌ها، توابع، کلاس‌ها، ماژول‌ها یا دیگر اشیا پایتون از یکدیگر استفاده می‌شود. انتخاب شناسه در پایتون نکاتی دارد که می‌بایست از سوی کاربر در نظر گرفته شود: * تنها با یکی از حروف بزرگ یا کوچک الفبا انگلیسی (``A..Z`` یا ``a..z``) یا کاراکتر ``_`` (Underscore) شروع شود. * در ادامه می‌تواند هیچ یا چند حرف الفبا انگلیسی (کوچک و بزرگ)، کاراکتر ``_`` و عدد (``9..0``) - با هر ترتیبی - آورده شود. * هیچ محدودیتی در طول شناسه وجود ندارد و می‌تواند از یک تا هر تعداد کاراکتر باشد. -با یک نگاه حرفه‌ای‌تر، ساختار لغوی (Lexical) شناسه به شکل پایین بیان می‌شود [`اسناد پایتون `__]: +با یک نگاه حرفه‌ای‌تر، ساختار لغوی (Lexical) شناسه به شکل پایین بیان می‌شود [`اسناد پایتون `__]: :: @@ -271,7 +285,8 @@ Docstring باید به عنوان دستور نخست درج گردد و این digit ::= "0"..."9" .. caution:: - در تعاریف `regex `_: از پرانتز ``( )`` برای گروه‌بندی استفاده می‌شود. نماد ``|`` به معنی **یا** می‌باشد و از آن برای جدا‌سازی دو عبارت متفاوت استفاده می‌شود. نماد ``*`` به معنی صفر بار تکرار یا بیشتر می‌باشد. [درسی جداگانه به regex اختصاص خواهد یافت] + در تعاریف `regex `_: از پرانتز ``( )`` برای گروه‌بندی استفاده می‌شود. نماد ``|`` به معنی **یا** می‌باشد و از آن برای جدا‌سازی دو عبارت متفاوت استفاده می‌شود. نماد ``*`` به معنی صفر بار تکرار یا بیشتر می‌باشد. [دروس پانزدهم و شانزدهم به بررسی Regular Expression اختصاص یافته است.] + .. tip:: * استفاده از کاراکترهای خاص به مانند ``.``، ``!``، ``@``، ``#``، ``$``، ``%`` و... مجاز نمی‌باشد. * استفاده از «فاصله» (Space) مجاز نمی‌باشد. @@ -309,10 +324,11 @@ Docstring باید به عنوان دستور نخست درج گردد و این * نام انتخابی برای یک تابع و متد‌ نیز باید تنها شامل حروف کوچک باشد و برای جداسازی کلمه‌ها از ``_`` استفاده شود. مانند: bubble_sort ،binary_search و... البته می‌توان از شیوه camelCase (همانند PascalCase با این تفاوت که حرف نخست کلمه یکم هم می‌بایست حرف کوچک باشد) نیز استفاده نماییم. مانند: bubbleSort ،binarySearch و... - * نام‌ متغیرها تنها باید شامل حروف کوچک باشد که کلمه‌های آن توسط ``_`` از یکدیگر جدا شده‌اند. مانند: body_color ،color و... + * نام‌ متغیرها تنها شامل حروف کوچک باشد که کلمه‌های آن توسط ``_`` از یکدیگر جدا شده‌اند. مانند: body_color ،color و... -برای شناسه‌های تک حرفی توجه داشته باشید که از انتخاب حروف l (اِل کوچک) و I (آی بزرگ) اجتناب کنید زیرا این دو حرف در برخی فونت‌ها شبیه هم هستند و البته همینطور حرف O (اُ بزرگ) که می‌تواند شبیه به صفر باشد. +برای شناسه‌های تک حرفی توجه داشته باشید که از انتخاب حروف l (اِل کوچک) و I (آی بزرگ) بهتر است اجتناب کنید زیرا این دو حرف در برخی فونت‌ها شبیه هم هستند و البته همینطور حرف O (اُ بزرگ) که می‌تواند شبیه به صفر باشد. +.. _python-keywords: کلمه‌های کلیدی ~~~~~~~~~~~~~~~ @@ -320,40 +336,20 @@ Docstring باید به عنوان دستور نخست درج گردد و این :: - >>> # Python 3.x - - >>> help("keywords") - Here is a list of the Python keywords. Enter any keyword to get more help. - - False def if raise - None del import return - True elif in try - and else is while - as except lambda with - assert finally nonlocal yield - break for not - class from or - continue global pass - -:: - - >>> # Python 2.x - >>> help("keywords") - Here is a list of the Python keywords. Enter any keyword to get more help. + Here is a list of the Python keywords. Enter any keyword to get more help. - and elif if print - as else import raise - assert except in return - break exec is try - class finally lambda while - continue for not with - def from or yield - del global pass + False class from or + None continue global pass + True def if raise + and del import return + as elif in try + assert else is while + async except lambda with + await finally nonlocal yield + break for not -در کتابخانه استاندارد پایتون ماژولی به نام ``keyword`` وجود دارد [`اسناد پایتون `__]:: - - >>> # Python 3.x +در کتابخانه استاندارد پایتون ماژولی به نام ``keyword`` وجود دارد [`اسناد پایتون `__]:: >>> import keyword @@ -371,30 +367,23 @@ Docstring باید به عنوان دستور نخست درج گردد و این شاید کنجکاو باشید تعداد کلمه‌های کلیدی پایتون را بدانید؛ برای این منظور نیازی به شمارش دستی نیست!:: - >>> # Python 3.x >>> import keyword >>> len(keyword.kwlist) 33 - >>> # Python 2.x - >>> import keyword - >>> len(keyword.kwlist) - 31 - .. caution:: - تابع ``()len`` تعداد اعضای یک شی را باز می‌گرداند [`اسناد پایتون `__]. + تابع ``()len`` تعداد اعضای یک شی را باز می‌گرداند [`اسناد پایتون `__]. -.. rubric:: برخی نکات: +.. tip:: -* در پایتون 3x: تنها کلمه‌های کلیدی ``True`` ،``False`` و ``None`` با حرف بزرگ آغاز می‌شوند. -* در پایتون 2x: کلمه‌های کلیدی ``True`` ،``False`` و ``None`` تعریف نشده است. -* در پایتون 3x: از آنجا که print به یک تابع تبدیل گشته، کلمه کلیدی ``print`` تعریف نشده است. + تنها کلمه‌های کلیدی ``True`` ،``False`` و ``None`` با حرف بزرگ آغاز می‌شوند. .. tip:: [`PEP 8 `_]: چنانچه می‌خواهید شناسه‌ای مشابه با یکی از کلمه‌های کلیدی انتخاب نمایید؛ می‌توانید این کار را با استفاده از یک ``_`` در انتهای کلمه مورد نظر به انجام برسانید. مانند: ``_def`` +.. _python-variable: متغیر ------- @@ -409,7 +398,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این int b = a; -در نمونه کد بالا: دستور ``;int a = 1`` بیان می‌کند که محلی از حافظه به نام ``a`` برای نگهداری اعداد صحیح (integers) در نظر گرفته شود و مقدار ``1`` در آن قرار بگیرد؛ از این پس متغیر ``a`` معرف این نقطه از حافظه می‌باشد (درست به مانند یک جعبه) که اکنون حاوی مقدار ``1`` است (شکل پایین - یک). در ادامه دستور ``;a = 2`` موجب می‌شود مقدار پیشین متغیر ``a`` حذف (از جعبه خارج) و مقدار جدید یعنی ``2`` در آن قرار داده شود (شکل پایین - دو). توجه داشته باشید که در این دسته زبان‌ها، نوع (type) توسط متغیر تعیین می‌گردد و تلاش برای قرار دادن نوع داده دیگری به غیر از ``int`` در متغیر ``a`` (به مانند ``3.7`` یا ``"string"``) موجب بروز خطا در زمان کامپایل می‌گردد. دستور سوم:‌ ``;int b = a`` در ابتدا موجب ایجاد یک محل جدید در حافظه با نام ``b`` و از نوع همان اعداد صحیح می‌شود و سپس مقدار درون متغیر ``a`` را درون آن کپی می‌کند؛ اکنون دو محل برای نگهداری نوع داده ``int`` در حافظه موجود است که هر دو حاوی مقدار ``2`` می‌باشند (شکل پایین - سه). +در نمونه کد بالا: دستور ``;int a = 1`` بیان می‌کند که محلی از حافظه به نام ``a`` برای نگهداری اعداد صحیح (integers) در نظر گرفته شود و مقدار ``1`` در آن قرار بگیرد؛ از این پس متغیر ``a`` معرف این نقطه از حافظه می‌باشد (درست به مانند یک جعبه) که اکنون حاوی مقدار ``1`` است (شکل پایین - یک). در ادامه دستور ``;a = 2`` باعث می‌شود مقدار پیشین متغیر ``a`` حذف (از جعبه خارج) و مقدار جدید یعنی ``2`` در آن قرار داده شود (شکل پایین - دو). توجه داشته باشید که در این دسته زبان‌ها، نوع (type) توسط متغیر تعیین می‌گردد و تلاش برای قرار دادن نوع داده دیگری به غیر از ``int`` در متغیر ``a`` (به مانند ``3.7`` یا ``"string"``) باعث بروز خطا در زمان کامپایل می‌گردد. دستور سوم:‌ ``;int b = a`` در ابتدا باعث ایجاد یک محل جدید در حافظه با نام ``b`` و از نوع همان اعداد صحیح می‌شود و سپس مقدار درون متغیر ``a`` را درون آن کپی می‌کند؛ اکنون دو محل برای نگهداری نوع داده ``int`` در حافظه موجود است که هر دو حاوی مقدار ``2`` می‌باشند (شکل پایین - سه). .. image:: /_static/l06-c-variable.png @@ -429,21 +418,21 @@ Docstring باید به عنوان دستور نخست درج گردد و این 1. یک شی از نوع اعداد صحیح و مقدار ``1`` را در جایی از حافظه ایجاد می‌کند. چرا اعداد صحیح؟ نوع توسط شی تعیین می‌گردد و ``1`` عددی است صحیح!. #. متغیرِ (یا همان نامِ) ``a`` را در جایی دیگر از حافظه ایجاد می‌کند (البته در صورتی که قبلا ایجاد نشده باشد). -#. یک پیوند از متغیر ``a`` به شی ``1`` برقرار می‌کند. به این پیوند «ارجاع» (Reference) گفته می‌شود که به صورت یک اشاره‌گر (Pointer) در حافظه پیاده‌سازی می‌گردد. +#. یک پیوند از متغیر ``a`` به شی ``1`` برقرار می‌کند. به این پیوند «ارجاع» (Reference) گفته می‌شود . .. image:: /_static/l06-python-variable-01.png :align: center -انتساب شی دیگری (که می‌تواند از هر نوع دیگری باشد) به یک متغیر موجود؛ موجب حذف ارجاع قبلی آن و ارجاع به شی جدید می‌شود. دستور ``a = 2`` موجب ایجاد شی ``2``، حذف ارجاع متغیر ``a`` به شی ``1`` و ایجاد ارجاعی جدید از متغیر ``a`` به شی ``2`` می‌شود. هر متغیر نامی است برای اشاره به یک شی؛ دستور ``b = a`` نیز می‌گوید: یک متغیر جدید با نام ``b`` ایجاد گردد و به همان شی‌ای ارجاع داشته باشد که متغیر ``a`` ارجاع دارد. +انتساب شی دیگری (که می‌تواند از هر نوع دیگری باشد) به یک متغیر موجود؛ باعث حذف ارجاع قبلی آن و ارجاع به شی جدید می‌شود. دستور ``a = 2`` باعث ایجاد شی ``2``، حذف ارجاع متغیر ``a`` به شی ``1`` و ایجاد ارجاعی جدید از متغیر ``a`` به شی ``2`` می‌شود. هر متغیر نامی است برای اشاره به یک شی؛ دستور ``b = a`` نیز می‌گوید: یک متغیر جدید با نام ``b`` ایجاد گردد و به همان شی‌ای ارجاع داشته باشد که متغیر ``a`` ارجاع دارد. ولی اکنون که ارجاعی به شی ``1`` وجود ندارد، با آن چه می‌شود؟ - هر شی شامل یک «**شمارنده ارجاع**» (Reference Counter) نیز هست؛ به این صورت که در هر لحظه تعداد ارجاع‌ها به آن شی را نشان می‌دهد و با هر ارجاع جدید به شی، یک واحد به آن اضافه می‌شود و با حذف هر ارجاع نیز یک واحد کاهش می‌یابد. چنانچه مقدار آن به صفر برسد، شی آن توسط تکنیک ”**Garbage Collection**“ پاک می‌گردد و مقدار حافظه‌ای که توسط شی مصرف شده بود آزاد می‌گردد. برای مشاهده تعداد ارجاع‌ها به یک شی می‌توان از تابع ``()getrefcount`` درون ماژول ``sys`` استفاده کرد [`اسناد پایتون `__]. +هر شی شامل یک «**شمارنده ارجاع**» (Reference Counter) نیز هست؛ به این صورت که در هر لحظه تعداد ارجاع‌ها به آن شی را نشان می‌دهد و با هر ارجاع جدید به شی، یک واحد به آن اضافه می‌شود و با حذف هر ارجاع نیز یک واحد کاهش می‌یابد. چنانچه مقدار آن به صفر برسد، شی آن توسط تکنیک ”**Garbage Collection**“ پاک می‌گردد و مقدار حافظه‌ای که توسط شی مصرف شده بود آزاد می‌گردد. برای مشاهده تعداد ارجاع‌ها به یک شی می‌توان از تابع ``()getrefcount`` درون ماژول ``sys`` استفاده کرد [`اسناد پایتون `__]. - البته مفسر پایتون اعداد صحیح و رشته‌های کوچک را پس از اینکه مقدار شمارنده ارجاع‌ آن‌ها به صفر برسد از حافظه پاک نمی‌کند. هدف از این کار صرفه جویی در هزینه ایجاد این اشیا برای استفاده در آینده است. بنابراین در پاسخ به سوال بالا باید گفت که: شی ``1`` در حافظه باقی می‌ماند. +البته مفسر پایتون اعداد صحیح و رشته‌های کوچک را پس از اینکه مقدار شمارنده ارجاع‌ آن‌ها به صفر برسد از حافظه پاک نمی‌کند. هدف از این کار صرفه جویی در هزینه ایجاد این اشیا برای استفاده در آینده است. بنابراین در پاسخ به سوال بالا باید گفت که: شی ``1`` در حافظه باقی می‌ماند. - :: +:: >>> import sys @@ -462,11 +451,14 @@ Docstring باید به عنوان دستور نخست درج گردد و این 97 - در نمونه کد بالا همانطور که مشاهده می‌نمایید تعداد ارجاع‌ها به شی ``1`` و ``2`` خارج از حد انتظار است که نشان می‌دهد در پشت صحنه اجرای مفسر پایتون نیز ارجاع‌های دیگری به این اشیا وجود دارد. +در نمونه کد بالا همانطور که مشاهده می‌نمایید تعداد ارجاع‌ها به شی ``1`` و ``2`` خارج از حد انتظار است که نشان می‌دهد در پشت صحنه اجرای مفسر پایتون نیز ارجاع‌های دیگری به این اشیا وجود دارد. به کاهش و افزایش تعداد ارجاع‌ها در مثال بالا توجه نمایید. + + +.. _python-multiple-assignment: انتساب چندگانه ~~~~~~~~~~~~~~~~ -امکان ایجاد همزمان چند متغیر یا انتساب‌های چندگانه در پایتون وجود دارد - می‌توان چند متغیر که همگی به یک شی ارجاع دارند را ایجاد کرد:: +امکان ایجاد همزمان چند متغیر یا انتساب‌های چندگانه در پایتون وجود دارد - بنابراین می‌توان چند متغیر که همگی به یک شی ارجاع دارند را تنها با یک دستور ایجاد کرد:: >>> a = b = c = "python" @@ -503,6 +495,8 @@ Docstring باید به عنوان دستور نخست درج گردد و این >>> b 1 +.. _python-constant: + ثابت ~~~~~~ @@ -515,7 +509,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این .. rubric:: در پایتون امکانی برای تعریف ثابت پیش‌بینی نشده است!. -علاوه بر امکان ایجاد ثابت‌ها برخی موارد دیگر هم هست که در پایتون نادیده گرفته شده است. در واقع فرض پایتون بر این است که کاربران او افراد باهوشی هستند که از پس مشکلات برمی‌آیند؛ در نتیجه می‌گوید: من به کاربرانم اعتماد دارم پس نیازی نیست که تمام کارها را من برای آن‌ها انجام دهم، یک برنامه‌نویس باید بتواند ریسک کند!. +علاوه بر امکان ایجاد ثابت‌ها برخی موارد دیگر نیز در پایتون نادیده گرفته شده است. در واقع فرض پایتون بر این است که کاربران او افراد باهوشی هستند که از پس مشکلات برمی‌آیند؛ در نتیجه می‌گوید: من به کاربرانم اعتماد دارم پس نیازی نیست که تمام کارها را من برای آن‌ها انجام دهم، یک برنامه‌نویس باید بتواند ریسک کند!. ولی برای ایجاد ثابت می‌توانید متغیر‌های مورد نظر خود را در ماژولی جدا تعریف نمایید و در هر جایی که لازم بود با ``import`` آن به متغیرهای مورد نظر خود دسترسی یابید: @@ -523,14 +517,14 @@ Docstring باید به عنوان دستور نخست درج گردد و این :linenos: # File: constant.py - # Path: /home/saeid/Documents/MyModule + # Path: /home/user/Documents/MyModule HOURS = 24 .. code-block:: python >>> import sys - >>> sys.path.append('/home/saeid/Documents/MyModule') + >>> sys.path.append('/home/user/Documents/MyModule') >>> import constant >>> constant.HOURS @@ -542,7 +536,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این :linenos: # File: constant.py - # Path: /home/saeid/Documents/MyModule + # Path: /home/user/Documents/MyModule class _const: @@ -559,7 +553,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این .. code-block:: python >>> import sys - >>> sys.path.append('/home/saeid/Documents/MyModule') + >>> sys.path.append('/home/user/Documents/MyModule') >>> import constant >>> constant.HOURS = 24 @@ -568,30 +562,37 @@ Docstring باید به عنوان دستور نخست درج گردد و این >>> constant.HOURS = 23 Traceback (most recent call last): File "", line 1, in - File "/home/saeid/Documents/MyModule/constant.py", line 10, in __setattr__ + File "/home/user/Documents/MyModule/constant.py", line 10, in __setattr__ raise self.ConstError("Can't rebind const(%s)" % name) constant.ConstError: Can't rebind const(HOURS) >>> constant.HOURS 24 -درک کد کلاس ``const_`` نیاز مطالعه درس‌های کلاس و استثنا‌ها (Exceptions) دارد. ولی برای توضیحی کوتاه در این درس باید گفت که: +درک کد کلاس ``const_`` نیاز به مطالعه دروس مربوط به شی‌گرایی و استثنا‌ها را دارد (Exceptions) دارد. ولی برای توضیحی کوتاه در این درس باید گفت که: - مفسر پایتون برای اینکه بداند کدام نام به کدام مقدار یا شی ارجاع دارد از ساختاری مشابه ``{... ,name : value}`` که به نوع دیکشنری (Dictionary) معروف است استفاده می‌کند؛ صفت‌های هر شی و مقدار‌ آن‌ها نیز توسط چنین ساختاری نگهداری می‌شود که برای مشاهده این دیکشنری که در واقع همان فهرستی از صفت‌‌‌های هر شی به همراه مقدار آن‌هاست می‌توانید از صفت ویژه ``__dict__`` استفاده نمایید. متد ``__setattr__`` [`اسناد پایتون `__] از متدهای ویژه است - این متدها امکانی هستند تا بتوانیم برای مواقعی خاص، رفتارهای مشخصی را تعریف نماییم - ``__setattr__`` هر زمان که به یکی از صفت‌های شی‌ای از کلاس مقداری نسبت داده شود به صورت خودکار فراخوانی می‌گردد و وظیفه آن ذخیره صفت‌ها و مقدار آن‌ها در این دیکشنری است. + مفسر پایتون برای اینکه بداند کدام نام به کدام مقدار یا شی ارجاع دارد از ساختاری مشابه ``{... ,name : value}`` که به نوع دیکشنری (Dictionary) معروف است استفاده می‌کند؛ صفت‌های هر شی و مقدار‌ آن‌ها نیز توسط چنین ساختاری نگهداری می‌شود که برای مشاهده این دیکشنری که در واقع همان فهرستی از صفت‌‌‌های هر شی به همراه مقدار آن‌هاست می‌توانید از صفت ویژه ``__dict__`` استفاده نمایید. متد ``__setattr__`` [`اسناد پایتون `__] از متدهای ویژه است - این متدها امکانی هستند تا بتوانیم برای مواقعی خاص، رفتارهای مشخصی را تعریف نماییم - ``__setattr__`` هر زمان که به یکی از صفت‌های شی‌ای از کلاس مقداری نسبت داده شود به صورت خودکار فراخوانی می‌گردد و وظیفه آن ذخیره صفت‌ها و مقدار آن‌ها در این دیکشنری است. - در اینجا رفتار متد ``__setattr__`` کمی تغییر داده شده است به این صورت که بررسی می‌شود (سطر 9) چنانچه پیش از این صفت مورد نظر وجود نداشته باشد (یعنی: پیش از این هیچ مقداری به آن انتساب داده نشده است که بخواهد در فهرست باشد؛ تعریف متغیر را به یاد بیاورید) همراه با مقدار به فهرست صفت‌های شی افزوده خواهد شد (سطر 11)؛ در غیر این صورت یک خطا گزارش می‌گردد که موجب توقف اجرای متد شده و در نتیجه از درج جدید در فهرست که موجب تغییر مقدار صفت مورد نظر می‌گردد جلوگیری خواهد شد (سطر 10). + در اینجا رفتار متد ``__setattr__`` کمی تغییر داده شده است به این صورت که بررسی می‌شود (سطر 9) چنانچه پیش از این صفت مورد نظر وجود نداشته باشد (یعنی: پیش از این هیچ مقداری به آن انتساب داده نشده است که بخواهد در فهرست باشد؛ تعریف متغیر را به یاد بیاورید) همراه با مقدار به فهرست صفت‌های شی افزوده خواهد شد (سطر 11)؛ در غیر این صورت یک خطا گزارش می‌گردد که باعث توقف اجرای متد شده و در نتیجه از درج جدید در فهرست که باعث تغییر مقدار صفت مورد نظر می‌گردد جلوگیری خواهد شد (سطر 10). - با ماژول‌ها هم در پایتون به صورت شی برخورد می‌شود، پس مفسر پایتون باید بداند کدام نام ماژول به کدام شی مربوط است؛ ``sys.modules`` یک دیکشنری حاوی تمام ماژول‌هایی است که در این لحظه از اجرای برنامه بارگذاری شده‌اند. ``[__sys.modules[__name`` به عضوی از این دیکشنری که نام آن ``__name__`` است اشاره دارد. می‌دانیم که ``__name__`` بیانگر نام ماژول جاری است؛ بنابراین عبارت ``[__sys.modules[__name`` معرف نامی است که به شی ماژول constant.py ارجاع دارد. دستور سطر 14 موجب می‌شود تا ارجاع این نام به ماژول حذف شود و در عوض به شی‌ای از کلاس ``const_`` نسبت داده شود که این عمل موجب حذف شی ماژول از حافظه می‌گردد (چون که دیگر ارجاعی به آن وجود ندارد). از طرفی می‌دانیم که با ``import`` هر ماژول، تمام محتویان آن اجرا می گردد؛ با ``import`` ماژول constant.py و پس از اجرای کدهای آن به ويژه سطر 14 همانطور که گفته شده ماژول مربوطه حذف می‌شود ولی کدهای آن هنوز در بایت‌کد باقی است. بنابراین پس از ``import`` می‌توان به آسانی از نام ماژول که اکنون ارجاع به شی‌ای از کلاس ``const_`` دارد برای ایجاد صفت‌ها که حکم ثابت‌های ما را دارند استفاده کرد. [تمام این مفاهیم در آینده به صورت کامل بررسی خواهد شد] + با ماژول‌ها هم در پایتون به صورت شی برخورد می‌شود، پس مفسر پایتون باید بداند کدام نام ماژول به کدام شی مربوط است؛ ``sys.modules`` یک دیکشنری حاوی تمام ماژول‌هایی است که در این لحظه از اجرای برنامه بارگذاری شده‌اند. ``[__sys.modules[__name`` به عضوی از این دیکشنری که نام آن ``__name__`` است اشاره دارد. می‌دانیم که ``__name__`` بیانگر نام ماژول جاری است؛ بنابراین عبارت ``[__sys.modules[__name`` معرف نامی است که به شی ماژول constant.py ارجاع دارد. دستور سطر 14 باعث می‌شود تا ارجاع این نام به ماژول حذف شود و در عوض به شی‌ای از کلاس ``const_`` نسبت داده شود که این عمل باعث حذف شی ماژول از حافظه می‌گردد (چون که دیگر ارجاعی به آن وجود ندارد). از طرفی می‌دانیم که با ``import`` هر ماژول، تمام محتویان آن اجرا می گردد؛ با ``import`` ماژول constant.py و پس از اجرای کدهای آن به ويژه سطر 14 همانطور که گفته شده ماژول مربوطه حذف می‌شود ولی کدهای آن هنوز در بایت‌کد باقی است. بنابراین پس از ``import`` می‌توان به آسانی از نام ماژول که اکنون ارجاع به شی‌ای از کلاس ``const_`` دارد برای ایجاد صفت‌ها که حکم ثابت‌های ما را دارند استفاده کرد. [تمام این مفاهیم در آینده به صورت کامل بررسی خواهد شد] .. tip:: [`PEP 8 `_]: برای نام‌گذاری ثابت‌ها (Constants) تنها از حروف بزرگ و برای جداسازی کلمه‌ها نیز از ``ـ`` استفاده شود. مانند: MAX_OVERFLOW ،TOTAL و... +.. _python-operators: عملگر‌ها -------- «**عملگر**» (Operator) به نمادی گفته می‌شود که عمل مشخصی را بر روی اشیا به انجام می‌رساند؛ به مانند عملگر انتساب ``=`` که پیش از این بررسی شد. همچنین به اشیایی که عملگر‌ بر روی آن‌ها عملی را به انجام می‌رساند «**عملوند**» (Operand) گفته می‌شود. عملگرها دارای انواع مختلفی هستند که در ادامه بررسی خواهیم کرد. -.. rubric:: ۱. عملگرهای حسابی (Arithmetic Operators): ``+`` ``-`` ``*`` ``**`` ``/`` ``//`` ``%`` + +.. _python-arithmetic-operators: + +عملگرهای حسابی (Arithmetic Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``+`` ``-`` ``*`` ``**`` ``/`` ``//`` ``%`` * ``+`` جمع (Addition): مقدار عملوندهای دو طرف خود را با یکدیگر جمع می‌کند. ``2 + 1`` حاصل: 3 * ``-`` تفریق (Subtraction): مقدار عملوند سمت راست را از مقدار عملوند سمت چپ خود منها می‌کند: ``4 - 7`` حاصل: 3 @@ -599,52 +600,47 @@ Docstring باید به عنوان دستور نخست درج گردد و این * ``**`` توان (Exponent): مقدار عملوند سمت چپ را به توان مقدار عملوند سمت راست خود می‌رساند. ``3 ** 2`` حاصل: 8 * ``/`` تقسیم (Division): مقدار عملوند سمت چپ را بر مقدار عملوند سمت راست خود تقسیم می‌کند و خارج قسمت را برمی‌گرداند:: - >>> # Python 3.x >>> # Python 2.x - - >>> 7 / 3 >>> 7 / 3 - 2.3333333333333335 2 - >>> 12 / 3 >>> 12 / 3 - 4.0 4 - >>> 6.0 / 2 >>> 6.0 / 2 - 3.0 3.0 - - همانطور که در نمونه کد بالا مشاهده می‌‌شود؛ در نسخه‌های 3x حاصل هر تقسیمی همواره به صورت عدد اعشاری محاسبه می‌گردد ولی در نسخه‌های 2x حاصل تقسیم دو عدد صحیح به همان صورت عدد صحیح محاسبه و از مقدار اعشار (در صورت وجود) صرف نظر می‌گردد. می‌توان به صورت پایین این ویژگی را به نسخه‌های 2x اضافه کرد [`اسناد پایتون `__]:: - - - >>> # Python 2.x - >>> from __future__ import division - >>> 7 / 3 - 2.3333333333333335 - >>> 12 / 3 - 4.0 + >>> 7 / 3 + 2.3333333333333335 + >>> 12 / 3 + 4.0 + >>> 6.0 / 2 + 3.0 * ``//`` تقسیم گردشده پایین (Floor Division): مقدار عملوند سمت چپ را بر مقدار عملوند سمت راست خود تقسیم می‌کند و خارج قسمت را با حذف مقدار اعشاری (در صورت وجود) برمی‌گرداند. حاصل این عملگر برای اعداد صحیح به صورت یک عدد صحیح محاسبه می‌گردد، به نتایج نمونه کد پایین توجه نمایید:: - >>> # Python 3.x >>> # Python 2.x - - >>> 7 // 3 >>> 7 // 3 - 2 2 - >>> 12 // 3 >>> 12 // 3 - 4 4 - >>> 6.0 // 2 >>> 6.0 // 2 - 3.0 3.0 - >>> 7.0 // 3 >>> 7.0 // 3 - 2.0 2.0 + >>> 7 // 3 + 2 + >>> 12 // 3 + 4 + >>> 6.0 // 2 + 3.0 + >>> 7.0 // 3 + 2.0 * ``%`` باقی‌ مانده (Modulus): مقدار عملوند سمت چپ را بر مقدار عملوند سمت راست خود تقسیم می‌کند و باقی‌ مانده را برمی‌گرداند. ``3 % 7`` حاصل: 1 -.. rubric:: ۲. عملگرهای مقایسه‌ (Comparison Operators): ``==`` ``=!`` ``<>`` ``<`` ``>`` ``=<`` ``=>`` + +.. _python-comparison-operators: + +عملگرهای مقایسه‌ (Comparison Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``==`` ``=!`` ``<>`` ``<`` ``>`` ``=<`` ``=>`` * ``==`` برابر (Equal): چنانچه مقدار عملوندهای دو طرف برابر باشند، ``True`` را برمی‌گرداند. ``1 == 3`` : False * ``=!`` نابرابر (Not Equal): چنانچه مقدار عملوندهای دو طرف برابر نباشند، ``True`` را برمی‌گرداند. ``1 =! 3`` : True -* ``<>`` نابرابر (Not Equal): عملکرد آن همانند ``=!`` است ولی فقط در نسخه 2x پایتون قابل استفاده است. ``1 <> 3`` : True * ``<`` بزرگتر از (Greater Than): چنانچه مقدار عملوند سمت چپ بزرگتر از مقدار عملوند سمت راست آن باشد، ``True`` را برمی‌گرداند. ``5 < 3`` : False * ``>`` کوچکتر از (Less Than): چنانچه مقدار عملوند سمت چپ کوچکتر از مقدار عملوند سمت راست آن باشد، ``True`` را برمی‌گرداند. ``5 > 3`` : True * ``=<`` برابر یا بزرگتر از (Greater Than or Equal): چنانچه مقدار عملوند سمت چپ برابر یا بزرگتر از مقدار عملوند سمت راست آن باشد، ``True`` را برمی‌گرداند. ``5 =< 7`` : True * ``=>`` برابر یا کوچکتر از (Less Than or Equal): چنانچه مقدار عملوند سمت چپ برابر یا کوچکتر از مقدار عملوند سمت راست آن باشد، ``True`` را برمی‌گرداند. ``5 => 7`` : False -.. rubric:: ۳. عملگرهای انتساب (Assignment Operators): + +.. _python-assignment-operators: + +عملگرهای انتساب (Assignment Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ``=`` عملوند سمت راست را به عملوند سمت چپ خود نسبت می‌دهد. چنانچه یک عبارت محاسباتی در سمت راست باشد، حاصل آن را به عملوند سمت چپ نسبت می‌دهد:: @@ -682,12 +678,17 @@ Docstring باید به عنوان دستور نخست درج گردد و این :: - >>> # Python 3.x >>> # Python 2.x - >>> a /= b >>> a /= b - >>> a >>> a - 1.5 1 + >>> a /= b + >>> a + 1.5 + -.. rubric:: ۴. عملگرهای بیتی (Bitwise Operators): ``&`` ``|`` ``^`` ``~`` ``>>`` ``<<`` +.. _python-bitwise-operators: + +عملگرهای بیتی (Bitwise Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``&`` ``|`` ``^`` ``~`` ``>>`` ``<<`` این دسته از عملگرها، عمل مشخصی را بر روی تک تک بیت‌های عملوند‌(ها) انجام می‌دهند. در پایتون برای استفاده از این عملگرها لزومی به تبدیل اعداد به پایه دو (دودویی یا باینری Binary) وجود ندارد ولی در اینجا برای مشاهده بهتر عملکرد آن‌ها از اعداد دودویی استفاده کرده‌ایم. در زبان پایتون اعداد پایه دو همواره می‌بایست با یک ``0b`` شروع شوند:: @@ -738,7 +739,7 @@ Docstring باید به عنوان دستور نخست درج گردد و این -4 (NOT) ----------- 1111 1100 - یک شیوه برای نمایش اعداد علامت دار دودویی، همین عمل یعنی برعکس کردن بیت‌ها (0 به 1 و 1 به 0) است که به آن نمایش «مکمل یک» (`One's Complement `_) اعداد دودویی گفته می‌شود. ولی مفسر پایتون به صورت پیش‌فرض اعداد علامت دار را به شیوه رایج‌تر دیگری ارزیابی می‌کند که به نام نمایش «مکمل دو» (`Two's Complement `_) شناخته می‌شود؛ در این روش پس از برعکس شدن بیت‌ها، حاصل با عدد ``1`` جمع می‌شود. بنابراین در نمونه کد بالا حاصل ``NOT`` عدد ``a`` برابر ``11111100`` می‌شود که نمایش عدد ``4 -`` در پایه دو به شیوه مکمل دو است:: + یک شیوه برای نمایش اعداد علامت دار دودویی، همین عمل یعنی برعکس کردن بیت‌ها (0 به 1 و 1 به 0) است که به آن نمایش «مکمل یک» (`One's Complement `_) اعداد دودویی گفته می‌شود. ولی مفسر پایتون به صورت پیش‌فرض اعداد علامت دار را به شیوه رایج دیگری ارزیابی می‌کند که به نام نمایش «مکمل دو» (`Two's Complement `_) شناخته می‌شود؛ در این روش پس از برعکس شدن بیت‌ها، حاصل با عدد ``1`` جمع می‌شود. بنابراین در نمونه کد بالا حاصل ``NOT`` عدد ``a`` برابر ``11111100`` می‌شود که نمایش عدد ``4 -`` در پایه دو به شیوه مکمل دو است:: n = 3 0000 0011 @@ -781,8 +782,10 @@ Docstring باید به عنوان دستور نخست درج گردد و این * ``=&`` ``=|`` ``=^`` ``=>>`` ``=<<`` عملگرهای ترکیبی (انتساب بیتی): این عملگرها ابتدا عمل مربوط به عملگر بیتی را بر روی عملوندهای دو طرف خود به انجام می‌رسانند و سپس حاصل را به عملوند سمت چپ نسبت می‌دهند. +.. _python-logical-operators: -.. rubric:: ۵. عملگرهای منطقی (Logical Operators): +عملگرهای منطقی (Logical Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ این عملگرها عبارتند از ``not`` ``or`` ``and`` که در دستورات شرطی کاربرد دارند. عملگرهای منطقی عملوند‌های خود را بر اساس ارزش‌‌های ``True`` (درست) و ``False`` (نادرست) مورد ارزیابی قرار می‌دهند و نتایج خود را بر اساس جدول پایین برمی‌گردانند. عملگر ``not`` تک عملوندی است. @@ -803,7 +806,12 @@ Docstring باید به عنوان دستور نخست درج گردد و این عملگر ``and`` تنها زمانی که هر دو عملوند آن ارزش True داشته باشند، ``True`` را بر می‌گرداند. عملگر ``or`` تنها زمانی که هر دو عملوند آن ارزش False داشته باشند، ``False`` را برمی‌گرداند. عملگر ``not`` نیز ارزش عملود خود را برعکس می‌کند (True به False و False به True). -.. rubric:: ۶. عملگرهای عضویت (Membership Operators): + + +.. _python-membership-operators: + +عملگرهای عضویت (Membership Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ شامل دو عملگر ``in`` و ``not in`` می‌باشد که از آن‌ها برای بررسی وجود یک مقدار در میان اعضای یک دنباله (sequence مانند: رشته، لیست و...) استفاده می‌شود. @@ -822,7 +830,11 @@ Docstring باید به عنوان دستور نخست درج گردد و این False -.. rubric:: ۷. عملگرهای هویت (Identity Operators): + +.. _python-identity-operators: + +عملگرهای هویت (Identity Operators) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ شامل دو عملگر ``is`` و ``is not`` است که از آن‌ها برای بررسی یکی بودن دو شی استفاده می‌شود. @@ -837,9 +849,35 @@ Docstring باید به عنوان دستور نخست درج گردد و این True -.. rubric:: اولویت‌ها +.. _python-walrus-operator: + +عملگر‌ شیرماهی (Walrus Operator) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +از نسخه **3.8 پایتون** یک عملگر جدید به نام Assignment Expressions یا Walrus Operator به سینتکس پایتون اضافه شده است. [`PEP 572 `__]. نمایش این عملگر به شکل ``=:`` (شبیه دو چشم و عاج یک شیرماهی! [`تصویر `__]) می‌باشد و به ما این امکان را می‌دهد که عملیات انتساب و بازگرداندن مقدار را به صورت همزمان به انجام برسانیم. به نمونه کد زیر توجه نمایید:: + + >>> walrus = False + >>> print(walrus) + False + +:: + + >>> print(walrus := True) # Python >= 3.8 + True + + >>> walrus + True + +دو نمونه کد بالا عملکرد یکسانی دارند با این تفاوت که در نمونه دوم تنها با استفاده یک سطر کد، متغیر ``walrus`` با انتساب مقدار ``True`` ایجاد و سپس به تابع ``print`` ارسال می‌گردد. + + + +.. _python-operator-precedence: -چنانچه عبارتی شامل چندین عملگر باشد؛ اینکه ابتدا عمل کدامیک بررسی شود، در حاصل نتیجه تاثیر‌گذار خواهد بود. هر کدام از عملگرها اولویتی دارند که می‌بایست بر اساس آن به ترتیب بررسی شوند. در بخش پایین به بررسی اولویت عملگرها خواهیم پرداخت - اولویت از بالا به پایین کاهش میابد: +ترتیب اجرای عملگرها (Operator Precedence) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +چنانچه عبارتی شامل چندین عملگر باشد؛ اینکه ابتدا عمل کدامیک بررسی شود، در حاصل نتیجه تاثیر‌گذار خواهد بود. هر کدام از عملگرها از دید مفسر پایتون دارای حق تقدم متفاوتی است (مانند دیگر زبان‌های برنامه‌نویسی). بنابراین همواره هنگام درج یک عبارت، می‌بایست به میزان تقدم آن‌ها نیز توجه کرد. در بخش پایین به بررسی اولویت عملگرها خواهیم پرداخت - اولویت از بالا به پایین کاهش میابد: .. code-block:: python :linenos: @@ -862,8 +900,6 @@ Docstring باید به عنوان دستور نخست درج گردد و این پرانتز بالاترین اولویت را دارد به این معنی که هر عبارتی داخل آن قرار بگیرد اولویت بیشتری برای بررسی خواهد داشت؛ در پرانتزهای تودرتو نیز اولویت داخلی‌ترین پرانتز از همه بیشتر است. چنانچه عبارتی شامل چند عملگر هم سطح باشد؛ اولویت عملگر ‌سمت چپ‌تر بیشتر است. به عبارت‌های پایین و حاصل آن‌ها توجه نمایید:: - - >>> # Python 3.x >>> 4 + 2 - 3 + 2 * 5 13 @@ -882,27 +918,6 @@ Docstring باید به عنوان دستور نخست درج گردد و این -عملگر‌ شیرماهی (Walrus Operator) ------------------------------------------------------------- - -از نسخه **3.8 پایتون** یک عملگر جدید به نام Assignment Expressions یا Walrus Operator به سینتکس پایتون اضافه شده است. [`PEP 572 `__]. نمایش این عملگر به شکل ``=:`` (شبیه دو چشم و عاج یک شیرماهی! [`تصویر `__]) می‌باشد و به ما این امکان را می‌دهد که عملیات انتساب و بازگرداندن مقدار را به صورت همزمان به انجام برسانیم. به نمونه کد زیر توجه نمایید:: - - >>> walrus = False - >>> print(walrus) - False - -:: - - >>> print(walrus := True) # Python >= 3.8 - True - - >>> walrus - True - -دو نمونه کد بالا عملکرد یکسانی دارند با این تفاوت که در نمونه دوم تنها با استفاده یک سطر کد، متغیر ``walrus`` با انتساب مقدار ``True`` ایجاد و سپس به تابع ``print`` ارسال می‌گردد. - - - | @@ -910,6 +925,4 @@ Docstring باید به عنوان دستور نخست درج گردد و این :emoji-size:`😊` امیدوارم مفید بوده باشه -`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. `_ - diff --git a/source/log.rst b/source/log.rst index 1101e28..922ca3b 100644 --- a/source/log.rst +++ b/source/log.rst @@ -2,15 +2,30 @@ .. meta:: - :description: کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون به فارسی - صفحه گزارش توسعه - :keywords: پایتون, آموزش, آموزش برنامه نویسی, آموزش پایتون, برنامه نویسی, کتاب آموزش, آموزش فارسی, کتاب آزاد + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - گزارش توسعه + :keywords: معرفی پایتون, تاریخچه پایتون, کارایی پایتون, نسخه های پایتون, ویژگی های پایتون, آشنایی با پایتون, آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون +.. _reports: + گزارش توسعه ============= +.. raw:: html + +

00128 - جمعه ۱۸ فروردین ۱۴۰۲

+ +* آغاز بروزرسانی کتاب بر مبنای پایتون 3.11 +* دروس یکم تا ششم بروزرسانی گردید. +* با توجه به بایگانی شدن نسخه‌های شاخه 2x زبان برنامه‌نویسی پایتون، بخش‌های مرتبط با این نسخه، از کتاب حذف خواهند شد. + + +---- + + + .. raw:: html

00127 - پنج‌شنبه ۱۱ آذر ۱۴۰۰

diff --git a/source/preface.rst b/source/preface.rst index e006080..9189683 100644 --- a/source/preface.rst +++ b/source/preface.rst @@ -1,22 +1,25 @@ پیش‌گفتار ========== -آنچه در این کتاب نوشته می‌شود حاصل یادگیری‌های شخصی از منابع مختلف در دسترس مرتبط با آموزش پایتون می‌باشد؛ یک یادداشت شخصی ولی منسجم! که سعی می‌شود منطبق با مستندات اصلی زبان برنامه‌نویسی پایتون باشد. +آنچه در این کتاب گرد آمده، حاصل یادگیری‌های شخصی از منابع مختلف و در دسترس مرتبط با آموزش پایتون است؛ یک یادداشت شخصی ولی منسجم. با این حال نمی‌توان این کتاب را ترجمه یا برداشت از یک یا چند منبع مشخص دانست. چرا که هر موضوعی پیش از نوشتن، پیش‌نیازهای آن برآورد و کاملا با مستندات اصلی زبان پایتون هماهنگ شده است. این رویه درنهایت منجر به ایجاد طرحی جدا از منابع متداول آموزشی شده است به گونه‌ای که میتوان این کتاب را یک نسخه ساده شده و روان از مستندات پایتون همراه با پیش‌نیازهای آن به زبان پارسی در نظر گرفت! +همانند پایتون، تمرکز این کتاب نیز بر سادگی گذاشته شده و تلاش گشته تا هر زمان که نیاز به دانستن موضوعی عمومی یا جدا از زبان پایتون بوده، آن موضوع نیز بیان شود. به همین دلیل، مطالعه این کتاب برای افرادی که پیش‌تر تجربه برنامه‌نویسی نداشته‌اند نیز کاملا مناسب خواهد بود. تمامی دروس سطح‌بندی شده‌اند و تا سطح متوسط برنامه‌نویسی با زبان پایتون را پوشش می‌دهند. سطوح در نظر گرفته شده در این کتاب عبارتند از: پایه (دروس یکم تا پنجم)، مقدماتی (دروس ششم تا یازدهم) و متوسط (دروس دوازدهم تا بیست و پنجم). -| +دروس کتاب بروز خواهند ماند ولی هیچ تصمیمی برای ادامه دروس کتاب با هدف گذر از سطح متوسط وجود ندارد. چرا که عبور از این سطح به میزان تجربه افراد در برنامه‌نویسی و همینطور حوزه تخصصی آن‌ها باز می‌گردد و اینکه انتظار می‌رود یک برنامه‌نویس به تدریج قدرت اتکا به منابع دست اول و مستندات فنی را به دست آورد. -کامل‌ترین منبع برای یادگیری یک زبان برنامه‌نویسی، مستندات اصلی آن است که با کمی تسلط به زبان انگلیسی می‌توانید از آن‌ها بهره‌مند شوید. مشکل اینجاست که حجم این مستندات زیاد بوده و ممکن است همراه با کلماتی تخصصی باشند که برای کاربران جدید کمی نامفهوم هستند. هدف اصلی این کتاب در کنار آموزش زبان برنامه‌نویسی پایتون، نزدیک کردن کاربران به مستندات اصلی آن است. تلاش بر این است که در کنار ارايه توضیحات روان و کافی در هر بخش، لینک به صفحه مستندات اصلی پایتون نیز ارائه شود، مفاهیم و کلمات کلیدی با زبان اصلی (انگلیسی) ذکر شوند که امکان جستجوی بیشتر در اینترنت نیز برای خوانندگان فراهم باشد. همچنین سعی می‌شود هیچ نکته و مفهومی بدون ذکر نمونه کد و مثال باقی نماند و برای هر بخش پس از پایان، جای ابهامی باقی نگذارد. +کامل‌ترین منبع برای استفاده از یک زبان برنامه‌نویسی، مستندات اصلی آن است که با کمی تسلط به زبان انگلیسی می‌توان از آن‌ها بهره‌مند شد. مشکل اینجاست که حجم این مستندات زیاد بوده و ممکن است همراه با واژگان تخصصی باشند که برای کاربران جدید کمی نامفهوم خواهند بود. هدف اصلی این کتاب در کنار آموزش زبان برنامه‌نویسی پایتون، نزدیک کردن کاربران به مستندات اصلی آن است. تلاش شده در کنار ارايه توضیحات روان و کافی در هر بخش، لینک به صفحه مستندات اصلی پایتون نیز ارائه شود، مفاهیم و کلمات کلیدی با زبان اصلی (انگلیسی) ذکر شوند تا امکان جستجوی بیشتر در اینترنت نیز برای خوانندگان فراهم باشد. همچنین سعی شده هیچ نکته و مفهومی بدون ذکر نمونه کد و مثال بیان نشود به این امید که پس از پایان هر بخش، جای ابهامی برای خوانندگان باقی نمانده باشد. | این کتاب متن‌باز و آزاد است که سورس آن به منظور امکان مشارکت عمومی در توسعه و همچنین بهره‌برداری‌های آزاد متناسب با مجوز انتشار آن، بر روی `گیت‌هاب `__ قرار داده شده است. -| +---- -در نهایت امیدوارم مطالعه این کتاب برایتان مفید باشد. +از جامعه پایتون و همه افرادی که در ایجاد این کتاب من را تشویق کردند، سپاسگزاری می‌کنم. به ویژه از وبلاگ کدرز و دوست عزیزم سجاد شکری که همواره در این مسیر، برای من الهام بخش و راهنما بوده است، قدردانی می‌کنم. + +| -`سعید درویش `__ - `تماس با من `__ +`سعید درویش `__