دستورهای شرطی و کنترلی - فصل ۲

03 اسفند 1395
python-main-flow-control

در این دوره آموزشی قصد داریم زبان برنامه نویسی پایتون را از ۰ تا ۱۰۰ به شما عزیزان به صورت کاملا رایگان و به زبان شیرین فارسی آموزش دهیم. در فصل گذشته با مفاهیم مقدماتی این زبان آشنا شدید و متوجه شدید که آیا این زبان همان چیزی است که به دنبالش هستید یا خیر! حال در ادامه به توضیح مفصل و دقیق مباحث دیگر این زبان می‌پردازیم. مبحثی که در این فصل به آن اشاره خواهیم کرد، دستور شرطی کنترلی هستند که بسیار ارزشمند و پر کاربرد است. با ما همراه باشید.

مقدمه

همانگونه که در جریان هستید برنامه و نرم افزار چیزی جز اعمال یک سری فرمان و دستورالعمل‌ها نیست. اما یک برنامه همواره به صورت خط به خط و پشت سر هم و بدون در نظر گرفتن قید و شروط اجرا نمی‌شود. بلکه بر اساس محاسبات عبارتهای ریاضی و یک سری شروط همواره به عمل می‌انجامد که با اعمال این شروط امکان دارد برخی از خطوط به صورت کلی از مدار برنامه خارج شده و هرگز اجرا نشوند. به‌عبارت‌ دیگر، ممکن است شما نخواهید یک برنامه از خط ۱ شروع به خطایابی شود. دستورشرطی کنترلی (Flow Control Statements) این امکان را برای شما فراهم می‌کنند تا دستورالعمل‌ها و فرمان‌های زبان برنامه‌نویسی پایتون متناسب با یک سری شرایط اجرا شوند.

دستورالعمل‌های شرطی معمولا به صورت فلوچارت نمایش داده می‌شوند تا درک و مفهوم آنها متناسب با الگوریتم اجرایی با دقت بالاتری ارائه شود. به تصویر زیر توجه کنید:

فلوچارت Yes و No

الگوریتم یک پیاده روی برای شما عزیزان به صورت فلوچارت به نمایش گذاشته شده است. هر فلوچارت با یک Start آغاز و با یک End به اتمام می‌رسد. شروط نیز داخل بیضی قرار داده می‌شود که اگر شرط برقرار باشد دستور بعدی و اگر برقرار نباشد دستوری متفاوت اجرا خواهد شد. بنابراین قبل از اینکه روی این فلوچارت دقیق تر شوید به شما توصیه می‌کنیم با مفاهیم yes و no آشنایی بیشتری پیدا کنید.

مقادیر بولین منطقی (Boolean)

علاوه بر نوع داده‌ای عدد صحیح، اعشاری و رشته‌ای، نوع داده‌ای بولین منطقی (Boolean) وجود دارد که تنها دو مقدار True و False را می‌پذیرد. درنظر داریم که در زبان برنامه‌نویسی پایتون همواره مقادیر باینری با حروف بزرگ T و F شروع می‌شوند. برای روشن شدن این موضوع عبارات زیر را در Python Interactive نرم افزار خود وارد کنید:

>>> spam = True
>>> spam
True
>>> true
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
     true
NameError: name 'true' is not defined
>>> True = 2 + 2
SyntaxError: assignment to keyword

همانگونه که ملاحظه می‌کنید، مقادیر باینری درون یک رشته ذخیره می‌شود. اگر شما بخواهید آن را به عنوان یک مقدار به شل ارسال کنید با خطا مواجه خواهید شد. همچنین اگر سعی کنید که نام متغییر خود را Ture یا False قرار دهید مشابه دستور 2+2=True خطا دریافت می‌کنید.

عملگرهای مقایسه‌ای

عملگرهای مقایسه‌ای دو مقدار را مقایسه کرده و محسابات را به خط بعدی انتقال می‌دهند. انواع عملگرهای مقایسه‌ای با خروجی بولین به صورت زیر هستند:

مفهوم                           عملگر
============================================
==                       مساوی بدون دو مقدار
!=                       عدم تساوی دو مقدار
<                        کوچکتر از
>                        بزرگتر از
<=                       کوچکتر مساوی
>=                       بزرگتر مساوی

این عملگر‌ها مقادیر Ture و False را باز می‌گردانند. به مثال‌های زیر توجه کنید:

