├── .gitignore ├── README.md ├── SUMMARY.md ├── about.md ├── about_python.md ├── basics.md ├── control_flow.md ├── data_structures.md ├── dedication.md ├── feedback.md ├── first_steps.md ├── floss.md ├── functions.md ├── img ├── pycharm_command_line_arguments.png ├── pycharm_create_new_project.png ├── pycharm_create_new_project_pure_python.png ├── pycharm_hello_open.png ├── pycharm_new_file_input.png ├── pycharm_new_python_file.png ├── pycharm_open.png ├── pycharm_output.png ├── pycharm_run.png └── terminal_screenshot.png ├── installation.md ├── modules.md ├── op_exp.md ├── preface.md ├── problem_solving.md ├── programs ├── abc.txt ├── backup_ver1.py ├── backup_ver1.txt ├── backup_ver2.py ├── backup_ver2.txt ├── backup_ver3.py ├── backup_ver3.txt ├── backup_ver4.py ├── backup_ver4.txt ├── break.py ├── break.txt ├── continue.py ├── continue.txt ├── ds_reference.py ├── ds_reference.txt ├── ds_seq.py ├── ds_seq.txt ├── ds_str_methods.py ├── ds_str_methods.txt ├── ds_using_dict.py ├── ds_using_dict.txt ├── ds_using_list.py ├── ds_using_list.txt ├── ds_using_tuple.py ├── ds_using_tuple.txt ├── exceptions_finally.py ├── exceptions_finally.txt ├── exceptions_handle.py ├── exceptions_handle.txt ├── exceptions_raise.py ├── exceptions_raise.txt ├── exceptions_using_with.py ├── for.py ├── for.txt ├── function1.py ├── function1.txt ├── function_default.py ├── function_default.txt ├── function_docstring.py ├── function_docstring.txt ├── function_global.py ├── function_global.txt ├── function_keyword.py ├── function_keyword.txt ├── function_local.py ├── function_local.txt ├── function_param.py ├── function_param.txt ├── function_return.py ├── function_return.txt ├── function_varargs.py ├── function_varargs.txt ├── if.py ├── if.txt ├── io_input.py ├── io_input.txt ├── io_pickle.py ├── io_pickle.txt ├── io_unicode.py ├── io_using_file.py ├── io_using_file.txt ├── module_using_name.py ├── module_using_name.txt ├── module_using_sys.py ├── module_using_sys.txt ├── more_decorator.py ├── more_decorator.txt ├── more_lambda.py ├── more_lambda.txt ├── more_list_comprehension.py ├── more_list_comprehension.txt ├── mymodule.py ├── mymodule_demo.py ├── mymodule_demo.txt ├── mymodule_demo2.py ├── oop_init.py ├── oop_init.txt ├── oop_method.py ├── oop_method.txt ├── oop_objvar.py ├── oop_objvar.txt ├── oop_simplestclass.py ├── oop_simplestclass.txt ├── oop_subclass.py ├── oop_subclass.txt ├── poem.txt ├── shoplist.data ├── stdlib_logging.py ├── stdlib_logging.txt ├── while.py └── while.txt ├── revision_history.md ├── translation_howto.md └── translations.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | # یک بایت از پایتون 6 | 7 |
8 | 9 | ## A Byte of Python 10 | 11 |
12 | 13 | توجه داشته باشید : *مترجم* 14 | 15 | در مقابلتان یک کتاب محبوب ترجمه شده است. 16 | 17 | نویسنده کتاب: **Swaroop Chitlur** 18 | 19 | مترجم: **الیاس روحانی** 20 | 21 | 22 | ایمیل : rohanielyasea8702@gmail.com 23 | 24 | کتاب اصلی: [ یک بایت از پایتون ](https://python.swaroopch.com/) 25 | 26 | "یک بایت از پایتون " _ این یک کتاب رایگان برنامه نویسی پایتون است.این کتاب می‌تواند به عنوان یک راهنما و یا اموزش پایتون برای مخاطبان مبتدی باشد. 27 | 28 | اگر دانش شما درباره‌ای کامپیوتر محدود است. چگونگی ذخیره سازی فایل‌های متنی، این کتاب برای شما مناسب است. 29 | 30 | کتاب اصلی پایتون ۳ را توصیف می‌کند. با وجود اینکه پایتون ۲ هنوز محبوب‌تر است. 31 | 32 | ## چه کسانی خوب است که این کتاب را بخوانند؟ 33 | 34 | نظرات افراد در مورد این کتاب: 35 | 36 | بهترین چیزی که من توانستم در کتاب _**“ یک بایت از پایتون ”**_ پیدا کنم. یک کتاب بسیار عالی برای مبتدیان است. 37 | 38 | این کتاب خیلی خوب نوشته شده است. مفاهیم اصلی همراه با مثال های ساده توضیح داده شده است. 39 | 40 | > Syed Talal (نوزده (۱۹) ساله) 41 | 42 | "خیلی ممنون بخاطر زحمت‌های شما، این بهترین کتاب اموزشی که برای مبتدیان دیده‌ام". 43 | 44 | > wmich50-at-theramp-dot-net) Walt Michalik) 45 | 46 | "شما بهترین کتاب، درباره‌ای پایتون را نوشته‌اید، از ان‌هایی که من در اینترنت دیده‌ام.کار بسیار بزرگی است. باتشکر از شما". 47 | 48 | > (Joshua Robin (joshrob-at-poczta-dot-onet-dot-pl 49 | 50 | "دوره‌ای مقدماتی عالی برای برنامه نویسی پایتون برای مبتدیات" 51 | 52 | > Shan Rajasekaran 53 | 54 | 55 | "سلام! من از جمهوری دومینیکن هستم. اسم من paul است.من به تازگی کتاب شما **“ یک بایت از پایتون ”** را خوندم و فوق‌العاده است :) . من خیلی چیزهای زیادی از مثال های شما یاد گرفتم . کتاب شما برای مبتدیان خیلی عالی است...." 56 | 57 | 58 | > (Pavel Simo (pavel-dot-simo-at-gmail-dot-com 59 | 60 | "من به تازگی کتاب **“ یک بایت از پایتون ”** را تمام کردم. با خودم فکر کرم باید از شما تشکر کنم در هر صورت خیلی ممنون " 61 | 62 | > (Samuel Young (sy-one-three-seven-at-gmail-dot-com 63 | 64 | "جناب اقای **Swaroop** من در حال گذراندن دوره اموزشی هستم که استادمان بدون هیچ علاقه‌ای به ما اموزش می هد و معلم است. مااز کتاب Learning Python ویرایش دوم O’Reilly استفاده می کنیم.ولی این کتاب اصلا برای مبتدیان نیست و استادی که هیچ اطلاعاتی درباره‌ای برنامه نویسی ندارد به ما درس می دهد. از کتاب خوبتون تشکر می‌کنم بدون این کتاب من هیچ درکی از پایتون نداشتم.تشکرفراوان! شما خیلی عالی مفاهیم را جدا کرده‌اید تا ان که برای مبتدیان قابل فهم باشد، و هرکسی نمی تواند همچین کاری را انجام دهد." 65 | 66 | > (Joseph Duarte (jduarte1-at-cfl-dot-rr-dot-com 67 | 68 | "من در مورد کتاب شما من بسیار هیجان زده‌ام! این بهترین کتاب برای یاگیری پایتون و همچنین برای مرجع است. بسیار عالی ! یک شاهکار واقعی ! همین طوری ادامه بدهید!." 69 | 70 | > Chris-André Sommerseth 71 | 72 | برای شما می نویسم، برای نوشتن کتاب و انتشار **“ یک بایت از پایتون ”** برای سپاس گذاری و تشکر از ان . از چند ماه قبل من در تلاش برای یادگیری پایتون بودم, قبل اینکه تصادفی به کتاب شما برخوردکنم. واگرچه من با pyGame به موفقیت‌های رسیدم, من هیچ وقت نمی‌توانستم برنامه را به اتمام برسانم. 73 | 74 | به دلیل ساده‌سازی مفاهیم پایتون دیگر حس می‌کنم به هدفم خواهم رسید. ودر نهایت من اصول پایه‌ای را درک کردم و می توانم به هدف واقعی یعنی توسعه بازی سازی ادامه دهم. 75 | 76 | ........ 77 | 78 | 79 | **با تشکر فروان** برای اصول برنامه نویسی در اینترنت و همچمین قراردادن ساختارها و راهنماهای مفید در این کتاب. 80 | 81 | 82 | > و حتی ناسا (NASA) 83 | 84 | 85 | این کتاب حتی در НАСА استفاده می شود. ان را در ازمایشگاه برای ویرایش حرکات جت در چارچوب پروژه "تلسکوپ فضایی " استفاده می شود. 86 | 87 | > الیاس روحانی 88 | 89 | **همچنین خودم نیز تشکر می کنم.** 90 | 91 | سلام منم مترجم! 92 | 93 | من حدودا تمامی نظرات افراد خارجی را ترجمه کرده‌ام. حال به نظر من اگر نظرات افراد ایرانی هم اضافه شود خیلی بهتر خواهد شد. 94 | 95 | دوستانی که دوست دارند، نظرات خود را زیر بنویسید. من هم نظرات داده شده را اضافه خواهم کرد. 96 | 97 | باتشکر از خواننده‌ها. 98 | 99 | 100 | 101 | # دوره های دانشگاهی 102 | 103 | این کتاب به عنوان یک کتاب درسی در موسسات اموزشی عالی زیر تدریس می شود: 104 | 105 | - اصول زبان های برنامه نویسی همچنین در [Vrije دانشگاه آمستردام](http://www.few.vu.nl/~nsilvis/PPL/2007/index.html) 106 | - مفاهیم اساسی محاسبات همچنین در [دانشگاه کالیفرنیا، دیویس](http://www.cs.ucdavis.edu/courses/exp_course_desc/10.html) 107 | 108 | - برنامه نویسی با پایتون همچنین در [دانشگاه هاروارد ](http://www.people.fas.harvard.edu/~preshman/python_winter.html) 109 | 110 | - معرفی برنامه‌نویسی همچنین در [دانشگاه لیدز](http://www.comp.leeds.ac.uk/acom1900/) 111 | 112 | - معرفی برنامه‌نویسی و نرم افزارهای برنامه نویسی همچنین در [دانشگاه بوستون](http://www.cs.bu.edu/courses/cs108/materials.html) 113 | 114 | - فن آوری اطلاعات مهارت های هواشناسی همچنین در [دانشگاه اکلاهما ](http://gentry.metr.ou.edu/byteofpython/) 115 | 116 | - 'Geoprocessing' همچنین در [دانشگاه ایالتی میشیگان](http://www.msu.edu/~ashton/classes/825/index.html) 117 | 118 | - اشنای با علوم کامپیوتر و برنامه نویسی همچنین در [درس‌افزار باز ام‌آی‌تی](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00sc-introduction-to-computer-science-and-programming-spring-2011/references/) 119 | 120 | 121 | 122 | 123 | 124 | 125 | # مجوز 126 | 127 | این کتاب تحت مجوز کرییتیو کامنز توزیع شده است. 128 | 129 |
130 | 131 | [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/) 132 | 133 |
134 | 135 | 136 | این بداین معنی است که: 137 | 138 | - حق کپی و تکثیر و انتقال به دیگران دارید. 139 | - حق استفاده قطعاتی از این کتاب در متون خود دارید. 140 | - همچنین برای مقاصد تجاری نیز می توانید استفاده کنید. 141 | 142 | # توجه: 143 | 144 | 145 | 146 | - زمان انتشار یا فروش الکترونیکی یا نسخه‌ی چاپی در توضیحات لازم است که عبارت (این نسخه از طرف خود نویسنده اصلی نیست) به صراحت گفته شود. 147 | 148 | 149 | - در مقدمه یا در صفحه‌ی اصلی باید نام نوسینده اصلی به همراه لینک کتاب اصلی [www.swaroopch.com/notes/Python](http://www.swaroopch.com/notes/Python) 150 | اشاره شده باشد. که می توان نسخه‌ی اصلی کتاب را در این مکان پیدا کرد. 151 | 152 | - تمامی سناریوها و قطعات ارئه شده در کتاب تحت پروانهٔ بی‌اس‌دی است. مگر انکه به صراحت گفته شود. 153 | 154 | # نسخه‌ی فارسی 155 | 156 | 157 | 158 |
159 | 160 | - [نسخه‌ی گیت‌هاب](https://github.com/elias8702/Byte-Of-Python-Persian) 161 | 162 | - [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | ## کمک به توسعه کتاب 171 | 172 | درصورت مشاهده هرگونه غلط املایی یا نامفهوم بودن جمله‌ها خوش‌حال می‌شوم برای توسعه کتاب به ما کمک کنید. 173 | 174 | حتی کوچکترین کمک هم ارزشمند است. 175 | 176 | 177 | ## نظرات و پیشنهادات 178 | 179 | اگر هرگونه نظر و پیشنهاد دارید به [انجمن اوبونتو](https://www.gitbook.com/read/book/elyas/a-byte-of-python-parsi) سر بزنید. 180 | 181 | همچنین اگر دوست دارید می‌توانید نظات خود را در بخش **نظرات افراد در مورد این کتاب** بنویسد. 182 | 183 | 184 | ## نسخه‌ی زبان اصلی 185 | 186 | 187 | - [پی‌دی‌اف (برای خواندن راحتر, غیره.)](https://www.gitbook.com/download/pdf/book/swaroopch/byte-of-python) 188 | - [ای‌پاب (برای آیفون و آی‌پد , غیره.)](https://www.gitbook.com/download/epub/book/swaroopch/byte-of-python) 189 | 190 | - [موبای (Mobi) (برای Kindle)](https://www.gitbook.com/download/mobi/book/swaroopch/byte-of-python) 191 | 192 | 193 | 194 | 195 | به زبان مادری خود این کتاب را بخوانید. 196 | 197 | اگر مایلید این کتاب را بخوانید و یا کمک به ترجمه‌اش کنید، یا به زبان دیگری ترجمه کنید. لطفا روی این لینک [مترجمین ](./translations.md#translations) کلیک کنید. 198 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | (Due to technical issues, the search service is temporarily unavailable.) 2 | 3 | # فهرست مطالب 4 | 5 | * [تقدیم](dedication.md) 6 | * [پیشگفتار](preface.md) 7 | * [درباره پایتون](about_python.md) 8 | * [نصب](installation.md) 9 | * [اولین گام‌ها](first_steps.md) 10 | * [مبانی](basics.md) 11 | * [عملگرها و عبارات](op_exp.md) 12 | * [جریان کنترل](control_flow.md) 13 | * [توابع](functions.md) 14 | * [ماژول‌ها](modules.md) 15 | * [ساختارهای داده](data_structures.md) 16 | * [حل مسئله](problem_solving.md) 17 | * [برنامه‌نویسی شیءگرا](oop.md) 18 | * [ورودی و خروجی](io.md) 19 | * [استثناها](exceptions.md) 20 | * [کتابخانه استاندارد](stdlib.md) 21 | * [بیشتر](more.md) 22 | * [قدم بعدی](what_next.md) 23 | * [پیوست: نرم‌افزارهای آزاد/متن‌باز](floss.md) 24 | * [پیوست: درباره](about.md) 25 | * [پیوست: تاریخچه ویرایش‌ها](revision_history.md) 26 | * [پیوست: ترجمه‌ها](translations.md) 27 | * [پیوست: روش ترجمه](translation_howto.md) 28 | * [بازخورد](feedback.md) 29 | -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | Colophon {#colophon} 2 | 3 |
4 | 5 | # پیوست: سرگذشت 6 | 7 | می‌توان گفت تمامی برنامه‌های که استفاده می‌کنم برای ساخت این کتاب در[دنیای‌متن‌باز](./floss.md#floss) موجود است. 8 | 9 | # تولد کتاب 10 | 11 | اولین پیش‌نویس از این کتاب در لینوکس ردهت 9.0 بود. بعدها به عنوان شیشمین پیش نویس، از لینوکس فدورای ۳ هسته‌ی استفاده کردم. 12 | 13 | من اولین بار برای نوشتن کتاب از KWord استفاده کردم.که در فصل [تاریخچه پیشرفت 14 | ](./revision_history.md#history-lesson) توضیح دادم. 15 | 16 | 17 | # سال‌های جوانی 18 | 19 | بعدها روی داک‌بوک اکس‌ام‌ال مهاجرت کردم(با استفاده از کیت ). ولی برای من این برنامه خیلی خسته‌کننده بود. بنابراین به اپن‌آفیس مهاجرت کردم، که خیلی عالی بود کنترل عالی داشتم همچین امکانات فرمت‌های مختلف، یکی دیگر از خوبی‌هایش مبدل برای فرمت پی‌دی‌اف بود، ولی در سند اچ‌تی‌ام‌ال به‌هم ریختگی داشتم. 20 | 21 | در اخر ایکس‌ایمکس را پیداکردم. کل کتاب را از صفر دوباره نوشتم. بعد از این موضوع، تصمیم گرفتم که فرمت داک‌بوک‌اکس‌ام‌ال یک راه‌حل بلند مدت خواهد بود. 22 | 23 | 24 | در شیشمین پیش‌نویس تصمیم گرفتم ازویرایشگر کوئنتاپلاس استفاده کنم. استفاده از جدول استاندارد مدل اکس‌اس‌ال، که با لینوکس فدورای ۳ هسته‌ی عرضه شده بود. همچنین یک سند سی‌اس‌اس نوشتم که رنگ ولابی به صفحه‌های اچ‌تی‌ام‌ال‌ام بدم. همچنین یک crude lexical analyzer در پایتون نوشتم که بطور خودکارتمامی لیست برنامه‌ها را فراهم می‌کرد. 25 | 26 | در هفتمین پروژه من به عنوان پایه برای نصابم از [مدیاویکی](http://www.mediawiki.org) استفاده کردم. دیگه به قول خودمون گفتنی به ویرایش در اینترنت عادت کرده بودم و افراد به طور مستقم می‌توانستند بخوانند، ویرایش کنند و درباره کتاب در سایت ویکی بحث کنند. اما در پایان من وقت بیشترم صرف هرزنامه میشد در حال کی باید صرف ایمیل‌ها میشد. 27 | 28 | در پروژه هشتم از [ویم ]({{ book.vimBookUrl }}), [Pandoc](http://johnmacfarlane.net/pandoc/README.html) و مکینتاش استفاده کردم. 29 | 30 | در نهمیمن پیش‌نویس من به فرمت [فرمت‌اسکی‌داک](http://asciidoctor.org/docs/what-is-asciidoc/) و [ ایمکس ۲۴.۳](http://www.masteringemacs.org/articles/2013/03/11/whats-new-emacs-24-3/), 31 | [tomorrow theme](https://github.com/chriskempson/tomorrow-theme), 32 | [Fira Mono font](https://www.mozilla.org/en-US/styleguide/products/firefox-os/typeface/#download-primary) و همچنین [adoc-mode](https://github.com/sensorflo/adoc-mode/wiki) برای نوشتن پروژه‌ام استفاده کردم. 33 | 34 | 35 | # درحال‌حاضر 36 | 37 | ۲۰۱۶: من از چند مشکل جزئی اسکی‌داک مثلا برای نوشتن `++` و `سی‌وسی‌++` خسته شده بودم. برای غالب گیری و از این کارها، سختی‌های خودش را داشت. بخاطر سختی‌های فرمت اسکی‌داک، دیگر تمایلی به ویرایش متن نداشتم. 38 | 39 | برای دهمین پروژه به سوی فرمت [گیت‌بوک](https://www.gitbook.com) مارک‌داون پناه اوردم . 40 | 41 | و از ویرایشگر [Spacemacs editor](http://spacemacs.org) استفاده کردم. 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /about_python.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | از این نکته هم با خبریم که خیلی سری می‌ریم سر اصل متلب برای راحتر خواندن [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) سر بزنید. 4 | 5 | 6 | 7 | # درباره‌ی پایتون 8 | پایتون یکی از ان زبان‌های برنامه نویسی است، که ادعا میکند میتواند همزمان ساده و قدرتمند باشد. 9 | 10 | غافلگیر خواهید شد که به چه اسانی برای حل مشکلات برنامه‌نویسی می توانید تمرکز (نه برای ساختار و گرامر برنامه نویسی) کنید . 11 | 12 | > پایتون - یک روش ساده برای یادگیری زبان برنامه نویسی قدرتمند است. ساختار سطح بالا و ساختار داده‌ای ساده پایتون, پایتون را کارامد کرده است. ولی یک رویکرد موثر برای برنامه نویس مفهوم شی گرایی است. پایتون همراه با تایپ پویا و طبیعت ظریف‌اش یک زبان برنامه نویسی ایده‌ال, برای برنامه نویسی و توسعه‌ی سریع در بیشتر مناطق نرم‌افزاری بر روی اکثر سیستم عامل‌ها است. 13 | 14 | در بخش های بعدی بیشتر در مورد این ویژگی ها بحث خواهم کرد. 15 | 16 | 17 | ## داستانی در پشت نام 18 | 19 | **خَودو فان روسوم** سازنده‌ی زبان پایتون است. 20 | 21 | بعد دیدن برنامه‌ی مستند در بی‌بی‌سی به نام "Monty Python's Flying Circus" این اسم به ذهن او خطور کرده‌ است. 22 | 23 | او مار(حیوان) را خیلی دوست نداشت, بخاطر غذا، با پیچیدن به دور طعمه ان را شکار می‌کند. همچین بخاطر اینکه مار حیوانات دیگر را می کشد. 24 | 25 | ## ویژگی‌های پایتون 26 | 27 | ### سادگی 28 | 29 | پایتون - یک زبان ساده و حداقل نویسی در کد را دارد. خواندن برنامه نویسی پایتون حسی خوبی مانند حس خواندن زبان انگلیسی به شما می دهد(البته نه برای ما ایرانی زبان *فارسی* جای خودش داره)، اگر چه زبان انگلیسی سخت است! طبیعت پایتون یک شبه-کد است و این یکی از نقاط قوت این زبان برنامه‌نویسی است. این زبان برنامه نویسی اجازه می‌هد که تمرکز خود را بر روی مشکلات و ارائه‌ای راه‌ حل ان، متمرکز نگه دارید و نه بر روی مشکلات زبان برنامه نویسی. 30 | 31 | ### یادگیری سریع 32 | 33 | پایتون را به سادگی میتوان آموخت و پایتون syntax بسیار ساده‌ی دارد. همان طور که در قبلا گفته شده است. این موضوع را در طی یادگیری کاملا درک خواهید کرد. 34 | 35 | ### رایگان بودن و منبع باز بودن پایتون 36 | 37 | پایتون یک مثال از نرم‌افزار آزاد و متن‌باز است. به عبارت دیگر می توانید ازادانه نرم افزار را انتشار دهید, متن کد را بخوانید, متن کد تغییر دهید و در برنامه های متن باز دیگر از این کد استفاده کنید. نرم‌افزار آزاد و متن‌باز پایگذار مفهوم به اشترک گذاشتن دانش و سهیم بودن این دانش در یک جامعه است. این یکی از دلایلی است, که خوبی پایتون را نمایش می‌دهد. بخاطر اینکه ساخته شده, بهبود یافته است, به اشترک گذاشته شده تا توسط این جامعه که منتظر دیدن پایتون در بالاترین سطحوح است. 38 | 39 | 40 | ### زبان - سطح بالا 41 | 42 | اول از همه زمانی که با پایتون برنامه نویسی می‌کنید، نیاز برای نگرانی درباره‌ی جزیئات زبان سطح پایین را ندارید, از قبیل, مدیرت حافظه برای برنامه‌های خود و غیره. 43 | 44 | ### قابل - حمل 45 | 46 | با توجه به طبیعت متن باز بودن پایتون, منتقل شده برای کار کردن روی اکثر سیستم عامل ها. همه‌ی برنامه‌های شما در پایتون میتواند به راحتی روی سیستم عامل‌های مختلف کار کند. برای جلوگیری از هرگونه وابستگی ها و ویژگی های ان سیستم عاملی که استفاده می‌کنید، اگر مراقب باشید, تمامی برنامه‌های پایتون خود را می توانید در تمام سیستم عامل ها اجرا کنید. 47 | 48 | پایتون را در سیستم عامل‌های زیر می‌توانید استفاده کنید: 49 | 50 | 51 | **گنولینوکس, ویندوز, فری‌بی‌اس‌دی, مکینتاش, سولاریس, اواس/۲, آمیگا, آروس, بی‌اواس, اواس/ ۳۹۰, زد/اواس, سیستم‌عامل پالم, کیواِن‌اکس, وی‌ام‌اس, پلی استیشن, شارپ زائوروس, ویندوز داس، کامپیوترجیبی، Acorn RISC OS ,VxWorks ,Psion و AS/400** 52 | 53 | 54 | 55 | همچنین می‌توانید با استفاده از پلت‌فرمی مانند کیوی برای ساخت بازی برای کامپیوتری, ایفون و اندروید, نیز قادر باشید. 56 | 57 | ### مفسر 58 | 59 | این کمی نیاز به توضیح دارد. 60 | 61 | برنامه‌های که به زبان سی و سی پلاس پلاس نوشته شده‌اند (زبان های کامپایل شده)هستند, اینان زبان‌های ترجمه شده از زبان مبدا است. یعنی سی و سی پلاس پلاس به زبان کامپیوتر (زبان باینری صفر ویک) صحبت می‌کنند. این کار با استفاده از کامپایلرها، پرچم‌ها و گزینه‌ها این کار امکان پذیر می‌کند. زمانیکه برنامه‌ی را اجرا می‌کنید، پیوند دهنده/اجراکننده برنامه‌ها را از هارد دیسک کپی می‌کند و برنامه را اجرا می‌کند. 62 | 63 | از سوی دیگر پایتون نیاز به کامپایلر باینری ندارد. فقط برنامه را از کد منبع اجرا می‌کنید. داخل, پایتون, کد منبع تبدیل به واسطه‌ی به نام bytecodes می‌شود و سپس به زبان مادری کامپیوتر (باینری) ترجمه می‌شود و برنامه را اجرا می‌کند. 64 | 65 | در واقع تمام این موارد گفته شده باعث کمک به پایتون در ترجمه زبان برنامه‌نویسی می‌شود. از انجا که دیگر لازم نیست نگران کامپایل کردن برنامه‌ها, لود کتابخانه‌‌های مرتبط باشید. در پایتون بامفهومی به نام حمل اسوده (portable) اشنا خواهید شد که به راحتی برنامه‌ی خود را از یک کامپیوتر به کامپیوتر دیگر می‌توانید انتقال داده و برنامه را اجرا کنید. 66 | 67 | ### شی گرایی 68 | 69 | پایتون همچنین از برنامه‌ نویسی شی‌گرایی پشتیبانی می‌کند. برنامه نویسی شی‌گرایی همانند توابع, قطعاتی از برنامه است که می‌توان ان را در برنامه‌های دیگر استفاده کرد. در برنامه نویسی زبان شی‌گرایی برنامه‌ها اطراف اشیا ساخته می‌شوند, که ترکیب داده ها وتوابع هستند. پایتون زبان بسیار قدرتمندی است و راه ساده‌ی برای انجام OOP دارد. به خصوص در مقایسه با زبان‌های برنامه نویسی مانند سی و جاوا. 70 | 71 | ### انعطاف‌پذیر و توسعه‌پذیز 72 | 73 | اگر نیاز به یک قطعه‌ کد مهم، اجرای سریع کد و یا از الگوریتم غیر منبع باز استفاده کنید می توانید بخشی از برنامه‌های که به زبان سی و سی پلاس پلاس نوشته شده است را در برنامه‌های پایتون خود استفاده کنید. 74 | 75 | 76 | ### درج شده یا جاسازی شده (Embeddable) 77 | 78 | همچنین پایتون را در برنامه‌های سی و سی پلاس پلاس (++C and C) و اسکریپت نویسی خود می‌توانید استفاده کنید. 79 | 80 | ### کتابخانه‌های گسترده 81 | 82 | کتابخانه‌ی استاندار پایتون, درواقع خیلی بزرگ است. در عبارت‌های بانظم قاعده, منظم کردن اسناد, تست واحد, پایگاه داده, مرورگرهای وب, سی‌جی‌آی, اف‌تی‌پی, ایمیل, اکس‌ام‌ال, اکس‌ام‌ال-ارپی‌سی, اچ‌تی‌ام‌ال, فایل WAV می‌تواند استفاده شود و به انجام کارهای مختلف کمک کند. 83 | 84 | رمزنگاری, واسط گرافیکی کاربر(رابط گرافیکی کاربر) و سایر وابستگی‌های سیستم‌ها به این مسائل است, تمامی این وابستگی‌ها در جایی که پایتون نصب باشد در دسترس خواهد بود. این فلسفه پایتون است که به نام (Batteries Included philosophy) (به معنی : باتری شامل فلسفه است) می‌شود. 85 | 86 | علاوه بر کتابخانه‌های استاندارد که وجود دارد, کتابخانه‌های دیگری با کیفیت بالایی وجود دارد. 87 | 88 | که در لینک زیر می توانید پیدا کنید: 89 | 90 | [Python Package Index](http://pypi.python.org/pypi) 91 | 92 | 93 | ### خلاصه 94 | 95 | پایتون در واقع یک بازی هیجان انگیز و زبان برنامه‌نویسی قدرتمند است. پایتون ترکیب مناسبی از عملکردها و ویژگی‌ها است, که برنامه نویسی را در پایتون سرگرم کننده و اسان‌تر می‌کند. 96 | 97 | ### پایتون ۳ در مقابل پایتون ۲ 98 | 99 | از این قسمت می توانید چشم پوشی کنید, اگر علاقه‌ای به تفاوت میان پایتون ۲ و ۳ ندارید. اما از نسخه‌ای که استفاده می‌کنید اگاه باشید. این کتاب برای زبان برنامه نویسی پایتون ۳ نوشته شده است. 100 | 101 | بخاطر داشته باشید اگر یک نسخه از پایتون را به درستی درک کرده باشید به راحتی می‌توانید از نسخه های دیگر استفاده کنید. همچنین تفاوت بین انان را به راحتی تشخیص دهید. بخش سخت یادگیری، برنامه نویسی واصول پایتون است. هدف این کتاب این است که هنگامی که به هدف خود رسیدید که به راحتی بتوانید از پایتون ۲ و۳ بسته به موقعیتان از ان استفاده کنید. 102 | 103 | 104 | برای اطلاعات بیشتر درباره‌ای تفاوت بین پایتون ۲ و ۳ به لینک‌های زیر سر بزنید: 105 | 106 | 107 |
108 | 109 | - [The future of Python 2](http://lwn.net/Articles/547191/) 110 | - [Porting Python 2 Code to Python 3](https://docs.python.org/3/howto/pyporting.html) 111 | - [Writing code that runs under both Python2 and 3](https://wiki.python.org/moin/PortingToPy3k/BilingualQuickRef) 112 | - [Supporting Python 3: An in-depth guide](http://python3porting.com) 113 | 114 | 115 | 116 |
117 | 118 | ### برنامه نویسان چه می‌گویند 119 | 120 | چیز‌های جالب می‌توانید برای خواندن پیدا کنید, هکرمعروف مثل ESR درباره‌ی پایتون می گوید: 121 | 122 | - اریک ریموند نویسنده‌ی کتاب "The Cathedral and the Bazaar" و همچنین فردی است که اصطلاح(متن‌باز) منبع باز را به وجود اورد. 123 | 124 | او می‌گوید[Python has become his favorite programming language](http://www.python.org/about/success/esr/) (برنامه نویسی زبان پایتون, برنامه نویسی مورد علاقه‌ی من شده است). 125 | 126 | - Bruce Eckel یکی از افراد مشهور دیگر که کتاب‌های زیر را نوشته است. 127 |
128 | 129 | 130 | '++Thinking in Java' and 'Thinking in C' 131 | 132 |
133 | 134 | او می‌گوید: هیچ زبانی مثل زبان برنامه نویسی پایتون پربارتر نیست. پایتون تنها زبانی است که تمرکز کرده بر روی برنامه نویس‌ها که راحتی برنامه نویسی حس کنند. 135 | 136 | اطلاعات بیشتر درباره‌ی این بحث بدانید [complete interview](http://www.artima.com/intv/aboutme.html) 137 | 138 | 139 | - Peter Norvig معرف به نویسنده‌ی well-known Lisp وهمچنین مدیر کیفیت جستجو در گوگل است(ممنون بخاطر اشاره کردن از Guido van Rossum ). 140 | 141 | او می‌گوید : [writing Python is like writing in pseudocode](https://news.ycombinator.com/item?id=1803815) (نوشتن برنامه در پایتون مانند نوشتن کدpseudocode است). 142 | 143 | -------------------------------------------------------------------------------- /basics.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | # اساس و پایه 5 | 6 | 7 | 8 | در دنیای برنامه نویسی فقط چاپ کردن سلام دنیا کافی نیست، این طور نیست؟ کارهای بیشتری را می‌خواهید انجام دهید، مانند گرفتن ورودی و دستکاری کد و خیلی از کارهای دیگر. پایتون این قابلیت را دارد که از ثابت‌ها و متغییرها استفاده کنیم. همچنین با بعضی از مفاهیم دیگر در این فصل اشنا خواهیم شد. 9 | 10 | 11 | 12 | ## نظرات یا توضیحات 13 | 14 | _نظرات_ 15 | 16 | هر متنی که سمت راست‌اش علامت هشتگ ` # ` باشد، عمدتا به عنوان یاداشت برای خواننده از کد برنامه است. 17 | 18 | برای مثال : 19 |
20 | 21 | ```python 22 | print('hello world') # Note that print is a function 23 |
24 | (این تابع برای چاپ است) 25 | ``` 26 | 27 |
28 | 29 | یا : 30 |
31 | 32 | 33 | ```python 34 | # Note that print is a function 35 | print('hello world') 36 | 37 |
38 | 39 | (این تابع برای چاپ است) 40 | ``` 41 |
42 | در برنامه های شخصی خود نیز می‌توانید از این توضیحات استفاده کنید: 43 |
44 | - توضیح فرضیات. 45 | - توضیح تصمیمات مهم. 46 | - توضیح اطلاعات مهم. 47 | - توضیح مشکلات شما در تلاش برای حل برنامه. 48 | - توضیح در مورد برنامه و غیره. 49 | 50 | [*کد به شما می گوید، چگونه‌وچطوری، نظرات یا توضیحات باید به شما بگوید ، چرا*](http://www.codinghorror.com/blog/2006/12/code-tells-you-how-comments-tell-you-why.html) 51 | 52 | این یک ابزار بسیار مفید است برای خواندن کدهای که نوشته‌اید. دیگران نیز به راحتی درک می‌کنند، این برنامه چه می کند. بخاطر داشته باشید که فردی بعد از شش ماه قطعا از برنامه‌ی که خود نوشته است سر در نخواهد آورد. 53 | 54 | 55 | ## ثابت‌های لفظی 56 | 57 | یک مثال از ثابت‌های لفظی مثل یک شماره مانند ، `5`، `1.23` ، یا یک رشته مانند `'This is a string'` یا `"It's a string!"` ثابت‌های لفظی هستند. 58 | 59 | چرا لفظ صدایش می کنیم؟ به خاطر انکه _لفظی است_ بخاطر انکه ارزش معنای واقعی ان کلمه استفاده می‌کینم(شما ارزش ان را به طور لفظی استفاده می‌کنید). شماره‌ی `2` همیشه به خودی خود نشان دهنده دو است و هیچ چیز دیگر - این یک مقدار _ ثابت _ است و ارزش ان را نمی توان تغییر داد. از این رو همه‌ی این‌ها به عنوان ثابت‌های لفظی تلقی می‌شوند. 60 | 61 | 62 | ## اعداد 63 | 64 | شماره‌ها عمدتا دو نوع است صحیح (integer) و اعشاری (float). 65 | 66 | برای مثال عدد `2` یک عدد صحیح است که یک عدد کامل(منظور از کامل ، کامل ریاضی نیست) است. 67 | 68 | برای مثال نمونه‌ی از اعداد ممیزی یا همان اعشاری `3.23` و `52.3E-4` هستند. نماد `E` قدرت ۱۰ را نشان می دهد توی این مورد ، `52.3E-4` معنی این `52.3 * 10^-4^` می شود. 69 | 70 | > ** برنامه نویسان باترجبه توجه داشته باشند ** 71 | > 72 | > نوعی `long` متمایز دیگری وجود ندارد . نوع `int` که میتواند یک عدد صیحیح , با هر اندازه‌ی باشد. 73 | 74 | ### رشته‌ها 75 | 76 | یک رشته _ دنباله‌ی از حروف (توالی از حروف) است ( کاراکترها (characters)) .رشته‌ها اساسا از گروهی از حروف یا کلمات ساده هستند. 77 | 78 | من تقریبا مطئن هستم که احتمالا برنامه‌های که شما در پایتون می نویسید ، از رشته‌ها ، استفاده خواهید کرد ، پس بنابراین بهتر است به جزئیات بخش زیر توجه کنید. 79 | 80 | چگونگی استفاده رشته در پایتون اینجاست: 81 | 82 | ### تک نقل قول (Single Quote) 83 | 84 | رشته ها را با استفاده از تک نقل قول می‌توانید نمایش دهید. مانند : `'Quote me on this'` 85 | 86 | تمامی فضای سفید یا همان فاصله (space) ، فاصله و (Tabs) همان طور که هست نمایش داده خواهد شد. 87 | 88 | 89 | 90 | ### دو نقل قول (Double Quotes) 91 | 92 | 93 | رشته ها در دو تا نقل قول همانند تک نقل قول کار می کنند برای مثال : `"What's your name?"` . 94 | 95 | ### سه نقل قول (Triple Quotes) 96 | برای رشته‌های چند خطی از سه نقل قول - (`"""` یا `'''`) می‌توانید استفاده کنید. از تک و دو نقل قول می‌توانید ازدانه وبه طور دلخواه در سه نقل قول استفاده کنید برای مثال : 97 | 98 |
99 | 100 | 101 | ```python 102 | '''This is a multi-line string. This is the first line. 103 | This is the second line. 104 | "What's your name?," I asked. 105 | He said "Bond, James Bond." 106 | ''' 107 | ``` 108 | 109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | ### رشته‌های الفظی الحاقی 118 | 119 | 120 | این بدان معنا است وقتی یک رشته را ایجاد می‌کنید، امکان تغییر دادن ان را ندارید. شاید این به نظر یک کار اشتباه به نظر برسد ولی این طور نیست. 121 | 122 | شاید تفکر کنید این موضوع دست پاگیر باشد ولی اینطور نیست. این محدویت محسوب نمی‌شود. 123 | 124 | 125 | > **تذکر برای برنامه نویسی سی و سی پلاس پلاس** 126 | > 127 | > در پایتون هیچ نوع داده‌ی `char` متمایز دیگری وجود ندارد. واقعا نیاز نیست و من مطئن هستم که شما درباره‌اش از من سوال نمی کنید و کمبود ان را احساس نخواهید کرد. 128 | 129 | 130 | 131 | 132 | > **تذکر برای برنامه نویسی پریل/پی اچ پی** 133 | 134 | بخاطرداشته باشید که تک نقل قول و دونقل قول در رشته ها یکسان هستند و به هیچ وجه متفاوت نیستند. 135 | 136 | 137 | 138 | 139 | ### روش و فرمت 140 | 141 | 142 | گاهی اوقات ممکن است, ساخت یک رشته از اطلاعات دیگر را بخواهیم. در این حالت از `()format` استفاده می‌کنیم. 143 | 144 | خط‌های زیر را در همچین فایلی `str_format.py` ذخیره کنید. 145 | 146 |
147 | 148 | 149 | ```python 150 | age = 20 151 | name = 'Swaroop' 152 | 153 | print('{0} was {1} years old when he wrote this book'.format(name, age)) 154 | print('Why is {0} playing with that python?'.format(name)) 155 | ``` 156 |
157 | 158 | خروجی : 159 | 160 |
161 | 162 | 163 | ``` 164 | $ python str_format.py 165 | Swaroop was 20 years old when he wrote this book 166 | Why is Swaroop playing with that python? 167 | ``` 168 |
169 | 170 | **چگونه و چطوری** 171 | 172 | 173 | با روش `format` یک رشته می‌تواند از مشخصات خاص استفاده کند. در روش `format` ارگومان های مشخص شده تعویض می‌شوند با مشخصات از قبل تعیین شده. 174 | 175 | این نشان `{0}` مربوط به متغییر `name` است, که همان ارگومان اول در روش format می‌باشد، همان طور که در بالا مشاهد کردید. پس خیلی ساده نشانه‌ی دوم `{1}` مربوط به متغییر `age` است ،که همان ارگومان دوم در روش format می باشد. توجه داشته باشید که , پایتون شمارش را از صفر 0 شروع می‌کند, که اولین موقعیت شاخص از صفر و دومی یک است وبه همین ترتیب ادامه دارد. 176 | 177 | توجه داشته باشید که با استفاده از الحاق رشته می‌توانید به همان نتیجه برسید : 178 |
179 | 180 | ```python 181 | name + ' is ' + str(age) + ' years old' 182 | ``` 183 |
184 | 185 | 186 | ولی در روش بالا امکان خطا خیلی است، بجای تبدیل صریح رشته، در روش `format` تبدیل رشته به طور خودکار انجام می‌شود. زمانیکه از روش format استفاده می‌کنیم می‌توانیم بدون نیاز به متغیر و یا بالعکس، پیام را تغییر بدهیم. 187 | 188 | توجه داشته باشید که اعداد اختیاری هستند و شما می توانید این طوری بنویسید: 189 |
190 | 191 | 192 | ```python 193 | age = 20 194 | name = 'Swaroop' 195 | 196 | print('{} was {} years old when he wrote this book'.format(name, age)) 197 | print('Why is {} playing with that python?'.format(name)) 198 | ``` 199 |
200 | 201 | که دقیقا همان خروجی را می‌دهد، مانند برنامه‌ی قبلی. 202 | 203 | پایتون چیکار می کند ، روش `format` این است که ارزش را به جای مشخصات جایگزین می‌کند. 204 | 205 | مشخصات بیشتر و دقیق وجود دارد مانند: 206 | 207 |
208 | 209 | 210 | ```python 211 | # decimal (.) precision of 3 for float '0.333' 212 | print('{0:.3f}'.format(1.0/3)) 213 | # fill with underscores (_) with the text centered 214 | # (^) to 11 width '___hello___' 215 | print('{0:_^11}'.format('hello')) 216 | # keyword-based 'Swaroop wrote A Byte of Python' 217 | print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python')) 218 | ``` 219 | 220 |
221 | 222 | خروجی: 223 |
224 | 225 | 226 | ``` 227 | 0.333 228 | ___hello___ 229 | Swaroop wrote A Byte of Python 230 | ``` 231 | 232 | 233 |
234 | 235 | ا 236 | از انجا که بحث ما در مورد قالب بندی است. 237 | 238 | توجه داشته باشید که `print` همیشه با یک کاراکتر نامرئی( (`n\`) " (خط جدید) new line" ) جمله را به پایان می‌رساند. به طوری که صدا زدن مکرر `print` همه را در یک خط جداگانه `چاپ` می‌کند. برای جلوگیری از کاراکتر newline (خط جدید) در چاپ ، شما می‌توانید با مشخصه`end` از این کار جلو گیری کنید. 239 | 240 | 241 | 242 | 243 |
244 | 245 | ```python 246 | print('a', end='') 247 | print('b', end='') 248 | ``` 249 |
250 | 251 | خروجی : 252 | 253 |
254 | 255 | ``` 256 | ab 257 | ``` 258 |
259 | 260 | یا شما می‌توایند `end` با فضایه خالی (space) استفاده کنید: 261 |
262 | 263 | 264 | ```python 265 | print('a', end=' ') 266 | print('b', end=' ') 267 | print('c') 268 | ``` 269 |
270 | 271 | خروجی: 272 |
273 | 274 | ``` 275 | a b c 276 | ``` 277 |
278 | 279 | 280 | 281 | 282 | 283 | ### Escape Sequences (توالی‌های گریز) 284 | 285 |
286 | 287 | 288 | فرض کنید می‌خواهید یک رشته داشته باشید که در ان تک نقل قول (`'`) داشته باشید , چگونه این رشته را مشخص می‌کنید ؟ 289 | 290 | به عنوان مثال رشته‌‌ی به این شکل `'What's your name'` دارید. شما نمی‌تواند به این روش گفته شده عمل کنید. زیرا پایتون نمی‌توانید محل شروع وپایان رشته را تشخیص بدهد. پس باید مشخص کنید, این فقط یک نقل قول است و انتهای رشته را نمایش نمی‌دهد. این کار را به وسیله‌ی چیزی که به نام _توالی‌های گریز_ می‌نامند می‌توانید انجام دهید. برای این کار با استفاده از بک‌اسلش قبل از نقل قول `'\` می‌توایند این کار را انجام دهید. حالا می‌توانید این را `'What\'s your name'` به عنوان یک رشته بنویسید. 291 | 292 | 293 | 294 | روشی دیگر برای رشته‌های که داری نقل‌قول هستند وجود دارد. به طور مشابه، می‌خواهید از رشته‌ها متوالی استفاده کنید که در ان نقل وجود دارد، که با دونقل قول مانند این مثال‌ `"What's your name"` می‌توانید این کار را انجام دهید. همچنین برای مشخص کردن یک بک‌اسلش باید از `\\` رشته متوالی استفاده کنید. 295 | 296 | اگر بخواهیم رشته‌ی دوخطه را مشخص کنیم (دارای چندین خط) چه کار کنیم؟ یک روش این است که از سه نقل قول استفاده کنیم، همان طور که قبلا گفتیم. یا اینکه با استفاده از توالی‌های گریز ( استفاده از کاراکتر - `n\` نشان دهنده خط جدید است) این کار را انجام دهیم. 297 | 298 | 299 | 300 | برای مثال: 301 | 302 |
303 | 304 | ``` 305 | python 306 | 'This is the first line\nThis is the second line' 307 | 308 | ``` 309 | 310 |
311 | 312 | یکی دیگر ازتوالی‌های گریز مفید `t\` است (به اندازی یک TAB فاصله می دهد). رشته‌های متوالی دیگری وجود دارد من سعی کردم فقط مفیدترین ان‌ها را ذکر کنیم. 313 | 314 | به یاد داشته باشید که در یک رشته با یک بک‌اسلش در انتهای خط به معنای ان است که رشته ادامه دارد ولی در خروجی خط جدیدی نمایش نمی‌دهد. برای مثال: 315 |
316 | 317 | 318 | ```python 319 | "This is the first sentence. \ 320 | This is the second sentence." 321 | ``` 322 |
323 | 324 | این معادل : 325 |
326 | 327 | 328 | ```python 329 | "This is the first sentence. This is the second sentence." 330 | ``` 331 | 332 | 333 |
334 | 335 | 336 | ### رشته‌ای چند سطر 337 | 338 | 339 | 340 | 341 | اگر شما نیاز به مشخص کردن برخی از رشته‌های که دران هیچ پردازش خاصی صورت (توالی‌های گریز) نمی‌گیرد. برای این کار نیاز به استفاده از رشته‌های _raw_ می‌باشید. کافی است به اول رشته پیشوند `r` یا `R` را اضافه کنید. برای مثال: 342 | 343 |
344 | 345 | ```python 346 | r"Newlines are indicated by \n" 347 | ``` 348 |
349 | 350 | > ** یاداشت برای کاربران عبارت‌های با نظم وقاعده (Regular Expression) ** 351 | 352 | > 353 | 354 | > همیشه از raw strings در عبارت‌های با نظم قاعده استفاده کنید. برای مثال بازگشت منبع (backreferences) را می‌توان به عنوان `'\\1'` یا `r'\1'` در نظر گرفت. 355 | 356 | ### متغیرها 357 | 358 | فقط استفاده از الفاظ ثابت ممکن است, بعد از مدتی خسته کننده شود و ما نیاز به برخی راه‌های دیگر برای ذخیره‌سازی اطلاعات و دستکاری ان داریم. در اینجا است که بحث _متغیر‌ها_ به گوش می‌اید. متغیرها دقیقا همان چیزی است که از اسم پیدا است - ارزش متغیر می‌تواند متفاوت باشد یعنی شما می‌توایند هر چیزی را در متغیر ذخیره کنید. متغیر‌ها قسمتی ازحافظه‌ی کامپیوتر شما هستند که می‌توانید در ان اطلاعات را ذخیره کنید. برخلاف الفاظ ثابت شما نیاز به دسترسی به این متغیرها را دارید این کار با دادن نام به ان‌ها امکان پذیرخواهد شد. 359 | 360 | 361 | ### شناسه نامگذاری 362 | 363 | متغیرها مثالی از شناسه‌ها هستند. _شناسه‌ها_ نامی برای مشخص کردن _چیزی_ هستند. قوانین وجود دارد برای نام گذاری متغیرها: 364 | 365 | - حروف اول متغیر با از الفبا باشند. (حروف بزرگ و کوچک اسکی (ASCII) یا یونیکد (Unicode)) ویا تاکید (`_`) (منظور همان خط زیرین است). 366 | 367 | - دیگر قسمت می‌تواند از حروف دیگر باشند. (حروف بزرگ و کوچک اسکی (ASCII) یا یونیکد (Unicode)) ویا تاکید (`_`) (منظور همان خط زیرین است) و یا از ارقام (0-9) باشند. 368 | 369 | - متغیرها به حروف بزگ و کوچک حساس هستند. برای مثال: `myname` و `myName` _ یکسان_ نیستند. همچنین این موضوع برای یک حروف هم همین طور است , حرف کوچک `n` با حرف بزرگ `N` فرق می‌کند. 370 | 371 | - برای مثال: متغیر‌های معتبر این‌‌ها هستند `i` , `name_2_3` . متغیرهای غیر معتبر این‌ها هستند `2things` , ` این فاصله است` , `my-name` و `>a1b2_c3` پس این نکات را در نظر داشته باشید. 372 | 373 | ### انواع داده‌ها 374 | 375 | 376 | 377 | 378 | 379 |
380 | 381 | 382 | ### انواع داده‌ها 383 | 384 | 385 | متغیرها می‌توانند مقادیر مختلف و _انواع داده_ را در خود نگه داری کنند. اساس انواع ها همان رشته‌ها و اعداد هستند که الان در مورد ان بحث می کنیم. در فصل بعدی ما خواهیم دید که چگونه نوع داده‌ی خود را ایجاد کنیم و به چگونگی استفاده از ان می‌پردازیم. 386 | 387 | ### شی گرایی 388 | 389 | به یاد داشته باشید که پایتون به هر چیزی که اشاره می‌کند در یک برنامه به عنوان یک _شی_ استفاده می‌شود. این به این معنا است ، به طور کلی. به جای گفتن "the _something_"'، we say "the _object_" 390 | (_چیزی _، ما می‌گوییم _ شی است_). 391 | 392 | > **تذکر برای کاربران برنامه نویسی شی گرایی** 393 | > 394 | > پایتون به شدت شی گرایی است و این شامل تمامی اعداد و رشته‌ها وتوابع هستند. 395 | 396 | 397 | حالا چگونگی استفاده از متغیرها همراه با لفظ‌های ثابت را ببینید. مثال‌های زیررا ذخیره و برنامه را اجرا کنید. 398 | 399 | 400 | 401 | 402 | ### چگونگی برنامه نوشتن در پایتون 403 | 404 | 405 | از این پس روش استاندار ذخیره سازی برنامه و اجرای ان در پایتون به شرح زیر است. 406 | 407 | ### برای برنامه‌ی PyCharm 408 | 409 | ۱. PyCharm را باز کنید. 410 | 411 | ۲. ایجاد فایل با نام ذکر شده . 412 | 413 | ۳. نوع کد برناه‌ی داده شده در مثال‌ها 414 | 415 | ۴. کیک راست کنید و اجرای فایل فعلی 416 | 417 | نکته: هر زمانکه یک خط از دستور ارگومان‌ها را دارید، کلیک کنید بر روی `Run` -> `Edit Configurations` و نوع ارگومان را در قسمت `Script parameters:` مشخص کنید و بر روی دکمه‌ی `OK` کلیک کنید. 418 | 419 | 420 | 421 | ![PyCharm command line arguments](./img/pycharm_command_line_arguments.png) 422 | 423 | 424 | 425 | 426 | 427 | ### برای دیگر ویراستارها 428 | 429 | 430 | ۱. ویراستار خود را بازکنید. 431 | 432 | ۲. برنامه‌ی داده شده را مانند مثال‌ها بنویسید. 433 | 434 | ۳. فایل با نام داده شده ذخیره کنید. 435 | 436 | ۴. برای اجرای دستور و مترجم برنامه از دستور `python program.py` استفاده کنید. 437 | 438 | ### برای مثال : استفاده از متغیرها و الفظی ثابت 439 | 440 | برنامه‌ی زیر را بنویسید و اجرا کنید: 441 | 442 |
443 | 444 | 445 | ```python 446 | # Filename : var.py 447 | i = 5 448 | print(i) 449 | i = i + 1 450 | print(i) 451 | 452 | s = '''This is a multi-line string. 453 | This is the second line.''' 454 | print(s) 455 | ``` 456 |
457 | 458 | خروجی: 459 | 460 | 461 |
462 | 463 | 464 | 465 | ``` 466 | 5 467 | 6 468 | This is a multi-line string. 469 | This is the second line. 470 | ``` 471 | 472 |
473 | 474 | 475 | 476 | 477 |
478 | 479 | 480 | **چگونه کار می کند** 481 | 482 | این طور این برنامه کار می‌کند. در گام اول مقدار ثابت `5` را در متغیر `i` اختصاص می دهیم. این خط را با نام بیانیه صدا می‌زنیم ان هم به این دلیل چیزی که باید انجام شود. در اینجا ما متغیر `i` را به ارزش `5` اتصال دادیم. گام بعدی مقدار `i` را با استفاده از`print` چاپ می‌کنیم. جای تعجبی ندارد که مقدار متغیر را در صفحه نمایش نشان می‌دهد. 483 | 484 | 485 | حال با اضافه کردن `1` به متغیر `i` و ذخیره ان , جای تعجبی نیست که با مقدار `6` در صفحه نمایش روبه‌ رو خواهیم شد. 486 | 487 | 488 | شما با اختصاص دادن الفاظ ثابت به یک متغیر+s+ ان را ذخیره و چاپ می‌کنید. 489 | 490 | > **نکته برای برنامه‌ نویسان ایستا (static)** 491 | 492 | 493 | > 494 | 495 | 496 | > متغیرها تنها با اختصاص دادن ان یه یک ارزش مورد استفاده قرار می‌گیرد. هیچ نوع تعریف داده لازم نیست. 497 | 498 | 499 | 500 | ## خطوط منطقی و فیزیکی 501 | 502 | خط‌های فیزیکی چیزی است که شما می‌بینید زمانی که شما برنامه می‌نویسید. خط‌های منطقی چیزی است که پایتون می‌بیند یک بیانه است. پایتون به طور ضمنی فرض می‌کند که هر خط فیزیکی مربوط به خط منطقی است. 503 | 504 | برای مثال از خط منطقی بیانه‌ی شبیه `print 'hello world'` اگر این روی یک خط باشد (چزی که در ویرایشگر خود می‌بینید), سپس همچنین این مشابه خط فیزیکی است. 505 | 506 | ضمنا, پایتون توسعه می‌کند از تک بیانه در هر خط استفاده شود که باعث می‌شود کدهایتان خواناتر شود. 507 | 508 | اگر شما می‌خواهید بیشتر از یک خط منطقی روی یک تک خط فیزیکی مشخص کنید برای این کار شما باید به صراحت با استفاده از نقطه و ویرگول (`;`) مشخص کنید. که نشان دهنده پایان یک خط منطقی است. برای مثال: 509 |
510 | 511 | ```python 512 | i = 5 513 | print(i) 514 | ``` 515 | به طور موثر 516 | 517 | ```python 518 | i = 5; 519 | print(i); 520 | ``` 521 | 522 | مشابه‌اش 523 | ```python 524 | i = 5; print(i); 525 | ``` 526 | 527 | دیگر ان 528 | ```python 529 | i = 5; print(i) 530 | ``` 531 |
532 | 533 | ولی *من توصه می‌کنم* که شما طبق این چارچوب *نوشتن یک خط منطقی روی هر خط فیزیکی* این کار را انجام دهید. رازش اینجاست که شما هیچ وقت نباید ازویلگول استفاده کنید. در حقیقت من هیچ وقت یا هرگز از ویلگول در برنامه‌ی پایتون استفاده نمی‌کنم. 534 | 535 | 536 | در حقیقت من هیچ وقت یا هرگز از ویلگول در برنامه‌ی پایتون استفاده نمی‌کنم. 537 | 538 | در این موقعیت یک راه‌حل است جایی که مفهوم واقعا مفید بود را مشخص می‌کند. اگر شما یک کد طولانی یا بزرگ دارید، می‌توانید روی چند خط فیزیکی جدا کنید با استفاده از (backslash) این کار را انجام دهید.این روش به نام _الحاق صریح خط _ می‌نامند. 539 |
540 | 541 | ```python 542 | s = 'This is a string. \ 543 | This continues the string.' 544 | print(s) 545 | ``` 546 |
547 | 548 | خروجی: 549 |
550 | 551 | ``` 552 | This is a string. This continues the string. 553 | ``` 554 |
555 | 556 | مشابه‌اش, 557 |
558 | 559 | 560 | ```python 561 | i = \ 562 | 5 563 | ``` 564 |
565 | 566 | این همان است 567 |
568 | 569 | 570 | ```python 571 | i = 5 572 | ``` 573 | 574 |
575 | 576 | 577 | گاهی اوقات این واضح است که نیاز به استفاده از backslash نداریم .در این مورد خاص خط منطقی زمانی که پرانتز دارد، با براکت یا اکولاد استفاده می‌کنیم(برای پایان دادن استفاده نمی‌کنیم). این موضوع با نام *خط پیوستن ضمنی* می‌نامند. شما می‌توانید این موضوع را در عمل ببینید وقتی در برنامه‌هایمان از کارکترهای [list](./data_structures.md#lists) استفاده می‌کنیم(در فصول بعدی). 578 | 579 | ## فرورفتگی‌ها 580 | 581 | فاصله‌ها در پایتون مهم است. درواقع *فضای خالی در ابتدی خط‌ها مهم است*. این به نام فرورفتگی‌ها شناخته می‌شود. فضای سفید (فضاها و زبانه‌ها)در اغاز خط منطقی برای تعیین سطح دندانه از خط منطقی، که به نوبه خود برای تعیین گروه‌بندی بخش‌ها استفاده می‌شود. 582 | 583 | 584 | این بدان معنی است که بخش‌ها باید تورفتگی‌های همانند همان داشته باشند. هرکدام از این اپروتورها را به نام *بلوک* می‌شناسند. ما خواهیم دید که بلوک‌ها چه نقش مهم دارند(در فصول بعدی). 585 | 586 | این چیز را، باید شما باید درک کنید. تورفتگی نادرست باعث بروز خطا می‌شود برای مثال: 587 | 588 |
589 | 590 | ```python 591 | i = 5 592 | # Error below! Notice a single space at the start of the line 593 | print('Value is', i) 594 | print('I repeat, the value is', i) 595 | ``` 596 |
597 | 598 | وقتی شما این را اجرا می‌کنید، شما خطا‌ی زیر را دریافت می‌کنید: 599 | 600 |
601 | 602 | 603 | ``` 604 | File "whitespace.py", line 3 605 | print('Value is', i) 606 | ^ 607 | IndentationError: unexpected indent 608 | ``` 609 |
610 | 611 | 612 | 613 | فضای اولی که در ابتدای خط دوم وجود دارد، خطای نمایش داده شده که پایتون به ما می‌گوید، خطا برنامه نامعتبر است، یعنی برنامه به درستی نوشته نشده است. این بدان معنا است که شما نمی‌توانید برنامه را اجرا کنید(پس خودسرانه بلوک‌ها و بخش‌ها را نمی‌توان به صورت دلخواه نوشت(البته به جز بلوک پبیش‌فرض که همه را با هم استفاده می‌کنیم، این یک استثنا است)). درباره‌ی این موضوع به طور دقیق در فصل [کنترل‌گردش](./control_flow.md#control_flow) بحث خواهیم کرد، که چه زمان‌های می‌توانید ازبلوک‌های جدید استفاده کنید. 614 | 615 | 616 | 617 | > **چگونگی تورفتگی‌ها** 618 | > 619 | > استفاده از چهار دندانه (یا همان چهار بار فاصله زدن) این توسعه رسمی پایتون است. اگر از ویرایشگر خوب استفاده کنید این کار را ویریشگر به جای شما انجام می‌دهد. مطمئن باشید که تعداد فاصله‌ها با هم یکی باشند. در غیر این صورت برنامه شما کار نمی‌کند یا خطا‌ی غیره منتظره می‌دهد. 620 | 621 | 622 | 623 | 624 | 625 | > **نکات برای برنامه‌های استاتیک** 626 | > 627 | > پایتون همیشه از تورفتگی‌ها در بلوک استفاده می‌کند وهیچ وقت از پرانتز استفاده نخواهد کرد. اجرا کنید `from __future__ import braces` برای یادگیری بیشتر. 628 | 629 | 630 | ## خلاصه 631 | 632 | 633 | حال که ما از بسیاری جزئیات گذشتیم، ما می‌توانیم به قسمت‌های جالب‌تر برسیم، مانند کنترل جریان حرکت‌ها در بخش‌ها. حتما با این نکات اشنا خواهیم شد،با چیزهایی که در این فصل خوانده‌اید. 634 | -------------------------------------------------------------------------------- /control_flow.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | {#control-flow} 4 | 5 | # کنترل گردش 6 | 7 | برنامه‌هایی که تا به حال می‌نوشتیم، یک مجموعه‌ی از فراخوانی‌ها بود که توسط پایتون به صورت مرتب از بالا به پایین اجرا می‌شدند. حال اگر بخواهید گردش را تغییر بدهید باید چه کرد؟ برای مثال اگر بخواهید برنامه کارهای مختلفی در موقعیت‌های مختلف را انجام دهد. همانند چاپ در زمان‌های مختلف روز 'شب‌بخیر' و 'صبح‌بخیر' . 8 | 9 | همان طور که شما حدس زدید این کنترل گردش است. در پایتون با سه روش می‌توان این کار را انجام داد: دستورات - `if`, `for` و `while` 10 | 11 | ## دستور `if` 12 | 13 | دستور `if` برای بررسی شرط استفاده می‌شود. *if(اگر)* شرط برقرار است بلوک اجرا می‌شود(بلوک if فراخوانی می‌شود). *else(وگرنه)* بلوک مربوط به وگرنه(بلوک else فراخوانی می‌شود) بررسی می‌شود. بند *else* اختیاری است. 14 | 15 | برای مثال (فایل `if.py` را ذخیره کنید) 16 | 17 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 18 | 19 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 20 | 21 |
22 | 23 | 24 | 25 | 26 |
{% include "./programs/if.py" %}
27 | 28 |
29 | 30 | 31 | خروجی: 32 | 33 | 34 |
35 | 36 | 37 |
{% include "./programs/if.txt" %}
38 | 39 | 40 | 41 |
42 | 43 | 44 | 45 | **چگونه و چطور** 46 | 47 | در این برنامه فرضیات کاربران را می‌گیریم و فرضیات را بررسی می‌کنیم. برای مثال ایا ورروی عدد است؟. حال متغییری با نام +number+ را با هر عدد صحیح‌ که می‌خواهیم پر می‌کنیم. برای مثال عدد `۲۳` است. در گام بعدی در نظر می‌گیرم که کاربر از تابع `input()` که برای ورودی گرفتن است، استفاده می‌کند. این تابع‌هابرنامه‌های هستند که از چندین بخش برنامه‌های کوچک ساخته شده‌اند. درباره‌ی این موضوع در [ فصل تابع‌ها](./functions.md#functions) بحث خواهیم کرد. 48 | 49 | در گام رشته موجود را با استفاده از تابع `input` می‌گیریم که برروی صفحه‌ای نمایش نشان داده می‌شود و منتظر گرفتن ورودی از کاربر می‌شود. وقتی که که ما چیزی را وارد می‌کنیم و دکمه‌ [enter] کیبورد را فشار می‌دهیم تابع `input()` انچه که ما وارد کرده بودیم رابه صورت یک رشته برمی‌گرداند.بعد ما با استفاده از `int` ان را به عدد تبدیل می‌کنیم و ان را در متغییر برای کاربر فرض کردیم ذخیره می‌کنیم.در صورتکه که `int` کلاس است ولی چیزی که شما ان را باید بدانید ان است که شما می‌توانید برای تبدیل رشته به عدد استفاده کنید(اگر رشته در حد مجاز عدد داشته باشد). 50 | 51 | در گام بعدی ما فرض کاربر را با عددی که ما در نظر گرفته بودیم را بررسی می‌کنیم. اگر این اعداد مساوی هستند چاپ می‌کنیم صحیح است. این نکته را در نظر بگیرید که ما از فاصله‌هاو تورفتگی‌ها استفاده می‌کنیم برای انکه به پایتون بگویم که کدام یک از فراخوانی‌ها مال کدام یک از بلوک‌ها هستند. امیدوارم که تورفتگی‌ها و فاصله‌ها("consistent indentation") را در اینده رعایت کنید. 52 | 53 | توجه داشته باشید که دستور `if` در اخر داری دونقطه می‌باشدکه بعد از ان بلوک دستورات است(با تورفتگی‌ها همچنین). 54 | 55 | در گام بعدی بررسی می‌شود که اگر عدد گفته شده کمتر از عدد ما است به کاربر پیام می‌دهیم که باید عدد بالاتری را حدس برند.دستوری که ما در اینجا استفاده می‌کنیم `elif` است.که دو دستور را `if else-if else` با هم متصل می‌کند و به این صورت می‌شود `if-elif-else`.این روش برنامه‌نویسی و همچنین تعداد تورفتگی ها را کمتر می‌‌کند. 56 | 57 | دستور `elif` و `else` همچنین باید داری دو نقطه باشند. 58 | 59 | در دستور `if` می‌توان از `if` دیگر در داخل ان استفاده کرد به این روش `if`های تودرتو می‌گویند. 60 | 61 | یاداوری قسمت‌ها `elif` و `else` ضروری نیست.`if` تنها کوتاه‌ترین روش است. 62 | 63 |
64 | 65 | 66 | ```python 67 | if True: 68 | print('Yes, it is true') 69 | ``` 70 | 71 |
72 | 73 | 74 | 75 | بعد از اینکه پایتون دستور `if` را همراه با بخش‌های `elif` و `else` اجرا کرد، پایتون به بلوک بعدی می‌رود که در داخل `if` است. در اینجا بلوک اصلی است(جاییکه برنامه اجرا می‌شود). در ادامه دستور `print` و اتمام شرط است`پایان`. 76 | 77 | با اینکه این برنامه یک برنامه ساده است، به نکته‌های مهم اشاره کردم. چیزهای گفتنی گفته شد. همانطور که می‌بینید بسیار ساده است (اگر بخواهیم با پشت صحنه‌ی سی و سی‌پلاس پلاس مقایسه کنیم). دراین گام باید مفهوم این موضوع را درک کنید. بعد از تمرین این موضوع برایتان این یک امر ساده می‌شود. 78 | 79 | 80 | 81 | 82 | >**نکته برای برنامه‌های سی و سی‌پلاس پلاس** 83 | > 84 | > در پایتون دستور `switch` نداریم. از دستور `if..elif..else` می‌توانید برای انجام همان کار‌ها نیز استفاده کنید. همچنین گاهی اوقات هم از [ساختار‌داده‌ها](./data_structures.md#dictionary) برای انجام این کار استفاده می‌کنند. 85 | 86 | ## دستور while 87 | 88 | دستور while برای تکرار یک بلوک استفاده می‌شود، به شرط انکه شرطه گفته شده برقرار باشد. دستور while به نام *looping(حلقه)* همچنین می‌نامند. دستور while می‌تواند به صورت اختیاری قسمت `else` را داشته باشد. 89 | 90 | برای مثال(فایلی با نام `while.py` ذخیره کنید) 91 | 92 | 93 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 94 | 95 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 96 | 97 | 98 | 99 | 100 |
101 | 102 |
{% include "./programs/while.py" %}
103 | 104 |
105 | 106 | خروجی: 107 | 108 |
109 | 110 |
{% include "./programs/while.txt" %}
111 | 112 | 113 |
114 | 115 | 116 | 117 | 118 | **چگونه و چطوری** 119 | 120 | در این برنامه‌هم ما بازی حدس بزن را بازی می‌کنیم ولی مزیت‌اش انیجاست که تا زمانی که درست حدس نزنید این مکان هست که ادامه بدهید. دیگر در اینجا نیاز نیست هر سری برنامه را برای حدس زدن اجرا کنیم(انچه که قبل انجام می‌دادیم).این به طور دقیق توانایی دستور `while` را نمایش می‌دهد. 121 | 122 | ما دستورهای `input` و `if` را به داخل حلقه‌ی `while` تغییر می‌دهیم و متغییر `running` برابر با `True` قبل از حلقه‌ی while قرارمی‌دهیم.در اولین گام ما بررسی می‌کنیم که ایا متغییر `running` برابر است با `True` اگر درست است به *بلوک حلقه‌ی while* می‌رویم.پس از انجام بلوک دوباره شرط بررسی می‌شود که در اینجا متغییر `running` است. اگر درست است که بلوک ااجرا می‌شود وگرنه بلوک else که اختیاری است اجرا می‌شود.بعد ان هم به فراخوانی‌ها گفته شده می‌رود. 123 | 124 | بلوک `else` زمانی اجرا می‌شود که داخل حلقه `while` برابر با `False` باشد.پس هر گاه شرط برقرار نباشد این بلوک اجرا می‌شود.این موضوع را هم در نظر داشته باشید که در حلقه‌ `while` این شرط پشت سرم هم اجرا می‌شود مگر انکه با دستور `break` به ان خاتمه دهید. 125 | 126 | به `True` و `False` نوع بولین می‌گویند و می‌توان یک جورایی با `1` و `0` همسان دانست. 127 | 128 | 129 | 130 | 131 | > **نکته برای برنامه‌های سی و سی‌پلاس پلاس** 132 | > 133 | > بخاطر داشته باشید که برای حلقه‌ی `while` می‌توانید از `else` استفاده کنید. 134 | 135 | ## حلقه‌ `for` 136 | 137 | دستور `for..in` یک فراخوانی در حلقه‌ها است که کار *تکرار* را انجام می‌دهد. ان هم به صورت ترتیبی این کار را انجام می‌دهد.ما جرییات بیشتر درباره‌ی [sequences(ترتیب یا دنباله‌ها)](./data_structures.md#sequence) در فصول بعدی خواهیم دید. شما باید این موضوع را درک کنید که دنباله‌ها فقط یک مجموعه‌ی از دستورالعمل هستند. 138 | 139 | مثال (فایلی با نام `for.py` ذخیره کنید) 140 | 141 |
142 | 143 |
{% include "./programs/for.py" %}
144 | 145 |
146 | 147 | خروجی: 148 | 149 |
150 | 151 |
{% include "./programs/for.txt" %}
152 | 153 | 154 |
155 | 156 | 157 | **چگونه و چطوری** 158 | 159 | در این برنامه ما *دنباله‌ی* از اعداد را چاپ می‌کنیم. ما این دنباله را با استفاده از تابع `range` می‌سازیم. 160 | کاری که ما اینجا انجام می‌دهیم باید دو عدد را در نظر بگیریم برای `range` یک عدد برای شروع دنباله و عدد دوم برای پایان دنباله.برای مثال `(range(1,5` نتیجه‌ی دنباله‌اش `[1, 2, 3, 4]` می‌شود.در حالت عادی گام‌های `range` یکی یکی است. اگر بخواهیم این را تغییر بدهیم کافی عدد سومی را به `range` اضافه کنیم. برای مثال `(range(1,5,2` نتیجه‌ی دنباله‌‌اش `[1,3]` می‌شود. این نکته را در نظر داشته باشید که range(دامنه) تا عدد دوم اضافه می‌شود. 161 | 162 | این نکته را در نظر دشته باشید که `()range` هر بار یک عدد را می‌سازد. اگر شما لیست کامل را می‌خواهید باید `()list` را صدا بزنید. برای مثال `((list(range(5` که نتیجه‌اش `[0, 1, 2, 3, 4]` میشود.list در بخش [ ساختار داده ](./data_structures.md#data-structures) توضیح داده می‌شود. 163 | 164 | 165 | حلقه‌ی `for` براساس این دامنه `(for i in range(1,5` که همانند `[for i in [1, 2, 3, 4` این دامنه است این کار را انجام می‌دهد.بدان معنی که هر عدد هر بار به ترتیب به i اضافه می‌شود.سپس دوباره به تعداد مقدار i ،بلوک for اجرا می‌شود. در این برنامه ما فقط مقدار بلوک را چاپ می‌کنیم. 166 | 167 | به یاد داشته باشید که بخش `else` اختیاری است. اگر شامل این بخش باشد، این بخش پس از یک بار اجرا شدن حلقه‌ی `for` اجرا می‌شود به شرط انکه از << دستور ,break>> استفاده نشده باشد. 168 | 169 | به یاد داشته باشید که حقله‌ی `for..in` برای هر دنباله‌ی کار می‌کند. در اینجا از `range` برای ساختن اعداد استفاده کردیم ولی می‌توانیم برای روش‌های دیگر نیز استفاده کنیم. در مورد این موضوع در فصول بعدی بحث خواهیم کرد. 170 | 171 | 172 | 173 | > **نکته برای برنامه‌های سی ، سی‌پلاس‌پلاس، جاوا ، سی شارپ** 174 | > 175 | > حلقه‌ی `for` در پایتون از ریشه با برنامه سی و سی‌پلاس‌پلاس تفاوت دارند. ولی برنامه‌نویسان سی‌شارپ به این نکته توجه کنند که حلقه‌ی `for` پایتون شبیه حلقه‌ی `foreach`سی‌شارپ است. برای برنامه‌نویسان جاوا هم همینطور است 176 | (حلقه‌ی `for (int i : IntArray)` در جاوا ۱.۵). 177 | > 178 | > در برنامه‌نوسی سی وسی‌پلاس‌پلاس اگر شما می‌خواستید همچین حلقه‌ی `(++for (int i = 0; i < 5; i` را بنویسید در پایتون کافی است این دستور را `(for i in range(0,5` بنویسد. همانطور که می‌بینیدحلقه‌ی `for` خیلی اسان‌تر وساده‌تر شده است.همین موضوع باعث کمتر شدن خطا در پایتون می‌شود. 179 | 180 | 181 | {#break-statement} 182 | ## دستور break 183 | 184 | دستور `break` برای قطع کردن حلقه و خارج شدن از حلقه استفاده می‌شود. حتی اگر در حلقه نتیجه‌اش `False` نباشه ویا حلقه کامل اجرا نشده باشد، با این دستور از حلقه خارج می‌شوید. 185 | 186 | توجه داشته باشید که اگر دستور *break* را در حلقه‌های `for` یا `while` استفاده می‌کنید دیگر بخش `else` **اجــرا نـــخواهد شـــد**. 187 | 188 | برای مثال (فایلی با نام `break.py` ذخیره کنید) 189 | 190 | 191 |
192 | 193 |
{% include "./programs/break.py" %}
194 | 195 |
196 | 197 | خروجی: 198 | 199 |
200 | 201 |
{% include "./programs/break.txt" %}
202 | 203 | 204 |
205 | 206 | **چگونه و چطوری** 207 | 208 | در این برنامه ما دوباره از کاربر ورودی می‌گیریم و طول ورودی را هر بار محاسبه می‌کنیم. اما شرطی قرار می‌دهیم که اگر ورودی کاربر `'quit'` بود از برنامه خارج شود.اینکار با استفاده از دستور *breaking* در حلقه انجام می‌شود. 209 | 210 | اما طول رشته وروردی با استفاده از تابع `len` محاسبه می‌شود. 211 | 212 | این نکته را هم به یاد داشته باشید که دستور `break` در حلقه‌ی `for` قابله استفاده است. 213 | 214 | **Swaroop's : اشعار پایتون ** 215 | 216 |
217 | 218 | ``` 219 | Programming is fun 220 | 221 | (برنامه‌نویسی یک سرگرمیه) 222 | 223 | When the work is done 224 | 225 | (وقتی کار تمومه) 226 | 227 | if you wanna make your work also fun: 228 | 229 | (اگر می‌خواهید کارتون رو تبدیل به سرگرمی کنید:) 230 | 231 | use Python! 232 | 233 | (از پایتون استفاده کنید!) 234 | 235 | ``` 236 | 237 |
238 | 239 | {#continue-statement} 240 | ## دستور `continue` 241 | 242 | دستور `continue` در پایتون برای نادیده گرفتن شروط در بلوک مربوطه استفاده می‌شود و دستورات بعدی را `continue` را اجرا می‌کند. 243 | 244 | برای مثال(فایلی با نام `continue.py` ذخیره کنید) 245 | 246 |
247 | 248 |
{% include "./programs/continue.py" %}
249 | 250 |
251 | 252 | خروجی: 253 | 254 |
255 | 256 |
{% include "./programs/continue.txt" %}
257 | 258 |
259 | 260 | **چگونه و چطوری** 261 | 262 | در این برنامه از ورودی کابر استفاده می‌کنیم. اما شرطی دارد ان هم که اگر رشته‌ی وروری کمتر ۳ کلمه طول داشته باشد و با استفاده از دستور `len` طول رشته را به دست می‌اوریم و اگر طول رشته کمتر سه تا بود ان موقع ما بلوک بعدی `continue` را نادیده میگیریم. در غیر این صورت دستور بلوک را ادامه می‌دهیم و عملیات مربوط ان بلوک را انجام می‌دهیم. 263 | 264 | این نکته را هم در نظر داشته باشید که دستور `continue` در حلقه `for` نیز می‌توان استفاده کرد. 265 | 266 | ## خلاصه 267 | 268 | ما دیدیم که چگونه از سه دستور `if`، `while` و `for` همچنین `break` و `continue` استفاده کنیم. این یکی از بخش‌های که خیلی در پایتون استفاده میشود و این موضوع باعث می‌شود برنامه‌ها کمی راحت‌ترکار‌کنند. 269 | 270 | در فصول بعدی خواهیم دید که چگونه از تابع‌ها استفاده کنیم. 271 | -------------------------------------------------------------------------------- /data_structures.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # ساختار داده‌ها 4 | 5 | ساختارهای داده اساسا یک *ساختاری* رو در خود نگه داری می‌کند. که این قابلیت را دارند که *داده‌های* را در خود نگه دارند. به عبارت دیگر ساختار داده برای ذخیره سازی مجموعه‌ی از داده‌های به هم مرتبط استفاده می‌‌شود. 6 | 7 | در پایتون چهار نوع داده وجود دارد list ،tuple ،dictionary و set که هر کدام از این‌ها مورد برسی قرار می‌گیرد و خواهید دید که چگونه با استفاده از این ابزارها زندگی خود را راحت‌تر می‌کنیم. 8 | 9 | ## لیست 10 | 11 | لیست چیست؟ ساختار داده‌ای است که مجموعه‌ی از ایتم‌های منظم را در خود نگه داری می‌کند. برای مثال این امکان وجود دارد که *دنباله‌ی* از اقلام را در یک لیست ذخیره کنید. 12 | ساده تر بگم تصور کنید که یک لیست خرید دارید که اقلام ان در خط‌های جداگانه نوشته شده درسته؟، در حالی که در پایتون همین لیست بر روی یک خط با کاما از هم جدا شده است. به همین راحتی!! 13 | 14 | این لیست اقلام باید `ab` داخل '[ ]'square brackets گذاشته شوند تا پایتون بفهمد که شما دارید از 'list' استفاده می‌کنید. 15 | بعد ایجاد یک لیست امکاناتی نظیر جتستجو کردن، پاک کردن، اضافه کردن اقلام برخوردار خواهید بود. 16 | 17 | از انجای که این لیست قابلیت اضاف‌کردن، پاک‌کردن دارد، پس می‌توانیم بگوییم که این لیست *(از نوع قابل تغییر)mutable* است. به همین راحتی! 18 | 19 | ## مقدمه‌ کوچکی درباره‌ی اشیاء و کلاس‌ها 20 | 21 | گرچه تا به امروز بحث و گفتگو درباره‌ی اشیا و کلاس‌ها را به تاخیر انداخته‌ایم. ولی برای درک بهتر لیست یک توضیح کوچکی نیاز است. این موضوع را در [بخش بعدی](./oop.md#oop) دقیق برسی خواهیم کرد. 22 | 23 | برای درک بهتر به مثال زیر توجه کنید. 24 | 25 | وقتی که یک متغییر را مقداری را به ان اختصاص می‌دهیم `i=5` ، یک *شی* ساخته ایم. متغییر `i` کلاسی است از نوع `int`. 26 | برای درک بهتر `help(int)` را می‌توانید مطالعه کنید. 27 | 28 | کلاس‌ها این امکان را دارند که از *methods* استفاده کنند. برای مثال پایتون *متدی* به نام `append` دارد که می‌تواند یک ایتم به انتهای لیست اضافه کند. 29 | برای مثال: `mylist.append('ali')` 30 | 31 | همانطور که در مثال بالا می‌بینید ایتم ali را به mylist اضافه می‌کند. نکته با استفاده از نقطه امکان دسترسی به متد‌های ان اشیا را داریم. 32 | 33 | یک کلاس همچنین می‌تواند *fields* داشته باشد. این متغییرها/نام‌ها را زمانی می‌توانید استفاده کنیدکه شی از ان کلاس داشته باشید. فیلد های هم با نقطه قابل دسترس هستند. برای مثال:`mylist.field` 34 | 35 | 36 | 37 | 38 | برای مثال (فایل `ds_using_list.py` را ذخیره کنید) 39 | 40 |
41 | 42 | 43 |
{% include "./programs/ds_using_list.py" %}
44 | 45 |
46 | 47 | 48 | خروجی: 49 | 50 |
51 | 52 |
{% include "./programs/ds_using_list.txt" %}
53 | 54 |
55 | 56 | 57 | 58 | 59 | **چگونه و چطور** 60 | 61 | متغییر `zoo` به یک دسته از ایتم‌ها اشاره دارد. همچنین می‌دانیم که تابع `len` می‌تواند طول یک رشته را به دست بیاورد. پس این متغییر به ما می‌گوید که من یک [رشته](#sequence) هستم. 62 | 63 | حالا قسط داریم تمام حیوانات را به یک **باغ وحش جدید چندتایی** ببریم بخاطر اینکه باغ وحش قدیمی دارد بسته می‌شود.بنابراین `new_zoo` حاوی حیواناتی است که در حال حاضر وجود دارند و حیواناتی که از باغ وحش قدیمی گرفتیم. زیادی خوتون گیج و درگیر نکیند کمی جلو تر موضوع را خواهید فهمید. 64 | 65 | با استفاده از دوجفت '[ ]' می‌توانیم موقعیت حیوانات را در لیست مشخص کنیم که کدام حیوان در کجا قرار گرفته است. به این روش _indexing_ می‌گویند. 66 | برای مثال با استفاده از `[new_zoo[2` امکان دسترسی به سومین بخش از باغ وحش را داریم. 67 | حال به این دستور نگاه کنید `[new_zoo[2][2` امکان دسترسی به طبقه سوم باغ وحش بخش سوم را داریم. جالب مگه نه! 68 | به این مفهوم در پایتون tuple (چندتایی) می‌گویند. 69 | 70 | 71 | 72 | 73 | 74 | >**نکته برای برنامه‌نویسان پریل** 75 | > 76 | > 77 | 78 | دستور لیست هویت خود را همانند پریل از دست نمی‌دهد. این خاصیت در لیست های تو در تو و چندتای هم به همین صورت است. این‌ها شی‌های هستند که ذخیره در شی‌های دیگر می‌شوند. 79 | 80 | ## لغت نامه 81 | 82 | یک فرهنگ لغت همانند کتابی است با ادرس‌ها وجزییات تماس با افراد تنها با دانستن نام می‌توانید هر کسی را پیدا کنید. این مفهومی است برای دستور 'Dictionary'. 83 | برای مثال ما *keys* را با *مقداری* مرتبط می‌کنیم. 84 | این تکته را بخاطر داشته باشید که کلید باید منحصر به فرد باشد. چون ممکن است اطلاعات به درستی تحلیل نشوند، برای مثال اگر نام دوفرد مثل هم باشد. ممکن است به فرد مورد نیازی که خواسته بوده‌اید نرسید. 85 | 86 | برای نام کلیدها باید نامی باشد که تغییر نیابد ولی برای مقدار ان اگر تغییر یافت مشکلی ندارد. پس برای کلیدها باید یک شی ساده‌ای را استفاده کینم. پس این نتیجه را می‌گیرم که کلیدی که ساخته‌ایم باید منحصربه‌فرد باشد. 87 | 88 | جفت کلیدها و مقادیر ان در Dictionary به صورت زیر نوشته می‌شود.`d = {key1 : value1, key2 : value2 }`. همان طور که می‌بینید جفت کلید با ویلگول از هم دیگر جدا شده اند و در یک کروشه قرار گرفته اند. 89 | 90 | به یاد داشته باشید داشتن یک جفت کلید عمل مرتب‌سازی اتفاق نمی‌افتد. 91 | اگر یک فرهنگ مرتب می‌خواهید باید از قابل خودتان ان را مرتب کنید. 92 | لغت‌نامه‌هایی که اینجا از ان استفاده می‌کنید جزء اشیاء کلاس `dict` هستند. 93 | 94 | 95 | برای مثال (فایل `ds_using_dict.py` را ذخیره کنید) 96 | 97 |
98 | 99 | 100 |
{% include "./programs/ds_using_dict.py" %}
101 |
102 | 103 | 104 | خروجی: 105 |
106 | 107 | 108 |
{% include "./programs/ds_using_dict.txt" %}
109 | 110 |
111 | 112 | 113 | 114 | **چگونه و چطوری** 115 | 116 | با استفاده از روش‌های که قبلا گفتیم یک دایرکتوری به نام `ab` ایجاد می‌کنیم. با رعایت دستور العمل ساده با مشخص کردن دوجفت کلید با استفاده از ایندکس به جفت کلید ارزش می‌دهیم همانطور که در بحث لیست گفته شد. 117 | حال بااستفاده از دوست قدیمی دستور `del` می‌توانیم key-value را حذف کنیم. کارمون فقط مشخص کردن دایرکتوری ،ایندکس است که کلید حذف شود از این بعداش با دستور `del` است. در این روش نیازی به دانستن مقدار کلید نیست. 118 | 119 | 120 | در گام بعدی با روش `items` دسترسی به هر جفت کلید دایرکتوری که خودش اجازه دسترسی tuples و ایتم ها می‌دهد را داشته باشیم. این جفت کلید ها را بازیابی می‌کنیم و به ان متیغیر ها `نام` و `ادرسی` می‌دهیم. 121 | با استفاده از حلقه `for..in` این مقادیر را در for-block چاپ می‌کنیم. 122 | 123 | 124 | همچنین با استفاده از ایندکس دوجفت کلید دیگر را اضافه و ارزشی به ان اختصاص دهیم.مثل موارد فوق که انجام دادیم. 125 | 126 | با استفاده از اپراتور `in ' می توانیم بررسی کنیم که این جفت کلید-ارزش وجود دارد. 127 | 128 | 129 | برای لیست روش های کلاس `dict`، به« کمک (dict) »مراجعه کنید. 130 | 131 | > ** کلمات کلیدی Arguments and Dictionary ** 132 | > اگر از روش کلید واژه در توابع خود استفاده کرده‌اید حواستان باشد که در پارامتر تعریف تابع ارزش جفت کلیدها مشخص شده باشد. وقتی کلید را فراخوانی می‌کنید کلیدی از دایرکتوری هاست.(که در جدول کامپایلر به نام _symbol table_ شناخته می‌شود. 133 | 134 | 135 | ## رشته‌ها 136 | 137 | لیست، tuples همه‌ی این‌ها نمونه‌ای از رشته‌ها هستند. ولی چه چیز انقدر رشته ‌ها را خاص می‌کند؟ 138 | 139 | ویژگی‌ها اصلی عبارت از اند: *membership tests*، *indexing operations* که این امکان را می‌دهد بخشی از رشته دسترسی مستقیم داشته باشیم. 140 | 141 | سه نوع رشته داریم:lists, tuples ،strings 142 | 143 | همچنین عملیات *slicing* یا برش دادن که اجازه می‌دهد به بخشی از رشته درسترسی داشته باشیم. 144 | 145 | 146 | برای مثال (فایل `ds_seq.py` را ذخیره کنید) 147 | 148 |
149 | 150 |
{% include "./programs/ds_seq.py" %}
151 |
152 | 153 | خروجی: 154 | 155 |
156 | 157 | 158 |
{% include "./programs/ds_seq.txt" %}
159 | 160 |
161 | 162 | **چگونه و چطوری** 163 | 164 | اول از همه دیدیم که چگونه از ایندکس استفاده کنیم که ایتم خاصی را از رشته بازمی‌گرداند. این روش در _عملوند‌ها_ اشاره شده است. هر زمان که یک عدد را در پایتون در داخل ` []` بگذارید همانطور که در بالا نشان داده شده است. پایتون ان ایتم را از داخل رشته استخراج می‌کند. این نکته را در نظر داشته باشید که شمارش پایتون از مقدار صفر شروع می‌شود. 165 | از این رو اگر ایتم اول را می‌خواهیم استخراج کنیم باید `[shoplist [0` از همچین چیزی استفاده کنیم عدد صفر مقدار اولیه ایتم را بازمی‌گرداند. 166 | حال اگر چهارمین ایتم را استخراج کنیم از چه عددی استفاده می‌کنیم؟ 167 | 168 | 169 | بله درست سه : 170 | 171 | 172 | 173 |
174 | `shoplist[3]` 175 | 176 |
177 | 178 | 179 | ایندکس که برای استخراج رشته به استفاده می‌اید می‌تواند یک عدد منفی باشد. در این صورت رشته را از انتها می‌خوانیم. بنابراین `[shoplist[-1` این دستور مقدار اخرین رشته و `[shoplist[-2` دومین را از اخر رشته بازمی‌گرداند. 180 | 181 | عملیات برش دادن هم در داخل ` []` انجام می‌شود با این تفاوت که عددی که وارد می‌کنیم را با دونقطه از هم دیگر جدا می‌کنیم. این بسیار شبیه همین رشته‌های ایندکسی که در بالا استفاده کردید هست. نکته اعداد اختیاری هستند ولی دونقطه اختیاری نیستند. 182 | 183 | اولین شماره قبل از دونقطه عملوند برش هست که از کجا رشته برش می‌خورد. عدد دوم هم که ایندکس رشته هست. اگر شماره اول مشخص نشده باشد پایتون از اول رشته شروع می‌کند، اگر از رشته دوم خارج شود پایتون از انتهای رشته متوقف می‌شود. 184 | 185 | نکته قطعه بازگشتی موقعیت _starts_ از جای شروع، شروع می‌کند و موقعیت پایان درست قبل از _end_ پایان می‌یابد یعنی موقعیت شروع. پس موقعیت پایان از رشته خذف می‌شود. 186 | 187 | پس `[shoplist[1:3` این تکیه‌ی از رشته در موقعیت یک ۱ را بازمی‌گرداند، که شامل موقعیت دو هم می‌شود که در موقعیت ۳ متوقف می‌شود پس بنابراین یک *slice* دو ایتم را باز‌میگرداند. به طور مشابه: `[:]shoplist` این تمامی رشته‌ها را بازمی‌گرداند. 188 | 189 | از این استدلال هم می‌توانید استفاده کنید. _step_ برای قطعه‌ها.(به طور پیش فرض هر گام برابر یک است) 190 | 191 |
192 | 193 | ```python 194 | >>> shoplist = ['apple', 'mango', 'carrot', 'banana'] 195 | >>> shoplist[::1] 196 | ['apple', 'mango', 'carrot', 'banana'] 197 | >>> shoplist[::2] 198 | ['apple', 'carrot'] 199 | >>> shoplist[::3] 200 | ['apple', 'banana'] 201 | >>> shoplist[::-1] 202 | ['banana', 'carrot', 'mango', 'apple'] 203 | ``` 204 | 205 | 206 |
207 | 208 | نکته وقتی که گام برابر ۲ است موقعیت صفر، دو 0, 2 بازگردانده می‌شود. وقتی گام ۳ است ایتم صفر، سه 0, 3 بازگردانده می‌شود. 209 | 210 | 211 | با استفاده از ترکیبات مختلف در پایتون به طور تعاملی تر و سریع تر سعی کنید نتایج را بیابید. چیز بزرگ در مورد رشته‌ها این است که tuples, lists and strings می‌توانید به همان شیوه دسترسی پیدا کنید. 212 | -------------------------------------------------------------------------------- /dedication.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | از این نکته هم با خبریم که خیلی سری می‌ریم سر اصل متلب برای راحتر خواندن به [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) سر بزنید. 4 | 5 | 6 | 7 | 8 | # فداکاریها 9 | 10 | به یاد [Kalyan Varma](http://www.kalyanvarma.net/) و همچنین خیلی‌ از افراد دیگر در دانشگاه [PESIT](http://www.pes.edu/) که ما را با دنیای گنولینوکس و متن‌باز اشنا کردن. 11 | 12 | همچنین یادی از [Atul Chitnis](http://www.nextbigwhat.com/atul-chitnis-obituary-297/) دوست و راهنمایی که تا یک حدی از دست رفته. 13 | 14 | [pioneers who made the Internet happen](http://www.ibiblio.org/pioneers/index.html) این کتاب اولین با در سال ۲۰۰۳ نوشته شده بود هنوز هم مشهور است، واقعا جای تشکر دارد. همچنین به لطف ماهیت دانش اشتراک گذاری در اینترنت که توسط پیشگامان پرورانده شد. 15 | -------------------------------------------------------------------------------- /feedback.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # بازخوردها 4 | 5 | کتاب نیاز به کمک از طرف خواننده‌های این کتاب دارد. کسانی مثل شما، که قسمت‌های قوت و ضعف کتاب را می‌شناسند(حتی اشتباهی کوچکی که ممکن است به چشم بخورد). لطفا [نویسنده‌ی اصلی را بنویسید] ({{ book.contactUrl }}) و یا با مشاهده [مترجمین](./translations.md#translations) نظرات و پیشنهادات خود را بنویسید. 6 | -------------------------------------------------------------------------------- /first_steps.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # گام اولیه 4 | 5 | 6 | حالا وقتش رسیده که برنامه سنتی 'Hello World' را در پایتون اجرا کنیم. این به شما نوشتن، ذخیره کردن و اجرای برنامه‌ی پایتون را یاد می‌دهد. 7 | 8 | 9 | دو روش برای اجرای برنامه‌ی شما در پایتون موجود است. با استفاده از مترجم تعاملی و یا با استفاده منبع فایل می‌توانیم این کار را انجام دهیم. حال، چگونگی استفاده از هر دو روش را خواهیم دید. 10 | 11 | 12 | ## استفاده از شل تعاملی 13 | 14 | ترمینال خود را در سیستم عامل خود باز کنید(همانطور که قبلا در فصل [نصاب](./installation.md#installation) ) اشاره شد. 15 | بعد برنامه‌ی پایتون را باز کنید. با نوشتن `Python3` دکمه‌[enter]` کیبورد را فشار دهید. 16 | 17 | پس از انکه پایتون را اجرا کردید شما همچین سمبلی `>>>` را مشاهده خواهید کرد.جاییکه شما می‌توانید مسائل خود را تایپ کنید. به این _مترجم تعاملی پایتون_ (_Python interpreter prompt_) می‌گویند. 18 | 19 | در مترجم فوری: 20 | 21 |
22 | 23 | 24 | ```python 25 | print("Hello World") 26 | ``` 27 | 28 |
29 | 30 | 31 | بعد از فشار دادن کلید `[enter]` کیبورد، شما باید جمله‌ی `Hello World` را چاپ شده برروی صفحه نمایش خود ببینید. 32 | 33 | در اینجا یک مثالی از کامپیوتر مکینتاش خواهید دید. جزئیات درباره‌ی برنامه‌های پایتون ممکن است در کامپیوترهای شما متفاوت باشند. اما (بعد از این سمبل `>>>`) باید یکی باشد اگرچه سیستم عامل‌ها متفاوت باشند. 34 | 35 |
36 | 37 | ```python 38 | > python3 39 | Python 3.5.1 (default, Jan 14 2016, 06:54:11) 40 | [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin 41 | Type "help", "copyright", "credits" or "license" for more information. 42 | >>> print("Hello World") 43 | Hello World 44 | ``` 45 | 46 |
47 | 48 | توجه داشته باشید که، پایتون سریعا جواب یا خروجی را می‌دهد. چیزی که همین الان نوشتید این یک _دستور_ پایتون است. ما برای چاپ هر مقداری از `print` (جایی برای تعب نیست) استفاده می‌کنیم. در اینجا ما از متن `Hello World` استفاده کردیم. که سریعا برروی صفحه‌ی نمایش نشان داده می‌شود. 49 | 50 | ### چگونگی خارج شدن از شل 51 | 52 | اگر شما از گنو لینوکس با مک استفاده می‌کنید برای خارج شدن کافی است از کلید `[ctrl + d]` یا نوشتن `exit()` (پراتنز `()` را به یاد داشته باشید ) و برروی دکمه‌ی `[enter]` کیبورد فشار دهید، می‌توان این کار را انجام دهید. 53 | 54 | اگر هم از خط فرمان ویندوز استفاده می‌کنید با استفاده از کلید`[ctrl + z]` و بعد برروی دکمه‌ی `[enter]` کیبور فشار دهید، می‌توان این کار را انجام دهید. 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | ## انتخاب ویرایشگر 63 | 64 | هر سری برنامه‌ی خود را نمی‌توانیم در شل پایتون وارد کنیم. هر وقت می‌خواهیم برنامه‌ی را اجرا کنیم باید ان را در یک فایل ذخیره کنیم و از این به بعد هر بار که نیاز داشتیم می‌توانیم ان را اجرا کنیم. 65 | 66 | برای ساخت فایل منبع در پایتون(منظورذخیره‌‌داشتن‌فایل‌است)، نیاز به نرم‌افزار ویرایشگر داریم. که برنامه‌نویسی، ذخیره بتوانیم کنیم. ویریشگر خوب زندگیتان را اسان می‌کند تا برنامه‌نویسی را راحتر و اسان‌تر انجام دهید. همچنین قابلیت ذخیره‌سازی داشته باشید. پس در نتیجه انتخاب ویرایشگر یک عامل موثر است. همانطور که با ری دادن ریئس جمهور انتخاب می‌کنید، باید ویرایشگر خود را نیز انتخاب کنید. ویرایشگر خوب در برنامه‌نویسی پایتون کمک می‌کند، که کار را راحتر و سفر که در پیش دارید را با امکانات بیشتر طی کنید. همچنین جلوگیری از هر گونه خطا میکند، همچنین با امنیت‌ بیشتر و ساده نویسی می‌توانید این کار را انجام دهید. 67 | 68 | یکی از الزامات بسیار اساسی _syntax highlighting 69 | (هایلایت کردن خطا)_ که تمامی بخش‌های مختلف ان را می‌توانید به صورت رنگی ببینید. پس در نتیجه به راحتی می‌توانید برنامه خود را مجسم کنید و کارکرد اجرای ان را ببینید. 70 | 71 | اگر شما هیچ ایده‌ای ندارید از کجا شروع کنید، من توسعه می‌کنم با استفاده از نرم‌افزار [پای‌چارم Educational Edition](https://www.jetbrains.com/pycharm-edu/) که برای ویندوز، گنو لینوکس و مکینتاش موجود است. جزیئیات بیشتر در بخش‌های بعدی موجود است. 72 | 73 | اگر از ویندوز استفاده می‌کنید *از ویرایشگر نُت‌پد استفاده نکیند*، این یک انتخاب اشتباه است. بخاطر اینکه خطا‌ها را هایلایت (syntax highlighting) نمی‌کند و از همه مهم‌تر فاصله‌ها را رعایت نمی‌کند و این نکته خیلی مهم است که در قسمت‌های بعدی مشاهده خواهیم کرد. ویرایشگر خوب به طور خودکار این کار‌ها را انجام می‌دهد. 74 | 75 | 76 | اگر برنامه‌نویس حرفه‌ای هستید فکر کنم که از [ویم](http://www.vim.org) یا [ایمکس](http://www.gnu.org/software/emacs/) استفاده می‌کنید. نیاز می‌دانم که این موضوع را بگویم که این دو ویرایشگر دوتا از ویریشگر‌ها قدرتمند هستند و استفاده از انان برای برنامه‌نویسی پایتون مفید واقع خواهد شد. خودم به شخصه از هر دو برای برنامه‌نوسی‌ استفاده می‌کنم. حتی یک اموزش برای ویم درست کردم. [entire book on Vim]({{ book.vimBookUrl }}) 77 | 78 | اگر حاضرید که وقت خود را برای یادگیری ویرایشگر ویم یا ایمکس بگذارید توسعه می‌کنم یکی از این ویرایشگرها را یاد بگیرید. چون در اینده خیلی برایتون مفید واقع خواهد شد. همان طور که قبلا گفتم کسانی که تازه شروع کرده‌اند می‌توانند از پای‌چارم برای یادگیری پایتون استفاده کنند(برای ویرایشگر در حال حاضر). 79 | 80 | تکرار: لطفا یک ویرایشگر مناسب انتخاب کنید. این موضوع باعث می‌شود برنامه‌نویسی پایتون را سرگرم کننده و اسان‌تر کند. 81 | 82 | 83 |
84 | 85 | ## پای‌چارم {#pycharm} 86 | 87 | 88 |
89 | 90 | [اموزش ویرایشگر پای‌چارم](https://www.jetbrains.com/pycharm-edu/) این یک ویرایشگر رایگان است که شما می‌توانید برای برنامه‌نویسی پایتون استفاده کنید. 91 | 92 | هنگامی که پای‌چارم را باز می‌کنید، این نوشته را خواهید دید، `Create New Project` برروی ان کلیک کنید: 93 | 94 | 95 | ![زمانی که پای‌چارم را باز می‌کنید](./img/pycharm_open.png) 96 | 97 | `Pure Python` انتخاب کنید: 98 | 99 | ![پای‌چارم ایجاد پروژه‌ی جدید](./img/pycharm_create_new_project.png) 100 | 101 | فایل‌ `untitled` را به `helloworld` تغییر بدهید. همچنین محل پروژه و جزییات را باید به این شکل ببینید: 102 | 103 | ![جزئیات پروژه پای‌چارم](./img/pycharm_create_new_project_pure_python.png) 104 | 105 | برروی کلید `Create` کلیک کنید: 106 | 107 | برروی `helloworld` راست کلیک کنید. در نوار کناری `New` -> `Python File` را انتخاب کنید: 108 | 109 | ![پای‌چارم -> New -> Python File](./img/pycharm_new_python_file.png) 110 | 111 | درخواست می‌شود اسم را وارد کنید، `hello` را وارد کنید. 112 | 113 | 114 | ![کادرمحاوره‌ی پای‌چارم، فایل جدید](./img/pycharm_new_file_input.png) 115 | 116 | حالا فایل باز شده را می‌توانید ببینید: 117 | 118 | ![فایل پای‌چارم hello.py ](./img/pycharm_hello_open.png) 119 | 120 | خطوط موجود را پاک کرده و متن زیر را وارد کنید: 121 | 122 | 123 | 124 | 125 | 126 |
127 | 128 | 129 | ```python 130 | print("hello world") 131 | ``` 132 | 133 | 134 |
135 | 136 | حالا برروی متنی که نوشته‌اید راست کلیک کنید (بدون انتخاب متن) و برروی `Run 'hello'` کلیک کنید. 137 | 138 | ![پای‌چارم اجرایی 'hello'](./img/pycharm_run.png) 139 | 140 | 141 | و حالا باید نتیجه‌ی برنامه را ببینید(چیزی که چاپ می‌کند). 142 | 143 | ![پای‌چارم خروجی](./img/pycharm_output.png) 144 | 145 | 146 | اوف!، برای شروع به کار، این چند گام بود. ولی از این به بعد هر گاه می‌خواهیم فایل جدیدی را بسازید، از یاد نبرید برروی `helloworld` راست کلیک کنید و `New` -> `Python File` را انتخاب کنید و راه‌های قبلی که بالا اشاره شده بود را طی کنید. 147 | 148 | شما می‌توانید اطلاعات بیشتری را درباره‌ی پای‌چارم در لینک [پای‌چارم شروع سریع](https://www.jetbrains.com/pycharm-educational/quickstart/) مشاهده نمایید. 149 | 150 | 151 | 152 | 153 | ## ویم 154 | 155 |
156 | 157 | 158 | ۱. نصب [ویم](http://www.vim.org). 159 | 160 | * کاربران مکینتاش باید از بسته‌ی `macvim` از طریق [HomeBrew](http://brew.sh/) نصب کنند. 161 | 162 | * کاربران ویندوز باید از [وبسایت ویم](http://www.vim.org/download.php) دانلود و نصب کنند. 163 | 164 | * کاربران گنولینوکس باید ویم را از منبع وابستگی‌ها نصب کنند. برای دبیان و اوبونتو می‌توانند از بسته‌ی ویم استفاده کنند. 165 | 166 | ۲. نصب پلاگین [jedi-vim](https://github.com/davidhalter/jedi-vim) برای خودکار پر کردن( autocompletion). 167 | 168 | ۳. نصب بسته مورد نیاز `jedi` برای پایتون : 169 | 170 |
171 | 172 | 173 | ` pip install -U jedi` 174 | 175 |
176 | 177 | 178 | 179 | ## ایمکس 180 | 181 |
182 | 183 | ۱. نصب [ایمکس ۲۴](http://www.gnu.org/software/emacs). 184 | 185 | * کاربران مکینتاش باید ایمکس از http://emacsformacosx.com دانلود کنند. 186 | 187 | * کابران ویندوز باید ایمکس از http://ftp.gnu.org/gnu/emacs/windows/ دانلود کنند. 188 | 189 | * کاربران گنولینوکس باید ایمکس از منبع وابستگی‌ها نصب کنند. برای دبیان و اوبونتو می‌توانند از بسته‌ی `ایمکس ۲۴` استفاده کنند. 190 | 191 | ۲. نصب [ELPY](https://github.com/jorgenschaefer/elpy/wiki). 192 | 193 | 194 | 195 | ## استفاده از منبع فایل 196 | 197 | حالا وقتش که به برنامه‌نویسی خود برگردیم. یک سنتی وجود دارد. وقتی شما زبان برنامه نویسی جدید یاد می‌گیرد، اولین برنامه‌ی را که می‌نویسید و اجرا می‌کنید این برنامه برنامه‌ی 'Hello World' است. تمام کاری که انجام می‌دهد این است که 'Hello World' را چاپ می‌کند. همانطور که Simon Cozens [^1] گفته است "این یک طلسم سنتی است که خدای برنامه نویسی نازل کرده تا بهتر برنامه‌نویسی را یاد بگریم". 198 | 199 | از انتخاب ویرایشگر شروع کنید، برنامه‌ی بعدی را وارد کنید و ان را با نام`hello.py` ذخیره کنید. 200 | 201 | اگر شما از پای‌چارم استفاده می‌کنید، ما قابلا [درباره‌ی ذخیره سازی فایل توضیح داده‌ایم ](#pycharm). 202 | 203 | برای دیگر ویرایشگرها یک فایل جدید`hello.py` بازکنید و برنامه‌ی زیر را وارد کنید: 204 | 205 |
206 | 207 | 208 | ```python 209 | print("hello world") 210 | ``` 211 |
212 | 213 | کجا باید فایل را ذخیره کرد؟ در هر پوشه‌ی که محل ان را می‌دانید. اگر شما نمی‌دانید پس یک پوشه‌ جدید ایجاد کنید و ازاین پوشه برای برنامه‌های پایتون خود، برای ذخیره‌سازی و اجرا استفاده کنید. 214 | 215 |
216 | 217 | 218 | - `/tmp/py` on Mac OS X (برای مکینتاش) 219 | - `/tmp/py` on GNU/Linux (برای گنو لینوکس) 220 | - `C:\\py` on Windows (برای ویندوز) 221 | 222 |
223 | 224 | برای ایجاد پوشه گفته شده (البته بستگی به سیتم‌عاملی که دارید استفاده می‌کنید دارد) از دستور `mkdir` در ترمینال خود استفاده کنید. برای مثال: 225 | 226 |
227 | 228 | 229 | `mkdir /tmp/py` 230 | 231 |
232 | 233 | نکته: همیشه مطمئن شوید که افزونه‌ی فایل `.py` را گذاشته‌اید. برای مثال: 234 | 235 | 236 |
237 | 238 | 239 | `foo.py` 240 | 241 |
242 | 243 | 244 | برای اجرای برنامه‌ پایتون 245 | 246 | ۱. پنجره‌ی ترمینال ویندوز را بازکنید. (فصل قبلی [نصاب](./installation.md#installation) را ببینید، در قسمت "نصب و راه‌اندازی در ویندوز"). 247 | 248 | 249 | ۲. **تـــ**غيـــ**یـر** بدیــــن دایرکتوری را به جایی که فایل را ذخیره کرده‌اید. برای مثال: `cd /tmp/py` 250 | 251 | ۳.برنامه را با استفاده از دستور `python hello.py` اجرا کنید. 252 | 253 | خروجی نمایش به این شکل است. 254 | 255 | 256 |
257 | 258 | ``` 259 | $ python hello.py 260 | hello world 261 | ``` 262 | 263 |
264 | 265 | ![عکس از برنامه‌ی اجرا شده](./img/terminal_screenshot.png) 266 | 267 | اگر شما نتیجه را همان طور که بالا گفته شده گرفتید به شما تبــــريــــک! ! می‌گویم. 268 | 269 | -شما اولین برنامه‌ی پایتون خود را اجرا کردید- شما اولین گام سخت یادگیری برنامه‌نویسی را برداشتید. که از همین اولین برنامه شروع می‌شود. 270 | 271 | 272 | در صورت اینکه شما بــــا خـطــا مواجه شدید بالای برنامه‌ی خود _exactly_ را وارد کنید، برنامه‌ی اجرا شده شما را دوباره نشان می‌دهد.این نــکته را درنظر داشته باشید پایتون به حروف بــزرگ وکــوچیک حساس است. این کلمه `print` با ایــن `Print` کلمه تفاوت دارد ویکسان نیست. در قسمت اول حروف `p` کــوچک است و در قسمت دوم حروف `P` بــزرگ است. 273 | 274 | همچنین مطئن شوید که فاصله‌ها را رعایت کرده‌اید. [برای چی این مهمــه](./basics.md#indentatio) در بخش‌های بعدی خواهید فهمید. 275 | 276 | 277 | **چگونه و چطوری** 278 | 279 | برنامه‌های پایتون از _statements(فراخوانی یا دستور)_ تشکیل شده است. در برنامه اول ما فقط یک فراخوانی هست. در این فراخوانی ما `print` را صدا می‌زنیم و متن "hello world" را به ما نمایش می‌دهد. 280 | 281 | ## گرفتن کمک 282 | 283 | اگر شما نیاز به کمک سریع درباره‌ی اطلاعات و توابع پایتون دارید. شما می‌توانید از تابع `help` که داخل پایتون است کمک بگیرید. این خیلی جالب و راحت درشل است.برای مثال 284 | `help('len')` را اجرا نمایید، این دستور سندهای مرتبط به `len` را نمایش می‌دهد. که برای شمارش عناصر استفاده می‌شود. 285 | 286 | توسعه: برای خارج شدن سند `q` را فشار دهید
287 | 288 | add this command in the text and fix left to right 289 | 290 | پس دیگه مشخص که شما می‌توانید هر موقع که کمک خواستید در پایتون بگیرید، با استفاده از `help()` یاد بگیرد که چگونه از `help` استفاده کنید. 291 | 292 | اگر شما در کمک نیاز داشتید برای اوپراتورها مانند `return` پس شما باید ان را در پرانتز بگذارید.برای مثال: ` help ('return') ` بخاطر اینکه پایتون بفهمه ما می‌خواهیم چه کنیم. 293 | 294 | 295 | ## خلاصه 296 | 297 | حال دیگر به راحتی می‌توانید برنامه‌های پایتون را بنویسید، ذخیره کنید و اجرا کنید. 298 | 299 | حالا که عنوان برنامه‌نویس پایتون هستید، بیاید مفهوم‌های دیگر پایتون را یاد بگیریم. 300 | 301 | --- 302 | 303 | [^1]: نویسنده عالی کتابه 'Beginning Perl'. 304 | 305 | -------------------------------------------------------------------------------- /floss.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | FLOSS {#floss} 4 | 5 | # ضمیمه: دنیادی متن‌باز 6 | 7 | > نکته : این نکته را در نظر داشته باشید که محتویات این قسمت در سال ۲۰۰۳ نوشته شده است و ممکن است برای بعضی‌ها کمی عجیب باشد. 8 | 9 | شاید مخفف کلمه انگلیسی [FLOSS](http://en.wikipedia.org/wiki/FLOSS) را زیاد دیده یا شنیده باشید، که به معنای *نرم‌افزار ازاد و متن باز* است. جامعه‌ی که مفهوم اشتراک‌گذاری دانش نرم‌افزار متن‌باز و اصلاح و توزیع مجدد را توسعه دادند. اگر قبلا این کتاب را خوانده‌اید پس با مفهوم *نرم‌افزار ازاد و متن باز* اشنا هستید چونکه *پایتون* یک برنامه‌ی متن‌باز است. 10 | 11 | این هم چند مثال درباره نرم‌افزار ازاد و متن باز تا دیدگاه کلی از این جامعه و ایده‌های ان داشته باشید. 12 | 13 | 14 | [لینوکس](http://www.kernel.org): این هسته‌ی سیستم‌عامل نرم افزار ازاد و متن باز است که در سیستم عامل‌های گنو/لینوکس استفاده می‌شود. هسته لینوکس را لینوس بندیکت توروالدز زمانی که دانشجو بود پایایه‌گذاری کرد. می‌توانیم گفت در حال حاضر پایه بیشتر چیزی که امروز استفاده می‌کنیم لینوکس است از پایه اندروید تا تمامی سایت‌های که امروزه استفاده می‌کنیم. 15 | 16 | [اوبونتو](http://www.ubuntu.com): این توزیع مبتنی بر جامعه کنونیکال توسعه داده شده است. و امروزه یکی از محبوب‌ترین توزیع‌ها گنو/لینوکس است. این امکان را دارید که از تمامی نرم افزارهای متن باز نصب و استفاده کنید. کار جالبی که می‌توانید بکنید این است که سیستم عامل را از روی سی‌دی بارگذاری کنید! این امکان باعث می‌شود که دیدگاه کلی از سیستم‌عامل داشته باشید. با این حال اوبونتو سیستم عامل کامل رایگانی نیست، چراکه بعضی از درایوهای اختصاصی و برنامه‌های کاربردی پولی هستند. 17 | 18 | 19 | [لیبره افیس](http://www.libreoffice.org/): یک مجموعه‌ی عالی برای اداره‌ها در جامعه توسعه یافته و ساخته شده برای ارائه‌ها ، طراحی نمودار و صفحه گسترده. حتی می‌توانید فایل‌های مایکروسافت ورد و مایکروسافت پاورپوینت را به راحتی باز و ویرایش کنید. این برنامه تقریبا در تمامی سیستم عامل‌ها اجرا می‌شود. این نرم‌افزار همچین متن‌باز است. 20 | 21 | [موزیلا فایرفاکس](http://www.mozilla.org/products/firefox): این یکی از بهترین برنامه برای وب‌گردی است که از طرف منتقدین خود تحسین شده است. مفهمومی به نام افزونه این امکان را به کاربران می دهد تا پلاگین‌های مختلفی بر روی فایرفاکس نصب کنید. 22 | 23 | 24 | [مونو || مانو](http://www.mono-project.com): این نرم‌افزار متن‌باز است. این برنامه یک پلت‌فرم مایکرسافت برای دات‌نت است و این امکان را به کاربر می‌دهد تا برنامه‌های نت را ایجاد و اجرا کند. نت برای روی گنو/لینوکس ، ویندوز، مکینتاش و فری‌بی‌اس‌دی و خیلی از سیستم‌عامل‌های دیگر قابل اجرا است. 25 | 26 | [وب سرور اپاچی](http://httpd.apache.org): یک وب‌ سرور محبوب متن باز است. می‌توان گفت محبوب‌ترین وب‌ سرور در جهان است! می‌توان گفت بیشتر وب‌سایت‌ها از این وب‌سرور استفاده می‌کنند. بله درست است اپاچی وب‌سایت‌های بیشتر نسبت به راقبای خود (مایکروسافت سرویس‌های اطلاعات اینترنتی) دارد. 27 | 28 | 29 | [وی‌ال‌سی مدیا پلیر](http://www.videolan.org/vlc/): این مدیاپلیری است که می‌توان هر چیزی را پخش کند مانند DivX ،VCDs، ام‌پی۳، اوجی‌جی و دی‌وی‌دی *بعد می‌گن متن‌باز باحال نیست!* 30 | 31 | این لیستی مختصر از ایده‌های نرم‌افزار ازاد و متن‌ باز است هنوز خیلی از چیزها مانند زبان‌برنامه‌نویسی پریل، پی‌اچ‌پی، دروپال که سامانه مدیریت محتوای ازاد و متن باز است، پایگاه داده‌ی (PostgreSQL)، بازی مسابقه‌رانی (TORCS)، نرم‌افزار آزاد محیط یکپارچه توسعه نرم‌افزار کی‌دوالاپ ، کسین مدیاپلیر برای فیلم، ویرایشگر ویم، ویرایشگر کوئنتا پلاس، مدیاپلیر (Bansheer)، گیمپ ویرایشگر عکس، همانطور که می‌بینید این لیست پایان ندارد و همین طور می‌تواند ادامه یابد. 32 | 33 | برای اطلاعات پیدا کردن از اخرین اخبار دنیای نرم‌افزار ازاد و متن باز به لینک زیر سر بزنید: 34 | 35 |
36 | 37 | - [OMG! Ubuntu!](http://www.omgubuntu.co.uk/) 38 | - [Web Upd8](http://www.webupd8.org/) 39 | - [DistroWatch](http://www.distrowatch.com) 40 | - [Planet Debian](http://planet.debian.org/) 41 | 42 |
43 | 44 | برای کسب اطلاعات بیشتر در مورد نرم‌افزار و ازاد و متن باز از لینک‌های زیر نیز بازدید کنید: 45 | 46 |
47 | 48 | - [GitHub Explore](http://github.com/explore) 49 | - [Code Triage](http://www.codetriage.com/) 50 | - [SourceForge](http://www.sourceforge.net) 51 | - [FreshMeat](http://www.freshmeat.net) 52 | 53 |
54 | 55 | پس پیش به سوی دنیای وسیع و ازاد، نرم‌افزار ازاد و متن باز! 56 | -------------------------------------------------------------------------------- /functions.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # توابع 4 | 5 | توابع برنامه‌‌های کوچکی هستند که این قابلیت را دارند که در قسمت‌های دیگر برنامه از آن استفاده کنید. برای استفاده از توابع از طریق نام گذاری تابع و فراخوانی آن می‌توانید در دیگر قسمت‌های برنامه‌ها از این توابع استفاده کنید. به این روش *فراخوانی تابع* می‌گویند. در برنامه‌های قبلی از توابع داخلی پایتون استفاده کردیم مانند `len` و `range`. 6 | 7 | 8 | ساختار مفهومی تابع احتمالا یکی از مهم‌ترین بخش‌های هر برنامه‌نویسی است. بنابراین در این فصل بخش‌های مختلف تابع را بررسی خواهیم کرد. 9 | 10 | تابع با استفاده از کلید واژه‌ی `def` تعریف می‌شود. بعد از این کلمه‌ی کلیدی *نام (شناسه)* تابع و بعد از نام دو جفت پرانتز گذاشته می‌شود. داخل پرانتز ممکن است متغییری قرار بگیرد. سپس بلوک کدهای برنامه است. برای مثال: 11 | 12 | برای مثال (فایلی با نام `function1.py` ذخیره کنید) 13 | 14 | 15 | 16 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 17 | 18 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 19 | 20 | 21 | 22 |
23 | 24 | 25 |
{% include "./programs/function1.py" %}
26 | 27 |
28 | 29 | خروجی: 30 | 31 |
32 | 33 |
{% include "./programs/function1.txt" %}
34 | 35 |
36 | 37 | 38 | 39 |
40 | 41 | **چگونه و چطوری** 42 | 43 | در بالا ما یک تابعی با نام `say_hello` داریم این تابع هیچ پارامتری ندارد پس درنتیجه داخل پرانتز هیچ متغییری قرار نمی‌گیرد. پارامتر‌های توابع یک عملکرد هستند. بنابراین می‌توانیم مقادیر مختلفی را به این پارامترها منتقل کنیم و نتایج مربوطه را بدست اوریم. 44 | 45 | توجه داشته باشید که می‌توانیم همان تابع را چند بار فراخوانی کنیم و نیازی به نوشتن دوباره‌ی کد ان برنامه را نداریم. 46 | 47 | 48 | ## پارامترهای توابع 49 | 50 | توابع می‌توانند پارامتر بگیرند، این مقادیری است که تابع از ان استفاده می‌کند. حال با استفاده از این پارمترها می‌توانیم روی انان *عملکردی* را انجام دهیم. منظور از پارامترها همان متغییرهای است که داخل پرانتز قرار می‌گیرند. متغییرهای که داخل پرانتز تعریف می‌شوند با فراخوانی تابع مقادیر از قبل تعیین شده داخل این پارمترها قرار می‌گیرند و تابع اجرا می‌شود. 51 | 52 | پارامترهای داخل جفت پرانتز با کاما جدا می‌شوند. توجه داشته باشید که پارامترها همان طور که گفته شد متغییرهای داخل جفت پرانتز هستند و متغییرهای که داخل پرانتز تابعی که فراخوانی می‌کنید *ارگومان* هسنتد. 53 | 54 | مثال (فایلی با نام `function_param.py` ذخیره کنید) 55 | 56 | 57 | 58 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 59 | 60 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 61 | 62 | 63 | 64 |
65 | 66 |
{% include "./programs/function_param.py" %}
67 | 68 |
69 | 70 | 71 | خروجی: 72 | 73 |
74 | 75 |
{% include "./programs/function_param.txt" %}
76 | 77 | 78 |
79 | 80 | 81 | 82 | 83 |
84 | 85 | **چگونه و چطوری** 86 | 87 | در اینجا ما تابع با نام `print_max` تعریف می‌کنیم. که دارای دو پارامتر به نام‌های `a` و `b` هستند. کار که قرار است انجام دهیم عدد بزرگتر را پیدا کنیم ان هم با استفاده از دستور `if..else` و بعد عدد پیدا شده را چاپ کنیم. 88 | 89 | با اولی که تابع `print_max` را فراخوانی می‌کنیم، به طور مستقیم این اعداد به عنوان ارگومان به تابع معرفی می‌کنیم. 90 | در گامی بعدی به تابع دو پارامتر می‌دهیم. که این امکان را `(print_max(x, y` میدهد که مقدار ارگومان `x` به `a` اختصاص داده شود و ارگومان `y` به `b` اختصاص داده شود. تابع `print_max` در هر دو مورد به یک صورت عمل می‌کند. 91 | 92 | ## متغییرهای محلی 93 | 94 | وقتی متغییری را در داخل تابعی تعریف می‌کنید به هیچ وجه متغییرهای هم نام خارج از تابع به هم مرتبط نیستند. این بدان معنی است در تابع متغییرهای تعریف شده *محلی* هستند. متغییرها در محدوده بلوک تابع قابل استفاده هستند. 95 | 96 | 97 | 98 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 99 | 100 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 101 | 102 | 103 | 104 | برای مثال (فایلی با نام `function_local.py` ذخیره کنید) 105 | 106 |
107 | 108 |
{% include "./programs/function_local.py" %}
109 | 110 |
111 | 112 | خروجی: 113 | 114 |
115 | 116 |
{% include "./programs/function_local.txt" %}
117 | 118 |
119 | 120 | 121 | 122 |
123 | 124 | **چگونه و چطوری** 125 | 126 | اولین باری که *مقدار* متغییر *x* را در خط اول در بدنه تابع چاپ می‌کنیم، پایتون از مقدار اعلام شده در بلوک اصلی (در قسمت بالا تعریف تابع) استفاده می‌کند. 127 | 128 | بعد مقدار `2` را به متغییر `x` اختصاص می‌دهیم. متغییر `x` یک متغییر محلی است. بنابراین هنگامی که مقدار `x` در تابع تغییر می‌دهیم، متغییر `x` تعریف شده در بلوک اصلی باقی می‌ماند. 129 | 130 | با استفاده از کمک دستور `print` مقدار متغییر `x` را که در بلوک اصلی تعریف شده است، نمایش می‌دهیم. پس باید درحال حاضر درکی از متغییر محلی داشته باشید. 131 | 132 | 133 | {#global-statement} 134 | ## متغییر سراسری 135 | 136 | 137 | اگر می‌خواهید یک متغییری در بالای برنامه خود تعریف کنید که به هیچ کلاس یا تابع محدود نباشد، پس باید به پایتون بگویید که این متغییر محلی نیست. به این نوع متغییرها متغییر *سراسری* می‌گویند. پس با استفاده از متغییر *سراسری* می‌توانیم این کار را انجام دهیم. 138 | 139 | فرض کنید که می‌خواهید که یک متغییر سراسری تعریف کنید و در خارج از تابع از ان استفاده کنید. همچنین متغییر هم نام با متغییر سراسری خود ندارید(هر چند توسعه می‌شود از این کار پرهیز کنید). زیرا به این خاطر سطح خوانا بودن برنامه شما را پایین می‌اورد. 140 | 141 | 142 | 143 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 144 | 145 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 146 | 147 | 148 | برای مثال (فایلی با نام `function_global.py` ذخیره کنید) 149 | 150 | 151 |
152 | 153 |
{% include "./programs/function_global.py" %}
154 | 155 |
156 | 157 | خروجی: 158 | 159 |
160 | 161 |
{% include "./programs/function_global.txt" %}
162 | 163 |
164 | 165 | 166 | 167 |
168 | 169 | **چگونه و چطوری** 170 | 171 | متغییر سراسری `x` را وقتی فراخوانی می‌کنیم، اعلام می‌کند که یک متغییر سراسری است. پس وقتی که متغییر `x` را صدا می کنیم در بلوک اصلی این تغییرات منعکس می‌شود. 172 | 173 | همچنین می‌توانیم چندین متغییر سراسری تعریف کنیم، با استفاده از دستور `global x, y, z` 174 | 175 | {#default-arguments} 176 | 177 | ## ارگومان‌های پیش‌فرض 178 | 179 | برای بعضی از توابع ممکن است که بخواهید از پارامترهای *اختیاری* استفاده کنید، درصورتیکه از کاربر مقداری را تعیین نکند. این کار با استفاده از ارگومان *پیش‌فرض* انجام می‌شود. این روش با کمک اضافه کردن پارامترها در تعریف تابع (انتساب تابع) با علامت (`=`) انجام می‌شود. 180 | 181 | این نکته را در نظر داشته باشید که مقدار ارگومان باید یک مقدار ثابت باشد. این بدان معنی است که مقدار ارگومان نباید تغییر کند. در این مورد در فصل‌های بعدی توضیح داده خواهد شد. 182 | 183 | 184 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 185 | 186 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 187 | 188 | 189 | 190 | برای مثال (فایلی با نام `function_default.py` ذخیره کنید) 191 | 192 |
193 | 194 |
{% include "./programs/function_default.py" %}
195 | 196 |
197 | 198 | خروجی: 199 | 200 |
201 | 202 |
{% include "./programs/function_default.txt" %}
203 | 204 | 205 |
206 | 207 | 208 | 209 | **چگونه و چطوری** 210 | 211 | تابع با نام `say` برای چاپ رشته به اندازه‌ی که بهش گفته می‌شود، رشته چاپ می‌کند. اگر مقدار ندهیم، به طور پیش‌فرض یک رشته چاپ می‌شود. روش دادن ارگومان هم به این صورت `1` to the parameter `times` است. 212 | 213 | در سری اول از تابع `say` فقط رشته را می‌دهیم و رشته را چاپ می‌کند. در روش بعدی از ارگومان `5` استفاده می‌کنیم به این صورت ۵ بار از رشته رونویسی می‌کند. 214 | 215 | > *نکته* 216 | > 217 | > تنها پارمترهای که در انتهای لیست قرار دارند متیواند پارامتر پیش‌فرض بگیرند. 218 | >مقدار پارامتر نمی‌تواند قبل از ارگومان باشد. 219 | > یک مقدار ارگومان به طور پیش‌فرض در لیست تابع قرار دارد. 220 | > 221 | > این بخاطر این دلیل است که مقادیر پارامترها بر اساس موقعیت اختصاص داده می‌شود. 222 | > برای مثال: `(def func(a,> b=5` صحیح است، `(def func(a=5, b` *صحیح نیست*. 223 | 224 | ## کلید ارگومان‌ها 225 | 226 | اگر توابعی با پارامترهای مختلفی دارید و می‌خواهید بعضی از پارامترها را مشخص کنید، می‌توانید با نامگذاری پارامترها این کار را انجام دهید. به این روش *کلید ارگومان* گفته می‌شود. در اینجا ما از یک کلید واژه به جای موقعیت (که قبلا از ان استفاده می‌کردیم) استفاده می‌کنیم. 227 | 228 | دو مزیت وجود دارد: اول از همه استفاده از تابع ساده‌تر است، چون دیگر نیاز به نگرانی برای نظم پارامترهای تابع نداریم. دوم: می‌توانیم فقط پارامترهای که می‌خواهیم را نامگذاری کنیم، به شرط اینکه پارامترها دیگر مقادیر پیش‌فرض داشته باشند. 229 | 230 | 231 | 232 | برای مشاهده برنامه‌ها بهتر است به لینک زیر سر بزنید: 233 | 234 | [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) 235 | 236 | 237 | برای مثال (فایلی با نام `function_keyword.py` ذخیره کنید) 238 | 239 |
240 | 241 |
{% include "./programs/function_keyword.py" %}
242 | 243 |
244 | 245 | خروجی: 246 | 247 |
248 | 249 |
{% include "./programs/function_keyword.txt" %}
250 | 251 | 252 |
253 | 254 | **چگونه و چطوری** 255 | 256 | تابعی به نام `func` دارای یک پارامتری است که، بدون یک مقدار ارگومان پیش‌فرض است. همچنین پارامتر‌های که دارای مقدار پیش‌فرض هستند. 257 | 258 | در اولین گام استفاده از `(func(3,7` پارامتر `a` مقدار `3`، پارامتر `b` مقدار `7` و پارامتر `c` مقدار پیش‌فرض `10` را می‌گیرد. 259 | 260 | در دومین گام استفاده از `(func(25, c = 24` متغییر `a` به دلیل موقعیت ارگومان مقدار `25` را می‌گیرد. بعد پارامتر `c` به دلیل کلید واژه‌ی ارگومان مقدار `24` را می‌گیرد. متغییر `b` هم مقدار پیش‌فرض `5` را به خود اختصاص می‌دهد. 261 | 262 | در سومین گام استفاده از `(func(c=50, a=100` از ارگومان‌های کلیدی برای تمامی مقادیر مشخص شده استفاده می‌کنیم. این نکته را در نظر داشته باشید که اول پارامتر `c` بعد این پارامتر، پارامتر `a` را تعیین می‌کنیم. حتی اگر پارامتر `a` قبل از `c` در تابع تعریف شده باشد. 263 | 264 | 265 | ## پارامتر‌های ارگومان-متغییر 266 | 267 | گاهی اوقات نیاز به این پیدا می‌کنید که تابعی را تعریف کنید که پارامترهای زیادی مانند مـ**تغیـیـر** بگیرد. برای صرفه‌جویی در پارامترها می‌توانید از این روش استفاده کنید. 268 | 269 | برای مثال (فایلی با نام `function_varargs.py` ذخیره کنید) 270 | 271 |
272 | 273 |
{% include "./programs/function_varargs.py" %}
274 | 275 |
276 | 277 | خروجی: 278 | 279 |
280 | 281 |
{% include "./programs/function_varargs.txt" %}
282 | 283 |
284 | 285 | **چگونه و چطوری** 286 | 287 | هنگامی که پارامتری ستاره‌داری مانند `*param` را تعریف می‌کنیم. سپس موقعیت ارگومان از ان نقطه به عنوان یک مرتبه به 'param' استفاده می‌کند. 288 | 289 | بیان ساده تر بگم، وقتی که پارامتری با دو تا ستاره‌ تعریف می‌کنیم چیزی مانند `**param` پس تمامی ارگومان‌های کلیدی که به تعداد کلمه‌ از این نقطه تا اخر جمع اوری می‌شود با نام 'param' (یک چیزی مانند فرهنگ لغت). 290 | 291 | در بخش‌های [بعدی](./data_structures.md#data-structures) در این مورد بیشتر بحث خواهیم کرد. 292 | 293 | {#return-statement} 294 | 295 | ## فراخوانی `return` 296 | 297 | دستور `return` همانطور که از نام انگلیسی‌اش مشخص است یک چیزی را از تابع **بازمی‌گرداند**. بعد از این عمل از تابع خارج می‌شویم. همچنین یک مقدار **اختیاری** را نیز می‌توانیم از تابع برگردانیم. 298 | 299 | 300 | برای مثال (فایلی با نام `function_return.py` ذخیره کنید) 301 | 302 |
303 | 304 |
{% include "./programs/function_return.py" %}
305 | 306 |
307 | 308 | خروجی: 309 | 310 |
311 | 312 |
{% include "./programs/function_return.txt" %}
313 | 314 |
315 | 316 | **چگونه و چطوری** 317 | 318 | تابع `maximum` بزگترین پارامتر را برمی‌گرداند، در این قسمت ارقام به تابع فرستاده می‌شود. برای انجام این کار با استفاده از دستور `if..else` بزرگترین مقدار را پیدا می‌کند. در اخر هم مقدار پیدا شده را **بازمی‌گرداند**. 319 | 320 | نکته: دستور `return` اگر بدون مقدار باشد مقدار `return None` را بازمی‌گرداند. `None` یک مقدار خاص در پایتون است که نمایشگر مقدار **هیچ‌چیز** است. برای مثال برای نمایش دادن مقداری که ارزش ندارد می‌توانید از مقدار `None` استفاده کنید. 321 | 322 | هر تابعی `return None` مقدار هیچ‌چیز را می‌گیرد مگر اینکه مقدار `return` را اعلام کرده (مقدار دهی کردن) باشید. 323 | 324 | با استفاده از دستور `((print(some_function)` می‌توانید ببینید که تابع `some_function` از دستور `return` استفاده نمی‌کند. 325 | 326 | 327 |
328 | 329 | ```python 330 | def some_function(): 331 | pass 332 | ``` 333 | 334 |
335 | 336 | 337 | دستور `pass` در پایتون برای نشان دادن یک بلوک‌خالی از فراخوانی‌ها استفاده می‌شود. 338 | 339 | نصیحت: تابعی دورنی با نام `max` وجود دارد که همان عمل پیدا کردن **مقدار بزگتر** را انجام می‌دهد. پس بهتر است از این تابع برای انجام این کار استفاده کنید. 340 | 341 | 342 | ## مستند سازی - رشته 343 | 344 | یکی از ویژگی‌های عالی پایتون به نام *مستندسازی رشته‌ها*(*documentation strings*) است که در زبان انگلیسی به طور مخفف *docstrings* به این شکل می‌شناسیم. یک ابزار مهم است که حتما باید ان را یاد داشته باشید. اما بخاطر چی؟ این روش باعث می‌شود برنامه‌ها را بهتر درک کنیم تا بتوانیم بهتر *مستندسازی* کنیم. البته این موضوع را هم بگم در ایران مستندسازی یک جهنمی برای برنامه‌نویس‌ها است و بهتر است این فرهنگ را بیشتر ترویج دهیم(این نکته را هم عرض کنم به هیچ عنوان قصد تهمت به برنامه‌نویسان خوبی ایرانی ندارم). یکی از کارهای شگفت انگیزی که می‌توانیم انجام دهیم این است که وقتی برنامه‌ی در حال اجرا است می‌توانیم از یک تابع مستند بسازیم. 345 | 346 | برای مثال (فایلی با نام `function_docstring.py` ذخیره کنید) 347 | 348 |
349 | 350 |
{% include "./programs/function_docstring.py" %}
351 | 352 |
353 | 354 | خروجی: 355 | 356 |
357 | 358 |
{% include "./programs/function_docstring.txt" %}
359 | 360 | 361 |
362 | 363 | **چگونه و چطوری** 364 | 365 | در تابع در خط اول رشته موجود یک رشته‌ی از مستند است. توجه داشته باشید که مستندسازی رشته‌‌ی برای [ما‌‌ژول‌ها](./modules.md#modules) و [کلاس‌ها](./oop.md#oop)نیز استفاده می‌شود. که درفصول بعدی با انها اشنا می‌شویم. 366 | 367 | در ادامه مستندسازی یک چند رشته‌ی است که خط اول با بزرگ شروع می‌شود و با یک نقطه به پایان می‌رسد. اما خط دوم خالی است و پس از ان توضیحات دقیقی می‌اید که در خط سوم قرار دارد. توسعه من برای همه این است که از این روش برای توابع غیر ضروری خود **مستندسازی رشته‌ی** را استفاده کنند. 368 | 369 | برای دسترسی به رشته-مستند با استفاده از `__doc__` تابع `print_max` می‌توانیم این کار را انجام دهیم. این نکته را هم در نظر داشته باشید که پایتون *همه چیز* را به عنوان یک شی که شامل تابع است می‌بیند. در این مورد در فصل [کلاس‌ها](./oop.md#oop) بحث خواهیم کرد. 370 | 371 | اگر از دستور `()help` پایتون استفاده می‌کنید روش کار با مستندسازی رشته‌ی را دیده‌اید. کار را که انجام می‌دهد این است که با گرفتن ویژگی تابع `__doc__` ان را به صورت شسته‌و‌رفته برایمان نمایش می‌دهد. همچنین تابع `help(print_max)` گفته شده در بالا را می‌توانید در اینجا استفاده کنید. برای خارج شدن از `help` هم با فشار دادن کلید `q` کیبورد می‌توانید خارج شوید. 372 | 373 | همانطور که دید با استفاده از ابزارهای اماده و اتوماسیون می‌توانید به راحتی مستندسازی را انجام دهید. برای همین یکی از *توسعه‌ها ضروری* من این است که برای توابع غیرضروری نیز از این روش استفاده کنید. دستور `pydoc` که در توزیع پایتون موجود است، مشابه دستور `()help` عمل می کند. 374 | 375 | 376 | ## خلاصه 377 | 378 | در این بخش جنبه‌های مختلف توابع را دیدیم. اما به طور کامل پوشش نداده‌ایم. با این حال بیشتر از انچه که از عملکرد پایتون استفاده می‌کنید را پوشش داده‌ایم. 379 | 380 | در فصول بعدی چگونگی استفاده از ماژول‌ها را خواهیم دید. 381 | 382 | -------------------------------------------------------------------------------- /img/pycharm_command_line_arguments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_command_line_arguments.png -------------------------------------------------------------------------------- /img/pycharm_create_new_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_create_new_project.png -------------------------------------------------------------------------------- /img/pycharm_create_new_project_pure_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_create_new_project_pure_python.png -------------------------------------------------------------------------------- /img/pycharm_hello_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_hello_open.png -------------------------------------------------------------------------------- /img/pycharm_new_file_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_new_file_input.png -------------------------------------------------------------------------------- /img/pycharm_new_python_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_new_python_file.png -------------------------------------------------------------------------------- /img/pycharm_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_open.png -------------------------------------------------------------------------------- /img/pycharm_output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_output.png -------------------------------------------------------------------------------- /img/pycharm_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/pycharm_run.png -------------------------------------------------------------------------------- /img/terminal_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elias8702/Byte-Of-Python-Persian/bf10aef0ed463db9515bb099b64bd5d88df27b38/img/terminal_screenshot.png -------------------------------------------------------------------------------- /installation.md: -------------------------------------------------------------------------------- 1 |
2 | {#installation} 3 | 4 | # نصب و راه‌اندازی 5 | 6 | 7 | 8 | در طول مدتی که در این کتاب با پایتون ۳ کار می‌کنیم، جابه‌جایی به نسخه‌های بالاتر و پایین‌تر را خواهیم داشت. 9 | 10 |
11 | 12 | [Python {{ book.pythonVersion }}](https://www.python.org/downloads/) 13 | 14 |
15 | 16 | ## نصب و راه‌اندازی در ویندوز 17 | 18 | به سایت زیر مراجعه کنید و اخرین نسخه‌ی را دانلود کنید. موقع نوشتن این کتاب نسخه‌ی پایتون ۳.۵.۱ موجود بود. 19 | 20 | [دانلود‌پایتون](https://www.python.org/downloads/) 21 | 22 | نصب و راه‌اندازی همانند برنامه‌های دیگر مبتنی بر ویندوز است. 23 | 24 | احتیاط: مطمئن شوید که گزینه‌ی `Add Python 3.5 to PATH` را انتخاب کرده‌اید. 25 | 26 | احتیاط: برای تغییر محل نصب، بر روی `Customize installation` و سپس بر روی `Next` کلیک کنید. سپس ادرس را `C:\python35` به عنوان محل نصب انتخاب کنید. 27 | 28 | در صورت علامت نگذاشتن، علامت `Add Python to environment variables` این همانند این است که در قسمت قبلی `Add Python 3.5 to PATH` علامت نگذاریم . 29 | 30 | 31 | 32 | همچنین برای همه کاربران می‌توانید Launcher نصب کنید. Launcher برای تعویض بین نسخه‌های مختلف پایتون استفاده می‌شود. نصب کردن یا نکردن Launcher در حال حاضر زیادی ضرورت ندارد. این موضوع بستگی به خودتان دارد. 33 | 34 | اگر به درستی برنامه را نصب کرده‌اید، این مراحل را `شل پایتون را روی ویندوز اجرا نمایید` انجام دهید. در غیر این صورت به قسمت‌های قبلی برگردید. 35 | 36 | نکته: اگر با برنامه نویسی Docker اشنا هستید که هیچ، در غیراین صورت به این قسمت‌ها [Python in Docker](https://hub.docker.com/_/python/) و [Docker on Windows](https://docs.docker.com/windows/) مراجعه کنید. 37 | 38 | {#dos-prompt} 39 | 40 | ### DOS Prompt (شل داس) 41 | 42 | اگر قابلیت کنترل پایتون از خط دستوری ویندوز را می‌خواهید یاد بگیرید (منظور شل داس است). پس نیاز به نصب و تنظیم مناسب متغییر محیطی به نام PATH را دارید. 43 | 44 | برای ویندوز ۲۰۰۰، ایکس‌پی، ۲۰۰۳، به قسمت زیر مراجعه نمایید. 45 | 46 |
47 | 48 | `Control Panel` -> `System` -> `Advanced` -> `Environment Variables` 49 | 50 |
51 | 52 | برروی متغییر با نام `PATH` کلیک کنید و در قسمت _System Variables_ section برروی دکمه‌ی `Edit` کلیک کنید و ادرس `C:\Python35;` را اضافه کنید(لطفا مطمئن شوید که ادرس نامبرده شده، پوشه‌اش وجود دارد. این موضوع برای نسخه‌های دیگر پایتون ممکن است تفاوت داشته باشد). همچنین از نام مناسب برای پوشه استفاده نمایید. 53 | 54 | 55 | 56 | در نسخه‌های قدیمی ویندوز فایل `C:\AUTOEXEC.BAT` را باز کنید و متن `PATH=%PATH%;C:\Python35` را اضافه کنید و بعد سیستم عامل را راه‌اندازی مجدد کنید. برای ویندوز ان‌تی از فایل `AUTOEXEC.NT` استفاده کنید. 57 | 58 | برای ویندوز ویستا: 59 | 60 | - روی منوی شروع(Start) کلیک کنید و گزینه‌ی `Control Panel` انتخاب کنید. 61 | 62 | - بر روی گزینه‌ی System کلیک کنید(سمت راست شما)" اطلاعات عمومی کامپیوترتان را نگاه کنید". 63 | 64 | - در سمت چپ لیست وظایف، که اخرین‌اش `Advanced system settings` است کلیک کنید. 65 | - در تب `Advanced` قسمت `System Properties` یک کادره‌محاوره‌ای مشخص است. برروی دکمه‌ی `Environment Variables` در قسمت راست پایین کلیک نمایید. 66 | 67 | - در کادر پایین‌تر با عنوان `System Variables` مشخص است با کمی پایین اوردن صفحه دکمه‌ی `Edit` را کلیک کنید. 68 | 69 | 70 | - اگر نیاز است مسیر( path) خود را به طور دلخواه تغییر دهید. 71 | 72 | - سیستم‌عامل خود را راه‌اندازی کنید، ویستا مسیر متغییر محیطی از تعویض نکرده و هنوز همان(قبل از راه‌اندازی) باقی مانده است. 73 | 74 | 75 | 76 | 77 | 78 | 79 | برای ویندوز ۷ و ۸: 80 | 81 | - برروی کامپیوتر در دکستاپ راست کلیک کنید و گزینه‌ی `Properties` را انتخاب کنید و یا بر روی منوی `Start` کلیک کنید و به قسمت زیر بروید. 82 | 83 |
84 | 85 | `Control Panel` -> `System and Security` -> `System` 86 | 87 |
88 | 89 | بعد بر روی `Advanced system settings` در قسمت چپ کلیک کنید و سپس برروی تب `Advanced` کلیک کنید. کمی پایین‌تر برروی `Environment Variables` کلیک کنید در بخش`System variables` متغییر `PATH` را می‌بینید فشار داده و سپس دکمه‌ی `Edit` را کلیک کنید. 90 | 91 | - به خط اخر بروید و مقدار`C:\Python35;` اضافه کنید(لطفا مطمئن شوید که ادرس نامبرده شده، پوشه‌اش وجود دارد. این موضوع برای نسخه‌های دیگر پایتون ممکن است تفاوت داشته باشد). همچنین از نام پوشه‌ی مناسب استفاده کنید. 92 | 93 | - اگر متغییر `%SystemRoot%\system32;`این طور بود حالا باید به این صورت `%SystemRoot%\system32;C:\Python35` تغییر شکل دهد. 94 | 95 | - برروی `OK` کلیک کرده و حالا همه چی امده است. راه‌اندازی مجدد نیازی نیست، با این حال باید خط فرمان را یکبار باز و بسته کنید. 96 | 97 | 98 | ### اجرای شل پایتون در ویندوز 99 | 100 | برای کاربران ویندوز شما می‌توانید خط‌فرمان را اجرا کنید اگر شما[set the `PATH` variable appropriately](#dos-prompt)دارید(منظور اگر شما مسیر `PATH` را تنظیم کرده باشید ). 101 | 102 | برای بازکردن ترمینال در ویندوز منوی شروع(start) را بازکرده و برروی `Run` کلیک نمایید. در کادر محاره‌ی ضاهر شده `cmd` تایپ نموده و سپس برروی دکمه‌ی `[enter]` کیبورد کلیک کنید. 103 | 104 | سپس پایتون `python` را تایپ کرده و مطمئن شوید که هیچ خطایی وجود ندارد. 105 | 106 | 107 | 108 | 109 | 110 | ## نصب در مکینتاش 111 | 112 | برای کابران مک، از [Homebrew](http://brew.sh) استفاده می‌کنیم: 113 | 114 | به منظور برسی، ترمینال را باز کرده و دکمه‌های `[Command + Space]`فشار دهید(برای بازکردن جستجوگر Spotlight ). ترمینال `Terminal` را تایپ کرده و دکمه‌ی `[enter]` کیبورد را فشاربدهید. وحالا پایتون ۳ `python3` را اجرا کنید و مطمئن شوید که هیچ خطایی وجود ندارد. 115 | 116 | ## نصب در گنو لینوکس 117 | 118 | برای کاربران گنو لینوکس از مدیربسته در توزیع خود برای نصب پایتون ۳ استفاده نمایند. برای دبیان اوبونتو و غیره از دستور زیر نیز می‌توان استفاده کرد. 119 |
120 | 121 | 122 | `sudo apt-get update && sudo apt-get install python3` 123 | 124 |
125 | 126 | 127 | به منظور برسی، ترمینال را بازکنید. 128 | 129 | بااستفاده از برنامه‌ی ترمینال `Terminal` یا با فشار دادن دکمه‌ی`Alt + F2` کیبورد، تایپ `gnome-terminal` این کار را انجام دهید.اگراین روش کار نکرد لطفا به مستندات توزیع گنو لینوکس مراجعه کنید.حال پایتون۳ `python3` را اجرا نمایید و مطمئن شوید که هیچ خطایی وجود ندارد. 130 | 131 | شما می‌توانید نسخه‌ی پایتون را بروی صفحه‌ی نمایش خود مشاهده کنید. 132 |
133 | 134 | ``` 135 | $ python3 -V 136 | Python 3.5.1 137 | ``` 138 | 139 |
140 | 141 | نکته: این علامت `$` نشان شل است. ممکن است برای شما متفاوت باشد بستگی به تنظیمات کامپیوترتان دارد. پس از این رو شل را فقط با نماد یا علامت `$` نشان می‌دهم. 142 | 143 | احتیاط: بستگی به نسخه نرم‌افزار پایتون نصب شده در کامپیوترتان خروجی ممکن است متفاوت باشد. 144 | 145 | ## خلاصه 146 | 147 | از این پس در نظر می‌گیرم که پایتون را نصب کرده‌اید. 148 | 149 | در فصول بعدی اولین برنامه پایتون را می‌نویسیم. 150 | 151 | 152 | -------------------------------------------------------------------------------- /modules.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ## ماژول‌ها 4 | 5 | 6 | حال متوجه شده‌اید که چگونه یک تابع را تعریف کنید و ازان در برنامه‌های دیگر خود استفاده کنید. حال همچنین موضوعی را فرض کنید اگر بخواهید تعدادی از توابع را در برنامه دیگری که می‌نویسید استفاده کنید باید چه کرد؟ فکر می‌کنم همانطور که حدس زده‌اید با استفاده از ماژول‌ها این کار امکان پذیر است. 7 | 8 | 9 | روش‌های گوناگونی برای نوشتن ماژول‌ها وجود دارد. اما ساده‌ترین روش است که فایلی افزونه‌ی `py.` بسازید که شامل محتویات توابع و متغییرها است. 10 | 11 | روش دیگر که برای نوشتن ماژول‌ها می‌توانیم استفاده کنیم این است که ماژول‌ها را با زبان‌برنامه‌نویسی مادری خود که در مترجم پایتون نوشته شده است، بنویسیم. برای مثال ماژول‌ها را به [برنامه‌نویسی سی](http://docs.python.org/3/extending/) می‌نویسید و در زمان کامپایل برنامه، پایتون از مترجم استانداری که در پایتون وجود دارد استفاده می‌کند. 12 | 13 | 14 | ماژول‌ها را از برنامه‌های دیگر می‌توانید *وارد کنید* (*imported*). تا از توابع و خاصیت‌ها انان استفاده کنید. همچنین از کتابخوانه‌های استاندارد پایتون نیز می‌توانیم استفاده کنیم. حال خواهیم دید که چگونه از ماژول‌های استاندارد کتابخوانه‌ پایتون استفاده کنیم. 15 | 16 | 17 | برای مثال (فایلی با نام `module_using_sys.py` ذخیره کنید) 18 | 19 |
20 | 21 | 22 |
{% include "./programs/module_using_sys.py" %}
23 | 24 |
25 | 26 | خروجی: 27 |
28 | 29 |
{% include "./programs/module_using_sys.txt" %}
30 | 31 |
32 | 33 | 34 | **چگونه و چطوری** 35 | 36 | در ابتدا ماژول‌های `sys` را *وارد می‌کنیم* این کار با استفاده از دستور `import` انجام می‌شود. اساسا این طوری به پایتون می‌گویم که می‌خواهیم از ماژول استفاده کنیم. ماژول `sys` حاوی توابعی که مربوط به مترجم پایتون و محیط‌اش می‌شود است. بدان معنی که **سیس**تم. 37 | 38 | وقتی که پایتون دستور `import sys` را اجرا می‌کند، نگاهی به ماژول `sys` هم کرده است. در این مورد این یک ماژول داخلی است و پایتون می‌داند کجا ان را پیدا کنید. 39 | 40 | اگر این یک ماژول کامپایل نشده بود بدان معنی که در پایتون نوشته شده بود، پس پایتون ان را در دارکتوری‌های فهرست شده در متغییر `sys.path` جستجو خواهد کرد. اگر ماژول پیدا شود سپس دستورات بدنه ماژول اجرا خواهد شد و ماژول در *دسترس* قرار خواهد گرفت. نکته، مقدار دهی اولیه یکبار انجام می‌شود وقتی که ماژول را وارد می‌کنیم. 41 | 42 | متغییر `argv` در ماژول `sys` با استفاده از نقطه‌ی نمادین `sys.argv` در دسترس است. پس باید این موضوع را درک کرده باشید این اسم قسمتی از ماژول `sys` است. یکی دیگر از مزیت‌های این روش این است که نام `argv` با متغییرهای که در برنامه با این نام دارید باعث مشکل نمی‌شود. 43 | 44 | متغییر `sys.argv` *لیستی* (لیست در فصول [بعدی](./data_structures.md#data-structures) توضیح داده خواهد شد) از رشته‌ها است. به طور خاص `sys.argv` لیستی از محتوایات *ارگومان‌های خط‌فرمان* است. این بدان معنی است که دستوراتی را که از ان استفاده می‌کنید شامل می‌شود. 45 | 46 | اگر از آی‌دی‌ئی برای اجرا و نوشتن این برنامه‌ها استفاده می‌کنید، دنبال راهی برای مشخص کردن ارگومان‌های خط‌فرمان در منوی برنامه بکنید. 47 | 48 | در اینجا وقتی که ماژول‌های پایتون را با استفاده از `sys.py` اجرا می‌کنیم(این‌ها ارگومان هستند)، ماژولی را اجرا کردیم که از ماژول `sys.py` استفاده می‌کند همراه با دستورات `پایتون` و خط فرمان‌های ان به دنبال دارد. پایتون ارگومان‌های خط‌فرمان را در متغییر `sys.argv` ذخیره می‌کند. 49 | 50 | به یاد داشته باشید که نام اسکریپت اجرا شده همیشه اولین عنصر لیست `sys.argv` است. بنابراین از `'sys.py به عنوان'` `sys.argv[0]`، `sys.argv[1]`، `sys.argv[2]` و ارگومان‌ها هم به عنوان `sys.argv[3]` به کار می‌رود. این نکته را هم در نظر داشته باشید که پایتون شمارش را نه از یک بلکه از صفر شروع می‌کند. 51 | 52 | محتویات فایل `sys.path` شمامل لیستی از نام دایرکتوری‌های که ماژول‌ها از انجا وارد(imported) شده‌اند. اگر توجه کنید در خط اول فایل `sys.path` خالی است، این رشته خالی نمایانگر دایرکتوری‌های فعلی است که بخشی از `sys.path` است که همانند متغییر `PYTHONPATH` است. این بدان معنی است که می‌توانید به طور مستقیم وارد ماژول‌های دایرکتوری جاری شوید. در غیر این صورت باید ماژول‌ها خود را در یک از لیست‌های `sys.path` قرار دهید. 53 | 54 | این نکته را در نظر داشته باشید منظور از دایرکتوری جاری همان جایی است که از برنامه اجرا می‌شود. `import os; print(os.getcwd())` اجرا کنید که دایرکتوری جاری برنامه‌ها خود را پیدا کنید. 55 | 56 | {#pyc} 57 | ## فایل Byte-compiled .pyc 58 | 59 | ماژول وارکردن یک کار نسبتا گرانبهایی است و پایتون برای این روش ترفندهای برای انجام سریع‌تر این کار دارد. یکی از این روش‌ها ساختن فایل *byte-compiled* با پسوند `.pyc` است که واسطه‌ی است برای پایتون برای تبدیل به ( اگر به یاد داشته باشید [در بخش مقدمه](./about_python.md#interpreted) در قسمت پایتون چگونه کار می‌کند؟) توضیح داده شد. 60 | این فایل `.pyc` زمانی بدرد می‌خورد که بعدا بخواهیم از یک برنامه دیگر ماژولی را وارد کنیم. این کار باعث می‌شود این امر بسیار سریع‌تر انجام شود زیرا پردازش‌های مربوط به وارد کردن ماژول قبلا انجام شده است. همچین این فایل 61 | بایت‌تغییریافته(Byte-compiled) وابستگی به پلت فرم ندارد. 62 | 63 | نـکـتـه: فایل `.pyc` در دایرکتوری جاری که فایل `.py` موجود هست ساخته می‌شود. اگر پایتون اجاز دسترسی برای نوشتن در ان پوشه را نداشته باشد فایل `.pyc` ایـــجـــاد نـــمی شـــود. 64 | 65 | {#from-import-statement} 66 | 67 | ## به واسطه‌ی دستور وارد شده 68 | 69 | اگر به طور مستقیم `argv` وارد برنامه‌ی خود کنید(که دیگر هر بار `sys` را وارد نکنید). برای این روش می‌توانید از دستور `from sys import argv` استفاده کنید. 70 | 71 | اخــطــار: به طور کلی از دستور `from..import` *اجـتـنـاب* کنید به جای این دستور از دستور `import` استفاده کنید. این موضوع جلوگیری از هرگونه مشکل می‌کند و برنامه خوانا تر می شود. 72 | 73 | مثال: 74 | 75 |
76 | 77 | ```python 78 | from math import sqrtе 79 | print("Square root of 16 is", sqrt(16)) 80 | ``` 81 | 82 |
83 | 84 | ## ماژول's `__name__` {#module-name} 85 | 86 | هر ماژولی نامی دارد و هر نامی خاصیت‌ها یا گزینه‌های دارد که می‌توان ان را پیدا کرد. 87 | 88 | این خاصیت برای هدف‌های خاص می‌تواند مفید واقع شود(ماٰژول‌های import شده). هماطور که قبلا گفته شده بود ماژول‌های که برای بار اول وارد (import)می‌شوند. محتویات ان ماژول اجرا می‌شود. 89 | با استفاده از این روش می‌توانیم از ماٰژول‌ها استفاده کنیم فرقی نمی‌کند ان ماژول را وارد کردیم(import) یا ماٰژول خودمان است. 90 | با استفاده از خاصیت `__name__` می‌توانیم به هدف خود برسیم. 91 | 92 | برای مثال (فایلی با نام `module_using_name.py`ذخیره کنید) 93 |
94 | 95 |
{% include "./programs/module_using_name.py" %}
96 | 97 |
98 | 99 | خروجی: 100 |
101 | 102 |
{% include "./programs/module_using_name.txt" %}
103 | 104 |
105 | 106 | 107 | 108 | **چگونه و چطوری** 109 | 110 | هر ماژولی در پایتون برای خود نامی`__name__` دارد یا برای ان تعریف شده. 111 | 112 | اگر این `'__main__'` است این بدان معنی است که ماٰژول توسط کاربر مستقل عمل می‌کند و اقدامات مناسب را می‌توانیم انجام بدهیم. 113 | 114 | ## ساختن ماژٰول شخصی 115 | 116 | ایجاد یک ماٰژول شخصی بسیار اسان است. هر روز دارید این کار را انجام می‌دهید شاید خودتون با خبر نباشید. چون تمامی برنامه‌های پایتون ماژول است. فقط کافی است که اطمینان حاصل کنید که افزنه‌ای `.py` را دارد. 117 | به مثال زیر توجه کنید 118 | 119 | برای مثال (فایلی با نام`mymodule.py`ذخیره کنید) 120 |
121 | 122 |
{% include "./programs/mymodule.py" %}
123 | 124 |
125 | نمونه بالا یک ماٰژول بود. همانطور که می‌بینید با برنامه معمولی پایتون هیچ تفاوتی ندارد. 126 | در اینده نه چندان دور خواهیم که چگونه از این ماٰژول‌ها در سایر برنامه های استفاده کنیم. 127 | 128 | بخاطر داشته باشید که ماٰٰژول فرخوان شده باید در همان پوشه باشد یا ادرش ان قید شده باشد.(در یکی از پوشه‌های `sys.path`) 129 | یک ماژول دیگر (فایلی با نام `mymodule_demo.py`ذخیره کنید) 130 | 131 |
132 |
{% include "./programs/mymodule_demo.py" %}
133 |
134 | 135 | خروجی: 136 |
137 | 138 |
{% include "./programs/mymodule_demo.txt" %}
139 |
140 | 141 | 142 | **چگونه و چطوری** 143 | 144 | دقت کردید پایتون برای صدا زدن ماٰژول‌ها ار هم نقطه دوباره استفاده کرده، که مجبور به یادگیری چیز متفرقه نشیم. پایتون به خوبی دوباره از این نشان‌ها استفاده می‌کند تا یک حس پابیتونی را القا کند. 145 | 146 | این یک نسخه از `from..import` 147 | برای مثال (فایلی با نام`mymodule_demo2.py`ذخیره کنید) 148 | 149 | 150 |
151 |
{% include "./programs/mymodule_demo2.py" %}
152 |
153 | 154 | خروجی: `mymodule_demo2.py` شبیه خروجی `mymodule_demo.py` است. 155 | 156 | 157 | با فراخوانی mymodule نام `__version__` صدا زده شده است. این باعث ایجاد درگیری می‌شود.بخاطر همین است که توسعه می‌شود از `import` استفاده کنید . گرچه برنامه‌ طولانی تر می‌شود ولی دچار چنین مشکلی نمی‌شود. 158 | 159 | هچنین می‌توانید: 160 |
161 | 162 | ```python 163 | from mymodule import * 164 | ``` 165 |
166 | 167 | این تمامی نام‌های عمومی فراخوانی می‌شود، مثل `say_hi` اما بدون `__version__` بخاطر اینکه با با دو خط شروع می‌شود (double underscores) 168 | 169 | تکته: با از import-star استفاده شود. `*from mymodule import` 170 | 171 |
172 | 173 | 174 |
175 | 176 | > **زین پایتون** 177 | > 178 | >یک از اصول پایتون این است که "Explicit is better than Implicit" "اشکار بودن بهتر از نهان است" برای یادگیری بهتر به `import this` مراجعه کنید. 179 | 180 | ## تابع dir 181 | {#dir-function} 182 | 183 | تابعی ساخته شده در `()dir` لیست تعریف شده توسط شی را بازمی‌گرداند. اگر شی یک ماژول باشد، این لیست شامل توابع، کلاس‌هاومتغییرهای است که در ان ماٰژول تعریف شده است. 184 | این تابع می‌تواند ارگومان را قبول کند. 185 | 186 | اگر ارگومان نامی‌است برای ماژول، تابع قابلیت فراخوانی لیست‌ نام‌های از ماژول را دارد. 187 | اگر ارگومانی وجود نداشته باشد، تابع لیست ماژول‌های فعلی را فراخوانی می‌کند. 188 | 189 | مثال: 190 |
191 | 192 | ```python 193 | $ python 194 | >>> import sys 195 | اسامی صفات را در ماژول sys دریافت کنید؛ 196 | >>> dir(sys) 197 | ['__displayhook__', '__doc__', 198 | 'argv', 'builtin_module_names', 199 | 'version', 'version_info'] 200 | 201 | فقط چند نوشته در اینجا نشان داده شده است 202 | 203 | نام اسناد برای ماژول فعلی را دریافت کنید 204 | >> dir() 205 | ['__builtins__', '__doc__', 206 | '__name__', '__package__'] 207 | ایجاد یک متغیر جدید 'a' 208 | >> a = 5 209 | >>> dir() 210 | ['__builtins__', '__doc__', '__name__', '__package__', 'a'] 211 | حذف / حذف نام 212 | >>> del a 213 | >>> dir() 214 | ['__builtins__', '__doc__', '__name__', '__package__'] 215 | ``` 216 |
217 | 218 | **چطوری و چگونه** 219 | 220 | در گام اولیه طرز استفاده `dir` برروی ماژول فراخوانی شده `sys` را دیدیم، همچنین لیستی از ویژگی‌های موجود را مشاهده کردیم. در گام بعدی از `dir` بدون پارامتر استفاده کردیم. به طور پیش فرض لیست ویژگی‌های ماژول فعلی را بازمی‌گرداند. نکته شامل لیست ماژول‌ها‌ی وارده شده هم می‌شود. 221 | برای دیدن عمل کرد `dir` یک تغییر جدید را به نام`a` تعریف کردیم و یک مقدار به ان اختصاص دادیم.سپس `dir` را برسی می‌کنیم می‌بینیم که یک لیست اضافی در لیست وجود دارد. 222 | 223 | با استفاده از دستور `del` متغییر را حذف می‌کنیم و درخروجی دوباره `dir` نمایش داده می‌شود. 224 | 225 | نکته دستور `del` برای حذف یک تغییر استفاده میشود.پس از استفاده از `del a` دیگر نمی‌توانید از متغییر `a` استفاده کنید. انگاری که وجود نداشته است مثل قبلا. 226 | نکته تابع `()dir` بر روی همه ماژول‌ها کار می‌کندبرای مثال `(dir(str` را اجرا کنید. 227 | 228 | همچنین تابع [`vars()`](http://docs.python.org/3/library/functions.html#vars) وجود دارد که می‌تواند هم صفت‌ها و مقادیر را برگرداند. ولی برای تمامی ماژول‌‌ها کار نمی‌کند. 229 | 230 | 231 | 232 | ## بسته‌ها 233 | 234 | در حال حاضر باید طرز سازماندهی و سلسله مراتب باید درگیر باشید. توابع‌هاعمومی مهعولا در درون ماژول‌ها قرار می‌گیرند. حال اگر بخواهید که ماژول‌ها را سازماندهی کنید چه؟ اینجاست که به کمکتات بسته‌ها (Packages) می‌ایند. 235 | بسته همان پوشه‌ است که درون ان فایلی `__init__.py` گذاشته می‌شود و برای پایتون این پوشه‌خاصی است چون ماژول‌ها در ان قرار دارد. 236 | 237 | برای مثال می‌خواهیم بسته با نام 'world' که در داخل ان 'asia', 'africa', و غیره وجود دارد. 238 | 239 | این کاری است که برای سلسله مراتب و ساختار پوشه‌هایتان باید داشته باشید: 240 | 241 |
242 | 243 | ``` 244 | - / 245 | - world/ 246 | - __init__.py 247 | - asia/ 248 | - __init__.py 249 | - india/ 250 | - __init__.py 251 | - foo.py 252 | - africa/ 253 | - __init__.py 254 | - madagascar/ 255 | - __init__.py 256 | - bar.py 257 | ``` 258 | 259 | 260 |
261 | 262 | بسته‌ها فقط یک توافقی برای سازماندهی سلسله مراتب هستند. نمونه‌ها بسیاری می‌توانید در [standard library](./stdlib.md#stdlib) پیدا کنید. 263 | 264 | ## خلاصه 265 | 266 | 267 | 268 | همانطور که دیدیم توابع هم مانند قسمتی از برنامه‌ها هستند که چندین بار در برنامه‌های مختلف می‌توانیم استفاده کنیم. بسته‌ها هم که روشی برای سازماندهی ماژول ها هستند. 269 | چیزهای که یاد گرفتیم. 270 | 271 | طرز استفاده از ماٰژول و ساخت ماٰژول را اموختیم. 272 | 273 | در دروس بعدی با مفهوم جالبی به نام ساختار اشنا خواهیم شد. 274 | 275 | 276 | -------------------------------------------------------------------------------- /op_exp.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | # اپراتورها و عبارت‌ها 5 | 6 | بیشتر فراخوانی‌ها(خطوط منطقی) که می‌نویسید دارای _عبارت‌ها_ هستند. عبارات‌ها را می‌توان به دو بخش تقسیم کرد عملوندها و عبارت‌ها. 7 | 8 | برای مثال `2 + 3` 9 | 10 | _اپراتور_، یک قابلیتی است که می‌تواند نمادهای مانند `+` یا کلیدهای خاص کیبورد را استفاده کند. اپراتورها به بعضی اطلاعات برای انجام این کار نیاز دارن که به این اطلاعات _عملوند_ می‌گویند. در این خصوص `2` و `3` عملوند هستند. 11 | 12 | ## اپراتورها 13 | 14 | 15 | 16 | به طور خلاصه‌وار به اپراتورها یک نگاهی می‌کنیم. 17 | 18 | 19 | توجه داشته باشید که عبارت‌ها را می‌توانید ارزیابی کنید. برای مثال با استفاده از مفسر تعاملی (همان خط دستور)، برای انجام تست عبارت‌ها `2 + 3`از کادرمحاوره‌ی شل پایتون استفاده کنید: 20 | 21 |
22 | 23 | ```python 24 | >>> 2 + 3 25 | 5 26 | >>> 3 * 5 27 | 15 28 | >>> 29 | ``` 30 | 31 |
32 | 33 | 34 | 35 | چند مثال برای اشنایی: 36 | 37 | - `+` (جمع) 38 | 39 | - اضافه کردن دو دستور العمل 40 | - `3 + 5` نتیجه‌اش `8`.`'a' + 'b'` نتیجه‌اش `'ab'`. 41 | 42 | - `-` (منفی) 43 | - کم کردن یک عدد از عدد دیگر 44 | - `5.2-` نتیجه‌اش منفی می‌شود و `50 - 24` نتیجه‌اش `26`. 45 | 46 | 47 | - `*` (ضرب) 48 | 49 | - ضرب دو عدد را می‌دهد یا رشته‌ی را چندبار تکرار می‌کند. 50 | - `2 * 3 نتیجه‌اش` `6`. `'la' * 3` نتیجه‌اش `'lalala'` . 51 | 52 | - `**` (توان) 53 | 54 | - به توان رساندن x به y. 55 | - `3 ** 4` نتیجه‌اش `81` (یاهمان `3 * 3 * 3 * 3`). 56 | 57 | - `/` (تقسیم) 58 | 59 | - تقسیم x به y 60 | - `3 / 13` نتیجه‌اش `4.333333333333333` . 61 | 62 | 63 | - `//` (تقسیم صحیح) 64 | 65 | - تقسیم x به y به صورتکی که کوچکترین عدد را در نظر می‌گیرد. 66 | - `3 // 13` نتیجه‌اش `4`. 67 | - `3 // 13-` نتیجه‌اش `5-`. 68 | 69 | 70 | 71 | - `%` (باقیمانده) 72 | 73 | - باقیمانده تقسیم عدد را برمی‌گرداند. 74 | - `3 % 13` نتیجه‌اش `1`.`-25.5 % 2.25` نتیچه‌اش `1.5` 75 | 76 | 77 | - `<<` (به چپ جابه‌جا کردن (left shift)) 78 | - به اندازه‌ی یک بیت از شماره به سمت چپ جابه‌جا می‌کند.(هر عدد در حافظه به صورت مبنای دودویی است مانند 0 و 1) 79 | - `2 << 2` نتیجه‌اش `8`. `2` در مبنای دو `10` بیت را نمایش می‌دهد. 80 | - ۲ بیت به چپ جابه‌جا کردن نتیجه‌اش `1000` که در مبنای ده `8` را نمایش می‌دهد. 81 | 82 | - `>>` (به راست جابه‌جا کردن (right shift)) 83 | - به اندازه‌ی یک بیت از شماره به سمت راست جابه‌جا می‌کند. 84 | - `11 >> 1` نتیجه‌اش `5`. 85 | - `11` در حالتی بیتی `1011` را نمایش می‌دهد، اگر به اندازه ۱ بیت سمت راست جابه‌جا کنیم نتیجه‌اش `101` است.که در مبنای ده‌دهی `5` است. 86 | 87 | - `&` (بیت منطقی AND) 88 | - بیت منطقی AND و عدد 89 | - `3 & 5` نتیجه‌اش `1`. 90 | 91 | - `|` (بیت منطقی OR) 92 | - بیت منطقی OR و عدد 93 | - `3 | 5` نتیجه‌اش `7`. 94 | 95 | - `^` (بیت منطقی XOR) 96 | - بیت منطقی XOR و عدد 97 | - `3 ^ 5` نتیجه‌اش `6`. 98 | 99 | - `~` (بیت منطقی (وارونه‌کردن)invert) 100 | - بیت منطقی X وارونه‌اش (x+1)- است. 101 | - `~5` نتیجه‌اش `-6`. اطلاعات بیشتر در http://stackoverflow.com/a/11810203 102 | 103 | 104 | - `<` (کمتر) 105 | - برسی‌می‌کند، ایا X کمتر Y است. همه‌ی مقایسه‌های عملوند‌ها `True` یا `False` را برمی‌گردانند.به این نکته‌های توجه کنید. 106 | 107 | - این `3 > 5` نتیجه‌اش `False` و `5 > 3` نتیجه‌اش `True`. 108 | - مقایسه می‌تواند به صورت زنچیره‌ای باشد: `7 > 5 > 3` نتیجه‌اش `True`. 109 | 110 | - `>` (بیشتر) 111 | - برسی‌می‌کند، ایا X بیشتر Y است. 112 | - این `3 < 5` نتیجه‌اش `True`. اگر هر دو عملوندها عدد باشند تبدیل به نوع معمولی می‌شوند در غیره این صورت محتوای بازگشتی همیشه `False` است. 113 | 114 | - `<=` (کمتر یا مساوی) 115 | - برسی‌می‌کند، ایا X کمتر یا مساوی Y است . 116 | - این`x = 3; y = 6; x <= y`نتیجه‌اش `True`. 117 | 118 | - `>=` (بیشتر و مساوی) 119 | - برسی‌می‌کند، ایا X بیشتر یا مساوی Y است . 120 | - این `x = 4; y = 3; x >= 3` نتیجه‌اش `True`. 121 | 122 | - `==` (مساوری) 123 | - برسی‌می‌کند، ایا دو مقدار با‌هم مساوی هستند. 124 | - این `x = 2; y = 2; x == y` نتیجه‌اش `True`. 125 | - این `x = 'str'; y = 'stR'; x == y` نتیجه‌اش `False`. 126 | - این `x = 'str'; y = 'str'; x == y` نتیجه‌‌اش `True`. 127 | 128 | - `!=` (نامساوی) 129 | - برسی‌می‌کند، ایا دو مقدار با‌هم نامساوی هستند. 130 | - این `x = 2; y = 3; x != y` نتیجه‌اش `True`. 131 | 132 | - `not` (بولی NOT) 133 | 134 | 135 | - اگر X برار`True` باشد نتیجه‌اش `False` است. اگر X برار `False` باشد نتیجه‌اش `True` است. 136 | - این `x = True; not x` نتیجه‌اش `False`. 137 | 138 | - `and` (بولی AND) 139 | - این `x and y` نتیجه‌اش `False` اگر X برار `False` وگرنه Y را برسی می‌کند. 140 | - این `x = False; y = True; x and y` نتیجه‌اش `False` چونکه X برار False.در این حالت پایتون Y را ارزیابی می‌کند بخاطر انکه می‌داند قسمت راستی 'and' عبارت `False` است که بدان معنی است که تمامی عبارت‌ها `False` بدون دلالت دیگر عبارت‌ها خواهد بود. این را به نام short-circuit evaluation می‌نامیم. 141 | 142 | - `or` (بولی OR) 143 | - اگر x برار `True` باشد نتیجه‌اش True است در غیر این صورت Y را ارزیابی می‌کند. 144 | - این `x = True; y = False; x or y` نتیجه‌اش `True` است. در اینجاهم از Short-circuit evaluation استفاده می‌شود 145 | 146 | 147 | ## میانبر برای عملیات ریاضی و انتساب 148 | 149 | معمولا عملیات ریاضی در متغییرها انجام می‌شود و جواب ان‌ها هم به متغییرها بر می‌گردد. بخاطر همین برای همچنین عبارت‌های مینابرهای مانند زیر را داریم: 150 | 151 |
152 | 153 | ```python 154 | a = 2 155 | a = a * 3 156 | ``` 157 | 158 |
159 | 160 | همچنین به این صورت هم می‌توان نوشت: 161 | 162 |
163 | 164 | ```python 165 | a = 2 166 | a *= 3 167 | ``` 168 |
169 | 170 | توجه داشته باشید که که عبارت `var = var operation expression` تبدیل به `var operation= expression` می‌شود. 171 | 172 | ## برسی سفارش 173 | 174 | اگر شما چنین عبارتی را دارید `4 * 3 + 2` بنظر شما اول جمع می‌شود یا ضرب می‌شود؟ طبق دروس ریاضی که در دبیرستان یاد گرفتیم، باید اول عمل ضرب انجام شود. و این بدان معنی است که عملوند ضرب اولویت بیشتر نسبت به عملوند جمع دارد . 175 | 176 | در جدول بعدی اولویت عملوندهای پایتون گفته شده است. از پایین‌ترین اولویت (اخرین مرحله) تا بالاترین اولویت(اولین مرحله). این بدان معنی است که عبارت‌های پایتون در این جدول، اول عبارت‌ها و عملوندهای که اولویت پایین‌تر دارند ارزیابی می‌شوند و بعد ان‌های که اولویت بیشتر دارند ارزیابی می‌شوند. 177 | 178 | جدول بعدی از [Python reference manual](http://docs.python.org/3/reference/expressions.html#operator-precedence (سند‌های پایتون)) گرفته شده است. ترجیحا بهتر است که از پرانتز برای گروه‌بندی عملوند‌ها و عبارت‌ها استفاده شود. بخاطر انکه به این صورت می‌توانیم به راحتی اولویت را درک کنیم.همچنین به راحتر کردن خواندن برنامه، این موضوع کمک می‌کند.بیشتر بدانید [Changing the Order of Evaluation](#changing-order-of-evaluation). 179 | 180 |
181 | 182 | - `lambda` : Lambda Expression 183 | - `if - else` : Conditional expression(عبارت شرطی) 184 | - `or` : Boolean OR (OR بولی) 185 | - `and` : Boolean AND (AND بولی) 186 | - `not x` : Boolean NOT (NOT بولی) 187 | - `in, not in, is, is not, <, <=, >, >=, !=, ==` : Comparisons, including membership tests and identity tests (مقایسه، شامل ارزیابی هویت ، انتساب متغییر) 188 | - `|` : Bitwise OR (OR بیت‌منطقی) 189 | - `^` : Bitwise XOR (XOR بیت‌منطقی) 190 | - `&` : Bitwise AND (AND بیت‌منطقی) 191 | - `<<, >>` : Shifts (جابه‌جاکردن یا همون شیفت دادن) 192 | - `+, -` : Addition and subtraction (جمع و تفریق) 193 | - `*, /, //, %` : Multiplication, Division, Floor Division and Remainder (ضرب، تقسیم، تقسیم صحیح و باقیمانده) 194 | - `+x, -x, ~x` : Positive, Negative, bitwise NOT (NOT مثت، منفی، بیت‌منطقی) 195 | - `**` : Exponentiation 196 | - `x[index], x[index:index], x(arguments...), x.attribute` : Subscription, slicing, call, attribute reference (فراخوانی، بقیه را هر کسی که معنی تخصصی ‌اش را می‌داند بگذارد) 197 | - `(expressions...), [expressions...], {key: value...}, {expressions...}` : Binding or tuple display, list display, dictionary display, set display (...) 198 | 199 |
200 | 201 | 202 | 203 | اپراتورهای که تا به حال ندیده‌ایم در فصول بعدی توضیح داده خواهد شد. 204 | 205 | اپراتورهای که _اولویت یکسان_ دارند همان طور که در جدول بالا می‌بیند. برای مثال `+` و `-` که اولویت یکسانی دارند. تمامی انان در یک خط نوشته شده‌اند. 206 | 207 | ## تغییر دادن به منظور ارزیابی 208 | 209 | {#changing-order-of-evaluation} 210 | 211 | برای انکه عبارت‌ها را بهتر بفهیم و راحتر قابل خواندن باشند می‌توانیم پرانتز استفاده کنیم. برای مثال `2 + (3 * 4)` واقعا فهم این راحتر از `2 + 3 * 4` بخاطرهمین اولویت عملوندها یادگیراش مهم است. این را هم در نظر بگیرید که پرانتزها باید عاقلانه استفاده شوند(جوگیر نشوید).همچین پرانتزها باید مقداردهی شوند برای مثال `(2 + (3 * 4))`. 212 | 213 | همچنین یک نکته دیگر بهتر برای استفاده از پرانتز داریم با این روش می‌توان اولویت‌ها را تغییر داد. برای مثال اگر شما می‌خواهید جمع اولویت بیشتر نسبت به ضرب داشته باشد، می‌توانید از این روش استفاده کنید `(2 + 3) * 4`. 214 | 215 | ## ارتباطات 216 | 217 | عملوندها معمولا از راست به چپ باهم در ارتباط هستند.این بدان معنی است که عملوندها با اولویت یکسان از چپ به راست ارزیابی می‌شوند.برای مثال `2 + 3 + 4` و به این صورت `(2 + 3) + 4` ارزیابی می‌شوند. 218 | 219 | ## عبارت‌ها 220 | 221 | مثال (`expression.py` همچین قایل را ذخیره کنید) 222 | 223 |
224 | 225 | ```python 226 | length = 5 227 | breadth = 2 228 | 229 | area = length * breadth 230 | print('Area is', area) 231 | print('Perimeter is', 2 * (length + breadth)) 232 | ``` 233 |
234 | 235 | خروجی: 236 | 237 |
238 | 239 | 240 | ``` 241 | $ python expression.py 242 | Area is 10 243 | Perimeter is 14 244 | ``` 245 | 246 |
247 | 248 | ## چطور و چگونه 249 | 250 | طول و عرض مستطیل با همان اسم در متغییر ذخیره می‌شوند. برای محاسبه طول و عرض مستطیل از عبارت‌ها استفاده می‌شود. نتیجه را در عبارت `length * breadth (طول و عرض)` در +area(مساحت)+ ذخیره می‌کنیم. و بعد با استفاده از تابع +print+ خروجی `2 * (length + breadth)` را چاپ می‌کنیم. همین طور که مشاهده می‌کنید دراینجا از محتویات عبارت‌ها استفاده می‌کنیم. 251 | 252 | همچنین این نکته را در نظر بگیرید که پایتون به چه زیبایی خروجی را چاپ می‌کند. حتی با اینکه بین `'Area is'` و متغییر `area` فاصله نگذاشتیم. به چه زیبایی پایتون این فاصله‌های را گذشته است. برای این که یک خروجی تمیز و قابل خواندن داشته باشیم(دیگر نیاز نیست برای فاصله‌ی خطوط نگران باشیم). این یکی از مثال‌ها‌ی است که پایتون زندگی برنامه‌نویسان را اسوده‌تر می‌کند. 253 | 254 | ## خلاصه 255 | 256 | چگونگی استفاده از اپراتورها و عبارت‌ها را دیدیم. این موضوع یک ساختار مهم در بلوک‌های برنامه‌نویسی است. در فصول بعدی خواهیم دید چگونه دربرنامه‌هایمان ازفراخوانی‌ها استفاده کنیم. 257 | 258 | test 259 | -------------------------------------------------------------------------------- /preface.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | از این نکته هم با خبریم که خیلی سری می‌ریم سر اصل متلب برای راحتر خواندن به [نسخه‌ی گیت‌بوک](https://elias_rouhani.gitbooks.io/byte-of-python-persian/content/) سر بزنید. 4 | 5 | 6 | 7 | 8 | 9 | # مقدمه 10 | 11 | پایتون یکی از زبان برنامه‌نویسی‌های است که هم اسان‌، ساده و از طرف دیگر قدرتمند است. این موضوع هم برای مبتدیان قابل فهم است و همچنین برای برنامه نویس‌های حرفه‌ای کار گشا است. یکی دیگر از نکات مهم دیگراش برنامه‌نویسی کردن در پایتون لذت‌بخش است. این کتاب طراحی شده که دستیاری عالی برای یادگیری زبان برنامه‌نویسی باشد. تا بتوانیم نشان بدهیم, که به ان هدفی که دارید, برای دست یافتن به حل مشکلات در زبان برنامه‌نویسی پایتون، چقدر ساده است. 12 | 13 | ## این کتاب برای کیست 14 | 15 | این کتاب به عنوان راهنما و کتاب درسی برای زبان‌ برنامه‌نویسی پایتون است. ترجیحا برای مبتدیان طراحی شده است. ولی برای حرفه‌ی‌ها هم ممکن است مفید واقع شود. 16 | 17 | هدفمان در اینجا این است که اگر شما درباره‌ی علوم کامپیوتر می‌دانید، به راحتی بتوانید از این کتاب برای یادگیری پایتون استفاده کنید. حتی اگر برنامه‌نویس هم باشید این کتاب در کارهایتان راه گشا خواهد بود. 18 | 19 | اگر برنامه‌نویس حرفه‌ی باشید احتمالا تفاوت پایتون با زبان برنامه‌نویسی که خود استفاده می‌کنید، برایتان جالب خواهد بود. ناراحت نباشید تمامی تفاوت‌های برنامه‌نویسی پایتون را هایلایت کرده‌ام. مطمئن باشید که پس از مدتی پایتون، به عنوان بهترین زبان برنامه‌نویسی, شما خواهد شد. 20 | 21 | 22 | 23 | ## وبگاه رسمی 24 | 25 | وبگاه رسمی کتاب [نسخه‌ی گیت‌بوک به زبان انگلیسی](https://python.swaroopch.com/) جاییکه که می‌توانید بصورت انلاین این کتاب را بخوانید و همچنین اخرین نسخه کتاب را دانلود کنید, [خرید کتاب چاپ شده]({{ book.buyBookUrl }}) و ارتباط با ما. برای دیدن [نسخه‌ی گیت‌بوک به زبان فارسی](https://elyas.gitbooks.io/a-byte-of-python-parsi/content/) نیز به لینک داده شده سر بزنید. 26 | 27 | ## نظرها 28 | 29 | > دو روش برای طراحی برنامه وجود دارد خیلی ساده بنویسیم که کمبودی نداشته باشد و دیگری که انقدر سنگین و پیچیده بنویسیم که مطمئنا کمبودهای خواهد داشت. 30 | 31 |
32 | 33 | **C. A. R. Hoare** 34 | 35 |
36 | 37 | 38 | 39 | > موفقیت در زندگی این است که چقدر **پشتکار**، **تمرکز**، توانایی و استعداد پشت ان خوابیده باشد. 40 | 41 |
42 | 43 | **W. Wendte** 44 | 45 |
46 | 47 | -------------------------------------------------------------------------------- /problem_solving.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | اضافه خواهد شد 4 | 5 | test 6 | -------------------------------------------------------------------------------- /programs/abc.txt: -------------------------------------------------------------------------------- 1 | Imagine non-English language here -------------------------------------------------------------------------------- /programs/backup_ver1.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | # 1. The files and directories to be backed up are 5 | # specified in a list. 6 | # Example on Windows: 7 | # source = ['"C:\\My Documents"', 'C:\\Code'] 8 | # Example on Mac OS X and Linux: 9 | source = ['/Users/swa/notes'] 10 | # Notice we had to use double quotes inside the string 11 | # for names with spaces in it. 12 | 13 | # 2. The backup must be stored in a 14 | # main backup directory 15 | # Example on Windows: 16 | # target_dir = 'E:\\Backup' 17 | # Example on Mac OS X and Linux: 18 | target_dir = '/Users/swa/backup' 19 | # Remember to change this to which folder you will be using 20 | 21 | # 3. The files are backed up into a zip file. 22 | # 4. The name of the zip archive is the current date and time 23 | target = target_dir + os.sep + \ 24 | time.strftime('%Y%m%d%H%M%S') + '.zip' 25 | 26 | # Create target directory if it is not present 27 | if not os.path.exists(target_dir): 28 | os.mkdir(target_dir) # make directory 29 | 30 | # 5. We use the zip command to put the files in a zip archive 31 | zip_command = 'zip -r {0} {1}'.format(target, 32 | ' '.join(source)) 33 | 34 | # Run the backup 35 | print('Zip command is:') 36 | print(zip_command) 37 | print('Running:') 38 | if os.system(zip_command) == 0: 39 | print('Successful backup to', target) 40 | else: 41 | print('Backup FAILED') 42 | -------------------------------------------------------------------------------- /programs/backup_ver1.txt: -------------------------------------------------------------------------------- 1 | $ python backup_ver1.py 2 | Zip command is: 3 | zip -r /Users/swa/backup/20140328084844.zip /Users/swa/notes 4 | Running: 5 | adding: Users/swa/notes/ (stored 0%) 6 | adding: Users/swa/notes/blah1.txt (stored 0%) 7 | adding: Users/swa/notes/blah2.txt (stored 0%) 8 | adding: Users/swa/notes/blah3.txt (stored 0%) 9 | Successful backup to /Users/swa/backup/20140328084844.zip 10 | -------------------------------------------------------------------------------- /programs/backup_ver2.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | # 1. The files and directories to be backed up are 5 | # specified in a list. 6 | # Example on Windows: 7 | # source = ['"C:\\My Documents"', 'C:\\Code'] 8 | # Example on Mac OS X and Linux: 9 | source = ['/Users/swa/notes'] 10 | # Notice we had to use double quotes inside the string 11 | # for names with spaces in it. 12 | 13 | # 2. The backup must be stored in a 14 | # main backup directory 15 | # Example on Windows: 16 | # target_dir = 'E:\\Backup' 17 | # Example on Mac OS X and Linux: 18 | target_dir = '/Users/swa/backup' 19 | # Remember to change this to which folder you will be using 20 | 21 | # Create target directory if it is not present 22 | if not os.path.exists(target_dir): 23 | os.mkdir(target_dir) # make directory 24 | 25 | # 3. The files are backed up into a zip file. 26 | # 4. The current day is the name of the subdirectory 27 | # in the main directory. 28 | today = target_dir + os.sep + time.strftime('%Y%m%d') 29 | # The current time is the name of the zip archive. 30 | now = time.strftime('%H%M%S') 31 | 32 | # The name of the zip file 33 | target = today + os.sep + now + '.zip' 34 | 35 | # Create the subdirectory if it isn't already there 36 | if not os.path.exists(today): 37 | os.mkdir(today) 38 | print('Successfully created directory', today) 39 | 40 | # 5. We use the zip command to put the files in a zip archive 41 | zip_command = 'zip -r {0} {1}'.format(target, 42 | ' '.join(source)) 43 | 44 | # Run the backup 45 | print('Zip command is:') 46 | print(zip_command) 47 | print('Running:') 48 | if os.system(zip_command) == 0: 49 | print('Successful backup to', target) 50 | else: 51 | print('Backup FAILED') 52 | -------------------------------------------------------------------------------- /programs/backup_ver2.txt: -------------------------------------------------------------------------------- 1 | $ python backup_ver2.py 2 | Successfully created directory /Users/swa/backup/20140329 3 | Zip command is: 4 | zip -r /Users/swa/backup/20140329/073201.zip /Users/swa/notes 5 | Running: 6 | adding: Users/swa/notes/ (stored 0%) 7 | adding: Users/swa/notes/blah1.txt (stored 0%) 8 | adding: Users/swa/notes/blah2.txt (stored 0%) 9 | adding: Users/swa/notes/blah3.txt (stored 0%) 10 | Successful backup to /Users/swa/backup/20140329/073201.zip 11 | -------------------------------------------------------------------------------- /programs/backup_ver3.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | # 1. The files and directories to be backed up are 5 | # specified in a list. 6 | # Example on Windows: 7 | # source = ['"C:\\My Documents"', 'C:\\Code'] 8 | # Example on Mac OS X and Linux: 9 | source = ['/Users/swa/notes'] 10 | # Notice we had to use double quotes inside the string 11 | # for names with spaces in it. 12 | 13 | # 2. The backup must be stored in a 14 | # main backup directory 15 | # Example on Windows: 16 | # target_dir = 'E:\\Backup' 17 | # Example on Mac OS X and Linux: 18 | target_dir = '/Users/swa/backup' 19 | # Remember to change this to which folder you will be using 20 | 21 | # Create target directory if it is not present 22 | if not os.path.exists(target_dir): 23 | os.mkdir(target_dir) # make directory 24 | 25 | # 3. The files are backed up into a zip file. 26 | # 4. The current day is the name of the subdirectory 27 | # in the main directory. 28 | today = target_dir + os.sep + time.strftime('%Y%m%d') 29 | # The current time is the name of the zip archive. 30 | now = time.strftime('%H%M%S') 31 | 32 | # Take a comment from the user to 33 | # create the name of the zip file 34 | comment = input('Enter a comment --> ') 35 | # Check if a comment was entered 36 | if len(comment) == 0: 37 | target = today + os.sep + now + '.zip' 38 | else: 39 | target = today + os.sep + now + '_' + 40 | comment.replace(' ', '_') + '.zip' 41 | 42 | # Create the subdirectory if it isn't already there 43 | if not os.path.exists(today): 44 | os.mkdir(today) 45 | print('Successfully created directory', today) 46 | 47 | # 5. We use the zip command to put the files in a zip archive 48 | zip_command = "zip -r {0} {1}".format(target, 49 | ' '.join(source)) 50 | 51 | # Run the backup 52 | print('Zip command is:') 53 | print(zip_command) 54 | print('Running:') 55 | if os.system(zip_command) == 0: 56 | print('Successful backup to', target) 57 | else: 58 | print('Backup FAILED') 59 | -------------------------------------------------------------------------------- /programs/backup_ver3.txt: -------------------------------------------------------------------------------- 1 | $ python backup_ver3.py 2 | File "backup_ver3.py", line 39 3 | target = today + os.sep + now + '_' + 4 | ^ 5 | SyntaxError: invalid syntax 6 | -------------------------------------------------------------------------------- /programs/backup_ver4.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | # 1. The files and directories to be backed up are 5 | # specified in a list. 6 | # Example on Windows: 7 | # source = ['"C:\\My Documents"', 'C:\\Code'] 8 | # Example on Mac OS X and Linux: 9 | source = ['/Users/swa/notes'] 10 | # Notice we had to use double quotes inside the string 11 | # for names with spaces in it. 12 | 13 | # 2. The backup must be stored in a 14 | # main backup directory 15 | # Example on Windows: 16 | # target_dir = 'E:\\Backup' 17 | # Example on Mac OS X and Linux: 18 | target_dir = '/Users/swa/backup' 19 | # Remember to change this to which folder you will be using 20 | 21 | # Create target directory if it is not present 22 | if not os.path.exists(target_dir): 23 | os.mkdir(target_dir) # make directory 24 | 25 | # 3. The files are backed up into a zip file. 26 | # 4. The current day is the name of the subdirectory 27 | # in the main directory. 28 | today = target_dir + os.sep + time.strftime('%Y%m%d') 29 | # The current time is the name of the zip archive. 30 | now = time.strftime('%H%M%S') 31 | 32 | # Take a comment from the user to 33 | # create the name of the zip file 34 | comment = input('Enter a comment --> ') 35 | # Check if a comment was entered 36 | if len(comment) == 0: 37 | target = today + os.sep + now + '.zip' 38 | else: 39 | target = today + os.sep + now + '_' + \ 40 | comment.replace(' ', '_') + '.zip' 41 | 42 | # Create the subdirectory if it isn't already there 43 | if not os.path.exists(today): 44 | os.mkdir(today) 45 | print('Successfully created directory', today) 46 | 47 | # 5. We use the zip command to put the files in a zip archive 48 | zip_command = 'zip -r {0} {1}'.format(target, 49 | ' '.join(source)) 50 | 51 | # Run the backup 52 | print('Zip command is:') 53 | print(zip_command) 54 | print('Running:') 55 | if os.system(zip_command) == 0: 56 | print('Successful backup to', target) 57 | else: 58 | print('Backup FAILED') 59 | -------------------------------------------------------------------------------- /programs/backup_ver4.txt: -------------------------------------------------------------------------------- 1 | $ python backup_ver4.py 2 | Enter a comment --> added new examples 3 | Zip command is: 4 | zip -r /Users/swa/backup/20140329/074122_added_new_examples.zip /Users/swa/notes 5 | Running: 6 | adding: Users/swa/notes/ (stored 0%) 7 | adding: Users/swa/notes/blah1.txt (stored 0%) 8 | adding: Users/swa/notes/blah2.txt (stored 0%) 9 | adding: Users/swa/notes/blah3.txt (stored 0%) 10 | Successful backup to /Users/swa/backup/20140329/074122_added_new_examples.zip 11 | -------------------------------------------------------------------------------- /programs/break.py: -------------------------------------------------------------------------------- 1 | while True: 2 | s = input('Enter something : ') 3 | if s == 'quit': 4 | break 5 | print('Length of the string is', len(s)) 6 | print('Done') 7 | -------------------------------------------------------------------------------- /programs/break.txt: -------------------------------------------------------------------------------- 1 | $ python break.py 2 | Enter something : Programming is fun 3 | Length of the string is 18 4 | Enter something : When the work is done 5 | Length of the string is 21 6 | Enter something : if you wanna make your work also fun: 7 | Length of the string is 37 8 | Enter something : use Python! 9 | Length of the string is 11 10 | Enter something : quit 11 | Done 12 | -------------------------------------------------------------------------------- /programs/continue.py: -------------------------------------------------------------------------------- 1 | while True: 2 | s = input('Enter something : ') 3 | if s == 'quit': 4 | break 5 | if len(s) < 3: 6 | print('Too small') 7 | continue 8 | print('Input is of sufficient length') 9 | # Do other kinds of processing here... 10 | -------------------------------------------------------------------------------- /programs/continue.txt: -------------------------------------------------------------------------------- 1 | $ python continue.py 2 | Enter something : a 3 | Too small 4 | Enter something : 12 5 | Too small 6 | Enter something : abc 7 | Input is of sufficient length 8 | Enter something : quit 9 | -------------------------------------------------------------------------------- /programs/ds_reference.py: -------------------------------------------------------------------------------- 1 | print('Simple Assignment') 2 | shoplist = ['apple', 'mango', 'carrot', 'banana'] 3 | # mylist is just another name pointing to the same object! 4 | mylist = shoplist 5 | 6 | # I purchased the first item, so I remove it from the list 7 | del shoplist[0] 8 | 9 | print('shoplist is', shoplist) 10 | print('mylist is', mylist) 11 | # Notice that both shoplist and mylist both print 12 | # the same list without the 'apple' confirming that 13 | # they point to the same object 14 | 15 | print('Copy by making a full slice') 16 | # Make a copy by doing a full slice 17 | mylist = shoplist[:] 18 | # Remove first item 19 | del mylist[0] 20 | 21 | print('shoplist is', shoplist) 22 | print('mylist is', mylist) 23 | # Notice that now the two lists are different 24 | -------------------------------------------------------------------------------- /programs/ds_reference.txt: -------------------------------------------------------------------------------- 1 | $ python ds_reference.py 2 | Simple Assignment 3 | shoplist is ['mango', 'carrot', 'banana'] 4 | mylist is ['mango', 'carrot', 'banana'] 5 | Copy by making a full slice 6 | shoplist is ['mango', 'carrot', 'banana'] 7 | mylist is ['carrot', 'banana'] 8 | -------------------------------------------------------------------------------- /programs/ds_seq.py: -------------------------------------------------------------------------------- 1 | shoplist = ['apple', 'mango', 'carrot', 'banana'] 2 | name = 'swaroop' 3 | 4 | # Indexing or 'Subscription' operation # 5 | print('Item 0 is', shoplist[0]) 6 | print('Item 1 is', shoplist[1]) 7 | print('Item 2 is', shoplist[2]) 8 | print('Item 3 is', shoplist[3]) 9 | print('Item -1 is', shoplist[-1]) 10 | print('Item -2 is', shoplist[-2]) 11 | print('Character 0 is', name[0]) 12 | 13 | # Slicing on a list # 14 | print('Item 1 to 3 is', shoplist[1:3]) 15 | print('Item 2 to end is', shoplist[2:]) 16 | print('Item 1 to -1 is', shoplist[1:-1]) 17 | print('Item start to end is', shoplist[:]) 18 | 19 | # Slicing on a string # 20 | print('characters 1 to 3 is', name[1:3]) 21 | print('characters 2 to end is', name[2:]) 22 | print('characters 1 to -1 is', name[1:-1]) 23 | print('characters start to end is', name[:]) 24 | -------------------------------------------------------------------------------- /programs/ds_seq.txt: -------------------------------------------------------------------------------- 1 | $ python ds_seq.py 2 | Item 0 is apple 3 | Item 1 is mango 4 | Item 2 is carrot 5 | Item 3 is banana 6 | Item -1 is banana 7 | Item -2 is carrot 8 | Character 0 is s 9 | Item 1 to 3 is ['mango', 'carrot'] 10 | Item 2 to end is ['carrot', 'banana'] 11 | Item 1 to -1 is ['mango', 'carrot'] 12 | Item start to end is ['apple', 'mango', 'carrot', 'banana'] 13 | characters 1 to 3 is wa 14 | characters 2 to end is aroop 15 | characters 1 to -1 is waroo 16 | characters start to end is swaroop 17 | -------------------------------------------------------------------------------- /programs/ds_str_methods.py: -------------------------------------------------------------------------------- 1 | # This is a string object 2 | name = 'Swaroop' 3 | 4 | if name.startswith('Swa'): 5 | print('Yes, the string starts with "Swa"') 6 | 7 | if 'a' in name: 8 | print('Yes, it contains the string "a"') 9 | 10 | if name.find('war') != -1: 11 | print('Yes, it contains the string "war"') 12 | 13 | delimiter = '_*_' 14 | mylist = ['Brazil', 'Russia', 'India', 'China'] 15 | print(delimiter.join(mylist)) 16 | -------------------------------------------------------------------------------- /programs/ds_str_methods.txt: -------------------------------------------------------------------------------- 1 | $ python ds_str_methods.py 2 | Yes, the string starts with "Swa" 3 | Yes, it contains the string "a" 4 | Yes, it contains the string "war" 5 | Brazil_*_Russia_*_India_*_China 6 | -------------------------------------------------------------------------------- /programs/ds_using_dict.py: -------------------------------------------------------------------------------- 1 | # 'ab' is short for 'a'ddress'b'ook 2 | 3 | ab = { 4 | 'Swaroop': 'swaroop@swaroopch.com', 5 | 'Larry': 'larry@wall.org', 6 | 'Matsumoto': 'matz@ruby-lang.org', 7 | 'Spammer': 'spammer@hotmail.com' 8 | } 9 | 10 | print("Swaroop's address is", ab['Swaroop']) 11 | 12 | # Deleting a key-value pair 13 | del ab['Spammer'] 14 | 15 | print('\nThere are {} contacts in the address-book\n'.format(len(ab))) 16 | 17 | for name, address in ab.items(): 18 | print('Contact {} at {}'.format(name, address)) 19 | 20 | # Adding a key-value pair 21 | ab['Guido'] = 'guido@python.org' 22 | 23 | if 'Guido' in ab: 24 | print("\nGuido's address is", ab['Guido']) 25 | -------------------------------------------------------------------------------- /programs/ds_using_dict.txt: -------------------------------------------------------------------------------- 1 | $ python ds_using_dict.py 2 | Swaroop's address is swaroop@swaroopch.com 3 | 4 | There are 3 contacts in the address-book 5 | 6 | Contact Swaroop at swaroop@swaroopch.com 7 | Contact Matsumoto at matz@ruby-lang.org 8 | Contact Larry at larry@wall.org 9 | 10 | Guido's address is guido@python.org 11 | -------------------------------------------------------------------------------- /programs/ds_using_list.py: -------------------------------------------------------------------------------- 1 | # This is my shopping list 2 | shoplist = ['apple', 'mango', 'carrot', 'banana'] 3 | 4 | print('I have', len(shoplist), 'items to purchase.') 5 | 6 | print('These items are:', end=' ') 7 | for item in shoplist: 8 | print(item, end=' ') 9 | 10 | print('\nI also have to buy rice.') 11 | shoplist.append('rice') 12 | print('My shopping list is now', shoplist) 13 | 14 | print('I will sort my list now') 15 | shoplist.sort() 16 | print('Sorted shopping list is', shoplist) 17 | 18 | print('The first item I will buy is', shoplist[0]) 19 | olditem = shoplist[0] 20 | del shoplist[0] 21 | print('I bought the', olditem) 22 | print('My shopping list is now', shoplist) 23 | -------------------------------------------------------------------------------- /programs/ds_using_list.txt: -------------------------------------------------------------------------------- 1 | $ python ds_using_list.py 2 | I have 4 items to purchase. 3 | These items are: apple mango carrot banana 4 | I also have to buy rice. 5 | My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice'] 6 | I will sort my list now 7 | Sorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice'] 8 | The first item I will buy is apple 9 | I bought the apple 10 | My shopping list is now ['banana', 'carrot', 'mango', 'rice'] 11 | -------------------------------------------------------------------------------- /programs/ds_using_tuple.py: -------------------------------------------------------------------------------- 1 | # I would recommend always using parentheses 2 | # to indicate start and end of tuple 3 | # even though parentheses are optional. 4 | # Explicit is better than implicit. 5 | zoo = ('python', 'elephant', 'penguin') 6 | print('Number of animals in the zoo is', len(zoo)) 7 | 8 | new_zoo = 'monkey', 'camel', zoo 9 | print('Number of cages in the new zoo is', len(new_zoo)) 10 | print('All animals in new zoo are', new_zoo) 11 | print('Animals brought from old zoo are', new_zoo[2]) 12 | print('Last animal brought from old zoo is', new_zoo[2][2]) 13 | print('Number of animals in the new zoo is', 14 | len(new_zoo)-1+len(new_zoo[2])) 15 | -------------------------------------------------------------------------------- /programs/ds_using_tuple.txt: -------------------------------------------------------------------------------- 1 | $ python ds_using_tuple.py 2 | Number of animals in the zoo is 3 3 | Number of cages in the new zoo is 3 4 | All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin')) 5 | Animals brought from old zoo are ('python', 'elephant', 'penguin') 6 | Last animal brought from old zoo is penguin 7 | Number of animals in the new zoo is 5 8 | -------------------------------------------------------------------------------- /programs/exceptions_finally.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import time 3 | 4 | f = None 5 | try: 6 | f = open("poem.txt") 7 | # Our usual file-reading idiom 8 | while True: 9 | line = f.readline() 10 | if len(line) == 0: 11 | break 12 | print(line, end='') 13 | sys.stdout.flush() 14 | print("Press ctrl+c now") 15 | # To make sure it runs for a while 16 | time.sleep(2) 17 | except IOError: 18 | print("Could not find file poem.txt") 19 | except KeyboardInterrupt: 20 | print("!! You cancelled the reading from the file.") 21 | finally: 22 | if f: 23 | f.close() 24 | print("(Cleaning up: Closed the file)") 25 | -------------------------------------------------------------------------------- /programs/exceptions_finally.txt: -------------------------------------------------------------------------------- 1 | $ python exceptions_finally.py 2 | Programming is fun 3 | Press ctrl+c now 4 | ^C!! You cancelled the reading from the file. 5 | (Cleaning up: Closed the file) 6 | -------------------------------------------------------------------------------- /programs/exceptions_handle.py: -------------------------------------------------------------------------------- 1 | try: 2 | text = input('Enter something --> ') 3 | except EOFError: 4 | print('Why did you do an EOF on me?') 5 | except KeyboardInterrupt: 6 | print('You cancelled the operation.') 7 | else: 8 | print('You entered {}'.format(text)) 9 | -------------------------------------------------------------------------------- /programs/exceptions_handle.txt: -------------------------------------------------------------------------------- 1 | # Press ctrl + d 2 | $ python exceptions_handle.py 3 | Enter something --> Why did you do an EOF on me? 4 | 5 | # Press ctrl + c 6 | $ python exceptions_handle.py 7 | Enter something --> ^CYou cancelled the operation. 8 | 9 | $ python exceptions_handle.py 10 | Enter something --> No exceptions 11 | You entered No exceptions 12 | -------------------------------------------------------------------------------- /programs/exceptions_raise.py: -------------------------------------------------------------------------------- 1 | class ShortInputException(Exception): 2 | '''A user-defined exception class.''' 3 | def __init__(self, length, atleast): 4 | Exception.__init__(self) 5 | self.length = length 6 | self.atleast = atleast 7 | 8 | try: 9 | text = input('Enter something --> ') 10 | if len(text) < 3: 11 | raise ShortInputException(len(text), 3) 12 | # Other work can continue as usual here 13 | except EOFError: 14 | print('Why did you do an EOF on me?') 15 | except ShortInputException as ex: 16 | print(('ShortInputException: The input was ' + 17 | '{0} long, expected at least {1}') 18 | .format(ex.length, ex.atleast)) 19 | else: 20 | print('No exception was raised.') 21 | -------------------------------------------------------------------------------- /programs/exceptions_raise.txt: -------------------------------------------------------------------------------- 1 | $ python exceptions_raise.py 2 | Enter something --> a 3 | ShortInputException: The input was 1 long, expected at least 3 4 | 5 | $ python exceptions_raise.py 6 | Enter something --> abc 7 | No exception was raised. 8 | -------------------------------------------------------------------------------- /programs/exceptions_using_with.py: -------------------------------------------------------------------------------- 1 | with open("poem.txt") as f: 2 | for line in f: 3 | print(line, end='') 4 | -------------------------------------------------------------------------------- /programs/for.py: -------------------------------------------------------------------------------- 1 | for i in range(1, 5): 2 | print(i) 3 | else: 4 | print('The for loop is over') 5 | -------------------------------------------------------------------------------- /programs/for.txt: -------------------------------------------------------------------------------- 1 | $ python for.py 2 | 1 3 | 2 4 | 3 5 | 4 6 | The for loop is over 7 | -------------------------------------------------------------------------------- /programs/function1.py: -------------------------------------------------------------------------------- 1 | def say_hello(): 2 | # block belonging to the function 3 | print('hello world') 4 | # End of function 5 | 6 | say_hello() # call the function 7 | say_hello() # call the function again 8 | -------------------------------------------------------------------------------- /programs/function1.txt: -------------------------------------------------------------------------------- 1 | $ python function1.py 2 | hello world 3 | hello world 4 | -------------------------------------------------------------------------------- /programs/function_default.py: -------------------------------------------------------------------------------- 1 | def say(message, times=1): 2 | print(message * times) 3 | 4 | say('Hello') 5 | say('World', 5) 6 | -------------------------------------------------------------------------------- /programs/function_default.txt: -------------------------------------------------------------------------------- 1 | $ python function_default.py 2 | Hello 3 | WorldWorldWorldWorldWorld 4 | -------------------------------------------------------------------------------- /programs/function_docstring.py: -------------------------------------------------------------------------------- 1 | def print_max(x, y): 2 | '''Prints the maximum of two numbers. 3 | 4 | The two values must be integers.''' 5 | # convert to integers, if possible 6 | x = int(x) 7 | y = int(y) 8 | 9 | if x > y: 10 | print(x, 'is maximum') 11 | else: 12 | print(y, 'is maximum') 13 | 14 | print_max(3, 5) 15 | print(print_max.__doc__) 16 | -------------------------------------------------------------------------------- /programs/function_docstring.txt: -------------------------------------------------------------------------------- 1 | $ python function_docstring.py 2 | 5 is maximum 3 | Prints the maximum of two numbers. 4 | 5 | The two values must be integers. 6 | -------------------------------------------------------------------------------- /programs/function_global.py: -------------------------------------------------------------------------------- 1 | x = 50 2 | 3 | 4 | def func(): 5 | global x 6 | 7 | print('x is', x) 8 | x = 2 9 | print('Changed global x to', x) 10 | 11 | 12 | func() 13 | print('Value of x is', x) 14 | -------------------------------------------------------------------------------- /programs/function_global.txt: -------------------------------------------------------------------------------- 1 | $ python function_global.py 2 | x is 50 3 | Changed global x to 2 4 | Value of x is 2 5 | -------------------------------------------------------------------------------- /programs/function_keyword.py: -------------------------------------------------------------------------------- 1 | def func(a, b=5, c=10): 2 | print('a is', a, 'and b is', b, 'and c is', c) 3 | 4 | func(3, 7) 5 | func(25, c=24) 6 | func(c=50, a=100) 7 | -------------------------------------------------------------------------------- /programs/function_keyword.txt: -------------------------------------------------------------------------------- 1 | $ python function_keyword.py 2 | a is 3 and b is 7 and c is 10 3 | a is 25 and b is 5 and c is 24 4 | a is 100 and b is 5 and c is 50 5 | -------------------------------------------------------------------------------- /programs/function_local.py: -------------------------------------------------------------------------------- 1 | x = 50 2 | 3 | 4 | def func(x): 5 | print('x is', x) 6 | x = 2 7 | print('Changed local x to', x) 8 | 9 | 10 | func(x) 11 | print('x is still', x) 12 | -------------------------------------------------------------------------------- /programs/function_local.txt: -------------------------------------------------------------------------------- 1 | $ python function_local.py 2 | x is 50 3 | Changed local x to 2 4 | x is still 50 5 | -------------------------------------------------------------------------------- /programs/function_param.py: -------------------------------------------------------------------------------- 1 | def print_max(a, b): 2 | if a > b: 3 | print(a, 'is maximum') 4 | elif a == b: 5 | print(a, 'is equal to', b) 6 | else: 7 | print(b, 'is maximum') 8 | 9 | # directly pass literal values 10 | print_max(3, 4) 11 | 12 | x = 5 13 | y = 7 14 | 15 | # pass variables as arguments 16 | print_max(x, y) 17 | -------------------------------------------------------------------------------- /programs/function_param.txt: -------------------------------------------------------------------------------- 1 | $ python function_param.py 2 | 4 is maximum 3 | 7 is maximum 4 | -------------------------------------------------------------------------------- /programs/function_return.py: -------------------------------------------------------------------------------- 1 | def maximum(x, y): 2 | if x > y: 3 | return x 4 | elif x == y: 5 | return 'The numbers are equal' 6 | else: 7 | return y 8 | 9 | print(maximum(2, 3)) 10 | -------------------------------------------------------------------------------- /programs/function_return.txt: -------------------------------------------------------------------------------- 1 | $ python function_return.py 2 | 3 3 | -------------------------------------------------------------------------------- /programs/function_varargs.py: -------------------------------------------------------------------------------- 1 | def total(a=5, *numbers, **phonebook): 2 | print('a', a) 3 | 4 | #iterate through all the items in tuple 5 | for single_item in numbers: 6 | print('single_item', single_item) 7 | 8 | #iterate through all the items in dictionary 9 | for first_part, second_part in phonebook.items(): 10 | print(first_part,second_part) 11 | 12 | print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560)) 13 | -------------------------------------------------------------------------------- /programs/function_varargs.txt: -------------------------------------------------------------------------------- 1 | $ python function_varargs.py 2 | a 10 3 | single_item 1 4 | single_item 2 5 | single_item 3 6 | Inge 1560 7 | John 2231 8 | Jack 1123 9 | None 10 | -------------------------------------------------------------------------------- /programs/if.py: -------------------------------------------------------------------------------- 1 | number = 23 2 | guess = int(input('Enter an integer : ')) 3 | 4 | if guess == number: 5 | # New block starts here 6 | print('Congratulations, you guessed it.') 7 | print('(but you do not win any prizes!)') 8 | # New block ends here 9 | elif guess < number: 10 | # Another block 11 | print('No, it is a little higher than that') 12 | # You can do whatever you want in a block ... 13 | else: 14 | print('No, it is a little lower than that') 15 | # you must have guessed > number to reach here 16 | 17 | print('Done') 18 | # This last statement is always executed, 19 | # after the if statement is executed. 20 | -------------------------------------------------------------------------------- /programs/if.txt: -------------------------------------------------------------------------------- 1 | $ python if.py 2 | Enter an integer : 50 3 | No, it is a little lower than that 4 | Done 5 | 6 | $ python if.py 7 | Enter an integer : 22 8 | No, it is a little higher than that 9 | Done 10 | 11 | $ python if.py 12 | Enter an integer : 23 13 | Congratulations, you guessed it. 14 | (but you do not win any prizes!) 15 | Done 16 | -------------------------------------------------------------------------------- /programs/io_input.py: -------------------------------------------------------------------------------- 1 | def reverse(text): 2 | return text[::-1] 3 | 4 | 5 | def is_palindrome(text): 6 | return text == reverse(text) 7 | 8 | 9 | something = input("Enter text: ") 10 | if is_palindrome(something): 11 | print("Yes, it is a palindrome") 12 | else: 13 | print("No, it is not a palindrome") 14 | -------------------------------------------------------------------------------- /programs/io_input.txt: -------------------------------------------------------------------------------- 1 | $ python3 io_input.py 2 | Enter text: sir 3 | No, it is not a palindrome 4 | 5 | $ python3 io_input.py 6 | Enter text: madam 7 | Yes, it is a palindrome 8 | 9 | $ python3 io_input.py 10 | Enter text: racecar 11 | Yes, it is a palindrome 12 | -------------------------------------------------------------------------------- /programs/io_pickle.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | # The name of the file where we will store the object 4 | shoplistfile = 'shoplist.data' 5 | # The list of things to buy 6 | shoplist = ['apple', 'mango', 'carrot'] 7 | 8 | # Write to the file 9 | f = open(shoplistfile, 'wb') 10 | # Dump the object to a file 11 | pickle.dump(shoplist, f) 12 | f.close() 13 | 14 | # Destroy the shoplist variable 15 | del shoplist 16 | 17 | # Read back from the storage 18 | f = open(shoplistfile, 'rb') 19 | # Load the object from the file 20 | storedlist = pickle.load(f) 21 | print(storedlist) 22 | -------------------------------------------------------------------------------- /programs/io_pickle.txt: -------------------------------------------------------------------------------- 1 | $ python io_pickle.py 2 | ['apple', 'mango', 'carrot'] 3 | -------------------------------------------------------------------------------- /programs/io_unicode.py: -------------------------------------------------------------------------------- 1 | # encoding=utf-8 2 | import io 3 | 4 | f = io.open("abc.txt", "wt", encoding="utf-8") 5 | f.write(u"Imagine non-English language here") 6 | f.close() 7 | 8 | text = io.open("abc.txt", encoding="utf-8").read() 9 | print(text) 10 | -------------------------------------------------------------------------------- /programs/io_using_file.py: -------------------------------------------------------------------------------- 1 | poem = '''\ 2 | Programming is fun 3 | When the work is done 4 | if you wanna make your work also fun: 5 | use Python! 6 | ''' 7 | 8 | # Open for 'w'riting 9 | f = open('poem.txt', 'w') 10 | # Write text to file 11 | f.write(poem) 12 | # Close the file 13 | f.close() 14 | 15 | # If no mode is specified, 16 | # 'r'ead mode is assumed by default 17 | f = open('poem.txt') 18 | while True: 19 | line = f.readline() 20 | # Zero length indicates EOF 21 | if len(line) == 0: 22 | break 23 | # The `line` already has a newline 24 | # at the end of each line 25 | # since it is reading from a file. 26 | print(line, end='') 27 | # close the file 28 | f.close() 29 | -------------------------------------------------------------------------------- /programs/io_using_file.txt: -------------------------------------------------------------------------------- 1 | $ python3 io_using_file.py 2 | Programming is fun 3 | When the work is done 4 | if you wanna make your work also fun: 5 | use Python! 6 | -------------------------------------------------------------------------------- /programs/module_using_name.py: -------------------------------------------------------------------------------- 1 | if __name__ == '__main__': 2 | print('This program is being run by itself') 3 | else: 4 | print('I am being imported from another module') 5 | -------------------------------------------------------------------------------- /programs/module_using_name.txt: -------------------------------------------------------------------------------- 1 | $ python module_using_name.py 2 | This program is being run by itself 3 | 4 | $ python 5 | >>> import module_using_name 6 | I am being imported from another module 7 | >>> 8 | -------------------------------------------------------------------------------- /programs/module_using_sys.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | print('The command line arguments are:') 4 | for i in sys.argv: 5 | print(i) 6 | 7 | print('\n\nThe PYTHONPATH is', sys.path, '\n') 8 | -------------------------------------------------------------------------------- /programs/module_using_sys.txt: -------------------------------------------------------------------------------- 1 | $ python module_using_sys.py we are arguments 2 | The command line arguments are: 3 | module_using_sys.py 4 | we 5 | are 6 | arguments 7 | 8 | 9 | The PYTHONPATH is ['/tmp/py', 10 | # many entries here, not shown here 11 | '/Library/Python/2.7/site-packages', 12 | '/usr/local/lib/python2.7/site-packages'] 13 | -------------------------------------------------------------------------------- /programs/more_decorator.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | from functools import wraps 3 | import logging 4 | logging.basicConfig() 5 | log = logging.getLogger("retry") 6 | 7 | 8 | def retry(f): 9 | @wraps(f) 10 | def wrapped_f(*args, **kwargs): 11 | MAX_ATTEMPTS = 5 12 | for attempt in range(1, MAX_ATTEMPTS + 1): 13 | try: 14 | return f(*args, **kwargs) 15 | except: 16 | log.exception("Attempt %s/%s failed : %s", 17 | attempt, 18 | MAX_ATTEMPTS, 19 | (args, kwargs)) 20 | sleep(10 * attempt) 21 | log.critical("All %s attempts failed : %s", 22 | MAX_ATTEMPTS, 23 | (args, kwargs)) 24 | return wrapped_f 25 | 26 | 27 | counter = 0 28 | 29 | 30 | @retry 31 | def save_to_database(arg): 32 | print("Write to a database or make a network call or etc.") 33 | print("This will be automatically retried if exception is thrown.") 34 | global counter 35 | counter += 1 36 | # This will throw an exception in the first call 37 | # And will work fine in the second call (i.e. a retry) 38 | if counter < 2: 39 | raise ValueError(arg) 40 | 41 | 42 | if __name__ == '__main__': 43 | save_to_database("Some bad value") 44 | -------------------------------------------------------------------------------- /programs/more_decorator.txt: -------------------------------------------------------------------------------- 1 | $ python more_decorator.py 2 | Write to a database or make a network call or etc. 3 | This will be automatically retried if exception is thrown. 4 | ERROR:retry:Attempt 1/5 failed : (('Some bad value',), {}) 5 | Traceback (most recent call last): 6 | File "more_decorator.py", line 14, in wrapped_f 7 | return f(*args, **kwargs) 8 | File "more_decorator.py", line 39, in save_to_database 9 | raise ValueError(arg) 10 | ValueError: Some bad value 11 | Write to a database or make a network call or etc. 12 | This will be automatically retried if exception is thrown. 13 | -------------------------------------------------------------------------------- /programs/more_lambda.py: -------------------------------------------------------------------------------- 1 | points = [{'x': 2, 'y': 3}, 2 | {'x': 4, 'y': 1}] 3 | points.sort(key=lambda i: i['y']) 4 | print(points) 5 | -------------------------------------------------------------------------------- /programs/more_lambda.txt: -------------------------------------------------------------------------------- 1 | $ python more_lambda.py 2 | [{'y': 1, 'x': 4}, {'y': 3, 'x': 2}] 3 | -------------------------------------------------------------------------------- /programs/more_list_comprehension.py: -------------------------------------------------------------------------------- 1 | listone = [2, 3, 4] 2 | listtwo = [2*i for i in listone if i > 2] 3 | print(listtwo) 4 | -------------------------------------------------------------------------------- /programs/more_list_comprehension.txt: -------------------------------------------------------------------------------- 1 | $ python more_list_comprehension.py 2 | [6, 8] 3 | -------------------------------------------------------------------------------- /programs/mymodule.py: -------------------------------------------------------------------------------- 1 | def say_hi(): 2 | print('Hi, this is mymodule speaking.') 3 | 4 | __version__ = '0.1' 5 | -------------------------------------------------------------------------------- /programs/mymodule_demo.py: -------------------------------------------------------------------------------- 1 | import mymodule 2 | 3 | mymodule.say_hi() 4 | print('Version', mymodule.__version__) 5 | -------------------------------------------------------------------------------- /programs/mymodule_demo.txt: -------------------------------------------------------------------------------- 1 | $ python mymodule_demo.py 2 | Hi, this is mymodule speaking. 3 | Version 0.1 4 | -------------------------------------------------------------------------------- /programs/mymodule_demo2.py: -------------------------------------------------------------------------------- 1 | from mymodule import say_hi, __version__ 2 | 3 | say_hi() 4 | print('Version', __version__) 5 | -------------------------------------------------------------------------------- /programs/oop_init.py: -------------------------------------------------------------------------------- 1 | class Person: 2 | def __init__(self, name): 3 | self.name = name 4 | 5 | def say_hi(self): 6 | print('Hello, my name is', self.name) 7 | 8 | p = Person('Swaroop') 9 | p.say_hi() 10 | # The previous 2 lines can also be written as 11 | # Person('Swaroop').say_hi() 12 | -------------------------------------------------------------------------------- /programs/oop_init.txt: -------------------------------------------------------------------------------- 1 | $ python oop_init.py 2 | Hello, my name is Swaroop 3 | -------------------------------------------------------------------------------- /programs/oop_method.py: -------------------------------------------------------------------------------- 1 | class Person: 2 | def say_hi(self): 3 | print('Hello, how are you?') 4 | 5 | p = Person() 6 | p.say_hi() 7 | # The previous 2 lines can also be written as 8 | # Person().say_hi() 9 | -------------------------------------------------------------------------------- /programs/oop_method.txt: -------------------------------------------------------------------------------- 1 | $ python oop_method.py 2 | Hello, how are you? 3 | -------------------------------------------------------------------------------- /programs/oop_objvar.py: -------------------------------------------------------------------------------- 1 | class Robot: 2 | """Represents a robot, with a name.""" 3 | 4 | # A class variable, counting the number of robots 5 | population = 0 6 | 7 | def __init__(self, name): 8 | """Initializes the data.""" 9 | self.name = name 10 | print("(Initializing {})".format(self.name)) 11 | 12 | # When this person is created, the robot 13 | # adds to the population 14 | Robot.population += 1 15 | 16 | def die(self): 17 | """I am dying.""" 18 | print("{} is being destroyed!".format(self.name)) 19 | 20 | Robot.population -= 1 21 | 22 | if Robot.population == 0: 23 | print("{} was the last one.".format(self.name)) 24 | else: 25 | print("There are still {:d} robots working.".format( 26 | Robot.population)) 27 | 28 | def say_hi(self): 29 | """Greeting by the robot. 30 | 31 | Yeah, they can do that.""" 32 | print("Greetings, my masters call me {}.".format(self.name)) 33 | 34 | @classmethod 35 | def how_many(cls): 36 | """Prints the current population.""" 37 | print("We have {:d} robots.".format(cls.population)) 38 | 39 | 40 | droid1 = Robot("R2-D2") 41 | droid1.say_hi() 42 | Robot.how_many() 43 | 44 | droid2 = Robot("C-3PO") 45 | droid2.say_hi() 46 | Robot.how_many() 47 | 48 | print("\nRobots can do some work here.\n") 49 | 50 | print("Robots have finished their work. So let's destroy them.") 51 | droid1.die() 52 | droid2.die() 53 | 54 | Robot.how_many() 55 | -------------------------------------------------------------------------------- /programs/oop_objvar.txt: -------------------------------------------------------------------------------- 1 | $ python oop_objvar.py 2 | (Initializing R2-D2) 3 | Greetings, my masters call me R2-D2. 4 | We have 1 robots. 5 | (Initializing C-3PO) 6 | Greetings, my masters call me C-3PO. 7 | We have 2 robots. 8 | 9 | Robots can do some work here. 10 | 11 | Robots have finished their work. So let's destroy them. 12 | R2-D2 is being destroyed! 13 | There are still 1 robots working. 14 | C-3PO is being destroyed! 15 | C-3PO was the last one. 16 | We have 0 robots. 17 | -------------------------------------------------------------------------------- /programs/oop_simplestclass.py: -------------------------------------------------------------------------------- 1 | class Person: 2 | pass # An empty block 3 | 4 | p = Person() 5 | print(p) 6 | -------------------------------------------------------------------------------- /programs/oop_simplestclass.txt: -------------------------------------------------------------------------------- 1 | $ python oop_simplestclass.py 2 | <__main__.Person instance at 0x10171f518> 3 | -------------------------------------------------------------------------------- /programs/oop_subclass.py: -------------------------------------------------------------------------------- 1 | class SchoolMember: 2 | '''Represents any school member.''' 3 | def __init__(self, name, age): 4 | self.name = name 5 | self.age = age 6 | print('(Initialized SchoolMember: {})'.format(self.name)) 7 | 8 | def tell(self): 9 | '''Tell my details.''' 10 | print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ") 11 | 12 | 13 | class Teacher(SchoolMember): 14 | '''Represents a teacher.''' 15 | def __init__(self, name, age, salary): 16 | SchoolMember.__init__(self, name, age) 17 | self.salary = salary 18 | print('(Initialized Teacher: {})'.format(self.name)) 19 | 20 | def tell(self): 21 | SchoolMember.tell(self) 22 | print('Salary: "{:d}"'.format(self.salary)) 23 | 24 | 25 | class Student(SchoolMember): 26 | '''Represents a student.''' 27 | def __init__(self, name, age, marks): 28 | SchoolMember.__init__(self, name, age) 29 | self.marks = marks 30 | print('(Initialized Student: {})'.format(self.name)) 31 | 32 | def tell(self): 33 | SchoolMember.tell(self) 34 | print('Marks: "{:d}"'.format(self.marks)) 35 | 36 | t = Teacher('Mrs. Shrividya', 40, 30000) 37 | s = Student('Swaroop', 25, 75) 38 | 39 | # prints a blank line 40 | print() 41 | 42 | members = [t, s] 43 | for member in members: 44 | # Works for both Teachers and Students 45 | member.tell() 46 | -------------------------------------------------------------------------------- /programs/oop_subclass.txt: -------------------------------------------------------------------------------- 1 | $ python oop_subclass.py 2 | (Initialized SchoolMember: Mrs. Shrividya) 3 | (Initialized Teacher: Mrs. Shrividya) 4 | (Initialized SchoolMember: Swaroop) 5 | (Initialized Student: Swaroop) 6 | 7 | Name:"Mrs. Shrividya" Age:"40" Salary: "30000" 8 | Name:"Swaroop" Age:"25" Marks: "75" 9 | -------------------------------------------------------------------------------- /programs/poem.txt: -------------------------------------------------------------------------------- 1 | Programming is fun 2 | When the work is done 3 | if you wanna make your work also fun: 4 | use Python! 5 | -------------------------------------------------------------------------------- /programs/shoplist.data: -------------------------------------------------------------------------------- 1 | (lp0 2 | S'apple' 3 | p1 4 | aS'mango' 5 | p2 6 | aS'carrot' 7 | p3 8 | a. -------------------------------------------------------------------------------- /programs/stdlib_logging.py: -------------------------------------------------------------------------------- 1 | import os 2 | import platform 3 | import logging 4 | 5 | if platform.platform().startswith('Windows'): 6 | logging_file = os.path.join(os.getenv('HOMEDRIVE'), 7 | os.getenv('HOMEPATH'), 8 | 'test.log') 9 | else: 10 | logging_file = os.path.join(os.getenv('HOME'), 11 | 'test.log') 12 | 13 | print("Logging to", logging_file) 14 | 15 | logging.basicConfig( 16 | level=logging.DEBUG, 17 | format='%(asctime)s : %(levelname)s : %(message)s', 18 | filename=logging_file, 19 | filemode='w', 20 | ) 21 | 22 | logging.debug("Start of the program") 23 | logging.info("Doing something") 24 | logging.warning("Dying now") 25 | -------------------------------------------------------------------------------- /programs/stdlib_logging.txt: -------------------------------------------------------------------------------- 1 | $ python stdlib_logging.py 2 | Logging to /Users/swa/test.log 3 | 4 | $ cat /Users/swa/test.log 5 | 2014-03-29 09:27:36,660 : DEBUG : Start of the program 6 | 2014-03-29 09:27:36,660 : INFO : Doing something 7 | 2014-03-29 09:27:36,660 : WARNING : Dying now 8 | -------------------------------------------------------------------------------- /programs/while.py: -------------------------------------------------------------------------------- 1 | number = 23 2 | running = True 3 | 4 | while running: 5 | guess = int(input('Enter an integer : ')) 6 | 7 | if guess == number: 8 | print('Congratulations, you guessed it.') 9 | # this causes the while loop to stop 10 | running = False 11 | elif guess < number: 12 | print('No, it is a little higher than that.') 13 | else: 14 | print('No, it is a little lower than that.') 15 | else: 16 | print('The while loop is over.') 17 | # Do anything else you want to do here 18 | 19 | print('Done') 20 | -------------------------------------------------------------------------------- /programs/while.txt: -------------------------------------------------------------------------------- 1 | $ python while.py 2 | Enter an integer : 50 3 | No, it is a little lower than that. 4 | Enter an integer : 22 5 | No, it is a little higher than that. 6 | Enter an integer : 23 7 | Congratulations, you guessed it. 8 | The while loop is over. 9 | Done 10 | -------------------------------------------------------------------------------- /revision_history.md: -------------------------------------------------------------------------------- 1 | {#history-lesson} 2 |
3 | 4 | # تاریخچه پیشرفت 5 | 6 | برای بار اول برای نرم‌افزار نصاب از پایتون استفاده کردم و اسمش را 'Diamond' گذاشتم. برای ساده سازی مراحل نصب، مجبور شدم بین زبان پریل و پایتون یکی را برای کتابخانه‌ی کیوت انتخاب کنم. یک چرخی در اینترنت زدم و [مقاله‌ی اریک اس. ریموند](http://www.python.org/about/success/esr/) را در اینترنت پیدا کردم. یک فرد مشهور و هکر بزرگوار، جاییکه که او می‌گفت چگونه زبان برنامه‌نویسی پایتون به زبان برنامه‌نویسی مورد علاقه‌اش تبدیل شده بود. همچنین فهمیدم که اتصال پای‌کیوت خیلی بیشتر از پریل-کیوت است به قول خودمون گفتنی با هم جوراند. این طور شد که فهمیدم پایتون همان زبان برنامه‌نویسی است، که من به دنبال‌اش بودم. 7 | 8 | بعد از این موضوع شروع کردم به جستجو برای یک کتاب برای یادگیری پایتون ولی نتوانستم همچین کتابی را پیدا کنم. کتابی که از O'Reilly پیدا کردم، ایا خیلی گرون بود، یا خیلی بیشتر از کتاب راهنما سنگین بود. بنابراین روی همان اموزش‌های خود پایتون ایستادم. ولی این اسناد خیلی کوتاه و ساده بودند. این راهنما‌هامن را با کلیات پایتون اشنا کردند. اما اصلا برای مبتدیان مناسب نبود. 9 | 10 | بعد از شش ماه سرکله زدن با پایتون بالاخره پایتون را نصب کردم. همچنین اخرین نسخه‌ی لینوکس ردهت 9.0 را هم نصب کردم. من با KWord خیلی سرکله می‌زدم و از این موضوع خیلی خوش‌حال بودم. ناگهان با یک جرقه تصمیم گرفتم یک چیزی درباره‌ی پایتون بنویسم و شروع به نوشتن چند صفحه کردم و اندک اندک به ۳۰ صفحه تبدیل شد. سپس این موضوع برایم جدی شد، که این صفحه‌ها را تبدیل به یک کتاب بکنم. 11 | 12 | پس از نوشتن‌ها و رونوشتن‌ها بلاخره به ان مرحله‌ی رسیدم، که بتوانم این نوشته‌ها را به عنوان یک کتاب راهنما برای زبان برنامه‌نویسی پایتون استفاده کنم.این کتاب، به عنوان سهمی از خودم، در انجمن متن‌باز است. 13 | 14 | این کتاب به عنوان یک پیش نویس برای یادگیری پایتون بود و هنوز هم من همان دید را در حال حاضر دارم. با اینکه خیلی برای این کتاب زحمت کشیدم و سعی کردم که تا این کتاب مورد قبول دیگران باشد. 15 | 16 | روح واقعی منبع باز، من خیلی پیشنهاد‌های زیادی از سازنده‌ها گرفتم از نظرات انتقادی 17 | ( [بازخوردها](./README.md#who-reads-bop) ) از خواننده‌های مشتاق که به من کمک کردن تا این کتاب را بهبود ببخشم. 18 | 19 | 20 | ## وضیعت کتاب 21 | 22 | کتاب نیاز به کمک خواننده‌های خود دارد, مانند شما، تا اینکه قسمت‌های که درست نیست یا اینکه اصلا اشتباه است به ان اشاره کنید. لطفا [نام نویسنده‌ی اصلی را بنویسید.]({{ book.contactUrl }}) . یا همان طور که اشاره شده در [مترجمین](./translations.md#translations) نظرها و پیشنهادات خود را بگوید. 23 | 24 | 25 | # تاریخچه 26 | 27 | - 4.0 28 | 29 | - ۱۹ ژانویه ۲۰۱۶ 30 | 31 | - .دوباره‌ برگشت به پایتون نسخه‌ی ۳ 32 | 33 |   - برگشت به مارک‌داون و استفاده از [گیت‌بوک](https://www.gitbook.com) و [Spacemacs](http://spacemacs.org). 34 | 35 | - 3.0 36 | 37 | - ۳۱ مارس ۲۰۱۴ 38 | 39 | - بازنویسی شد برای پایتون نسخه‌ی ۲ 40 | [اسکی‌داک](http://asciidoctor.org/docs/what-is-asciidoc/) و [adoc-mode](https://github.com/sensorflo/adoc-mode/wiki). 41 | 42 | - 2.1 43 | 44 | - ۰۳ اگوست ۲۰۱۳ 45 | 46 | - برای مارک‌داون بازنویسی شد و [Jason Blevins' Markdown Mode](http://jblevins.org/projects/markdown-mode/). 47 | 48 | 49 | - 2.0 50 | 51 | - ۲۰ اکتبر ۲۰۱۲ 52 | 53 | - با [ فرمت Pandoc](http://johnmacfarlane.net/pandoc/README.html) بازنویسی شد. از همسرم خودم تشکر می‌کنم که بیشتر بازنویسی تبدیل به MediaWiki انجام داد 54 | 55 | - ساده سازی متنی، حذف کردن قسمت‌های اضافی، مانند: `غیر محلی‌ها` و metaclasses. 56 | 57 | 58 | - 1.90 59 | 60 | - ۰۴ سپتامر ۲۰۰۸ و هنوز ادامه دارد. 61 | 62 | - بازتولد دوباره بعد ۳.۵ سال. 63 | 64 | - برای پایتون نسخه‌ی ۳ بازنویسی شد. 65 | 66 | - بااستفاده از http://www.mediawiki.org[مدیاویکی] (دوباره) بازنویسی شد. 67 | 68 | 69 | 70 | 71 | - 1.20 72 | 73 | - ۱۳ ژانویه ۲۰۰۵ 74 | 75 | - به طور کامل بازنویسی شد با استفاده از [کوئنتا+](https://en.wikipedia.org/wiki/Quanta_Plus) روی [فدورا](http://fedoraproject.org/) ۳ هسته‌ی همراه با تعداد زیادی از رفع مشکل و بهروزرسانی. مثال‌های جدید. تمام تظیمات DocBook از صفر بازنویسی کردم. 76 | 77 | 78 | 79 | - 1.15 80 | 81 | - ۲۸ مارس ۲۰۰۴ 82 | 83 | - اعمال کمی تغییرات. 84 | 85 | - 1.12 86 | 87 | - ۱۶ مارس ۲۰۰۴ 88 | 89 | - اعمال تغییرات مکمل. 90 | 91 | 92 | - 1.10 93 | 94 | - ۰۹ مارس ۲۰۰۴ 95 | 96 | - رفع غلط‌های املایی بیشتر، با تشکر از بسیاری از علاقه‌مندان و خوانندگان. 97 | 98 | 99 | - 1.00 100 | 101 | - ۰۸ مارس ۲۰۰۴ 102 | 103 | - پس از بازید‌های بسیار، انتقادات و پیشنهادات بسیار، از خوانندگان، تغییرات قابل توجهی در درست کردن محتوا و غلط املایی دادم. 104 | 105 | 106 | - 0.99 107 | 108 | - ۲۲ فوریه ۲۰۰۴ 109 | 110 | - اضافه شدن فصل جدید ماژول‌ها همچنین اطلاعاتی درباره‌ی توابع، ارگومان‌ها و متغیرها. 111 | 112 | 113 | 114 | - 0.98 115 | 116 | - ۱۶ فوریه ۲۰۰۴ 117 | 118 | - نوشتن اسکریپت پایتون و طراحی سی‌اس‌اس برای بهبودی خروجی اکس‌اچ‌تی‌ام‌ال, همچنین شامل crude-yet-functional lexical analyzer برای لیست کردن خودکار syntax برنامه‌ها مانند ویم. 119 | 120 | 121 | - 0.97 122 | 123 | - ۱۳ فوریه ۲۰۰۴ 124 | 125 | - یکی دیگر از یاداشت‌ها که دوباره در داک‌بوک‌ اکس‌ام‌ال بازنویسی شد. کتاب واقعا بهبود یافت. و درک کردن و فهمیدن کتاب اسان‌تر شد. 126 | 127 | 128 | - 0.93 129 | 130 | - ۲۵ ژانویه ۲۰۰۴ 131 | 132 | - اضافه شدن بحث درباره‌ی IDLE و موارد دیگر برای ویندوز. 133 | 134 | 135 | - 0.92 136 | 137 | - ۰۵ ژانویه ۲۰۰۴ 138 | 139 | - تغییردادن بعضی از مثال‌ها. 140 | 141 | 142 | - 0.91 143 | 144 | - ۳۰ دسامبر ۲۰۰۳ 145 | 146 | - تحصیح کردن غلط املایی. 147 | 148 | 149 | - 0.90 150 | 151 | - ۱۸ دسامبر ۲۰۰۳ 152 | 153 | - اضافه شدن دو فصل دیگر با تغییر فرمت [اپن آفیس](https://en.wikipedia.org/wiki/OpenOffice) . 154 | 155 | 156 | - 0.60 157 | 158 | - ۲۱ نوامبر ۲۰۰۳ 159 | 160 | - به طور کامل بازنویسی شده و گسترش یافته است. 161 | 162 | 163 | - 0.20 164 | 165 | - ۲۰ نوامبر ۲۰۰۳ 166 | 167 | - تحصیح کردن بعضی از غلط املایی‌ها و اشتباهات. 168 | 169 | 170 | - 0.15 171 | 172 | - ۲۰ نوامبر ۲۰۰۳ 173 | 174 | - تبدیل به فرمت [داک‌بوک‌ اکس‌ام‌ال](https://en.wikipedia.org/wiki/DocBook) به کمک XEmacs. 175 | 176 | 177 | - 0.10 178 | 179 | - ۱۴ نوامبر ۲۰۰۳ 180 | 181 | - اولین پیش‌نویس و با استفاده از [KWord](https://en.wikipedia.org/wiki/Kword) نوشته شد. 182 | -------------------------------------------------------------------------------- /translation_howto.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | {#translation-howto} 4 | # چگونه ترجمه کنیم 5 | ۱. منبع کامل کتاب قابل رویت باشد {{ book.sourceUrl }}. 6 | 7 | ۲. لطفا [fork the repository](https://help.github.com/articles/fork-a-repo) . 8 | 9 | ۳. منبع را در رایانه‌ی خود داشته باشید. باید اطلاعاتی درباره‌ی گیت و چگونگی استفاده از [گیت](http://www.git-scm.com) را بدانید. 10 | 11 | ۴. خواندن [اسناد گیت‌بوک](https://help.gitbook.com) و [مارک‌داون](https://help.gitbook.com/format/markdown.html). 12 | 13 | ۵. شروع کردن به ویرایش فایل‌های ".md" و یادگیری ان، برای ترجمه به زبان خود. 14 | 15 | ۶. [Sign up on GitBook.com](https://www.gitbook.com) ، کتاب را بنویسید و زیبای رندر کردن وبسایت را خواهید دید, با لینک برای دانلود پی‌دی‌اف ، ای‌پاب و غیره. 16 | -------------------------------------------------------------------------------- /translations.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # مترجمین 4 | 5 | در اینجا ترجمه‌های زیادی از این کتاب با زبان‌های مختلف وجود دارد، همچنین از افراد داوطلب خستگی ناپذیربرای ترجمه‌ این کتاب سپاس گذاریم! 6 | 7 | اگر به ترجمه‌ی این کتاب می‌خواهید کمک کنید، لطفا اول لیست زیرین داوطلب‌ها و زبان‌ها را ببینید و بعد تصمیم بگیرد که یا می‌خواهید ترجمه جدیدی را شروع یا کمک برای ترجمه‌های موجود برای پروژه‌ها کنید. 8 | 9 | اگر شروع به ترجمه می‌خواهید کنید لطفا [چگونه ترجمه کنیم](./translation_howto.md#translation-howto) را بخوانید. 10 | 11 | 12 | ## عربی 13 | 14 | در اینجا لینکی برای نسخه‌ی عربی موجود است. از اشراف علی خلاف برای ترجمه سپاس گذاریم, تمامی کتاب را می‌توانید انلاین بخوانید با مراجعه‌ی به این لینک یا می‌توانید با دانلود از این لینک [sourceforge.net](http://downloads.sourceforge.net/omlx/byteofpython_arabic.pdf?use_mirror=osdn) for more info see و از این کتاب لذت ببرید. 15 | 16 | ## اذربایجانی 17 | 18 | 19 | Jahangir Shabiyev داوطلب دیگری بوده برای ترجمه‌ی این کتاب به اذربایجانی که ترجمه در حال ادامه است و برای مشاهده به لینک زیر مراجعه کنید 20 | https://www.gitbook.com/book/jahangir-sh/piton-sancmasi 21 | 22 | 23 |
24 | 25 | ## برزیلی پرتقالی 26 | 27 | در اینجا دو ترجمه‌ی مختلف قاب دسترس است. در حال حاضر انان ترجمه قدیمی گم شده است و نیستش، و ترجمه‌ی جدید هنوز به اتمام نرسیده است. 28 |
29 | 30 | Samuel Dias Neto (samuel.arataca@gmail.com) 31 |
32 | که اولین ترجمه‌ی برزیلی پرتغالی را نوشته است (که‌همان ترجمه‌ی قدیمی است) که در ان زمان نسخه‌ی کتاب پایتون ۲.۳.۵ بوده، که در مدت طولانی در دسترس نبود. 33 | 34 |
35 | 36 | [Rodrigo Amaral](http://rodrigoamaral.net) (rodrigoamaral@gmail.com) 37 | 38 |
39 | 40 | یک داوطلب دیگر که کتاب را به برزیلی پرتغالی ترجمه کر ده است (ترجمه‌ی جدید). که هنوز در حال ترجمه برای کامل شدن است. 41 | 42 | ## کاتالان 43 |
44 | 45 | Moises Gomez (moisesgomezgiron@gmail.com) 46 |
47 | 48 | داوطلب شده برای ترجمه کتاب به کتالانی، و ترجمه‌ی در حال پیشرفت است. 49 | 50 | > موریس گومز - من یک توسعه دهنده هستم وهمچنین معلمه برنامه نویسی هستم. (معمولا برای افرادی درس می‌دهم که هیچ تجربه‌ی قبلا نداشته‌اند). 51 | 52 | > 53 | 54 | > چند وقت قبل به برنامه‌نویسی با پایتون نیاز پیدا کردم و اقای (Swaroop's) خیلی خوب روی کتاب کار کرده‌بودند و این خیلی به من کمک کرد. 55 | 56 | > بعد از این تجربه، تصمیم گرفتم که برای افراد دیگر مفید باشم. ولی زبان انگلیسی‌ همه خوب نیست. 57 | 58 | > بنابراین، تیصیم گرفتم چرا ترجمه نکنم؟ و ترجمه را برای نسخه‌ی قبلی انجام دادم. 59 | 60 | > من در شهری هستم که داری دو زبان می‌باشد و زبان کاتالانی را انتخاب کردم که دیگران بتوانند به راحتی به زبان‌های گسترده‌ی دیگر اسپانیایی ترجمه کنند. 61 | 62 | ## چینی 63 | 64 | ترجمه در دسترس است در و . 65 | 66 |
67 | Juan Shen (orion_val@163.com) 68 |
69 | 70 | داوطلب شد برای ترجمه‌ی کتاب به چینی. 71 | 72 | > من تحصیلات تکمیلی کارشناسی ارشد از دانشگاه تکنولوژی پکن در مخابرات بیسیم دارم. علاقه‌ی من پژوهش در همگام‌سازی، تخمین کانال‌ها، کشف چند-کاربره و سیستم‌های (multicarrier CDMA) است. 73 | پایتون یک بزار قدرتمند برای برنامه‌نویسی روزانه و برای شبیه‌سازی و پژوهش‌ در کار‌هایم است( درواقع با کمک اعداد پایتون). من پایتون را طی نیم سال یاد گرفتم. ولی همین طور که می‌دونید خیلی راحت قابل فهم است. همچنین خیلی راحت قابل استفاده است. با خواندن کتاب اقای (Swaroop's) در حال‌حاضر این زبان یکی از زبان‌های مورد علاقه‌ی من شده است. 74 | > 75 | 76 | > 'A Byte of Python' یک خوداموز برای یادگیری پایتون برای من بوده است. بصورت خیلی تمیز و موثر شما را به دنیای پایتون وارد می‌کند. خیلی هم طول نمی‌کشد، اما بصورت موثر همه‌ی چیز‌های مهم در پایتون پوشش می‌دهد. به نظر من کتاب 'A Byte of Python' باید بطور قدرتمند برای تازکاران برای اولین کتاب برای یادگیری پایتون پیشنهاد شود. من شروع به ترجمه کردم برای میلیون‌ها کاربر پایتون در چین. 77 | 78 | 79 | 80 | 81 | ## چینی سنتی 82 |
83 | 84 | Fred Lin (gasolin@gmail.com) 85 |
86 | 87 | 88 | برای ترجمه‌ی کتاب به چینی سنتی داوطلب شد. 89 | 90 | این در دسترس در . 91 | 92 | و بسیار شگفت‌انگیز است اینده این ترجمه که محتویات این کتاب( منابع پایتون چینی) همزمان با کتاب پایتون انگلیسی در حال پیشرفت است. 93 | 94 | > فرید لین - من مهندس چارچوب شبکه هستم در (Delta Network). و همچنین یک شرکت‌کننده(contributor) در (TurboGears web framework). 95 | 96 | 97 | 98 | 99 | > پایتون یک زبان کامل است، من نیاز دارم به چیز برای ترقیی دادن زبان پایتونم. و من کتاب 'A Byte of Python' را پیدا کردم. 100 | 101 | 102 | > که یک تجربه‌ی جالب و موفقیت‌امیز و شیرینی بود. 'یک بایت از پایتون' بسیار با زحمت و استادانه ساخته شده این حاصل تلاش‌های خستگی ناپذیر بزرگ است. 103 | 104 | > ترجمه نسخه‌ی چینی پایه‌اش از نسخه‌ی اصلی است. و به زودی از چیزی که ما ساخیتم بازنویسی می‌کنند و یک نسخه‌ی ویکی باکیفیت خواهد شد برای خواندن. 105 | 106 | > همچنین ویژگی نسخه‌ی جدید چینی سنتی با قابلیت همسان منبع پایتون ، که پروژه‌ی ارشیوی با اسم م 'zhpy' (پایتون در چینی) است. 107 | 108 | > zhpy (تلفظ‌ اش (Z.H.?, or zippy)) ساختن لایه‌ی روی پایتون برای ترجمه یا ارتباط برقرار کردن با پایتون درزبان چینی (سنتی یا ساده شده). این پروژه پایه‌ی برای اموزش و پرورش است. 109 | 110 | 111 | ## فرانسوی 112 |
113 | Gregory (coulix@ozforces.com.au) 114 |
115 | برای ترجمه‌ی کتاب به فرانسوی داوطلب شده است. 116 |
117 | 118 | Gérard Labadie (gerard.labadie@gmail.com) 119 |
120 | 121 | ترجمه‌ی کتاب به فرانسوی اتمام رسیده است. 122 | 123 | ## المانی 124 |
125 | 126 | Lutz Horn (lutz.horn@gmx.de), Bernd Hengelein (bernd.hengelein@gmail.com) and Christoph Zwerschke (cito@online.de) 127 | 128 |
129 | برای ترجمه‌ی کتاب به المانی داوطلب شده‌اند. ترجمه در لینک زیر قرار دارد 130 | 131 | 132 | Lutz Horn می‌گوید: 133 | 134 | > من ۳۲ سالم و در حوضه ریاضی در دانشگاه هایدلبرگ المان درس‌می‌خوانم. در واقع مهندش نرم‌افزار هستم. 135 | 136 | > من در حال حاضر روی پروژه‌ی مهندسی نرم‌افزاری مشغول هستم که تحت کمک مالی دولت است. پروژه درباره‌ی ساخت سایتی برای همه کارهای که مربوط به علوم کامپیوتر در المان است. زبان اصلی که به عنوان یک حرفه‌ای استفاده می‌کنم جاوا است ولی سعی می‌کنم در پشت صحنه از پایتون استفاده کنم. با استفاده از پایتون خیلی راحت‌تر می‌توان به انالیز و تغییرات متنی پرداخت. خیلی از ابزار واسط گرافیکی کاربر را درک نمی‌کنم، بخاطر انکه بیشتر روی برنامه‌های وب‌اپلیکشن کار کردم. جاییکه از رابط ساختار جاوا مانند Struts استفاده می‌شود. در حال حاظر سعی دارم از ساختار پایتون و امکانات تابعی و همچنین ویژگی‌های برنامه‌نویسی‌اش بیشتر استفاده کنم. بعد از اموزش کوتاه روبی خیلی تحت تاثیر استفاده از بلوک‌ها در این زبان برنامه نویسی شدم. به طور کلی از ماهیت پویا این زبان‌ها خوشم می‌اید مانند پایتون و روبی که امکانات را می‌دهد ولی بیشتر برنامه‌های ایستا مانند جاوا نمی‌توانند. به دنبال برخی از مقدمات برنامه نویسی مناسب بودم برای کسی که برنامه نویسی را یاد ندارد, تا کامل یاد بگیرد. کتابی را پیدا کردم که چگونه مانند مثل دانشمند کامپیوتری فکر کنم کتاب‌های مانند: 'Dive into Python' و 'Learning with Python' کتاب خوبی برای مبتدیان است اما طولانی برای ترجمه کردن و دومی که برای مبتدیان خوب نیست. به نظر من کتاب یک بایت از پایتون یک چیزی بین این دو کتاب است نه خیلی طولانی و به سبک روان نوشته شده است. و این برای مبتدیان خیلی راحت خلاصه‌وار است. علاوه براین من ساختار ساده‌ای داک‌بوک خوشم می‌اید که باعث می‌شود خروجی ترجمه متن را به فرمت‌های مختلف جذاب تبدیل کنیم. 137 | 138 |
139 | 140 | 141 | Bernd Hengelein می‌گوید: 142 | 143 | 144 | > من و Lutz قرار بود باهم ترجمه‌ی المانی را انجام بدهیم. مقدمه را اغاز کردیم و قرار شد درباره‌ی پیشرفت هم‌دگیر را باخبر کنیم. حالا کمی درباره‌ی خودم. ۳۴ سالم است و با کامپیوتر از سال‌های ۱۹۸۰ سرکله می‌زنم. زمانه "Commodore C64" بود که همه چیز کنترل می‌کرد. بعد از اموزش انفورماتیک شروع به کار کردن به عنوان مهندس نرم‌افزار کردم، در حال حاضر من در عکس‌برداری یا همان تصویربرداری در زمینه‌ی پزشکی (به طور عمده) کارم می‌کنم. هر چند که باید از سی‌پلاس‌پلاس به عنوان برنامه‌نویسی اصلیم در کارهایم استفاده کنم، همیشه به دنبال چیزهای جدیدام، برای یادگیری بیشتر. سال گذشته بود که عاشق پایتون شدم، واقعا یک زبان برنامه‌نویسی خوب و عالی، چه از نظر امکانات و چه از نظر کاری. یادم یک جایی در یک سایتی خوندم که یک نفر می‌گفت که از زبان برنامه‌نویسی پایتون خوشش می‌اید بخاطر اینکه کدنویسی‌اش زیباست و به نظرم راست می‌گفت. ان زمانکی شروع کردم به یاد گرفتن زبان پایتون فهمیدم که سند اموزشی پایتون به زبان المانی بسیار کم است. ان موقع بود که من با کتاب شما اشنا شدم. یک ایده‌ی خودبه‌خود بود که کتابتون را به المانی ترجمه کنم. و خوشبختانه Lutz را هم همین ایده را داشت و می‌توانستیم کارمان را تقسیم کنیم. من مشتاقانه منتظر یک همکاری خوب هستم! 145 | 146 | 147 | ## یونانی 148 | 149 | انجمن یونانی ابونتو [ این کتاب را به یونانی ترجمه کردن](http://wiki.ubuntu-gr.org/byte-of-python-el).برای درس‌های پایتون، که در فرم‌های ما ارئه می‌گردد استفاده کرده‌اند. برای اطلاعات بیشتر بر روی این لینک [@savvasradevic](https://twitter.com/savvasradevic) کلیک کنید. 150 | 151 | 152 | 153 | ## اندونزی 154 | 155 | 156 | (Daniel (daniel.mirror@gmail.com داوطلب شده برای ترجمه به زبان اندونزی و لینک کتاب در ادرس موجود می‌باشد. 157 | 158 | 159 | Wisnu Priyambodo داوطلب شده برای ترجمه به زبان اندونزی (cibermen@gmail.com) . 160 | 161 | همچنین Bagus Aji Santoso داوطب شده برای ترجمه. 162 | 163 | 164 | ## ایتالیایی (اولین) 165 | 166 | 167 | (Enrico Morelli (mr.mlucci@gmail.com و (Massimo Lucci (morelli@cerm.unifi.it دوطلب شده‌اند برای ترجمه کتاب به ایتالیایی. 168 | 169 | کتاب به زبان ایتالیایی در لینک زیر است. 170 | 171 | 172 | 173 | > Enrico Morelli و Massimo Lucci ـ ما در دانشگاه فلورانس در قسمت شیمی کار می‌کنیم. من (Massimo) به عنوان مدیر سیسیتم و خدمات مهندسی هستم، برای رزونانس طیف هسته‌ی مغناطیسی; Enrico به عنوان مدیر سیسیتم و خدمات مهندسی هستم، برای CED و سیستم‌ها موازی خوشه‌ای. ما با برنامه‌نویسی پایتون حدودا هفت سال می‌شود که کار می‌کنیم و تجربه کار باسیستم عامل لینوکس ده سال می‌شود. در ایتالیا ما سایت www.gentoo.it را کنترل می‌کنیم با لینوکس Gentoo و سایت www.nmr.it در حال پیشرفت و در دست کار می‌باشد(برای برنامه هسته‌ی رزونانس مغناطیسی و سازمان مدیریت از طرفه کنگره). ما واقعا شگفت‌زده شده‌ایم که این زبان قدرتمند چه می‌تواند. و ما سعی داریم که پایتون رابرای استفاده عموم در ازمایشگاه بیشتر اشنا کنیم. 174 | 175 | 176 | ## ایتالیایی (دومی) 177 | 178 | 179 | نسخه‌ی دیگر ترجمه‌ی ایتالیایی در لینک زیر است[Calvina Bice](http://besthcgdropswebsite.com/translate). و همکاران در . 180 | 181 | 182 | 183 | ## ژاپنی 184 | 185 | (Shunro Dozono (dozono@gmail.com داوطلب شده برای ترجمه‌ به زبان ژاپنی. 186 | 187 | 188 | 189 | ## کره‌ای 190 | 191 | 192 | 193 | Jeongbin Park دواطلب شده برای ترجمه به زبان کره‌ای (pjb7687@gmail.com) برای مشاهده به لینک زیر سر بزنید. 194 | 195 | 196 | 197 | > من Jeongbin Park هستم و درحال حاضر به عنوان محقق بیوفیزیک و بیوانفورماتیک در کره کار می‌کنم. 198 | 199 | > یک سال قبل بود که من به دنبال یک کتاب خوب برای پایتون بودم تا به همکارم معرفی کنم. 200 | در چنین زمینه‌های تحقیقاتی کاربران روز به روز در حال رشداند و این چیز اجتناب ناپذیر است و بخاطر همین من تصمیم گرفتم از پایتون استفاده کنم. 201 | 202 | > 203 | 204 | > ولی دران زمان چند کتاب کره‌ی برای پایتون بود. ان موقع بود که من تصمیم گرفتم این کتاب را ترجمه کنم.چون این یکی از بهترین کتاب‌های گام‌گام برای یادگیری پایتون بود. 205 | > 206 | > دوباره از شما تشکر می‌کنم بابت همچین کتاب راهنمای خوبی که نوشته‌اید. 207 | 208 | ## مغولی 209 | 210 | Ariunsanaa Tunjin داوطلب شده برای ترجمه این کتاب به زبان مغولی (luftballons2010@gmail.com). 211 | 212 | در ۲۲ توامبر ۲۰۰۹ بهروز رسانی شده: Ariunsanaa در حال حاضر چیزی به اتمام ترجمه ان نماده است. 213 | 214 | ## کره‌ای 215 | 216 | Jeongbin Park دواطلب شده برای ترجمه به زبان کره‌ای (pjb7687@gmail.com) برای مشاهده به لینک زیر سر بزنید. 217 | 218 | 219 | > من Jeongbin Park هستم و درحال حاضر به عنوان محقق بیوفیزیک و بیوانفورماتیک در کره کار می‌کنم. 220 | 221 | > یک سال قبل بود که من به دنبال یک کتاب خوب برای پایتون بودم تا به همکارم معرفی کنم. 222 | در چنین زمینه‌های تحقیقاتی کاربران روز به روز در حال رشداند و این چیز اجتناب ناپذیر است و بخاطر همین من تصمیم گرفتم از پایتون استفاده کنم. 223 | 224 | > 225 | 226 | > ولی دران زمان چند کتاب کره‌ی برای پایتون بود. ان موقع بود که من تصمیم گرفتم این کتاب را ترجمه کنم.چون این یکی از بهترین کتاب‌های گام‌گام برای یادگیری پایتون بود. 227 | > 228 | > دوباره از شما تشکر می‌کنم بابت همچین کتاب راهنمای خوبی که نوشته‌اید. 229 | 230 | ## نروژی (بوکمال) 231 | 232 | Eirik Vågeskar دانش‌اموز دبیرستان مدرسه‌ای [Sandvika videregående skole] است (http://no.wikipedia.org/wiki/Sandvika_videreg%C3%A5ende_skole). و درحال حاضر دارد کتاب را به نروژی ترجمه می‌کند. 233 | 234 | > 235 | Eirik Vågeskar من همیشه می‌خواستم برنامه‌نویسی کنم. و بخاطر اینکه من انگلیسی خوب نیست یادگرفتن این کتاب کمی سخت بود. بیشترین کتاب‌های زبان برنامه نویسی پایتون به زبان انگلیسی نوشته شده است و بسیار در سطوح تخصصی نوشته شده است. وبرای بیشتر دانش‌اموزان دبیرستان یا حتی کسانی که مدرک دیپلم دارند، زبان انگلیسی کافی برای یادگیری ندارد و درکی از موضوع نمی‌برند. ولی من وقتی که این کتاب را پیدا کردم (یک بایت از پایتون) از کلمه‌های انچنان تخصصی استفاده نشده بود این بعضی از مشکلات من را حل کرد.این یک زبان برنامه نویسی ساده و همچنین ساده توضیح داده شده است و این نکته بسیار عالی است.و این نکات است که یادگیری پایتون را یادگار می‌کند. بعد از خواندن نصف کتاب تصمیم گرفتم که این کتاب ارزش ترجمه کردن را دارد. امیدورام که ترجمه این کتاب به مردم کمک کند تا به ان وضعیت که من برخورد کردم دیگران دچار مشکل نشوند. و شاید به هم دوره‌ای های خودم برای بیشتر کردن دانش و تخصص انان کمکی کرده به باشم. 236 | 237 | ## لهستانی 238 | 239 | Dominik Kozaczko داوطلب شده برای ترجمه‌ی کتاب به لهستانی(dominik@kozaczko.info). ترجمه درحال پیشرفت است و برای دسترسی به این لینک سر بزنید. [Ukąś Pythona](http://python.edu.pl/byteofpython/) 240 | 241 | ترجمه به اتمام رسیده در ۲ اکتبر ۲۰۰۹. ممنون از Dominik و دو دانش اموز و بقیه برای زحمت‌ها کشیدن برای ترجمه. 242 | 243 | > _Dominik Kozaczko _ من معلم علوم کامپیوتر و فناوری اطلاعات هستم. 244 | 245 | ## پرتغالی 246 | 247 | 248 | Fidel Viegas داوطلب شده برای ترجمه‌ی کتاب به پرتغالی (fidel.viegas@gmail.com) 249 | 250 | 251 | 252 | ## رومانیایی 253 | 254 | 255 | Paul-Sebastian Manole داوطلب شده برای ترجمه‌ی کتاب به زبان رومانیایی(brokenthorn@gmail.com). 256 | 257 | 258 | > Paul-Sebastian Manole من دانشجوی ترم دوم علوم فناوری در دانشگاه Spiru Haret در رومانیایی هستم. من یک فرد خوداموز برنامه نویسی هستم و تصمیم گرفتم که زبان برنامه نویسی پایتون را یاد بگیرم. تو اینترنت به من گفتن بهترین راه برای یادگیری خواندن کتاب یک بایت از پایتون است. و اقعا این بسیار کتاب معرفی است ( ومن به نویسنده این کتاب تبریک می‌گویم). خلاصه من از کتاب خوشم امد و تصمیم گرفتم اخرین نسخه‌ای کتاب Swaroop's را به رومانیایی ترجمه کنم. اگر چه می‌خواستم اولین نفری باشم که این کار را می‌کنم ولی اگر شما می‌توانید به کمک به من بپیوندید. 259 | 260 | 261 | 262 | ## روسی 263 | 264 | 265 | Vladimir Smolyar برجمه‌ی کتاب به زبان رویسی را به اتمام رسانده. 266 | 267 | 268 | 269 | ## اوکراینی 270 | 271 | Averkiev Andrey داوطلب شده برای ترجمه‌ی کتاب به زبان روسی ( شاید هم به زبان اوکراینی اگر وقت اجازه بدهد). (averkiev@ukr.net) 272 | 273 | 274 | ## صربستانی 275 | 276 | "BugSpice" ترجمه‌ی کتاب به صربستانی را به اتمام رسانده است. 277 | 278 | > این لینک دانلود دیگر در دسترس نیست. 279 | 280 | جزییات بیشتر در لینک زیر موجود است. 281 | 282 | 283 | 284 | 285 | 286 | ## اسلواکی 287 | 288 | Albertio Ward داوطلب شده برای ترجمه‌ی کتاب به اسلواکی(albertioward@gmail.com). 289 | ادرس کتاب در لینک زیر است. 290 | 291 | 292 | > ما یک سازمان غیر انتفاعی به نام "ترجمه برای تحصیلات"("Translation for education"). ما یک گروه از دانشجویان و استادان در دانشگاه اسلواکی هستیم. دانشجویان از رشته‌های مختلفی اینجا هستند زبان شناسی شیمی زیست و غیره. و سعی داریم به دنبال چیز‌های جالب در اینترنت بگردیم. چیزها که برای ما همکارهایمان و دانشگاه مفید واقع شود. بعضی وقت‌ها خودمان مقاله را پیدا می‌کنیم گاهی اوقات هم استاد‌ها در این راه به کار ترجمه کمک می‌کنند.همچنین پس از اجازه گرفتن ناشر این کار انجام می‌شود. این کتاب برای دانشجویان خیلی مفید واقع می‌شود. 293 | 294 | 295 | 296 | 297 | ## اسپانیایی 298 | 299 | 300 | Alfonso de la Guarda Reyes و Gustavo Echeverria و David Crespo Arroyo و Cristian Bermudez Serna داوطلب شده‌اند برای ترجمه‌ی کتاب به زبان اسپانیایی. 301 | 302 | ایمیل‌ها به ترتیب اسم‌ها است : 303 | 304 | (alfonsodg@ictechperu.net) 305 | 306 | (gustavo.echeverria@gmail.com) 307 | 308 | (davidcrespoarroyo@hotmail.com) 309 | 310 | (crisbermud@hotmail.com) 311 | 312 | Gustavo Echeverria می‌گوید: 313 | 314 | > من به عنوان مهندس برنامه نویسی در ارژانتین کار می‌کنم. من از برنامه‌نویسی سی‌شارپ و نت استفاده می‌کنم.ولی در کار‌های خودم از پریل و پایتون استفاده می‌کنم.من از چند سال پیش با پایتون اشنا شدم و دیگر از هم جدا نشدیم. بعد از اشنا شدن با پایتون این کتاب را نیز کشف کردم و این باعث شد که من این زبان را یاد بگیرم. وسریعا شروع کردم به ترجمه‌ی کتاب به اسپانیایی . 315 | 316 | 317 | Cristian Bermudez Serna می‌گوید: 318 | 319 | > من دانشجوی مهندسی و فناوری در دانشگاه Antioquia (کلمبیا) هستم. چند ماه قبل من شروع کردم به یادگیری پایتون و هم‌زمان این کتاب را پیداکردم و تصمیم برای ترجمه‌ی کتاب به زبان اسپانیایی گرفتم. 320 | 321 | 322 | ## سوئدی 323 | 324 | Mikael Jacobsson داوطلب شده برای ترجمه‌ی کتاب به سوئدی (leochingkwake@gmail.com. 325 | 326 | 327 | 328 | ## ترکی 329 | 330 | 331 | Türker SEZER و Bugra Cakir داوطلب شده‌اند بری ترجمه کتاب به ترکی (tsezer@btturk.net) و (bugracakir@gmail.com). 332 | 'کجای نسخه‌ی ترکی؟ Bitse de okusak' 333 | --------------------------------------------------------------------------------