Professional Documents
Culture Documents
Payton Be Zaban Sade (WWW - Ketabesabz.com)
Payton Be Zaban Sade (WWW - Ketabesabz.com)
https://bit.ly/2kKGxYJ
www.w3-farsi.com/product
بی شک این اثر ،خالی از اشکال نیست و از شما خوانندگان عزیز می خواهم که با نظرات و پیشنهادات خود بنده را در تکمیل و رفع نواقص آن از طریق پست
IDتلگرام@ebrahimi_younes :
پایتون چیست
پایتون ) (Pythonیک زبان برنامهنویسی همه منظوره ،شیءگرا و متن باز است که توسط خودو فان راسام ) (Guido van Rossumدر
سال 1991در کشور هلند طراحی شد .این زبان از زبانهای برنامهنویسی مفسر بوده و به صورت کامل یک زبان شیءگرا است که به زبانهای
پایتون ،کد باز ) (Open Sourceاست ،زبانی که گوگل و یا یاهو از آن به عنوان یکی از اصلیترین ابزارهای توسعه استفاده میکنند.
برنامههای پایتون مثل PHPقابل اجرا روی اغلب سیستم عاملهاست .پایتون ،دستور زبانی شبیه گفتار سادهی انگلیسی دارد و با دارا بودن
سادگی و خوانایی از ویژگیهای بارز زبان برنامهنویسی پایتون است ،آنچنان ساده که حتی کودکان نیز قادر به آموختن آن هستند و قدرت
در کنار این سادگی و خوانایی ،معجزه پایتون میباشد .از نگاه هر برنامهنویسی ،برنامههای پایتون مجموعه ای از کدهای زیبا هستند ،بدون
هیچ آشفتگی و پیچیدگی .جالب است بدانید مایکروسافت نیز این زبان را با نام IronPythonدر تکنولوژی .Netخود گنجانده است.
هم اکنون پایتون در شرکتها و سازمانهای بزرگی مثل ناسا و گوگل و یاهو و … به صورت گسترده مورد استفاده قرار میگیرد .تا کنون
نسخههای مختلفی از این زبان ارائه شده است که لیست آنها را در جدول زیر مشاهده میکنید:
حال که با پایتون به طور مختصر آشنا شدید ،در درسهای بعد در مورد این زبان برنامهنویسی بیشتر توضیح میدهیم.
ویرایش کدها ،پیدا کردن خطاها ،نمایش خروجی ،و برخی موارد دیگر کمک م یکنند .برای اجرای کدهای Pythonمحیطهای مختلفی
وجود دارد که سادهترین آنها IDEL ،میباشد .برای دانلود این محیط کدنویسی ،بر روی لینک زیر کلیک کنید:
https://www.python.org/downloads
با کلیک بر روی لینک باال ،صفحهای به صورت زیر باز میشود ،که در این صفحه همانطور که در شکل زیر مشاهده میکنید ،بر روی دکمهای
که با فلش نشان داده شده کلیک کرده ،تا آخرین نسخه IDELدانلود شود:
9 فصل اول :مبانی زبان پایتون
بعد از دانلود فایل مورد نظر به محل ذخیره آن رفته و بر روی فایل دو بار کلیک کنید .سپس در صفحهای که به صورت زیر نمایش داده می
شود ،تیک مورد نظر را زده و سپس بر روی گزینه Customize installiationکلیک کنید:
بعد از کلیک بر روی گزینه مذکور صفحهای به صورت زیر نمایش داده میشود .در این صفحه بر روی دکمه Nextکلیک کنید:
در صفحه بعد بر روی دکمه Installکلیک کرده و منتظر بمانید تا برنامه نصب شود:
در آخر و بعد از نصب کامل برنامه پیغامی مبنی بر موفقیت آمیز بودن ،نصب برنامه به شما نمایش داده میشود و شما میتوانید دکمه
Closeرا بزنید:
11 فصل اول :مبانی زبان پایتون
در صفحه باز شده به صورت زیر بر روی منوی Fileو سپس گزینه New Fileکلیک کنید:
13 فصل اول :مبانی زبان پایتون
با کلیک بر روی گزینه New Fileصفحهای به صورت زیر نمایش داده میشود که شما میتوانید کدهای خود را در داخل آن بنویسید:
سپس یک مسیر برای ذخیره فایل انتخاب کنید .ما در شکل زیر فایل را در درایو Cذخیره کردهایم:
15 فصل اول :مبانی زبان پایتون
بعد از ذخیره فایل به محیط کدنویسی بر گشته و از منوی Runگزینه Run Moduleو یا دکمه F5را بزنید:
مشاهده میکنید که برنامه اجرا شده و پیغام ! Welcome to Python tutorialsچاپ میشود:
مثال باال سادهترین برنامهای است که شما میتوانید در Pythonبنویسید .هدف در مثال باال نمایش یک پیغام در صفحه نمایش است.
هر زبان برنامهنویسی دارای قواعدی برای کدنویسی است .پایتون دارای توابع از پیش تعریف شدهای است که هر کدام برای مقاصد خاصی
به کار میروند .هر چند که در آینده در مورد توابع بیشتر توضیح میدهیم ولی در همین حد به توضیح تابع بسنده میکنیم که توابع
مجموعهای از کدها هستند که دارای یک نام بوده و در جلوی نام آنها عالمت () قرار میگیرد .یکی از این توابع ،تابع )( printاست .از
تابع )( printبرای چاپ یک رشته استفاده میشود .یک رشته گروهی از کاراکترها است ،که به وسیله دابل کوتیشن (“) محصور شده
است .مانند .“Welcome to Python Tutorials!” :یک کاراکتر میتواند یک حرف ،عدد ،عالمت یا … باشد .در کل مثال باال نحوه
استفاده از تابع )( printاست .توضیحات بیشتر در درسهای آینده آمده است .پایتون فضای خالی باال را نادیده میگیرد و از کد زیر
اشکال نمیگیرد:
(print
)"!"Welcome to Python Tutorials
همیشه به یاد داشته باشید که Pythonبه بزرگی و کوچکی حروف حساس است .یعنی به طور مثال MANو manدر Pythonبا هم فرق
دارند .رشتهها و توضیحات از این قاعده مستثنی هستند که در درسهای آینده توضیح خواهیم داد .مثالا کدهای زیر با خطا مواجه میشوند
و اجرا نمیشوند:
تغییر در بزرگی و کوچکی حروف از اجرای کدها جلوگیری میکند .اما کد زیر کامالا بدون خطا است:
در زبانهایی مثل جاوا و سی شارپ ،از عالمت آکوالد ({}) برای ایجاد یک بالک کد
Block
{
statement
}
ولی در زبان پایتون از ترکیب عالمت دو نقطه ( ):و تو رفتگی برای اینکار استفاده میشود:
Block:
statement
ما با دونقطه به پایتون میگوییم که قصد داریم یک بلوک کد را آغاز کنیم و با تو رفتگی ابتدای خطوط دستورات آن بلوک را تعریف میکنیم .
برای تورفتگی میتوانیم از 3یا 4یا 10فضای خالی استفاده کنیم .میزان این فضای خالی تا زمانی که در تمام کد رعایت شود ،اهمیتی
1 Block1:
2 statement
3 statement
4 Block2:
5 statement
6 Block3:
7 statement
8 statement
9 Block4:
10 statement
11 statement
12 statement
ا
حتما باید دارای تو رفتگی در کد باال ،بالک اول ) (Block1از خط 1تا 3را شامل میشود .به این نکته توجه کنید که خطوط بعد از عالمت:
باشند .بالک دوم ) (Block2از خط 4شروع و به خط 11ختم میشود .نکتهای که باید در اینجا دوباره به آن اشاره کنیم این است که
دستور یا بالکهایی که دارای فاصلههای برابر از سمت چپ هست جزو یک بالک میباشند .مثالا در کد باال خطوط 2و 3جز Block1
هستند چون تو رفتگی آنها از سمت چپ برابر است و اگر مثالا فاصلههای خط 3از سمت چپ را حذف کنیم دیگر جز بالک محسوب نمی
شود .یک بالک را میتوان زیر مجموعه بالک دیگر کرد .مثالا در خط Block3 ،6را زیر مجموعه Block2و در خط Block4 ،9را زیر مجموعه
Block3کردهایم .در نهایت خط 12جز هیچکدام از بالکها نیست و مستقل اجرا میشود .گاهی اوقات و هنگام کدنویسی ،الزم است که
رشتههای طوالنی را در چند خط بنویسید .برای اینکار در پایتون میتوان از عالمت \ به صورت زیر استفاده کنید:
\ print("Welcome
\ to
\ Python
)"!Tutorials
توضیحات
وقتی که کدی تایپ میکنید شاید بخواهید که متنی جهت یادآوری وظیفه آن کد به آن اضافه کنید .در ( Pythonو بیشتر زبانهای
برنامهنویسی) میتوان این کار را با استفاده از توضیحات انجام داد .توضیحات متونی هستند که توسط مفسر نادیده گرفته میشوند و به
هدف اصلی از ایجاد توضیحات ،باال بردن خوانایی و تشخیص نقش کدهای نوشته شده توسط شما ،برای دیگران است .فرض کنید که
میخواهید در مورد یک کد خاص ،توضیح بدهید ،میتوانید توضیحات را در باالی کد یا کنار آن بنویسید .از توضیحات برای مستند سازی
برنامه هم استفاده میشود .در برنامه زیر نقش توضیحات نشان داده شده است:
در کد باال ،خط اول کد باال یک توضیح درباره خط دوم است که به کاربر اعالم میکند که وظیفه خط دوم چیست؟ با اجرای کد باال فقط
جمله Hello Worldچاپ شده و خط اول در خروجی نمایش داده نمیشود چون مفسر توضیحات را نادیده میگیرد .همانطور که مشاهده
میکنید برای درج توضیخات در پایتون از عالمت #استفاده میشود .برای توضیحات طوالنی هم باید در ابتدای هر خط از توضیح این
کاراکترهای کنترلی
کاراکترهای کنترلی ،کاراکترهای ترکیبی هستند که با یک بک اسلش )\( شروع میشوند و به دنبال آنها یک حرف یا عدد میآید و یک
رشته را با فرمت خاص نمایش میدهند .برای مثال برای ایجاد یک خط جدید و قرار دادن رشته در آن میتوان از کاراکتر کنترلی \nاستفاده
کرد:
)"!print("Hello\nWorld
Hello
World
مشاهده کردید که مفسر بعد از مواجهه با کاراکتر کنترلی \nنشانگر ماوس را به خط بعد برده و بقیه رشته را در خط بعد نمایش میدهد.
ما برای استفاده از کاراکترهای کنترلی ،از بک اسلش )\( استفاده میکنیم .از آنجاییکه \ معنای خاصی به رشتهها میدهد برای چاپ بک
یکی از موارد استفاده از \\ ،نشان دادن مسیر یک فایل در ویندوز است:
از آنجاییکه از دابل کوتیشن )“( برای نشان دادن رشتهها استفاده میکنیم برای چاپ آن از ”\ استفاده میکنیم:
)"print("Left\tRight
Left Right
برای چاپ کاراکترهای یونیکد میتوان از \uاستفاده کرد .برای استفاده از ،\uمقدار در مبنای 16کاراکتر را درست بعد از عالمت \uقرار
میدهیم .برای مثال اگر بخواهیم عالمت کپی رایت )©( را چاپ کنیم ،باید بعد از عالمت \uمقدار 00A9را قرار دهیم مانند:
)"print("\u00A9
©
برای مشاهده لیست مقادیر مبنای 16برای کاراکترهای یونیکد به لینک زیر مراجعه نمایید:
http://www.ascii.cl/htmlcodes.htm
اگر مفسر به یک کاراکتر کنترلی غیر مجاز برخورد کند ،برنامه پیغام خطا میدهد .بیشترین خطا زمانی اتفاق می افتد که برنامه نویس برای
متغیر
متغیر مکانی از حافظه است که شما میتوانید مقادیری را در آن ذخیره کنید .میتوان آن را به عنوان یک ظرف تصور کرد که دادههای خود
را در آن قرار دادهاید .محتویات این ظرف میتواند پاک شود یا تغییر کند .هر متغیر دارای یک نام نیز هست .که از طریق آن میتوان متغیر
را از دیگر متغیرها تشخیص داد و به مقدار آن دسترسی پیدا کرد .همچنین دارای یک مقدار میباشد که می تواند توسط کاربر انتخاب شده
باشد یا نتیجه یک محاسبه باشد .مقدار متغیر میتواند تهی نیز باشد .متغیر دارای نوع نیز هست بدین معنی که نوع آن با نوع دادهای
متغیر دارای عمر نیز هست که از روی آن میتوان تشخیص داد که متغیر باید چقدر در طول برنامه مورد استفاده قرار گیرد .و در نهایت
متغیر دارای محدوده استفاده نیز هست که به شما میگوید که متغیر در چه جای برنامه برای شما قابل دسترسی است .ما از متغیرها به
عنوان یک انبار موقتی برای ذخیره داده استفاده میکنیم .هنگامی که یک برنامه ایجاد میکنیم احتیاج به یک مکان برای ذخیره داده،
مقادیر یا دادههایی که توسط کاربر وارد میشوند ،داریم .این مکان ،همان متغیر است .
برای این از کلمه متغیر استفاده میشود چون ما میتوانیم بسته به نوع شرایط هر جا که الزم باشد ،مقدار آن را تغییر دهیم .متغیرها
موقتی هستند و فقط موقعی مورد استفاده قرار میگیرند که برنامه در حال اجراست و وقتی شما برنامه را میبندید محتویات متغیرها نیز
پاک میشود .قبالا ذکر شد که به وسیله نام متغیر میتوان به آن دسترسی پیدا کرد .برای نامگذاری متغیرها باید قوانین زیر را رعایت کرد:
نام متغیر باید با یکی از حروف الفبا ) (a-z or A-Zیا عالمت _ شروع شود.
نمیتوان از کلمات رزرو شده در پایتون برای نام متغیر استفاده کرد.
اسامی متغیرها نسبت به بزرگی و کوچکی حروف حساس هستند .در پایتون دو حرف مانند aو Aدو کاراکتر مختلف به حساب میآیند.
دو متغیر با نامهای myNumberو MyNumberدو متغیر مختلف محسوب میشوند چون یکی از آنها با حرف کوچک mو دیگری با حرف
بزرگ Mشروع میشود .متغیر دارای نوع هست که نوع دادهای را که در خود ذخیره میکند را نشان میدهد .در درس بعد در مورد انواع
دادهها در پایتون توضیح میدهیم .لیست کلمات کلیدی پایتون ،که نباید از آنها در نامگذاری متغیرها استفاده کرد در زیر آمده است:
انواع داده
توضیح نوع
شامل اعداد مختلط میباشد .نوع داده مختلط نوع غیر قابل تغییری است
به مجموعهای از کاراکترها که بین دو عالمت کوتیشن یا دابل کوتیشن قرار گرفته باشند ،اطالق
رشتهای )(String
میشود.
مجموعهای از آیتمها هستند که بین دو عالمت [] قرار گرفته و با عالمت کاما ( ),از هم جدا
لیست )(List
شدهاند.
مجموعهای از آیتمها هستند که بین دو عالمت () قرار گرفته و با عالمت کاما ( ),از هم جدا
تاپل )(Tuple
شدهاند.
مجموعهای از آیتمها هستند که به صورت کلید و مقدار بوده ،بین دو عالمت {} قرار گرفته ،و
دیکشنری )(Dictionary
با عالمت کاما ( ),از هم جدا شدهاند.
در مورد انواع دادههای باال و نحوه استفاده از آنها در متغیرها ،در درس بعد توضیح میدهیم.
استفاده از متغیرها
بر خالف زبانهایی مثل جاوا و سی شارپ ،که هنگام تعریف متغیر باید نوع متغیر را هم مشخص میکردیم ،در پایتون کافیست که فقط
در مثال زیر نحوه تعریف و مقداردهی متغیرها نمایش داده شده است:
در خطوط ،1-7متغیرها تعریف شدهاند .اما نوع این متغیرها چیست؟ پایتون نوع متغیرها را بسته به مقداری که به آنها اختصاص داده
میشود در نظر میگیرد .مثالا نوع متغیر StringVarدر خط 4از نوع ر شته است ،چون یک مقدار رشته ای به آن اختصاص داده شده
است .به خطوط 6 ،5و 7کد باال توجه کنید .در خط 5یک متغیر تعریف شده است و نوع دادهای که به آن اختصاص داده شده است از
نوع listاست .همانطور که در درس قبل اشاره شد ،برای تعریف listعالمت [] به کار میرود و آیتمهای داخل آن به وسیله کاما از هم
جدا میشوند:
در خط 6هم یک متغیر تعریف شده است و یک مقدار از نوع tupleبه آن اختصاص داده شده است .در تعریف tupleبه جای عالمت
[] از () استفاده میشود .تفاوت بین این دو را در درسهای آینده بیشتر توضیح میدهیم .و اما در خط 7یک نوع دیکشنری تعریف شده
است .برای تعریف دیکشنری بین کلید و مقدار عالمت :و بین کلید/مقدارها هم عالمت ,قرار میگیرد:
مثالا در مثال باال یک دیکشنری تعریف کردهایم که سه آیتم یا کلید/مقدار دارد که بین آنها عالمت کاما ( ),قرار دادهایم .ولی بین یک کلید
و مقدار مربوط به آن عالمت :قرار گرفته است .برای اختصاص یک مقدار به چند متغیر میتوان به صورت زیر عمل کرد:
23 فصل اول :مبانی زبان پایتون
)print(num1
)print(num4
)print(message1
)print(message3
10
10
!Hello World
!Hello World
دقت کنید که برای متغیرهای تعریف شده در حالت باال یک خانه حافظه تخصیص داده میشود ،یعنی مقدار 10در حافظه ذخیره شده و
متغیرهای num1و num2و num3و num4و num5به آن خانه از حافظه اشاره میکنند .همچنین میتوان چند متغیر را تعریف کرد و برای
)print(num1
)print(num2
)print(message1
10
12.5
!Hello World
همانطور که در درس قبل هم اشاره کردیم ،یک رشته در اصل یک مجموعه از کاراکترهاست که در داخل عالمت “” یا ‘ ‘ قرار دارند .هر کدام
از این کاراکترها دارای یک اندیس است که به وسیله آن اندیس قابل دسترسی هستند .اندیس کاراکترها در رشته از 0شروع میشود .به
در رشته باال اندیس کاراکتر Oبرابر 4است .برای درک بهتر به شکل زیر توجه کنید:
حال برای چاپ یک کاراکتر (مثل )Wاز این رشته کافیست که به صورت زیر عمل کنیم:
" !message = "Hello World
)]print(message[6
W
همانطور که در کد باال مشاهده میکنید کافیست که نام متغیر را نوشته ،در جلوی آن یک جفت کروشه و در داخل کروشهها اندیس آن
کاراکتری را که میخواهیم چاپ شود را بنویسیم .چاپ مقدار با استفاده از اندیس در مورد Listو Tupleهم صدق میکند:
)]print(listVar[2
)]print(tupleVar[1
8
Programming
و اما در مورد دیکشنری ،شما باید نام کلید را بنویسید تا مقدار آن برای شما نمایش داده شود:
)]'print(dictionaryVar['Family
Scalia
نکتهای که بهتر است در همینجا به آن اشاره کنیم این است که کلید/مقدارها در دیکشنری میتوانند از هر نوعی باشند و شما برای چاپ
مقدار مربوط به یک کلید باید نام کلید را دقیق بنویسید .به مثال زیر توجه کنید:
)]'print(dictionaryVar['2
Scalia
در مثال باال ما مقدار کلید ‘ ’2را چاپ کردهایم .حال اگر به جای ‘ ’2عدد 2را بنویسیم ،یعنی عالمت کوتیشن را نگذاریم با خطا مواجه می
شویم:
)]print(dictionaryVar[2
جانگهدار )(Placeholders
به تابع )( printدر خطوط ( )9-15توجه کنید .این تابع به دو قسمت تقسیم شده است .قسمت اول یک رشته قالب بندی شده است و
و قسمت دوم هم شامل متدی به نام )( formatاست که دارای مقدار یا مقادیری است که توسط رشته قالب بندی شده مورد استفاده
قرار میگیرند .اگر به دقت نگاه کنید رشته قالب بندی شده دارای عدد صفری است که در داخل دو آکوالد محصور شده است .البته عدد
داخل دو آکوالد میتواند از صفر تا nباشد .به این اعداد جانگهدار می گویند .این اعداد بوسیله مقدار یا مقادیری که در داخل تابع
)( formatهستند جایگزین میشوند .به عنوان مثال جانگهدار } {0به این معناست که اولین مقدار داخل تابع )( formatدر آن قرار
))print("The values are {0}, {1}, {2}, and {3}.".format(value1, value2, value3, value4
جانگهدارها از صفر شروع میشوند .تعداد جانگهدارها باید با تعداد مقادیری که در داخل تابع )( formatآورده شدهاند برابر باشد .برای
مثال اگر شما چهار جانگهدار مثل باال داشته باشید باید چهار مقدار هم برای آنها بعد از رشته قالب بندی شده در نظر بگیرید .اولین جانگهدار
با اولین مقدار و دومین جا نگهدار با دومین مقدار جایگزین میشود .در ابتدا فهمیدن این مفهوم برای کسانی که تازه برنامهنویسی را
شروع کردهاند سخت است اما در درسهای آینده مثالهای زیادی در این مورد مشاهده خواهید کرد.
عبارات و عملگرها
ابتدا با دو کلمه آشنا شوید:
مثالا :X+Yیک عبارت است که در آن Xو Yعملوند و عالمت +عملگر به حساب میآیند.
زبانهای برنامهنویسی جدید دارای عملگرهایی هستند که از اجزاء معمول زبان به حساب میآیند .پایتون دارای عملگرهای مختلفی از جمله
عملگرهای ریاضی ،تخصیصی ،مقایسهای ،منطقی و بیتی میباشد .از عملگرهای ساده ریاضی میتوان به عملگر جمع و تفریق اشاره کرد.
انواع مختلف عملگر که در این بخش مورد بحث قرار میگیرند ،عبارتند از:
عملگرهای ریاضی
عملگرهای ریاضی
پایتون از عملگرهای ریاضی برای انجام محاسبات استفاده میکند .جدول زیر عملگرهای ریاضی پایتون را نشان میدهد:
Var1برابر است با حاصل جمع var2و var3 var1 = var2 + var3 +
Var1برابر است با حاصل تفریق var2و var3 var1 = var2 – var3 –
Var1برابر است با حاصل تقسیم var2بر var3 var1 = var2 / var3 /
Var1برابر است با باقیمانده تقسیم var2و var3 var1 = var2 % var3 %
Var1برابر است با مقدار var2به توان var3 var1 = var2 ** var3 **
مثال باال در از نوع عددی استفاده شده است .اما استفاده از عملگرهای ریاضی برای نوع رشتهای نتیجه متفاوتی دارد .اگر از عملگر +برای
رشتهها استفاده کنیم دو رشته را با هم ترکیب کرده و به هم میچسباند .حال میتوانیم با ایجاد یک برنامه نحوه عملکرد عملگرهای ریاضی
9 print("The "quotient of {0} and {1} is {2:.2f}. .format(num1, num2, (num1 / )))num2
10 print("The "remainder of {0} divided by {1} is {2}. .format(num1, num2, (num1 % )))num2
11 print("The "result of {0} power {1} is {2}. .format(num1, num2, (num1 ** )))num2
12 print("The "quotient of {0} and {1} is {2}. .format(num1, num2, (num1 // )))num2
13
14 #Demonstrate concatenation on strings using the + operator
15 " msg1 = "Hello
16 "!msg2 = "World
17 )print(msg1 + msg2
برنامه باال نتیجه هر عبارت را نشان میدهد .در این برنامه از تابع )( printبرای نشان دادن نتایج در سطرهای متفاوت استفاده شده
است .در خط 9برای اینکه ارقام کسری بعد از عدد حاصل دو رقم باشند از } {2:.2fاستفاده میکنیم {2:.2f} .در این جا بدین معناست
که عدد را تا دو رقم اعشار نمایش بده .پایتون خط جدید و فاصله و فضای خالی را نادیده میگیرد .در خط 17مشاهده میکنید که دو
رشته به وسیله عملگر +به هم متصل شدهاند .نتیجه استفاده از عملگر +برای چسباندن دو کلمه “ “Helloو ” “!Worldرشته “!Hello
” Worldخواهد بود .به فاصلههای خالی بعد از اولین کلمه توجه کنید اگر آنها را حذف کنید از خروجی برنامه نیز حذف میشوند.
نوع دیگر از عملگرهای پایتون عملگرهای جایگزینی نام دارند .این عملگرها مقدار متغیر سمت راست خود را در متغیر سمت چپ قرار
مقدار var1برابر است با حاصل جمع var1و var2 var1 += var2 =+
مقدار var1برابر است با حاصل تفریق var1و var2 var1 -= var2 =-
مقدار var1برابر است با حاصل ضرب var1در var2 var1 *= var2 =*
مقدار var1برابر است با حاصل تقسیم var1بر var2 var1 /= var2 =/
مقدار var1برابر است با باقیمانده تقسیم var1بر var2 var1 %= var2 =%
مقدار var1برابر است با var1به توان var2 var1 **= var2 =**
مقدار var1برابر است با حاصل تقسیم var1بر var2 var1 //= var2 =//
از عملگر = +برای اتصال دو رشته نیز میتوان استفاده کرد .استفاده از این نوع عملگرها در واقع یک نوع خالصه نویسی در کد است .مث ا
ال
شکل اصلی کد var1 += var2به صورت var1 = var1 + var2میباشد .این حالت کدنویسی زمانی کارایی خود را نشان میدهد
که نام متغیرها طوالنی باشد .برنامه زیر چگونگی استفاده از عملگرهای تخصیصی و تأثیر آنها را بر متغیرها نشان میدهد:
Assigning 10 to number...
Number = 10
Adding 10 to number...
Number = 20
Subtracting 10 from number...
Number = 10
در برنامه از 3عملگر تخصیصی استفاده شده است .ابتدا یک متغیر و مقدار 10با استفاده از عملگر = به آن اختصاص داده شده است.
سپس به آن با استفاده از عملگر = +مقدار 10اضافه شده است .و در آخر به وسیله عملگر = -عدد 10از آن کم شده است.
عملگرهای مقایسهای
از عملگرهای مقایسهای برای مقایسه مقادیر استفاده می شود .نتیجه این مقادیر یک مقدار بولی (منطقی) است .این عملگرها اگر نتیجه
مقایسه دو مقدار درست باشد مقدار 1و اگر نتیجه مقایسه اشتباه باشد مقدار 0را نشان میدهند .این عملگرها به طور معمول در دستورات
شرطی به کار میروند به این ترتیب که باعث ادامه یا توقف دستور شرطی می شوند .جدول زیر عملگرهای مقایسهای در پایتون را نشان
میدهد:
29 فصل اول :مبانی زبان پایتون
num1 = 10
num2 = 5
}print("{0 == }{1 : "}{2 .format(num1, num2, num1 == ))num2
}print("{0 =! }{1 : "}{2 .format(num1, num2, num1 =! ))num2
}print("{0 >< }{1 : "}{2 .format(num1, num2, num1 =! ))num2
}print("{0 < }{1 : "}{2 .format(num1, num2, num1 < ))num2
}print("{0 > }{1 : "}{2 .format(num1, num2, num1 > ))num2
}print("{0 =< }{1 : "}{2 .format(num1, num2, num1 =< ))num2
}print("{0 => }{1 : "}{2 .format(num1, num2, num1 => ))num2
در مثال باال ابتدا دو متغیر را که میخواهیم با هم مقایسه کنیم را ایجاد کرده و به آنها مقادیری اختصاص میدهیم .سپس با استفاده از
یک عملگر مقایسهای آنها را با هم مقایسه کرده و نتیجه را چاپ میکنیم .به این نکته توجه کنید که هنگام مقایسه دو متغیر از عملگر ==
به جای عملگر = باید استفاده شود .عملگر = عملگر تخصیصی است و در عبارتی مانند x = yمقدار yرا در به xاختصاص میدهد .عملگر
== عملگر مقایسهای است که دو مقدار را با هم مقایسه میکند مانند x==yو اینطور خوانده میشود xبرابر است با .y
عملگرهای منطقی
عملگرهای منطقی بر روی عبارات منطقی عمل میکنند و نتیجه آنها نیز یک مقدار بولی است .از این عملگرها اغلب برای شرطهای پیچیده
استفاده میشود .همانطور که قبالا یاد گرفتید مقادیر بولی میتوانند Falseیا Trueباشند .فرض کنید که var2و var3دو مقدار بولی
هستند.
مثال عملگر
اگر مقادیر دو طرف عملگر True ،andباشند عملگر andمقدار Trueرا بر میگرداند .در غیر اینصورت اگر یکی از مقادیر یا هر دوی آنها
Falseباشند مقدار Falseرا بر میگرداند .در زیر جدول درستی عملگر andنشان داده شده است:
برای درک بهتر تأثی ر عملگر andیاد آوری میکنم که این عملگر فقط در صورتی مقدار Trueرا نشان میدهد که هر دو عملوند مقدارشان
Trueباشد .در غیر اینصورت نتیجه تمام ترکیبهای بعدی Falseخواهد شد .استفاده از عملگر andمانند استفاده از عملگرهای مقایسهای
است .به عنوان مثال نتیجه عبارت زیر درست ) (Trueاست اگر سن ) (ageبزرگتر از 18و salaryکوچکتر از 1000باشد.
عملگر andزمانی کارامد است که ما با محدود خاصی از اعداد سرو کار داریم .مث ا
ال عبارت 10 <= x <= 100بدین معنی است که xمی
تواند مقداری شامل اعداد 10تا 100را بگیرد .حال برای انتخاب اعداد خارج از این محدوده میتوان از عم لگر منطقی andبه صورت زیر
استفاده کرد.
اگر یکی یا هر دو مقدار دو طرف عملگر ،orدرست ) (Trueباشد ،عملگر orمقدار Trueرا بر میگرداند .جدول درستی عملگر orدر زیر
در جدول باال مشاهده میکنید که عملگر orدر صورتی مقدار Falseرا بر میگرداند که مقادیر دو طرف آن Falseباشند .کد زیر را در نظر
بگیرید .نتیجه این کد در صورتی درست ) (Trueاست که رتبه نهایی دانش آموز ) (finalGradeبزرگتر از 75یا یا نمره نهایی امتحان
آن 100باشد.
برخالف دو اپراتور orو andعملگر منطقی NOTیک عملگر یگانی است و فقط به یک عملوند نیاز دارد .این عملگر یک مقدار یا اصطالح
بولی را نفی میکند .مثالا اگر عبارت یا مقدار Trueباشد آنرا Falseو اگر Falseباشد آنرا Trueمیکند .جدول زیر عملکرد اپراتور NOTرا
نشان میدهد:
X not X
True False
False True
عملگرهای بیتی
عملگرهای بیتی به شما اجازه میدهند که شکل باینری انواع دادهها را دستکاری کنید .برای درک بهتر این درس توصیه میشود که شما
سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را از لینک زیر یاد بگیرید:
http://www.w3-farsi.com/?p=5698
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده میکند وضعیت هر چیز یا خاموش است یا روشن .برای نشان دادن حالت روشن
از عدد 1و برای نشان دادن حالت خاموش از عدد 0استفاده میشود .بنابراین اعداد باینری فقط میتوانند صفر یا یک باشند .اعداد باینری
را اعداد در مبنای 2و اعداد اعشاری را اعداد در مبنای 10می گویند .یک بیت نشان دهنده یک رقم باینری است و هر بایت نشان دهنده
8بیت است .به عنوان مثال برای یک داده از نوع intبه 32بیت یا 4بایت فضا برای ذخیره آن نیاز داریم ،این بدین معناست که اعداد
از 32رقم 0و 1برای ذخیره استفاده میکنند .برای مثال عدد 100وقتی به عنوان یک متغیر از نوع intذخیره میشود در کامپیوتر به صورت
000000000000000000000000000001100100
عدد 100در مبنای ده معادل عدد 1100100در مبنای 2است .در اینجا 7رقم سمت راست نشان دهنده عدد 100در مبنای 2است و مابقی
صفرهای سمت راست برای پر کردن بیتهایی است که عدد از نوع intنیاز دارد .به این نکته توجه کنید که اعداد باینری از سمت راست به
چپ خوانده میشوند .عملگرهای بیتی پایتون در جدول زیر نشان داده شدهاند:
مثال عملگر
عملگر بیتی ANDکاری شبیه عملگر منطقی ANDانجام میدهد با این تفاوت که این عملگر بر روی بیتها کار میکند .اگر مقادیر دو طرف آن
1باشد مقدار 1را بر میگرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر میگرداند .جدول درستی عمگر بیتی ANDدر زیر آمده
است:
1
همانطور که در مثال باال مشاهده میکنید نتیجه عملکرد عملگر ANDبر روی دو مقدار 5و 3عدد یک میشود .اجازه بدهید ببینیم که چطور
5: 00000000000000000000000000000101
3: 00000000000000000000000000000011
------------------------------------
1: 00000000000000000000000000000001
ابتدا دو عدد 5و 3به معادل باینریشان تبدیل میشوند .از آنجاییکه هر عدد صحیح ) 32 (intبیت است از صفر برای پر کردن بیتهای
خالی استفاده میکنیم .با استفاده از جدول درستی عملگر بیتی ANDمیتوان فهمید که چرا نتیجه عدد یک میشود.
عملگر بیتی )|(OR
اگر مقادیر دو طرف عملگر بیتی ORهر دو صفر باشند نتیجه صفر در غیر اینصورت 1خواهد شد .جدول درستی این عملگر در زیر آمده
است:
نتیجه عملگر بیتی ORدر صورتی صفر است که عملوندهای دو طرف آن صفر باشند .اگر فقط یکی از دو عملوند یک باشد نتیجه یک خواهد
result = 7 | 9
)print(result
15
وقتی که از عملگر بیتی ORبرای دو مقدار در مثال باال ( 7و )9استفاده میکنیم نتیجه 15میشود .حال بررسی میکنیم که چرا این نتیجه
7: 00000000000000000000000000000111
9: 00000000000000000000000000001001
-----------------------------------
15: 00000000000000000000000000001111
با استفاده از جدول درستی عملگر بیتی ORمیتوان نتیجه استفاده از این عملگر را تشخیص داد .عدد 1111باینری معادل عدد 15صحیح
است.
در صورتیکه عملوندهای دو طرف این عملگر هر دو صفر یا هر دو یک باشند نتیجه صفر در غیر اینصورت نتیجه یک میشود .در مثال زیر
result = 5 ^ 7
)print(result
2
در زیر معادل باینری اعداد باال ( 5و )7نشان داده شده است.
5: 00000000000000000000000000000101
7: 00000000000000000000000000000111
-----------------------------------
2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی ،XORمیتوان فهمید که چرا نتیجه عدد 2می شود.
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد .در زیر جدول درستی این عملگر آمده است:
0 1
1 0
عملگر بیتی NOTمقادیر بیتها را معکوس میکند .در زیر چگونگی استفاده از این عملگر آمده است:
result = ~7
)print(result
-8
به نمایش باینری مثال باال که در زیر نشان داده شده است توجه نمایید.
7: 00000000000000000000000000000111
------------------------------------
-8: 11111111111111111111111111111000
عملگر بیتی تغییر مکان )(shift
این نوع عملگرها به شما اجازه میدهند که بیتها را به سمت چپ یا راست جا به جا کنید .دو نوع عملگر بیتی تغییر مکان وجود دارد که
هر کدام دو عملوند قبول میکنند .عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد جابه جایی بیتها
این عملگر بیتهای عملوند سمت چپ را به تعداد nمکان مشخص شده توسط عملوند سمت راست ،به سمت چپ منتقل میکند .به عنوان
مثال:
)print(result
40
در مثال باال ما بیتهای مقدار 10را دو مکان به سمت چپ منتقل کردهایم ،حال بیایید تأثیر این انتقال را بررسی کنیم:
10: 00000000000000000000000000001010
------------------------------------
40: 00000000000000000000000000101000
مشاهده میکنید که همه بیتها به اندازه دو واحد به سمت چپ منتقل شدهاند .در این انتقال دو صفر از صفرهای سمت چپ کم میشود
این عملگر شبیه به عمگر تغییر مکان به سمت چپ است با این تفاوت که بیتها را به سمت راست جا به جا میکند .به عنوان مثال:
)print(result
6
37 فصل اول :مبانی زبان پایتون
با استفاده از عملگرتغییر مکان به سمت راست بیتهای مقدار 100را به اندازه 4واحد به سمت چپ جا به جا میکنیم .اجازه بدهید تأثیر
100: 00000000000000000000000001100100
------------------------------------
6: 00000000000000000000000000000110
هر بیت به اندازه 4واحد به سمت راست منتقل میشود ،بنابراین 4بیت اول سمت راست حذف شده و چهار صفر به سمت چپ اضافه
میشود.
عملگرهای خاص
عالوه بر عملگرهایی که تا کنون ذکر شد ،پایتون دارای عملگرهای خاص زیر نیز میباشد:
عملگرهای membershipکه بررسی میکنند آیا متغیر مورد نظر در یک مجموعه ) (sequenceهمچون رشته list ،یا
عملگرهای Identityکه مکانهای قرار گیری دو شیء را با هم مقایسه میکند (بررسی میکنند آیا دو شیء با هم برابر
توضیح عملگر
در صورت یافتن متغیر مورد نظر در مجموعهی مشخص شده True ،و در
in
غیر این صورت Falseرا برمی گرداند.
Memberships operator
در صورت یافت نشدن متغیر مورد نظر در مجموعهی مشخص شده،
not in
Trueو در غیر این صورت Falseرا برمی گرداند.
Identity operator
چنانچه متغیر در دو طرف عملگر به شیء یکسان اشاره داشته باشد،
is not
Falseو در غیر این صورت Trueرا بر میگرداند.
True
False
در خط اول کد باال ،چک میشود که آیا عدد 5در مجموعه ] [3, 8, 5, 10وجود دارد یا نه؟ و چون وجود دارد مقدار Trueبر گردانده
number1 = 5
number2 = 6
True
False
در مثال باال و در اولین مقایسه گفته شده است که آیا number1همان number2است و چون چنین نیست مقدار Falseو در مقایسه
دوم هم گفته شده است که آیا number1برابر number2نیست؟ و چون برابر نیستند مقدار Trueبرگردانده شده است.
که شما در محیط برنامهنویسی تایپ میکنید تا زمانی که دکمه enterرا میزنید ،میخواند .به برنامه زیر توجه کنید:
Name is John.
Age is 18.
Height is 160.5.
ابتدا 3متغیر را برای ذخیره داده در برنامه تعریف میکنیم (خطوط 1و 2و .)3برنامه از کاربر میخواهد که نام خود را وارد کند (خط .)1در
خط 2شما به عنوان کاربر نام خود را وارد میکنید .سپس برنامه از ما سن را سؤال میکند (خط .)3در خط 6هم یک خط فاصله به وسیله
39 فصل اول :مبانی زبان پایتون
تابع )( printایجاد کردهایم تا بین ورودیهای شما و خروجی فاصلهای جهت تفکیک ایجاد شود .حال برنامه را اجرا کرده و با وارد کردن
ساختارهای تصمیم
تقری ا
با همه زبانهای برنامهنویسی به شما اجازه اجرای کد را در شرایط مطمئن میدهند .حال تصور کنید که یک برنامه دارای ساختار تصمیم
گیری نباشد و همه کدها را اجرا کند .این حالت شاید فقط برای چاپ یک پیغام در صفحه مناسب باشد ولی فرض کنید که شما بخواهید
اگر مقدار یک متغیر با یک عدد برابر باشد سپس یک پیغام چاپ شود آن وقت با مشکل مواجه خواهید شد .پایتون راههای مختلفی برای
رفع این نوع مشکالت ارائه میدهد .در این بخش با مطالب زیر آشنا خواهید شد:
دستور if
میتوان با استفاده از دستور ifو یک شرط خاص که باعث ایجاد یک کد میشود یک منطق به برنامه خود اضافه کنید .دستور if
سادهترین دستور شرطی است که برنامه میگوید اگر شرطی برقرار است کد معینی را انجام بده .ساختار دستور ifبه صورت زیر است:
if (condition):
code to execute
قبل از اجرای دستور ifابتدا شرط بررسی میشود .اگر شرط برقرار باشد یعنی درست باشد سپس کد اجرا میشود .شرط یک عبارت
مقایسهای است .میتوان از عملگرهای مقایسهای برای تست درست یا اشتباه بودن شرط استفاده کرد .اجازه بدهید که نگاهی به نحوه
استفاده از دستور ifدر داخل برنامه بیندازیم .برنامه زیر پیغام Hello Worldرا اگر مقدار numberکمتر از 10و Goodbye Worldرا اگر
Hello World.
Goodbye World.
در خط 2یک متغیر با نام numberتعریف و مقدار 5به آن اختصاص داده شده است .وقتی به اولین دستور ifدر خط 2میرسیم برنامه
منطقی است که نتیجه مقایسه درست میباشد ،بنابراین دستور ifدستور را اجرا میکند (خط )6و پیغام Hello Worldچاپ میشود .
حال مقدار numberرا به 15تغییر میدهیم (خط .)9وقتی به دومین دستور ifدر خط 12میرسیم برنامه مقدار numberرا با 10مقایسه
میکند و چون مقدار numberیعنی 15از 10بزرگتر است برنامه پیغام Goodbye Worldرا چاپ میکند (خط .)13به این نکته توجه کنید
شما میتوانید چندین دستور را در داخل دستور ifبنویسید .کافیست که حواستان به تو رفتگی کدها باشد .نحوه تعریف چند دستور در
)if (condition
statement1
statement2
.
.
.
statementN
x = 15
در مثال باال اگر مقدار xاز 10بزرگتر باشد دو پیغام چاپ میشود .حال اگر به عنوان مثال ،تو رفتگی خط آخر را حذف کنیم و مقدار xاز 10
x = 5
:کد باال در صورتی بهتر خوانده میشود که بین دستورات فاصله بگذاریم
x = 5
if (x > 10):
print("x is greater than 10.")
کوچکتر است10 ازx اینجاست که چون ما فرض را بر این گذاشتهایم که مقدار. نیستif جز دستور،میبیند که دستور آخر در مثال باال
به عنوان. در نتیجه اهمیت وجود تو رفتگی مشخص میشود. چاپ میشودThis is not part of the if statement پس خط
فراموش نکنید که از قلم انداختن یک تو. داشتید برای آن یک تو رفتگی ایجاد کنیدif تمرین همیشه حتی اگر فقط یک دستور در بدنه
:if مثالی دیگر در مورد دستور.رفتگی باعث به وجود آمدن خطا شده و یافتن آن را سخت میکند
if (firstNumber == secondNumber):
print("{0} == {1}".format(firstNumber, secondNumber))
if (firstNumber != secondNumber):
print("{0} != {1}".format(firstNumber, secondNumber))
Enter a number: 2
Enter another number: 5
2 != 5
2 < 5
2 <= 5
Enter a number: 10
Enter another number: 3
10 != 3
10 > 3
10 >= 3
Enter a number: 5
Enter another number: 5
5 == 5
5 <= 5
5 >= 5
ما از عملگرهای مقایسهای در دستور ifاستفاده کردهایم .ابتدا دو عدد که قرار است با هم مقایسه شوند را به عنوان ورودی از کاربر
میگیریم .اعداد با هم مقایسه میشوند و اگر شرط درست بود پیغامی چاپ می شود .به این نکته توجه داشته باشید که شرطها مقادیر
دستور if…else
دستور ifفقط برای اجرای یک حالت خاص به کار میرود یعنی اگر حالتی برقرار بود کار خاصی انجام شود .اما زمانی که شما بخواهید ا گر
شرط خاصی برقرار شد یک دستور و اگر برقرار نبود دستور دیگر اجرا شود باید از دستور if elseاستفاده کنید .ساختار دستور if else
if (condition):
code to execute if condition is true
else:
code to execute if condition is false
ا
حتما باید با ifبه کار برده شود .اگر فقط یک کد اجرایی در داخل بدنه ifو از کلمه کلیدی elseنمیتوان به تنهایی استفاده کرد بلکه
بدنه elseدارید استفاده از آکوالد اختیاری است .کد داخل بلوک elseفقط در صورتی اجرا میشود که شرط داخل دستور ifنادرست
در خط 1یک متغیر به نام numberتعریف کردهایم و در خط 4تست میکنیم که آیا مقدار متغیر numberاز 10کمتر است یا نه و چون
کمتر است در نتیجه کد داخل بلوک ifاجرا میشود (خط )7و اگر مقدار numberرا تغییر دهیم و به مقداری بزرگتر از 10تغییر دهیم (خط
،)10شرط نادرست میشود (خط )13و کد داخل بلوک elseاجرا میشود (خط .)16
43 مبانی زبان پایتون:فصل اول
if…elif…else دستور
را بهif استفاده کنید و بهتر است که این دستوراتif اگر بخواهید چند شرط را بررسی کنید چکار میکنید؟ میتوانید از چندین دستور
if (condition):
code to execute
else:
if (condition):
code to execute
else:
if (condition):
code to execute
else:
code to execute
: می توانید کد باال را سادهتر کنید. بنویسیدelse بهتر است دستورات را به صورت تو رفتگی در داخل بلوک.خواندن کد باال سخت است
if (condition):
code to execute
elif (condition):
code to execute
elif (condition):
code to execute
else:
code to execute
elif دستور. وابسته استif نیز به دستورelif ،else را یاد گرفتید باید بدانید که مانندif else حال که نحوه استفاده از دستور
و اگر آن نیز اجرا نشود. بعدی اجرا میشودelif اشتباه باشد دستورelif اشتباه باشد حال اگرif وقتی اجرا میشود که اولین دستور
: را نشان میدهدelif برنامه زیر نحوه استفاده از دستور. اجرا میشودelse در نهایت دستور
ا گر. بسته به اینکه شما چه چیزی انتخاب میکنید پیغامهای مختلفی چاپ می شود. وابسته استchoice خروجی برنامه باال به متغیر
. اجرا میشودelse عددی که شما تایپ میکنید در داخل حالتهای انتخاب نباشد کد مربوط به بلوک
تو در توif دستور
: دیگرif در داخل دستورif یک دستور ساده. تو در تو در پایتون استفاده کردif میتوان از دستور
if (condition):
code to execute
if (condition):
code to execute
elif (condition):
if (condition):
code to execute
else:
if (condition):
code to execute
اجازه بدهید که برنامه را کالبد شکافی کنیم .ابتدا برنامه از شما درباره سنتان سؤال می کند (خط .)1در خط 2درباره جنستان از شما سؤال
میکند .سپس به اولین دستور ifمیرسد (خط .)4در این قسمت اگر سن شما بیشتر از 12سال باشد برنامه وارد بدنه دستور ifمیشود
در غیر اینصورت وارد بلوک ( elseخط )12مربوط به همین دستور ifمیشود.
حال فرض کنیم که سن شما بیشتر از 12سال است و شما وارد بدنه اولین ifشدهاید .در بدنه اولین ifدو دستور ifدیگر را مشاهده
میکنید .اگر سن کمتر 20باشد شما وارد بدنه ifدوم میشوید و اگر نباشد به قسمت elseمتناظر با آن میروید (خط .)10دوباره فرض
میکنیم که سن شما کمتر از 20باشد ،در اینصورت وارد بدنه ifدوم شده و با یک ifدیگر مواجه میشوید (خط .)6در اینجا جنسیت
شما مورد بررسی قرار می گیرد که اگر برابر ” “maleباشد ،کدهای داخل بدنه سومین ifاجرا میشود در غیر اینصورت قسمت elseمربوط
به این ifاجرا میشود (خط .)8پیشنهاد میشود که از ifتو در تو در برنامه کمتر استفاده کنید چون خوانایی برنامه را پایین میآورد.
یک مقدار بولی را بر میگردانند .در جدول زیر برخی از عملگرهای منطقی آمده است:
Trueباشد .اگر فقط مقدار یکی از شروط Falseباشد مقدار False ،z )z = (x > 2) and (y < 10 and
خواهد شد.
مقدارشان Trueباشد .اگر هر دو شرط مقدارشان Falseباشد مقدار ،z )z = (x > 2) or (y < 10 or
Falseخواهد شد.
به عنوان مثال جمله ) z = (x > 2) and (y < 10را به این صورت بخوانید“ :در صورتی مقدار zبرابر Trueاست که مقدار xبزرگتر
از 2و مقدار yکوچکتر از 10باشد در غیر اینصورت Falseاست” .این جمله بدین معناست که برای اینکه مقدار کل دستور Trueباشد
باید مقدار همه شروط Trueباشد .عملگر منطقی orتأثیر متفاوتی نسبت به عملگر منطقی andدارد .نتیجه عملگر منطقی orبرابر True
است اگر فقط مقدار یکی از شروط Trueباشد .و اگر مقدار هیچ یک از شروط Trueنباشد نتیجه Falseخواهد شد .میتوان عملگرهای
در اینجا استفاده از پرانتز مهم است چون از آن در گروه بندی شرطها استفاده میکنیم .در اینجا ابتدا عبارت )(y > 3) or (z < 10
مورد بررسی قرار میگیرد (به علت تقدم عملگرها) .سپس نتیجه آن بوسیله عملگر andبا نتیجه ) (x == 1مقایسه میشود .حال بیایید
برنامه باال نحوه استفاده از عملگر منطقی andرا نشان میدهد (خط .)4وقتی به دستور ifمیرسید (خط )4برنامه سن شما را چک
میکند .اگر سن شما بزرگتر از 12و کوچکتر از 20باشد (سنتان بین 12و 20باشد) یعنی مقدار هر دو Trueباشد سپس کدهای داخل بلوک
ifاجرا میشوند .اگر نتیجه یکی از شروط Falseباشد کدهای داخل بلوک elseاجرا میشود .عملگر andعملوند سمت چپ را مورد
بررسی قرار میدهد .اگر مقدار آن Falseباشد دیگر عملوند سمت راست را بررسی نمیکند و مقدار Falseرا بر میگرداند .بر عکس عملگر
orعملوند سمت چپ را مورد بررسی قرار میدهد و اگر مقدار آن Trueباشد سپس عملوند سمت راست را نادیده میگیرد و مقدار True
را بر میگرداند.
)if (x == 2 or y == 3
#Some code here
نکته مهم اینجاست که شما میتوانید از عملگرهای andو orبه عنوان عملگر بیتی استفاده کنید .تفاوت جزئی این عملگرها وقتی که به
عنوان عملگر بیتی به کار میروند این است که دو عملوند را بدون در نظر گرفتن مقدار عملوند سمت چپ مورد بررسی قرار میدهند .به
عنوان مثال حتی اگر مقدار عملوند سمت چپ Falseباشد عملوند سمت چپ به وسیله عملگر بیتی andارزیابی میشود .اگر شرطها را
47 فصل اول :مبانی زبان پایتون
در برنامه ترکیب کنید استفاده از عملگرهای منطقی andو orبه جای عملگرهای بیتی andو orبهتر خواهد بود .یکی دیگر از عملگرهای
منطقی عملگر notاست که نتیجه یک عبارت را خنثی یا منفی میکند .به مثال زیر توجه کنید:
عملگر شرطی
عملگر شرطی در پایتون مانند دستور شرطی if…elseعمل میکند .در زیر نحوه استفاده از این عملگر آمده است:
عملگر شرطی تنها عملگر سه تایی پایتون است که نیاز به سه عملوند دارد ،یک مقدار زمانی که شرط درست باشد ،شرط و یک مقدار زمانی
که شرط نادرست باشد .اجازه بدهید که نحوه استفاده این عملگر را در داخل برنامه مورد بررسی قرار دهیم:
dog
cat
برنامه باال نحوه استفاده از این عملگر شرطی را نشان میدهد .خط 4به این صورت ترجمه میشود که مقدار dogرا در متغیر type1قرار
بده اگر مقدار pet1برابر با puppyبود در غیر این صورت مقدار catرا type1قرار بده .خط 5به این صورت ترجمه میشود که مقدار
catرا در type2قرار بده اگر مقدار pet2برابر با kittenبود در غیر این صورت مقدار .dogحال برنامه باال را با استفاده از دستور if
elseمینویسیم:
هنگامی که چندین دستور در داخل یک بلوک ifیا elseدارید از عملگر شرطی استفاده نکنید چون خوانایی برنامه را پایین میآورد.
49 فصل اول :مبانی زبان پایتون
نسخه کامل این کتاب را از سایت کتابراه به نشانی زیر دانلود کنید:
روی لینک کلیک کنید و با با رعایت حروف بزرگ و کوچک در مرورگر تایپ و کلید Enterرا بزنید
https://bit.ly/2nxcgxZ
Younes.ebrahimi.1391@gmail.com
از سایر کتاب های یونس ابراهیمی در لینک زیر دیدن فرمایید:
https://bit.ly/2kKGxYJ
تکرار
ساختارهای تکرار به شما اجازه میدهند که یک یا چند دستور کد را تا زمانی که یک شرط برقرار است تکرار کنید .بدون ساختارهای تکرار
شما مجبورید همان تعداد کدها را بنویسید که بسیار خسته کننده است .مثالا شما مجبورید 10بار جمله ” “.Hello Worldرا تایپ کنید
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
print("Hello )"!World
البته شما میتوانید با کپی کردن این تعداد کد را راحت بنویسید ولی این کار در کل کیفیت کدنویسی را پایین میآورد .راه بهتر برای
نوشتن کدهای باال استفاده از حلقهها است .حلقهها در پایتون عبارتند از:
while
for
حلقه While
ابتداییترین ساختار تکرار در پایتون حلقه Whileاست .ابتدا یک شرط را مورد بررسی قرار می دهد و تا زمانیکه شرط برقرار باشد کدهای
درون بلوک اجرا میشوند .ساختار حلقه Whileبه صورت زیر است:
while(condition):
code to loop
میبینید که ساختار Whileمانند ساختار ifبسیار ساده است .ابتدا یک شرط را که نتیجه آن یک مقدار بولی است مینویسیم اگر نتیجه
درست یا trueباشد سپس کدهای داخل بلوک Whileاجرا میشوند .اگر شرط غلط یا falseباشد وقتی که برنامه به حلقه While
برسد هیچکدام از کدها را اجرا نمیکند .برای متوقف شدن حلقه باید مقادیر داخل حلقه Whileاصالح شوند.
به یک متغیر شمارنده در داخل بدنه حلقه نیاز داریم .این شمارنده برای آزمایش شرط مورد استفاده قرار میگیرد و ادامه یا توقف حلقه به
نوعی به آن وابسته است .این شمارنده را در داخل بدنه باید کاهش یا افزایش دهیم .در برنامه زیر نحوه استفاده از حلقه Whileآمده
است:
counter = 1
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
برنامه باال 10بار پیغام ! Hello Worldرا چاپ میکند .اگر از حلقه در مثال باال استفاده نمیکردیم مجبور بودیم تمام 10خط را تایپ کنیم.
اجازه دهید که نگاهی به کدهای برنامه فوق بیندازیم .ابتدا در خط 1یک متغیر تعریف و از آن به عنوان شمارنده حلقه استفاده شده است.
سپس به آن مقدار 1را اختصاص میدهیم چون اگر مقدار نداشته باشد نمیتوان در شرط از آن استفاده کرد.
در خط 3حلقه whileرا وارد میکنیم .در حلقه whileابتدا مقدار اولیه شمارنده با 10مقایسه میشود که آیا از 10کمتر است یا با آن برابر
است .نتیجه هر بار مقایسه ورود به بدنه حلقه Whileو چاپ پیغام است .همانطور که مشاهده میکنید بعد از هر بار مقایسه مقدار
شمارنده یک واحد اضافه میشود (خط .)5حلقه تا زمانی تکرار میشود که مقدار شمارنده از 10کمتر باشد.
اگر مقدار شمارنده یک بماند و آن را افزایش ندهیم و یا مقدار شرط هرگز falseنشود یک حلقه بینهایت به وجود می آید .به این نکته
توجه کنید که در شرط باال به جای عالمت < از =< استفاده شده است .اگر از عالمت < استفاده میکردیم کد ما 9بار تکرار میشد چون
مقدار اولیه 1است و هنگامی که شرط به 10برسد falseمیشود چون 10 < 10نیست .اگر میخواهید یک حلقه بی نهایت ایجاد کنید که
هیچگاه متوقف نشود باید یک شرط ایجاد کنید که همواره درست ) (trueباشد:
while(True):
#code to loop
این تکنیک در برخی موارد کارایی دارد و آن زمانی است که شما بخواهید با استفاده از دستورات breakو returnکه در آینده توضیح
حلقه for
یکی دیگر از ساختارهای تکرار حلقه forاست .این حلقه عملی شبیه به حلقه whileانجام میدهد .ساختار حلقه forبه صورت زیر
است:
iterator_varیک متغیر موقتی in ،کلمه کلیدی و sequenceهم یک سری مانند list ،tupleو … میباشد .میتوان حلقه forرا
اینگونه ترجمه کرد ،که به ازای یا به تعداد آیتمهای موجود در سری ،فالن کارها یا کدها را تکرار کن .در زیر یک مثال از حلقه forآمده
است:
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
)print("Number ", i
Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
Number 10
برنامه باال اعداد 1تا 10را با استفاده از حلقه forمیشمارد .ابتدا یک متغیر موقتی ) ،(iسپس کلمه کلیدی inو در آخر یک سری از اعداد
که در اینجا یک listمیباشد ،تعریف میکنیم .کد اجرا میشود .هر بار که حلقه اجرا میشود ،ابتدا یکی از آیتمهای listدر متغیر i
قرار گرفته و در خط بعد چاپ میشود .این کار تا چاپ آخرین آیتم ادامه مییابد .به جای listدر کد باال میتوانید از tupleو
یا
پایتون به شما اجازه میدهد که از حلقهها به صورت تو در تو استفاده کنید .اگر یک حلقه در داخل حلقه دیگر قرار بگیرد ،به آن حلقه تو
در تو گفته میشود .در این نوع حلقهها ،به ازای اجرای یک بار حلقه بیرونی ،حلقه داخلی به طور کامل اجرا میشود .در زیر نحوه ایجاد
while expression:
while expression:
)statement(s
)statement(s
نکتهای که در مورد حلقههای تو در تو وجود دارد این است که ،میتوان از یک نوع حلقه در داخل نوع دیگر استفاده کرد .مثالا میتوان از
حلقه forدر داخل حلقه whileاستفاده نمود .در مثال زیر نحوه استفاده از این حلقهها ذکر شده است .فرض کنید که میخواهید یک
در کد باال به ازای یک بار اجرای حلقه forاول (خط ،)1حلقه forدوم ( )2-3به طور کامل اجرا میشود .یعنی وقتی مقدار iبرابر عدد 1
میشود ،عالمت * توسط حلقه دوم 5بار چاپ میشود ،وقتی iبرابر 2میشود ،دوباره عالمت * پنج بار چاپ میشود و … .در کل منظور
از دو حلقه forاین است که در 4سطر عالمت * در 5ستون چاپ شود یا 4سطر ایجاد شود و در هر سطر 5بار عالمت * چاپ شود .خط
4هم برای ایجاد خط جدید است .یعنی وقتی حلقه داخلی به طور کامل اجرا شد ،یک خط جدید ایجاد میشود و عالمتهای * در خطوط
گاهی اوقات با وجود درست بودن شرط میخواهیم حلقه متوقف شود .سؤال اینجاست که چطور این کار را انجام دهید؟ با استفاده از
کلمه کلیدی breakحلقه را متوقف کرده و با استفاده از کلمه کلیدی continueمیتوان بخشی از حلقه را رد کرد و به مرحله بعد رفت .
Number 1
Number 2
Number 3
Number 4
Demonstrating the use of continue
Number 1
Number 2
Number 3
Number 4
Number 6
Number 7
Number 8
Number 9
Number 10
Demonstrating the use of pass
در این برنامه از حلقه forبرای نشان دادن کاربرد دو کلمه کلیدی فوق استفاده شده است اگر به جای forاز حلقه whileاستفاده میشد
نتیجه یکسانی به دست میآمد .همانطور که در شرط برنامه (خط )4آمده است ،وقتی که مقدار xبه عدد 5برسد ،سپس دستور break
اجرا (خط )5و حلقه بالفاصله متوقف میشود ،حتی اگر شرط x < 10برقرار باشد .از طرف دیگر در خط 21حلقه forفقط برای یک تکرار
خاص متوقف شده و سپس ادامه مییابد .وقتی مقدار xبرابر 5شود حلقه از 5رد شده و مقدار 5را چاپ نمیکند و بقیه مقادیر چاپ
میشوند.
ممکن است این سؤال برایتان پیش آمده باشد که کاربرد کلمه passچیست؟ از این دستور زمانی استفاده میکنیم که در شرایطی خاص
ا
بعدا کدهای آن نوشته شود .یا زمانی که بخواهیم همانند مثالا باال، نیاز به انجام هیچ کاری نباشد! مثالا برای تعریف یک تابع خالی تا
ا
بعدا بنویسیم ،به کار میرود .حال شما برای درک بهتر ،کلمه passرا از کد باال حذف کرده و کد کدهای بدنه یک دستور شرطی و یا حلقه را
را اجرا کنید .مشاهده میکنید که به شما پیغام خطا نمایش داده میشود و از شما میخواهد که بدنه دستور ifو forرا مشخص کنید
ولی اگر کلمه passرا دوباره بنویسید ،این خطا نادیده گرفته و کد اجرا میشود.
تابع
توابع به شما اجازه میدهند که یک رفتار یا وظیفه را تعریف کنید و مجموعهای از کدها هستند که در هر جای برنامه میتوان از آنها استفاده
کرد .توابع دارای آرگومانهایی هستند که وظیفه تابع را مشخص میکنند .میتوان را می توان در داخل کالس و یا تابع دیگر تعریف کرد .
وقتی که شما در برنامه یک تابع را صدا میزنید برنامه به قسمت تعریف تابع رفته و کدهای آن را اجرا میکند.
گاهی اوقات دو کلمه پارامتر و آرگومان به یک منظور به کار میروند .سادهترین ساختار یک تابع به صورت زیر است:
به برنامه ساده زیر توجه کنید .در این برنامه از یک تابع برای چاپ یک پیغام در صفحه نمایش استفاده شده است:
def printmessage():
)"!print("Hello World
)(printmessage
!Hello World
در خطوط 1-2یک تابع تعریف کردهایم .در تعریف تابع باال کلمه کلیدی defآمده است که نشان دهنده تعریف تابع است .نام تابع ما
)( printmessageاست .به این نکته توجه کنید که در پایتون و طبق قرارداد نام توابع به صورت حروف کوچک نوشته می شود و اگر در
نامگذاری تابع از دو یا چند کلمه استفاده شود ،بهتر است که آنها را با عالمت _ از هم جدا کنید .این روش نامگذاری قراردادی است و
میتوان از این روش استفاده نکرد ،اما پیشنهاد میشود که از این روش برای تشخیص توابع استفاده کنید .بهتر است در نامگذاری توابع
از کلماتی استفاده شود که کار آن تابع را مشخص میکند مثالا نامهایی مانند GoToBedیا .OpenDoorدو پرانتزی که بعد از نام میآید
نشان دهنده آن است که نام متعلق به یک تابع است .در این مثال در داخل پرانتزها هیچ چیزی نوشته نشده چون پارامتری ندارد .د ر
بعد از پرانتزها عالمت :قرار میدهیم و کدهایی را که میخواهیم اجرا شوند را به صورت تو رفتگی بعد از عالمت :و در خط زیر مینویسیم .
در خط 4تابع )( printmessageرا صدا میزنیم .برای صدا زدن یک تابع کافیست نام آن را نوشته و بعد از نام پرانتزها را قرار دهیم.
ا
حتما باید بعد از نام تابع ،عالمتهای پرانتز را هم قرار دهید . به این نکته توجه کنید که برای اجرای کدهای تابع ،هنگام فراخوانی تابع،
اگر تابع دارای پارامتر باشد باید شما آرگومانها را به ترتیب در داخل پرانتزها قرار دهید .در این مورد نیز در درسهای آینده توضیح بیشتری
میدهیم .با صدا زدن یک تابع کدهای داخل بدنه آن اجرا میشوند .برای اجرای تابع )( printmessageبرنامه به محل تعریف تابع
)( printmessageمیرود .مثالا وقتی ما تابع )( printmessageرا در خط 4صدا میزنیم برنامه از خط 4به خط ،1یعنی جایی که تابع
توابع میتوانند مقدار برگشتی از هر نوع دادهای داشته باشند .این مقادیر میتوانند در محاسبات یا به دست آوردن یک داده مورد ا ستفاده
قرار بگیرند .در زندگی روزمره فرض کنید که کارمند شما یک تابع است و شما او را صدا میزنید و از او میخواهید که کار یک سند را به
پایان برساند .سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد .سند همان مقدار برگشتی تابع است .نکته مهم در
مورد یک تابع ،مقدار برگشتی و نحوه استفاده شما از آن است .برگشت یک مقدار از یک تابع آسان است .کافیست در تعریف تابع به روش
)(def functionname
return value
در داخل بدنه تابع کلمه کلیدی returnو بعد از آن یک مقدار یا عبارتی که نتیجه آن یک مقدار است را مینویسیم .مثال زیر یک تابع که
Sum is 15.
همانطور که مشاهده میکنید ،در خطوط 1-6یک تابع تعریف کردهایم .در خطوط 2و 3دو متغیر تعریف و مقدار دهی شدهاند .توجه کنید
که این متغیرها ،متغیرهای محلی هستند .و این بدان معنی است که این متغیرها در سایر توابع ،قابل دسترسی نیستند و فقط در تابعی
که در آن تعریف شدهاند قابل استفاده هستند .در خط 4جمع دو متغیر در متغیر sumقرار میگیرد .در خط 6مقدار برگشتی sumتوسط
دستور returnفراخوانی میشود .در خط 8یک متغیر به نام resultتعریف کرده و تابع )( calculatesumرا فراخوانی میکنیم.
تابع )( calculatesumمقدار 15را بر میگرداند که در داخل متغیر resultذخیره میشود .در خط 10مقدار ذخیره شده در متغیر
resultچاپ میشود .تابعی که در این مثال ذکر شد تابع کاربردی و مفیدی نیست .با وجودیکه کدهای زیادی در تابع باال نوشته شده
ولی همیشه مقدار برگشتی 15است ،در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 15را به آن اختصاص دهیم .این
تابع در صورتی کارآمد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد .هنگامی که میخواهیم در داخل
یک تابع از دستور ifاستفاده کنیم باید تمام کدها دارای مقدار برگشتی باشند .برای درک بهتر این مطلب به مثال زیر توجه کنید:
در خطوط 1 -6یک تابع با نام )( getnumberتعریف شده است که از کاربر یک عدد بزرگتر از 10را میخواهد .اگر عدد وارد شده توسط
کاربر درست نباشد تابع مقدار صفر را بر میگرداند .و اگر قسمت elseدستور ifو یا دستور returnرا از آن حذف کنیم در هنگام اجرای
چون اگر شرط دستور ifنادرست باشد (کاربر مقداری کمتر از 10را وارد کند) برنامه به قسمت elseمیرود تا مقدار صفر را بر گرداند و
چون قسمت elseحذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور returnحذف شود چون برنامه نیاز به مقدار
برگشتی دارد پیغام خطا میدهد .و آخرین مطلبی که در این درس میخواهیم به شما آموزش دهیم این است که شما میتوانید از یک
تابع که مقدار برگشتی ندارد خارج شوید .استفاده از returnباعث خروج از بدنه تابع و اجرای کدهای بعد از آن میشود:
در برنامه باال نحوه خروج از تابع با استفاده از کلمه کلیدی returnو نادیده گرفتن همه کدهای بعد از این کلمه کلیدی نشان داده شده
است .در کد باال انتظار ما این است که با فراخوانی تابع در خط ،11همه کدهای بدنه تابع ( )2-9اجرا شوند .ولی با فراخوانی تابع خطوط 2
و 3چاپ میشوند ،چون هنگامی که برنامه به خط 5میرسد ،از بدنه تابع خارج میشود .سپس مفسر به خط 12رفته و رشته Hello
پارامترها و آرگومانها
پارامترها دادههای خامی هستند که تابع آنها را پردازش میکند و سپس اطالعاتی را که به دنبال آن هستید ،در اختیار شما قرار میدهد .
فرض کنید پارامترها مانند اطالعاتی هستند که شما به یک کارمند میدهید که بر طبق آنها کارش را به پایان برساند .یک تابع میتواند هر
تعداد پارامتر داشته باشد .هر پارامتر میتواند از انواع مختلف داده باشد .در زیر یک تابع با Nپارامتر نشان داده شده است:
کرد .بعد از فراخوانی یک تابع باید آرگومانهای آن را نیز تأمین کنید .آرگومانها مقادیری هستند که به پارامترها اختصاص داده میشوند.
در برنامه باال یک تابع به نام )(( calculatesumخطوط )1-2تعریف شده است و میخواهیم مقدار دو عدد را با این تابع حمع کنیم .در
بدنه تابع دستور returnنتیجه جمع دو عدد را بر میگرداند .در خطوط 4و 5برنامه از کاربر دو مقدار را درخواست میکند و آنها را داخل
متغیرها قرار میدهد .حال تابع را که آرگومانهای آن را آماده کردهایم فراخوانی میکنیم .مقدار num1به پارامتر اول و مقدار num2به پارامتر
دوم ارسال میشود .حال اگر مکان دو مقدار را هنگام ارسال به تابع تغییر دهیم (یعنی مقدار num2به پارامتر اول و مقدار num1به پارامتر
دوم ارسال شود) هیچ تغییری در نتیجه تابع ندارد چون جمع خاصیت جابه جایی دارد.
ا
دقیقا با تعداد پارامترها تعریف شده در تابع مطابقت داشته باشد . فقط به یاد داشته باشید که باید تعداد آرگومانها هنگام فراخوانی تابع
بعد از ارسال مقادیر 10و 5به پارامترها ،پارامترها آنها را دریافت میکنند .به این نکته نیز توجه کنید که نام پارامترها طبق قرارداد به شیوه
کوهان شتری یا ( camelCasingحرف اول دومین کلمه بزرگ نوشته میشود) نوشته میشود .در داخل بدنه تابع (خط )2دو مقدار با هم
جمع میشوند و نتیجه به تابع فراخوان (تابعی که تابع )( calculatesumرا فراخوانی میکند) ارسال میشود .در درس آینده از یک متغیر
برای ذخیره نتیجه محاسبات استفاده میکنیم ولی در اینجا مشاهده میکنید که میتوان به سادگی نتیجه جمع را نشان داد (خط .)7
در خط 7تابع )( calculatesumرا فراخوانی میکنیم و دو مقدار صحیح به آن ارسال میکنیم .دو عدد صحیح در داخل تابع با هم جمع
شده و نتیجه آنها برگردانده میشود .مقدار برگشت داده شده از تابع به وسیله تابع )( printنمایش داده میشود .و نکته آخر اینکه یک
تابع را میتوان به عنوان آرگومان به تابع دیگر ارسال کرد .به کد زیر توجه کنید:
!Hello World
59 فصل اول :مبانی زبان پایتون
در کد باال ما دو تابع تعریف کردهایم .که تابع اول یعنی functionAقرار است که یک آرگومان از نوع تابع دریافت کند .برای این منظور
ا
حتما باید عالمتهای پرانتز را بنویسید .این بدین معنی است که مقدار برگشتی بعد از تعریف پارامتر در خط 1در خط 2و بعد از نام پارامتر
از تابع functionAیک تابع است .در نتیجه هنگامی که در خط 7ما functionBرا به عنوان آرگومان به تابع functionAمیدهیم،
کلمه functionAدر خط 2جایگزین کلمه myFunctionشده و در نتیجه این خط همانند فراخوانی تابع functionBعمل میکند (یعنی
یکی دیگر از راههای ارسال آرگومانها استفاده از نام آنهاست .استفاده از نام آرگومانها شما را از به یاد آوری و رعایت ترتیب پارامترها هنگام
ارسال آرگومانها راحت میکند .در عوض شما باید نام پارامترهای تابع را به خاطر بسپارید .استفاده از نام آرگومانها خوانایی برنامه را باال
میبرد چون شما میتوانید ببینید که چه مقادیری به چه پارامترهایی اختصاص داده شده است .در زیر نحوه استفاده از آرگومانهای کلمه
اختصاص داده میشود .همچنین میتوان از آرگومانهای کلمه کلیدی و آرگومانهای ثابت (مقداری) به طور همزمان استفاده کرد به شرطی
همانطور که مشاهده میکنید ابتدا باید آرگومانهای ثابت هنگام فراخوانی تابع ذکر شوند .در اولین و دومین فراخوانی در کد باال ،مقدار
” “Scaliaرا به عنوان اولین آرگومان به اولین پارامتر تابع یعنی jackاختصاص میدهیم .سومین و چهارمین خط کد باال اشتباه هستند
چون آرگومانهای کلمه کلیدی ،قبل از آرگومانهای ثابت قرار گرفتهاند .قرار گرفتن آرگومانهای کلمه کلیدی بعد از آرگومانهای ثابت از بروز
آرگومانهای متغیر
با استفاده از دستورات خاص *argsو **kwargsمیتوان تعداد دلخواهی از آرگومانها را به تابع ارسال کرد .همانطور که در درسهای
قبل ذکر شد ،هنگام فراخوانی تابع باید به تعداد پارامترهایی که در داخل پرانتز تعریف شدهاند ،آرگومان به تابع ارسال کرد .گاهی اوقات
در برنامهنویسی ممکن است بخواهید که در هر بار فراخوانی تابع تعداد دلخواهی آرگومان به آن ارسال کنید .این کار با استفاده از * و **
def vararguments(*args):
total = 0
for number in args:
total = total + number
return total
6=3+2+1
10 = 4 + 3 + 2 + 1
15 = 5 + 4 + 3 + 2 + 1
ابتدا به این نکته توجه کنید که نامهای argsو kwargsاختیاری هستند و هم نام دیگری میتواند به جای آنها به کار رود .تنها چیزی
که مهم است تعداد عالمت * میباشد که در ادامه کاربرد آنها را توضیح میدهیم.
61 فصل اول :مبانی زبان پایتون
همانطور که در کد باال مشاهده میکنید ،با قرار دادن یک عالمت ستاره قبل از نام پارامتر ،میتوان هر بار که تابع را فراخوانی کرد ،تعداد
دلخواهی از آرگومانها را به آن ارسال کرد .وجود یک عالمت * باعث میشود که آرگومانها در یک متغیر از جنس tupleذخیره شوند و در
نتیجه میتوان با یک دستور forمقادیر آنها را با هم جمع کرد .این نوع پارامتر را میتوان با پارامترهای ثابت هم به کار برد .به مثال زیر
توجه کنید:
)vararguments(1, 2, 3
number = 1
)args = (2, 3
در کد باال اولین آرگومان به اولین پارامتر (یعنی 1به )numberو بقیه آرگومانها به argsاختصاص داده می شوند .وقتی از چندین پارامتر
در یک تابع استفاده میکنید فقط یکی از آنها باید دارای * بوده و همچنین از لحاظ مکانی باید آخرین پارامتر باشد .اگر این پارامتر
(پارامتری که دارای عالمت * است) در آخر پارامترهای دیگر قرار نگیرد و یا از چندین پارامتر عالمت دار استفاده کنید با خطا مواجه
البته میتوان پارامتر ستاره دار را در ابتدای پارامترهای دیگر قرار داد ولی پارامترهای بعد از این پارامتر یا باید دارای مقدار پیشفرض باشند
)vararguments(1, 3, 5
و یا هنگام فراخوانی تابع ،باید پارامترهای بعد از این پارامتر را با استفاده از اسمشان مقداردهی کرد .به کد زیر توجه کنید:
حال فرض کنید که میخواهید چند listیا tupleبه پارامتر ستاره دار ارسال کنید .به کد زیر توجه نمایید:
def vararguments(number, *args):
))print("number = {0}".format(number
print("args ))= {0}".format(args
number = 1
args )= (2, 3, 4, 5, 6, 7, 8
همانطور که در کد باال مشاهده میکنید ،کافیست که آرگومانها به صورت listیا tupleارسال شوند و قبل از آنها عالمت * را قرار دهیم .
** kwargsهم شبیه * argsعمل میکند با این تفاوت که هنگام فراخوانی تابع باید آرگومانها را به صورت کلید /مقدار به آن ارسال کرد
def vararguments(**kwargs):
)print(kwargs
محدوده متغیر
متغیرها در پایتون دارای محدوده ) (scopeهستند .محدوده یک متغیر به شما میگوید که در کجای برنامه میتوان از متغیر استفاده کرد
و یا متغیر قابل دسترسی است .به عنوان مثال متغیری که در داخل یک تابع تعریف میشود فقط در داخل بدنه تابع قابل دسترسی است .
میتوان دو متغیر با نام یکسان در دو تابع مختلف تعریف کرد .برنامه زیر این ادعا را اثبات میکند:
def firstfunction():
number = 5
))print("number inside method firstMethod() = {0}".format(number
def secondfunction():
number = 10
))print("number inside method secondMethod() = {0}".format(number
)(firstFunction
)(secondFunction
مشاهده میکنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که دارای محدودههای متفاوتی هستند ،میتوان به هر کدام از آنها
مقادیر مختلفی اختصاص داد .متغیر تعریف شده در داخل تابع )( firstfunctionهیچ ارتباطی به متغیر داخل تابع
63 فصل اول :مبانی زبان پایتون
)( secondfunctionندارد .همانطور که ذکر شد ،متغیری که در داخل بدنه یک تابع تعریف شود در خارج از تابع قابل دسترسی نیست .
def myfunction():
number = 10
)print(number
در تابع باال یک متغیر به نام numberتعریف شده است .اگر بخواهیم در خارج از تابع یعنی خط آخر مقدار این متغیر را چاپ کنیم با پیغام
خطا مواجه میشویم .چون این متغیر فقط در داخل تابع قابل دسترسی است .به این متغیرها محلی یا Localگفته میشود .یک نوع
دیگر از متغیرها ،عمومی یا globalهستند .این متغیرها در خارج از تابع تعریف میشوند و در داخل بدنه تابع قابل دسترسی هستند .به
number = 10
def myfunction():
)print(number
)(myFunction
10
در کد باال یک متغیر به نام numberبا مقدار 10در خارج از تابع تعریف شده است .از تابع )( myfunctionخواستهایم که مقدار این متغیر
را در هنگام فراخوانی چاپ کند .این اتفاق می افتد ،چون متغیرهای خارج از تابع در داخل تابع قابل دسترسی هستند .حال اگر بخواهیم
از یک متغیر محلی به صورت عمومی و خارج از تابع استفاده کنیم باید چکار کنیم؟ راهکار ،استفاده از کلمه کلیدی globalاست .به مثال
15
10
در کد باال یک متغیر تعریف کردهایم و قبل از آن کلمه کلیدی globalرا نوشته ایم .این کلمه به برنامه میفهماند که قرار است از فالن متغیر
در خارج از تابع استفاده شود .همانطور که مشاهده میکنید با وجود کلمه globalمیتوان به متغیر numberدر خارج از تابع دسترسی
داشت .ما در اینجا فقط مقدار numberرا خارج از تابع تغییر دادهایم .ولی شما ممکن است که بخواهید از آن ،استفادههای دیگری بکنید.
در خط 7با چاپ مقدار متغیر numberعدد 15حاصل میشود ،چون در خط قبل آن را تغییر دادهایم .ولی مقدار همین متغیر در داخل
تابع همان عدد 10است .نکته آخر این است که در خطی که کلمه globalبه کار رفته است نمیتوان عمل انتساب را انجام داد .یعنی خط
پارامترهای پیشفرض
پارامترهای پیشفرض همانگونه که از اسمشان پیداست دارای مقادیر پیشفرضی هستند و میتوان به آنها آرگومان ارسال کرد یا نه .اگر به
اینگونه پارامترها ،آرگومانی ارسال نشود از مقادیر پیشفرض استفاده میکنند .به مثال زیر توجه کنید:
تابع )(( printmessageخطوط )1-2یک پارامتر اختیاری دارد .برای تعریف یک پارامتر اختیاری میتوان به آسانی و با استفاده از عالمت
= یک مقدار را به یک پارامتر اختصاص داد (مثال باال خط . )1دو بار تابع را فراخوانی میکنیم .در اولین فراخوانی (خط )4ما آرگومانی به
تابع ارسال نمیکنیم بنابراین تابع از مقدار پیشفرض )! (Welcome to Python Tutorialsاستفاده میکند .در دومین فراخوانی (خط
)5یک پیغام (آرگومان) به تابع ارسال میکنیم که جایگزین مقدار پیشفرض پارامتر میشود .اگر از چندین پارامتر در تابع استفاده میکنید
همه پارامترهای اختیاری باید در آخر بقیه پارامترها ذکر شوند .به مثالهای زیر توجه کنید:
وقتی توابع با چندین پارامتر اختیاری فراخوانی میشوند باید به پارامترهایی که از لحاظ مکانی در آخر بقیه پارامترها نیستند مقدار
اختصاص داد .به یاد داشته باشید که نمیتوان برای نادیده گرفتن یک پارامتر به صورت زیر عمل کرد:
بازگشت )(Recursion
بازگشت فرایندی است که در آن تابع مدام خود را فراخوانی میکند تا زمانی که به یک مقدار مورد نظر برسد .بازگشت یک مبحث پیچیده
در برنامهنویسی است و تسلط به آن کار راحتی نیست .به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف شود وگرنه برای
65 فصل اول :مبانی زبان پایتون
بی نهایت بار ،تابع ،خود را فراخوانی میکند .در این درس یک مثال ساده از بازگشت را برای شما توضیح میدهیم .فاکتوریل یک عدد
صحیح مثبت )! (nشامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن میباشد .به فاکتوریل عدد 5توجه کنید.
5! = 5 * 4 * 3 * 2 * 1 = 120
بنابراین برای ساخت یک تابع بازگشتی باید به فکر توقف آن هم باشیم .بر اساس توضیح بازگشت ،فاکتوریل فقط برای اعداد مثبت صحیح
است .کوچکترین عدد صحیح مثبت 1است .در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده میکنیم.
120
تابع مقدار بزرگی را بر میگرداند چون محاسبه فاکتوریل میتواند خیلی بزرگ باشد .تابع یک آرگومان که یک عدد است و میتواند در
محاسبه مورد استفاده قرار گیرد را میپذیرد .در داخل تابع یک دستور ifمینویسیم و در خط 2می گوییم که اگر آرگومان ارسال شده برابر
1باشد سپس مقدار 1را برگردان در غیر اینصورت به خط بعد برو .این شرط باعث توقف تکرارها نیز میشود.
در خط 4مقدار جاری متغیر numberدر عددی یک واحد کمتر از خودش ) (number – 1ضرب میشود .در این خط تابع Factorial
خود را فراخوانی میکند و آرگومان آن در این خط همان number – 1است .مثالا اگر مقدار جاری number 10باشد یعنی اگر ما بخواهیم
فاکتوریل عدد 10را به دست بیاوریم آرگومان تابع Factorialدر اولین ضرب 9خواهد بود .فرایند ضرب تا زمانی ادامه مییابد که آرگومان
ارسال شده با عدد 1برابر نشود .شکل زیر فاکتوریل عدد 5را نشان میدهد.
num = 5
factorial = 1
while num > 1:
factorial = factorial * num
num = num – 1
)print(factorial
این کد از کد معادل بازگشتی آن آسانتر است .از بازگشت در زمینههای خاصی در علوم کامپیوتر استفاده میشود .استفاده از بازگشت
حافظه زیادی اشغال میکند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.
توابع داخلی
به تابعی که در داخل تابع دیگر تعریف شده باشد ،تابع داخلی گفته میشود:
def outer():
def inner():
#Some code
در کد باال تابع )( innerیک تابع داخلی است .برای اینکه یک تابع داخلی را به وسیله تابع خارجی آن برگشت دهیم باید بعد از کلمه
def outer():
def inner():
#Some code
return inner
15
قبل از توضیح کد باال به این نکته توجه کنید که توابع داخلی به متغیرهای تابع خارجی دسترسی دارد .در کد باال یک تابع داخلی به نام
)( addfiveتعریف شده است که وظیفه آن اضافه کردن عدد 5به مقداری است که با تابع خارجی ارسال میشود .در خط 6وقتی تابع
)( make_adderرا فراخوانی میکنیم و مقدار آن را در داخل یک متغیر به نام resultمیریزیم ،این متغیر در اصل مقدار برگشتی از تابع
)( make_adderیعنی تابع )( addfiveاست .در نتیجه برای چاپ نهایی این مقدار برگشتی باید در جلوی نام resultدر خط 7عالمت
پرانتز بگذاریم تا به نوعی تابع )( addfiveفراخوانی شود .پس وقتی مقدار 10را به تابع )( make_adderارسال میکنیم ،این عدد در
داخل تابع )( addfiveبا 5جمع شده و مقدار 15برگشت داده میشود .توابع داخلی در مبحث Decoratorها کاربرد دارند ،که در
Decorator
در درسهای قبلی در مورد ارسال مقدار به تابع ،ارسال تابع به تابع و همچنین نحوه ایجاد توابع داخلی توضیح دادیم .حال میخواهیم
این سه مبحث را در این درس و در قالب مبحث جدیدی به نام Decoratorبه کار ببریم .فرض کنید میخواهیم یک تابع را ایجاد کنیم
که هر عددی که به آن دادیم را به توان 2برساند و نتیجه را برگشت دهد .روش تعریف همچین تابعی به صورت زیر است:
def powevenvalue(number):
return number * number
اما اگر بخواهیم فقط اعداد زوج را به توان دو برساند به دو روش میتوانیم این کار را انجام دهیم .یا باید بدنه تابع را دستکاری کنیم:
def powevenvalue(number):
if ((number % 2) == 0):
return number * number
else:
number
و اگر نخواهید بدنه تابع را دستکاری کنید میتوانید از روش دوم استفاده کنید و آن استفاده از یک تابع داخلی است .بدین صورت که شما
هر تغییری را که میخواهید در تابع اصلی اعمال کنید به یک تابع داخلی میدهید .کد باال را به صورت زیر اصالح میکنیم:
100
در کد باال با تابع اصلی کاری نداریم (خطوط .)11-12یک تابع تعریف میکنیم ،که یک تابع دریافت میکند (خطوط .)1-9در داخل این تابع
یک تابع دیگر تعریف میکنیم (خطوط ،)3-7که همان تابع داخلی بوده و همان تغییراتی را که قرار است در تابع اصلی بدهیم ،از این تابع
میخواهیم .این تابع یک پارامتر قبول میکند که همان عددی است که قرار است به توان برسد .در داخل بدنه این تابع در خط 4چک می
کنیم که اگر باقیمانده تقسیم عدد گرفته شده بر 2برابر با 0بود ،عدد را به تابع اصلی بدهد تا آن را به توان 2برساند در غیر اینصورت خود
عدد را نشان دهد (خط .)7در خط 9هم همین تابع داخلی را به وسیله تابع خارجی برگشت میدهیم.
در خط ،15تابع خارجی را صدا میزنیم .این تابع ،یک تابع را به عنوان پارامتر دریافت میکند ،و ما هم تابع اصلی ))((powevenvalue
را به آن ارسال میکنیم و نتیجه را در یک متغیر با نام resultمیریزیم .از آنجاییکه خروجی تابع خارجی یعنی تابع )(،getfunction
تابع داخلی )( checkvalueاست ،در نتیجه ،متغیر resultهمان تابع )( checkvalueاست و کافیست در خط 17یک پرانتزها را در
جلوی این متغیر قرار داده و یک عدد به آن بدهیم تا چک کند که آیا زوج است یا فرد؟
اگر بخواهید همان تابع اصلی خود را صدا زده و خروجی مورد نظر را دریافت کنید ،کافیست که از مفهوم Decoratorاستفاده کنید.
خطوط 13-17کد باال را حذف کرده و خط 11کد زیر را قبل از تابع اصلی بنویسید .خط 11همان کار خطوط 15و 17کد باال را انجام میدهد
و مفهوم Decoratorهم همین است .در این خط عالمت @ و سپس نام تابع خارجی را نوشتهایم:
100
همانطور که در کد باال مشاهده میکنید میتوان تابع اصلی را صدا کرد و یک عدد به آن داد ،تا مجذورش را محاسبه کند.
عبارات المبدا در اصل توابع یک خطی هستند که در برخی از زبانها به عنوان توابع بی نام شناخته میشوند .گاهی اوقات اتفاق می افتد
که در برنامه نمیخواهید یک تابع را جهت انجام یک کار تعریف کنید .در این صورت میتوان از عبارات المبدا استفاده کرد .نحوه استفاده
!Hello World
)( showmessage
!Hello World
هنگام فراخوانی تابع باید تعداد آرگومانها با تعداد پارامترها برابر باشد .مثالا برنامه زیر با خطا مواجه میشود:
اگر یک عبارت المبدا دارای دو یا تعداد بیشتری پارامتر باشد باید آنها را در داخل پرانتز قرار دهید:
!Hello World
Some more message
عبارات المبدا نمیتوانند دارای کلمه returnباشند .میتوان گفت که دستورات المبدا در حالت عادی برگردانده میشوند و نیازی به این
کلمه نیست:
25
در درسهای قبل در مورد چگونگی تعریف تابع و ارسال آرگومان به آن و … بحث کردیم .پایتون عالوه بر توابعی که توسط کاربر تعریف می
شوند دارای توابع دیگری نیز هست که به آنها توابع از پیش تعریف شده می گویند .طراحان زبان برنامهنویسی پایتون برای س ادگی کار
برنامه نویسان ،این توابع را نوشته و به همراه پایتون ارائه میدهند .تعداد این توابع به همراه نسخههای جدید پایتون افزایش مییابد .
این توابع دارای کابردهای مختلفی از جمله برگرداندن قدر مطلق یک عدد ،تبدیل انواع داده به هم ،ایجاد لیست و … به کار میروند .در
نسخه 3.6پایتون که آخرین نسخه این زبان تا کنون است 68 ،تابع از پیش تعریف شده وجود دارد که در جدول زیر به برخی از آنها اشاره
شده است:
کاربرد تابع
قدر مطلق یک عدد را بر میگرداند. )(abs
یک مقدار را قالب بندی میکند .این تابع بیشتر به همراه تابع )( printجهت قالب بندی خروجی به کار میرود. )(format
یک محدود از اعداد صحیح ایجاد میکند .مثالا اعداد بین 1تا .10 )(range
نوع یک مقدار را بر میگرداند .مثالا اگر عدد 10.2را به این تابع بدهیم ،عبارت floatرا بر میگرداند که نشان
)(type
دهنده نوع عدد است.
در مثال زیر هم در عمل نحوه کار با این توابع نشان داده شده است:
))print(abs(-3
))print(bin(5
))print(chr(97
))print(float(10
))print(pow(2, 2
3
0b101
a
10.0
4
71 فصل اول :مبانی زبان پایتون
همانطور که احتماال ا از خروجی کدهای باال متوجه شدهاید ،مثالا تابع )( powدو آرگومان میگیرد که اولی عدد و دومی توان میباشد .در
مثالا باال عدد 2را به توان دو رساندهایم ،که در خروجی عدد 4نشان دهده شده است .یا مث ا
ال تابع )( absقدر مطلق -3را که عدد 3می
باشد را برگشت داده است .تابع از پیش تعریف شده )( rangeیک محدوده از اعداد را ایجاد میکند .به کد زیر توجه کنید:
در کد باال مقادیر یک مجموعه از اعداد را چاپ کردهایم .برای ایجاد همین محدوده از اعداد با استفاده از تابع )( rangeمیتوان به صورت
خروجی دو کد باال ،شبیه هم میباشد .ممکن است که این سؤال برایتان پیش بیاید که چرا در کد باال 6را در داخل تابع نوشتهایم .آرگومان
دوم تابع )( rangeجز خروجی نست .یعنی اعداد 1تا 5چاپ میشوند .اگر به جای 6عدد 10را بنویسید .اعداد 1تا 9چاپ میشوند .از
))print(type(intVar
))print(type(floatVar
))print(type(boolVar
))print(type(StringVar
))print(type(listVar
))print(type(tupleVar
))print(type(dictionaryVar
<class >''int
<class >''float
<class >''bool
<class >''str
<class >''list
<class >''tuple
<class >''dict
لیست کامل توابع از پیش تعریف شده پایتون در لینک زیر آمده است:
https://docs.python.org/2/library/functions.html
توکار همراه با پایتون نصب شده و هنگام برنامه نویسی و در حالتهای خاصی فراخوانی میشوند .با استفاده از توابعی خاص ،کالسی که
به وسیله شما تعریف میشود ،میتواند همانند مجموعهها ،دیکشنریها ،توابع ،پیمایشگرها و حتی همانند اعداد عمل کند .مشخصه اصلی
این توابع این است که قبل و بعد از نام آنها ،دو عالمت زیر خط (__) یا همان underscoreقرار میگیرد .قبل از آموزش یک مثال ساده
میزنیم:
x = 5
))print(dir(x
در مثال باال یک متغیر از نوع کالس intتعریف کرده و سپس با استفاده از تابع )( ،dirلیست توابع و خاصیتهای آن را به دست
آوردهایم .اکثر اسامی باال ،نام توابعی کالس intبوده و اکثر آنها به عملگرهای پایتون مرتبط هستند .یکی از آنها متد )(__ __addمی
x = 5
)print(x + 10
15
اما چیزی که در پشت صحنه و به صورت خودکار توسط پایتون اتفاق می افتد فراخوانی متد خاص )(__ __addبرای جمع این دو مقدار
است:
x = 5
))print(x.__add__(10
15
x = 5
))print(int.__add__(x, 10
15
73 فصل اول :مبانی زبان پایتون
نظر را انجام میدهد .در عبارت ) ،x.__add__(10پایتون میفهمد که xاز نوع intاست .در نتیجه با فراخوانی متد )(__ __addاز
کالس intو ارسال xو عدد 10به آن عمل جمع را انجام میدهد .یعنی در واقع دو عبارت x + 10و ) x.__add__(10توسط مفسر
پایتون به ) int.__add__(x, 10ترجمه میشوند .در پایتون توابعی خاص دیگری وجود دارند که در درسهای بعدی با برخی از آنها
نسخه کامل این کتاب را از سایت کتابراه به نشانی زیر دانلود کنید:
روی لینک کلیک کنید و یا با رعایت حروف بزرگ و کوچک در مرورگر تایپ و کلید Enterرا بزنید
https://bit.ly/2nxcgxZ
Younes.ebrahimi.1391@gmail.com
از سایر کتاب های یونس ابراهیمی در لینک زیر دیدن فرمایید:
https://bit.ly/2kKGxYJ