پنج شنبه 29 مهر 1395 - 15:49
آموزش زبان برنامه نویسی پایتون#جلسه ششم
جریان کنترلی (بخش دوم: حلقه های تکرار) در پایتون
جلسه ششم
در زبان تفسیری پایتون دو نوع حلقه (حلقه های for و while) موجود است. با استفاده از این حلقه ها، کنترل برنامه پس از اجرای کامل قطعهکد داخل ساختار، دوباره به ابتدا برمیگردد و در صورت درست بودن شرط اجرا، دوباره کد داخل حلقه به اجرا در میآید. به همین دلیل به این قطعات کد «حلقه» گفته میشود.
جریان کنترلی (بخش دوم: حلقه های تکرار) در پایتون
جلسه ششم
در زبان تفسیری پایتون دو نوع حلقه (حلقه های for و while) موجود است. با استفاده از این حلقه ها، کنترل برنامه پس از اجرای کامل قطعهکد داخل ساختار، دوباره به ابتدا برمیگردد و در صورت درست بودن شرط اجرا، دوباره کد داخل حلقه به اجرا در میآید. به همین دلیل به این قطعات کد «حلقه» گفته میشود.
حلقۀfor
شاید بتوان حلقۀ for را مناسبترین انتخاب برای ایجاد یک حلقۀ شمارشی دانست که تکرار را بیان می کند. حلقۀ for در پایتون یک پیمایشگر آرایه یا توالی است که عناصر موجود در لیست یا آرایۀ را پیمایش کرده و متغیر پیمایشگر هر بار برابر با یکی از اعضای داخل لیست شده و دستورات داخل حلقه به ازای همان مقدار اجرا میشوند. حلقۀ for قادر است آرایههایی از نوع رشته، لیست، تاپل، دیکشنری و هم چنین دادههای ترتیبی را پیمایش کند.
یک حلقه for از عنصری دارای اندیس صفر تکرار برنامه را آغاز می کند و از چپ به راست در توالی پیش می رود. حلقۀ for در پایتون با یک شروعکننده آغاز میشود که کار اصلی آن تعریف یک یا چند متغیر به عنوان پیمایشگر و مشخص کردن آرایۀ مورد نظر برای پیمایش است. برای متغیر پیمایشگر هر نامی می توان گذاشت و برای پیمایش توالی ها یا آرایه ها در حالت عادی نیازی به داشتن طول آنها نمی باشد.
نحوه نوشتاری کلی حلقه for به صورت زیر است:
for var in iterable:
# loop body using var
else:
#invoked if no "break"
var نامی است که برای متغیر انتخاب شده است، این نام هر اسمی می تواند باشد و معمولا از i و j و k استفاده می شود. منظور از iterable توالی است که باید مورد پیمایش قرار گیرد.
در حلقه های for گاها از شرط های if، elif و else استفاده می شود. و گاهی نیز حلقه های تو در تو، مورد استفاده قرار می گیرند.
مثال هایی از کاربرد for برای دسترسی به عناصر موجود در انواع داده ای :
رشته: در مورد رشته، می توان براساس موقعیت کاراکترها یا اندیس کاراکترهای موجود در رشته، حلقه را اجرا کرد.
>>> for letter in "python" :
print letter
p
y
t
h
o
n
لیست:
>>> for veg in ['Celery', 'Mushroom', 'Okra’]:
print veg
Celery
Mushroom
Okra
لیست در پایتون
در مواردی که عناصر تشکیل دهندۀ لیست خود بهصورت آرایه هستند، میتوان از چندین متغیر به عنوان پیمایشگر استفاده کرد.
>>> A = [(1,2), (3,4), (5,6)]
(x, y) in A: print X,
>>> for (x, y) in A: print X,y, ,--> (,x,’,’y,’)’
1 2 → (1,2)
3 4 → (3, 4 )
5 6 → (5,6 )
در این حالت اگر از یک متغیر استفاده شود، متغیر هر بار برابر با یک آرایه درون لیست اصلی خواهد شد.
>>> A = [(1,2), (3,4), (5,6)]
>>> for i inA:
print i
(1, 2)
(3, 4)
(5, 6)
برای آنکه بتوان به طور همزمان به اندیس و مقادیر مربوطه در یک لیست دسترسی داشت، تابع enumerate() به کار می رود.
>>> for i, s in enumerate ([,kitchen', 'living room']):
print (i, s )
O kitchen
1 living room
2 dining room
برای آنکه بتوان عملیات درون حلقه را به طور همزمان بر روی بیش از یک توالی اجرا کرد، از تابع zip استفاده می شود. با به کار بردن این تابع، متغیرها به ترتیب به توالی های مربوطه نسبت داده می شوند و با استفاده از تابع format که در رشته ها به آن اشاره شده (یا روش های دیگر) می توان به عناصر دسترسی داشت.
>>> question = 'first name', 'last name', 'favorite color' )
>>> answer = [ " Peter " , "Mandela " , "yellow" )
>>> for q, a in Zip (question, answer) :
print "what is your {0}? it's {1} . ". format (g, a)
what is your first name? it's Peter.
what is your last name? it's Mandela.
what is your favorite color? it's yellow.
فایل: حلقه ها هم چنین برای خواندن و بررسی فایل ها مناسب می باشند. فرض کنید فایلی با نام "spam.txt" در مسیر "C:/python27" ذخیره شده است. تابع open() فایل را باز می کند و جریانی از کاراکترها (stream of character) را بر می گرداند. با استفاده از حلقه for هر خط از فایل قابل دستیابی است.
>>> f = open ( ‘C:\Python 27 \spam... txt ‘ )
>>> for line in f:
print line
this is the first line
this is the second line
this is the third line
دیکشنری: کاربرد دیگر حلقه در دسترسی به عناصر دیکشنری می باشد. می توان برای دسترسی به این عناصر از items() در پایتون 3.x یا iteritems () و item()در پایتون2.x استفاده کرد. این تابع لیستی از جفت ای key-value را بر می گرداند.
>>> d = { ‘key1’ : ‘ value1', 'key2’ : ‘ value2’}
>>> for k, V in d. items () :
print (k, W)
(‘key2', 'value2’)
(‘key1', 'value1’)
تابع range
بهمنظور شمارش محدودهای از اعداد بهوسیلۀ حلقۀ for از یک دستور با نام range استفاده میشود. این دستور با دریافت پارامترهای شروع، خاتمه و گام حرکت، یک لیست از اعداد صحیح موجود بین دو حد بالایی و پایینی با گام حرکت به مقدار تعیینشده را بر میگرداند.
اگر ورودی این تابع فقط یک عدد باشد تمام اعداد بین صفر تا آن عدد به عنوان نتیجه و بهصورت آرایه برگشت داده میشود. اگر دو عدد بهعنوان پارامتر ارسال شود آرایهای از اعداد بین دو عدد برگشت داده میشود. با ارسال گام حرکت، ترتیب و توالی اعداد بر اساس گام حرکت تنظیم خواهد شد.
>>> range ( 7 ) , range(2, 7), range(0, 7, 2)
([0, 1, 2, 3,4, 5, 6], [2, 3, 4, 5, 6], [0, 2, 4, 6])
[0, 2, 4, 6]
>>> for i in range (2) :
print i, (" Hello world")
O Hello World
1 Hello World
توجه داشته باشید که حد بالا جزئی از محدوده به حساب نمی آید.
گاهی لازم است حلقه های for به صورت تو در تو به کار روند. در مثال زیر حلقه for اول سه مرتبه تکرار می شود و به ازای هر بار تکرار آن، برنامه وارد حلقه for دوم می شود که این حلقه نیز به نوبه خود در هر بار اجرا 10 مرتبه اجرا می شود و هر بار یک جدول ضرب منفرد تولید می کند. خروجی برنامه جدول ضربی است که اعداد 4و 5 و 6 را در تمام اعداد محدوده 1 تا 11 (به جز خود 11 که انتهای بازه است) ضرب می کند.
>>> for mult in range (4, 7) : #Run 3 iteration, 4, 5, and 6
for i in range (1,11) :
print i, 'x' , mult, ‘=’ , i* mult
print
1*4=4
2*4=8
3*4=12
4*4=16
5*4=20
6*4=24
7*4=28
8*4=32
9*4=36
10*4=40
1*5=5
2*5=10
3*5=15
4*5=20
5*5=25
6*5=30
7*5=35
8*5=40
9*5=45
10*5=50
1*6=6
2*6=12
3*6=18
4*6=24
5*6=30
6*6=36
7*6=42
8*6=48
9*6=54
10*6=60
حلقه while
حلقه while نیز مانند for برای تکرار قطعهکدی خاص به کار می رود. اگر هنگام اولین اجرا شرط مورد بررسی نادرست باشد کدهای داخل قطعه تکرار، هیچ وقت اجرا نخواهد شد.
در عبارت فوق که ساختار کلی while را نشان می دهد، حلقه while تا زمانی که شرط test برابر false باشد، تکرار می شود. بخش اختیاری else ممکن است پس از while قرار گیرد، در صورت عدم وجود break در بدنه حلقه while، این بخش از کد در صورتی که حلقه بهطور کامل و با روند عادی اجرا شده و خاتمه یابد اجرا خواهد شد.
>>> X = 0
>>> y = 5
>>> while x < y : print X
x += 1
0
1
2
3
4
while : #must evaluate to true to continue
else: # optional
#run in absence of ‘boreak’
حلقه بی نهایت
حلقه while اگر با True یا 1 به کار رود، چون یک شرط همیشه برقرار است و هیچگاه عوض نمیشود، یک حلقه بی نهایت تولید می کند، به همین دلیل باید با استفاده از if یا break و ... حلقه های while را بهتر مدیریت کرد. برای مثال دستور روبرو منجر می شود عملیات print تا بی نهایت تکرار شود. برای متوقف کردن برنامه در این مواقع باید از کلیدهای Ctrl + C استفاده کرد.
>>> while True:
print (‘python’)
Python
Python
Python
Python
Python
Python
Python
Python
Traceback (most recent call last):
File "", line 2, in
print (‘Python')
File “C :\python27\lib\idlelib\PyShell.py”,line 1356, in writre
return self.shell.write(s , self.tags)
keyboardInterrupt
مقایسۀ حلقههای for و while
• دو روش بسیار پرکاربرد برای ایجاد حلقهها یا قطعهکدهای تکرار شونده در پایتون وجود دارد. ماهیت این دو روش یکسان است و تقریباً همیشه میتوان این دو حلقه را بهجای یکدیگر استفاده کرد. اما استفادۀ نادرست از یک حلقه ممکن است باعث افزایش غیرالزامی حجم کد، افزایش تعداد متغیرها، گنگ بودن کد و بهینه نبودن و مشکلات دیگر شود.
• معمولا در حالتی که تعداد تکرار مشخص نباشد از حلقۀ while و زمانی که تعداد تکرار مشخص باشد از حلقۀ for استفاده میشود. هم چنین نوشتن کد با for بسیار بهینهتر و کوتاهتر است.
• در حلقه های for و while دستورات موجود در بدنه اصلی حلقه همگی دارای تورفتگی یکسان و برابر نسبت به خط آغازین هستند. اما همانند دستور شرطی if، اگر دستور مورد نظر که باید در بدنه حلقه قرار گیرد، فقط یک سطر باشد، می توان دستور را در مقابل شروع کننده حلقه (for یا while) قرار داد.
>>> for i in range (1,3) : printe i
1
2
در صورتی که قرار باشد دستورات متعددی اجرا شود و بخواهیم تمام این دستورات در یک خط کد نوشته شوند، باید با ";" دستورات را از هم جدا کرد.
دستورات زیر خروجی یکسان دارند.
>>> for i in range(1,3) : print ‘the value is:’; print i
The value is:
1
The value is:
2
>>>
>>>
>>> for i in range(1,3):
print 'the value is:’
print i
The value is:
1
The value is:
2
>>> for i in range(1,3): print 'the value is:\n i'
the value is:
i
the value is:
i
• پس از دستورات for یا while بخش اختیاری else قرار می گیرد، این بخش از کد در صورتی که حلقه بهطور کامل و با روند عادی اجرا شده و خاتمه یابد اجرا خواهد شد. در صورتی که حلقه با دستورbreak خاتمه یابد، دستورات درون بخش else اجرا نشده و برنامه از دستور بعدی حلقه به اجرای خود ادامه میدهد. بخش else ، حتی در صورت اجرا نشدن حلقه (یعنی زمانی که در اولین اجرا شرط نادرست بوده و اصلا دستورات داخل حلقه اجرا نشود) نیز اجرا خواهد شد.
• در حلقه ها باید به شرط پایان حلقه توجه کرد، در غیر این صورت یک حلقه (loop) بی نهایت ایجاد می شود.
دستورات break و continue
برای کنترل بهتر جریان برنامه ها و انعطاف پذیری بیشتر آنها میتوان از دستورات break و continue استفاده کرد.
While :
if :
break #exit loop, exit else
if :
continue #go to test1
Else:
#processed if no "break"
حل
دستور pass است که در حقیقت با اجرای این دستور هیچ اتفاق خاصی رخ نخواهد داد. از این دستور زمانی استفاده میکنیم که در شرایطی خاص نیاز به انجام هیچ کاری نباشد! مثلاً برای تعریف یک تابع خالی تا بعداً کدهای آن نوشته شود. یا زمانی که بخواهیم هنگام بروز یک خطای خاص آن مشکل نادیده گرفته شده و برنامه به روند عادی خود ادامه دهد.
نام دستور عملکرد
break خروج آنی و بدون تست شرط از داخلیترین حلقۀ در حال اجرا
continue پرش به اول قطعهکد حلقه و تست شرط اجرای داخلیترین حلقه. اگر شرط درست باشد کدهای درون قطعه دوباره اجرا میشود. در غیر این صورت حلقه خاتمه مییابد.
pass باعث بروز هیچ اتفاقی نمیشود. نام دیگر این عبارت عبارت تهی است
از طریق دستور break روند عادی اجرای یک حلقه قبل از اتمام عادی آن پایان می یابد. این دستور برای شرط های if به کار نمی رود. بلکه تنها برای حلقه (for یا while ) به کار می رود. به عبارتی دستورات break و continue در هر بخش حلقه میتوانند ظاهر شوند ولی معمولاً این دو دستور در داخل یک عبارت شرطی قرار میگیرند و در صورت صحت شرط، اجرا میشوند.
و معمولاً بهعنوان کنترلکننده و خاتمهدهندۀ یک جستجو و یا خاتمۀ آنی حلقه به محض وقوع یک شرط خاص استفاده میشود.
مثال زیر کاربردی از continue و break است. همان طور که در قطعه کد دیده می شود، در صورتی که شرط if اول برقرار باشد، اجرای برنامه به ابتدای حلقه بر می گردد و در صورت برقرار بودن شرط دوم نیز برنامه از حلقه خارج می شود. در سایر موارد مقدار a چاپ می شود. در مثال زیر به جای if دوم، از elif نیز می توان استفاده کرد.
>>> a = 0
>>> while a<13:
a +=1
If a ==5:
Continue
If a ==10:
Break
Print a
1
2
3
4
5
6
7
8
9