>>> 42 == 42
True
>>> 42 == 99
False
>>> 2 != 3
True
>>> 2 != 2
False
>>> 'hello' == 'hello'
True
>>> 'hello' == 'Hello'
False
>>> 'dog' != 'cat'
True
>>> True == True
True
>>> True != False
True
>>> 42 == 42.0
True
>>> 42 == '42'
False #جون هیج عددی معال یک رشته نیست
>>> 42 < 100
True
>>> 42 > 100
False
>>> 42 < 42
False
>>> eggCount = 42
>>> eggCount <= 42
True
>>> myAge = 29
>>> myAge >= 10
True

یک سوال: تفاوت بین عملگرهای == و = چیست؟
پاسخ: عملگر == دو متغییر را از نظر مقدار بررسی می‌کند که آیا مقادیر آنها دقیقا یکسان است یا نه! درحالیکه عملگر = به عنوان یک انتساب بین مقدار و متغییر مورد استفاده قرار می‌گیرد.

عملگرهای بولین (Boolean)

سه عملگر بولین وجود دارد که به صورت and، or و not مورد استفاده قرار می‌گیرند.

عملگرهای بولین باینری

عملگرهای and و or همیشه برای دو مقدار بولین (یا عبارات) مورد استفاده قرار می‌گیرند.بدین صورت عمل می‌کنند که اگر دو مقدار True‌باشند پاسخ Ture را ارسال می‌کنند و درغیر این صورت مقدار False را در خروجی نمایش می‌دهند.

>>> True and True
True
>>> True and False
False

جدول این عملگر به صورت زیر می‌باشد:

مقدار محاسبه شده                 عبارت
======================================
True and True              True
True and False             False
False and True             False
False and False            False

از طرفی اگر عملگر or به‌کار گرفته شود آنگاه اگر هر دو مقدار یا تنها یکی از آنها True باشد جواب True را نمایش و در غیراین صورت جواب False را در خروجی چاپ می‌کند.

>>> False or True
True
>>> False or False
False

جدول این عملگر به صورت زیر می‌باشد:

مقدار محاسبه شده                 عبارت
======================================
True and True              True
True and False             True
False and True             True
False and False            False

و اما عملگر not اگر مورد استفاده قرار بگیرد در برابر مقدار True جواب False و در برابر مقدار False جواب True را در خروجی چاپ می‌کند. به جدول زیر توجه کنید:

مقدار محاسبه شده                 عبارت
======================================
not True                   False
not False                  True

همچنین در جریان هستید که می‌توان عملگرهای مقایسه‌ای و بولین با همدیگر ترکیب کرد و عبارتهای دیگری را ایجاد نمود. به مثال زیر توجه کنید:

>>> (4 < 5) and (5 < 6)
True
>>> (4 < 5) and (9 < 6)
False
>>> (1 == 2) or (2 == 2)
True

که اگر بخواهیم خط اول این مثال را تشریح کنیم بدین صورت عمل خواهیم کرد:

(4 < 5) and (5 < 6)
         |
   True and (5 < 6)
         |
   True and True
         |
        True

جملات و دستور شرطی کنترلی

حال اجازه بدهید به قسمت مهم دستور شرطی کنترلی در زبان برنامه نویسی پایتون بپردازیم.

دستور شرطی if

یکی از پرکاربردترین دستور شرطی کنترلی، دستور if است. این دستور بدین صورت عمل می‌کند که اگر شرط آن برقرار باشد مقدار True را انتخاب کرده و دستورهایی که درون این شرط وجود دارند را اجرا می‌کند. هر دستور شرطی if شامل اجزایی است که در ذیل به آنها اشاره خواهیم کرد:

  • کلمه‌کلیدی if
  • یک شرط
  • یک علامت کولن (:)
  • مجموعه‌ای از کدها که درون این دستور قرار می‌گیرند و اصطلاحا به آنها if clause‌ گفته می‌شود

به مثال زیر توجه کنید:

if name  == 'Alice':
    print('Hi, Alice.')

برای روشن‌تر شدن این مثال و دستورهای شرطی به شما پیشنهاد می‌کنیم قبل از کدنویسی آنها را به صورت فلوچارت طراحی کنید. هم اکنون برای مثال فوق فلوچارت زیر را خواهیم داشت:

فلوچارت if

بنابراین برنامه ابتدا وارد بررسی شرط می‌شود که آیا شرط برقرار است یا خیر؟ در صورتیه شرط برقرار بود عبارت Hi, Alice. را چاپ می‌کند و درغیر این صورت برنامه را خاتمه می‌دهد.

دستور شرطی else

دستور شرطی if را گاهی می‌توان با گزینه‌های دیگر ارتقا داد و آن را هوشمندتر کرد. برای این کار از جمله‌ی else استفاده خواهیم کرد. بدین‌صورت که اگر شرط برقرار نبود عبارتهای داخل دستور else اجرا خواهند شد. هر دستوری که شامل else باشد از اجزای زیر تشکیل شده است:

  • کلمه‌کلیدی else
  • یک علامت کولن (:)
  • مجموعه‌ای از کدها که درون این دستور قرار می‌گیرند و اصطلاحا به آنها else clause‌ گفته می‌شود

به مثال قبلی باز می‌گردیم و آن را با استفاده از دستور else ارتقاء می‌دهیم:

if name == 'Alice':
    print('Hi, Alice.')
else: 
    print('Hello, stranger')

فلوچارت else

دستور شرطی elif

گاهی می‌خواهیم چندین دستور شرطی if را با یکدیگر ادغام کنید تا با اعمال شروط مختلف یک برنامه اجرا شود و در غیراینصورت اگر شرط دیگری برقرار بود به کدهای درون آن عمل کند. این حالت پیچیده‌ترین نوع دستور if است. هر دستور شرطی elif از چند قسمت تشکیل شده است:

  • کلمه‌کلیدی elif
  • یک شرط
  • یک علامت کولن (:)
  • مجموعه‌ای از کدها که درون این دستور قرار می‌گیرند و اصطلاحا به آنها elif clause‌ گفته می‌شود

حال مثال قبلی را ارتقاء می‌دهیم و پیشرفته‌ترین حالت دستور شرطی if را برای شما عزیزان تشریح می‌کنیم:

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')

همینطور که ملاحظه کردید دو شرط مختلف برای برنامه‌ی خود ایجاد کردیم تا با برقرار بودن هر یک از شروط کدهای مربوط به آن اجرا شود. بنابراین فلوچارت این مثال به صورت زیر خواهد بود:

فلوچارت elif پایتون

همچنین می‌توان مجموعه کد فوق را بسط داد و مثال زیر را ایجاد کرد:

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')

بنابراین فلوچارت مجموعه‌ی کد فوق به صورت زیر خواهد بود. این کد بدین صورت عمل می‌کند که اگر هر یک از شروط برقرار نباشد، دستورهای داخل بلاک :else برقرار خواهد شد:

فلوچارت if و elif و else

دستور حلقه‌ی while

گاهی نیاز است مجموعه‌ای از کدها را برای تعداد اجرا کرد. یعنی درواقع کدها را داخل یک حلقه قرار داده و آنها را مدام تکرار کنید. برای انجام اینکار می‌توان از دستور حلقه‌ی while استفاده کرد. این حلقه بدین صورت عمل می‌کند که اگر شرط آن برقرار باشد حلقه شروع به کار کرده تا زمانیکه از شرط خارج شود. هر دستور حلقه‌ی while از چندین قسمت تشکیل شده است:

  • کلمه‌کلیدی while
  • یک شرط
  • یک علامت کولن (:)
  • مجموعه‌ای از کدها که درون این دستور قرار می‌گیرند و اصطلاحا به آنها while clause‌ گفته می‌شود

اگر مثال زیر را بررسی کنید متوجه خواهید شد که حلقه‌ی while بسیار شبیه به دستور شرطی if است با این تفاوت که دستور شرطی if پس از اجرا شدن به اتمام رسیده و خط بعدی آن اجرا خواهد شد. درحالیکه دستور حلقه‌ی while اجرا خواهد شد و پس از به اتمام رسیدن، به ابتدای حلقه پرش کرده و مجددا کدها را اجرا می‌کند تا از شرط خارج شود:

#if Statements

spam = 0
if spam < 5:
    print('Hello, world.')
    spam = spam + 1

#while Statements

spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

همانطور که در مثال فوق ملاحظه می‌کنید ابتدا مقدار spam برابر ۰ در نظر گرفته شده است. سپس حلقه‌ی while بررسی می‌شود و اگر شرط spam کوچکتر از ۵ برقرار بود مجموعه‌ی کدهای درون آن اجرا خواهد شد. سپس در انتها یک مقدار به spam‌ اضافه می‌شود. این حلقه تا ۵ مرتبه تکرار می‌شود. به فلوچارت این مثال دقت کنید:

فلوچارت دستور شرطی if

فلوچارت دستور شرطی حلقه while

دستور break

یک راه میانبر همیشه در برنامه‌نویسی وجود دارد که با استفاده از آن می‌توان در هر لحظه‌ای که اراده کرد از شروط خارج شد. این دستور break نام دارد و معمولا برای خروج از حلقه‌ها از آن استفاده می‌شود. ساختار این دستور تنها شامل یک کلمه‌ی break است. برای روشن‌تر شدن این موضوع مثال زیر را بررسی می‌کنیم:

while True:
print('Please type your name.')
    name = input()
if name == 'your name':
    break
print('Thank you!')

این مثال بدین صورت عمل می‌کند که اگر چنانچه نام وارد شده توسط کاربر برابر مقدار your name نبود دستور break اجرا شده و ادامه‌ی برنامه در خارج از حلقه اتفاق بی افتد و عبارت Thank You چاپ شود. بنابراین فلوچارت برنامه فوق به صورت تصویر زیر است:

فلوچارت break

دستور continue

همانند عبارت break، جمله‌ای تحت عنوان continue وجود دارد که درون حلقه‌ اتفاق می‌افتد. هنگامیکه این دستور اجرا شود فورا برنامه به خط اول حلقه انتقال پیدا می‌کند.

توجه: جهت تولید حلقه‌های نامحدود باید شرط حلقه را روی Ture تنظیم کنید.

دستور حلقه‌ی for و تابع ()range

حلقه‌ی while‌ تنها زمانیکه شرط آن برقرار باشد اجرا خواهد شد اما اگر شما بخواهید یک مجموعه‌ی کد را به تعداد مشخص اجرا کنید باید چه کاری انجام دهید؟ انجام این کار با استفاده از حلقه‌ی for و تابع ()range امکان‌پذیر است. هر حلقه‌ی for از اجزای مشخص تشکیل‌شده است که در ذیل به آنها اشاره خواهیم کرد:

  • کلمه‌کلیدی for
  • یک نام متغییر
  • کلمه‌کلیدی in
  • متد ()range به همراه سه مقدار که به عنوان آرگومان‌های آن تعیین می‌شود
  • یک علامت کولن (:)
  • مجموعه‌ای از کدها که درون این دستور قرار می‌گیرند و اصطلاحا به آنها for clause‌ گفته می‌شود

برای تفهیم بیشتر دستور حلقه‌ی for مثال زیر را بررسی می‌کنیم:

print('My name is')
for i in range(5):
    print('Jimmy Five Times (' + str(i) + ')')

همانطور که ملاحظه می‌کنید اولین مقدار برای i برابر ۰ است و سپس دستورات داخل حلقه‌ی for اجرا شده و عبارت  Jimmy Five Times 0 در خروجی چاپ می‌شود. سپس برنامه به ابتدای حلقه باز می‌گردد و مقدار i را برابر ۱ قرار می‌دهد.  این عمل تا زمانیکه مقدار i‌ برابر ۴ می‌شود ادامه پیدا می‌کند. تابع ()range مقادیر i‌ را با گام ۱ تقسیم می‌کند. بنابراین فلوچارت برنامه فوق به صورت زیر  خواهد بود:

فلوجارت forفلوچارت Yes و No

در نهایت خروجی این مثال به صورت زیر خواهد بود:

My name is
Jimmy Five Times (0)
Jimmy Five Times (1)
Jimmy Five Times (2)
Jimmy Five Times (3)
Jimmy Five Times (4)

شروع، توقف و گام‌های تابع ()range

همانطور که در جریان هستید تابع ()range معمولا در حلقه‌ی for مورد استفاده قرار می‌گیرد. این تابع دارای ۳ آرگومان است که به ترتیب اولین آرگومان برای شروع، دومین برای توقف و سومین آرگومان برای گام هر مرحله‌ مورد استفاده قرار می‌گیرد. در ضمن وارد کردن تمام آرگومان‌ها الزامی نیست به عنوان مثال:

for i in range(12, 16):
    print(i)

خروجی این مثال به صورت زیر خواهد بود:

12
13
14
15

در نظر دارید که هر دو مقدار اول و دوم همواره باید وجود داشته باشند و حضور سومین آرگومان الزامی نیست. چون اگر این آرگومان وجود نداشته باشد به صورت پیشفرض گام حرکتی ۱ ثبت می‌شود.

یک مثال کامل‌تر از این حالت ارا‌ئه خواهیم داد:

for i in range(0, 10, 2):
    print(i)

خروجی‌ای که برای شما به نمایش گذاشته خواهد شد برابر است با:

0
2
4
6
8

نمونه‌ی دیگری را در اختیار شما قرار می‌دهیم:

for i in range(5, -1, -1):
    print(i)

در این مثل همانطور که پیداست از عدد ۵ شروع کرده و با گام حرکتی ۱- به سمت عقب حرکت می‌کنیم تا به مقدار ۱- برسیم. بنابراین در خروجی داریم:

5
4
3
2
1
0

فراخوانی ماژول‌ها (import)

گاهی برای استفاده از توابع مختلف در زبان برنامه نویسی پایتون ابتدا باید کتابخانه‌های استاندارد آنها را بارگذاری کنیم. هر ماژول در برنامه‌های پایتون شامل یک سری مجموعه توابع هستند که شمارا در تولید برنامه‌ کمک می‌کنند. مثلا ماژول math امکانات ریاضیاتی و توابع ریاضی را در اختیار شما قرار می‌دهد. یکی از این توابع random نام دارد که اعداد تصادفی تولید می‌کند. قبل از استفاده از هر تابع ابتدا باید ماژول (کتابخانه) مربوط به آن را فراخوانی (import) کنید. نحوه‌ی فراخوانی یک ماژول به صورت زیر است:

  • کلمه‌کلیدی import
  • نام ماژول

به مثال زیر توجه کنید:

import random
for i in range(5):
    print(random.randint(1, 10))

همانطور که ملاحظه می‌کنید تابع random‌ به همراه متد randint فراخوانی شده است که حاصل خروجی به صورت مجموعه از اعداد تصادفی صحیح بین ۱ و ۱۰ است:

4
1
8
4
1

در صورت اضافه کردن چند ماژول به صورت همزمان می‌توان نام هر یک با کاما (,) از یکدیگر جدا کرد:

import random, sys, os, math

اتمام برنامه با استفاده از ()sys.exit

گاها برای شما پیش آمده که هر یک از برنامه‌های فوق را اجرا کرده اید و تحت هیچ شرایطی با وجود به اتمام رسیدن خطوط برنامه، نرم افزار شما متوقف نمی‌شود. در این حالت از دستور ()sys.exit استفاده مفلوچارت if و elif و elseی‌شود. این تابع در کتابخانه‌ی sys قرار دارد. به مثال زیر توجه کنید:

import sys
while True:
    print('Type exit to exit.')
    response = input()
    if response == 'exit':
        sys.exit()
    print('You typed ' + response + '.')

اگر دستور فوق را در IDE‌ خود اجرا کنید متوجه خواهید شد که این حلقه به صورت نامحدود و نامتناهی کار می‌کرد تا زمانیکه کاربر ورودی exit را وارد کند و سپس از طریق تابع ()sys.exit برنامه خارج شود.

به شما تبریک می‌گوییم! با مطالعه‌ی این فصل اطلاعات بسیار مفیدی از نحوه‌ی کار با دستورهای شرطی بدست آوردید. اینک با ترکیب فصل ۱ و فصل ۲ می‌توانید برنامه‌های پیچیده‌تری را بنویسید و از این کار لذت ببرید. فصل ۳ را به نحوه‌ی تعریف توابع و کاربرد آنها در برنامه‌نویسی اختصاص خواهیم داد. با ما همراه باشید.

نویسنده شوید

دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

eli
01 شهریور 1399
درود بر شما من بولین false و true رو در پایچارم به صورت پیش فرض ندارم یعنی وقتی مینویسم رنگ نارنجی نمیگیره و حتی پیش بینی نمیکنه کلمه false رو میشه راهنمایی کنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمد
24 آبان 1397
دمت گرم اولین اموزش فارسی خوبی بود که در مورد (پیتون)دیدم ،یک کلام عالی بود اگه میشه همین رو ادامه بدید و اموزش رو تا اخر بنویسید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمد حسین
28 تیر 1396
منتظر فصل 3 هستیم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.