آشنایی با ساختار لوپ for در زبان برنامه نویسی پایتون

سیده آمین ارمان

کاربر نگاه دانلود
کاربر نگاه دانلود
عضویت
2016/05/10
ارسالی ها
1,730
امتیاز واکنش
20,744
امتیاز
795
محل سکونت
البرز
در آموزش های گذشته با لوپ while آشنا شدیم و فهمیدیم که چگونه می توانیم از این ساختار استفاده کنیم تا در صورت برقرار بودن شرایطی خاص، اجرای دستورات داخل بدنه ی لوپ تکرار شوند. در این آموزش با ساختار لوپ for آشنا خواهیم شد. دستور for هم مانند دستور while برای تکرار اجرای یک قطعه کد استفاده می شود، با این تفاوت که در زمان استفاده از آن دقیقاً می دانیم که می خواهیم چند بار عملیات مورد نظر را تکرار کنیم.

بهترین راه برای آشنایی بیش تر با ساختار دستور for و نحوه ی کارکرد آن در زبان برنامه نویسی پایتون، ارائه ی آن در قالب یک مثال است. در این مثال می خواهیم به کمک دستور for حروف نام تجاری "SokanAcademy" را به صورت جداگانه در خروجی چاپ کنیم. برای این کار برنامه را به صورت زیر کدنویسی می کنیم و اسکریپت آن را در فایلی تحت عنوان ForLoop.py ذخیره می کنیم:

letterNum = 0
for letter in "SokanAcademy":
letterNum += 1
print("Letter ", letterNum, " is ", letter,".")


print("SokanAcademy has",letterNum,"letters.")
این برنامه با ایجاد یک متغیر با شناسه ی letterNum آغاز می شود که عدد صحیح 1 به آن ارجاع داده شده است و از آن برای شمارش تعداد حروف کلمه ی مورد نظر یا به عبارت دیگر برای شمارش تعداد دفعات تکرار اجرای دستورات داخل لوپ استفاده می کنیم. بنابراین در داخل بدنه ی لوپ باید کدی قرار دهیم که با هر بار اجرای لوپ، این متغیر به عددی که یک واحد بزرگ تر است ارجاع داده شود.

دستور بعدی یک دستور مرکب است و مانند هر دستور مرکب دیگر با یک کیورد که در این جا کلمه ی for است آغاز شده است. بعد از کیورد for باید شناسه ی یک متغیر را قرار دهیم. در این مثال شناسه ی متغیر letter یا هر نام دلخواه دیگری است. در ادامه کیورد in را قرار می دهیم که به مفسر پایتون نشان می دهد در ادامه قرار است داده ای از نوع دنباله قرار گیرد. یک آبجکت از نوع دنباله به گونه ای است که از چند عضو تشکیل شده است و اعضا به ترتیب یکی پس از دیگری در جایگاه ثابتی قرار گرفته اند و دنباله را ایجاد کرده اند.

برای مثال در زمان معرفی نوع داده ی استرینگ گفتیم که این آبجکت ها از نوع دنباله هستند، چرا که هر آبجکت استرینگ از تعدادی حرف ساخته شده است که به ترتیب و پشت سر هم در یک ردیف به دنبال هم آمده اند. جایگاه هر یک از حروف در این دنباله ثابت است، به طوری که اگر جای یکی از اعضای دنباله را با عضو دیگری عوض کنیم دنباله ی جدیدی ایجاد می شود. برای مثال دنباله های "eat" و "ate" با وجود آن که از حروف یکسانی تشکیل شده اند، اما چون ترتیب اعضای آن ها با هم فرق دارد دو دنباله ی متفاوت هستند. اگرچه در این مثال آبجکت بعد از کیورد in دنباله ای از جنس استرینگ با مقدار "SokanAcademy" است، اما دنباله ها می توانند انواع دیگری هم داشته باشند که در آموزش های آینده با آن ها آشنا خواهیم شد.

بعد از تعریف کردن آبجکت دنباله در این دستور مانند هر دستور مرکب دیگر، سربند آن را با علامت : به پایان می رسانیم. در حقیقت ترجمه ی این سربند به زبان عادی این است که:

برای هر حرف در دنباله ی "SokanAcademy" :

پس همان طور که می بینید در این جا برای دسترسی پیدا کردن به هر عضو یا حرف دنباله از متغیر letter استفاده می کنیم و هر بار که لوپ for تکرار شود، این متغیر به ترتیب به یکی از حروف "SokanAcademy" منتسب می شود.

دستورات داخل بدنه ی لوپ for با رعایت تورفتگی نسبت به بلوک سربند آن در یک بلوک مجزا نوشته می شود. این دستورها همان کدهایی هستند که می خواهیم در هر نوبت از اجرای لوپ توسط مفسر اجرا شوند. در این مثال همان طور که پیش تر گفتیم ابتدا دستور 1 =+ letteNum در بدنه ی لوپ برای افزودن یک واحد به مقدار متغیر letterNum استفاده شده است. سپس دستور پرینت را در بدنه ی لوپ قرار داده ایم. در این فانکشن از پنج آرگومان استفاده کرده ایم. سه آرگومان از نوع استرینگ و دو آرگومان متغیر، یکی letterNum که شماره ی حرف را در کلمه ی "SokanAcademy" نشان می دهد و دیگری letter که نشان دهنده ی خود آن حرف است. در نهایت هم پس از خروج از بدنه ی لوپ for از یک دستور پرینت استفاده کرده ایم تا پس از پایان تکرارها در لوپ for، تعداد حروف کلمه را در خروجی چاپ کند. خروجی این برنامه به صورت زیر است:

========== RESTART: C:/SokanAcademy/ForLoop.py ==========
Letter 1 is S .
Letter 2 is o .
Letter 3 is k .
Letter 4 is a .
Letter 5 is n .
Letter 6 is A .
Letter 7 is c .
Letter 8 is a .
Letter 9 is d .
Letter 10 is e .
Letter 11 is m .
Letter 12 is y .
SokanAcademy has 12 letters.
>>>
بنابراین فرم کلی لوپ for را می توانیم به صورت زیر در نظر بگیریم:

for target in object: # Assign object items to target
block(s) of statements # Repeated loop body: uses target
در حالت عادی، بر اساس این الگو هر لوپ for دقیقاً به تعداد عضوهای دنباله ی object تکرار می شود، به این شکل که متغیر target هر بار با رعایت ترتیب به یکی از اعضای دنباله، با شروع از عضو اول و در ادامه به سایر اعضا منتسب می شود و دستورات داخل بدنه ی لوپ اجرا می شوند. این عملیات تکراری ادامه پیدا می کند تا دستورهای داخل لوپ به ازای تمام اعضای دنباله ی object اجرا شوند.

در پاراگراف قبل اشاره ای داشتیم که لوپ for در حالت عادی به ازای تمام اعضای دنباله اجرا می شود؛ با این حال باید بدانید که در لوپ for هم مانند لوپ while امکان استفاده از دستورهای break و continue برای تغییر جریان عادی اجرای لوپ، و هم چنین دستور else وجود دارد. در ادامه کاربرد این دستورها را در لوپ for در قالب مثال هایی می بینیم.

کاربرد دستور break در لوپ for
برنامه ی زیر که اسکریپت آن در فایل ForBreak.py ذخیره شده است را در نظر بگیرید:

username = input("Enter a username less than 6 characters: ")
letterNum = 1
for letter in username:
print("Letter ", letterNum, " is ", letter)
letterNum+=1
if letterNum > 6:
print("Your username is too long!")
break
این برنامه به شکلی کدنویسی شده است که یک مقدار ورودی را از کاربر دریافت می کند و آن را به متغیر username ارجاع می دهد. سپس با استفاده از یک لوپ for مانند مثال قبل حروف به کار رفته در کلمه ی ورودی را در خروجی چاپ می کند؛ با این تفاوت که یک محدودیت در تعداد کارکترهای کلمه ی وارد شده توسط کاربر در نظر گرفته شده است و از او خواسته شده تا کلمه ای 6 حرفی یا کم تر را وارد کند.

دستور شرطی if که در بدنه ی لوپ for قرار داده شده است این شرط را بررسی می کند. زمانی که کاربر کلمه ی مورد نظر خود را وارد می کند و لوپ for اجرا می شود، حروف این کلمه به ترتیب با استفاده از دستور پرینت چاپ می شوند و مقدار متغیر letterNum که در این برنامه هم چون مثال قبل تعداد حروف کلمه ی وارد شده را شمارش می کند یک واحد اضافه می شود. حال اگر کاربر شرط را رعایت نکند و کلمه ای با تعداد بیش تر از 6 حرف را وارد کند، زمانی که لوپ برای بار ششم اجرا می شود متغیر letterNum به عدد صحیح 7 منتسب می شود و در این صورت شرط دستور if برابر با true ارزیابی خواهد شد و دستورات بدنه ی آن اجرا می شوند. در بدنه ی if از دستور پرینت برای چاپ پیغام "کلمه ی کاربری شما بیش از حد طولانی است!" استفاده شده است و پس از اجرای این دستور، دستور break اجرا خواهد شد که باعث می شود مفسر پایتون به طور کامل از لوپ for خارج شود و بقیه حروف کلمه ی وارد شده چاپ نشوند. برای مثال یک نمونه از خروجی برنامه ی فوق به صورت زیر خواهد بود:

========== RESTART: C:/SokanAcademy/ForBreak.py ==========
Enter a username less than 6 characters: NargesAsadi
Letter 1 is N
Letter 2 is a
Letter 3 is r
Letter 4 is g
Letter 5 is e
Letter 6 is s
Your username is too long!
>>>
همان طور که می بینید اجرای لوپ for برای 6 بار تکرار شده و سپس مفسر به طور کامل از آن خارج شده است.

کاربرد دستور continue در لوپ for
برنامه ی زیر که اسکریپت آن در فایل ForContinue.py ذخیره شده است را در نظر بگیرید:

letterNum = 0
for letter in "SokanAcademy":
letterNum+=1
if (letter == "a" or letter == "A"):
print("Letter ", letterNum, " is ", letter,"and not processed.")
continue

print("Letter ", letterNum, " is ", letter)
این برنامه مانند مثال اول است، و می خواهیم حروف نام تجاری "SokanAcademy" را در خروجی چاپ کند؛ با این تفاوت که علاقه ای به چاپ حروف a یا A در آن نداریم. برای این کار یک دستور if به بدنه ی لوپ for افزوده شده است. در صورتی که شرط این دستور برقرار باشد، یعنی متغیر letter به یکی از حروف a یا A منتسب شده باشد، مفسر پایتون وارد بدنه ی if می شود و ابتدا دستور پرینت اجرا خواهد شد که پیغام می دهد حرف a در برنامه پردازش نشده است. سپس مفسر دستور continue را اجرا می کند. با اجرای این دستور سایر دستورهایی که در ادامه آمده اند اجرا نخواهند شد و مفسر مجدداً به ابتدای لوپ برمی گردد و دور بعدی تکرار را با حرف بعدی شروع می کند. خروجی این برنامه به صورت زیر است:

======== RESTART: C:\SokanAcademy\ForContinue.py ========
Letter 1 is S
Letter 2 is o
Letter 3 is k
Letter 4 is a and not processed.
Letter 5 is n
Letter 6 is A and not processed.
Letter 7 is c
Letter 8 is a and not processed.
Letter 9 is d
Letter 10 is e
Letter 11 is m
Letter 12 is y
>>>
همان طور که می بینید حروف چهارم، ششم، و هشتم در خروجی چاپ نشده اند. به خاطر داشته باشید زمانی که می خواهیم بعضی از اعضای یک دنباله را بررسی کنیم اما علاقه ای به بررسی تمام اعضای آن نداریم می توانیم از لوپ for و یک دستور continue درون آن استفاده کنیم. در چنین شرایطی دستور break کاربرد ندارد، چرا که اگر در یک دور تکرار لوپ به عضوی برسیم که علاقه ای به آن نداریم و با دستور break بررسی آن را کنسل کنیم بقیه ی اعضای دنباله هم که در ادامه ی آن عضو آمده اند بررسی نخواهند شد، اما دستور continue تنها همان یک دور از تکرار لوپ را نادیده خواهد گرفت و بقیه ی تکرارها را اجرا خواهد کرد.

به خاطر داشته باشید
برای استفاده ی منطقی از دستورهای break و continue در یک لوپ آن ها را در بدنه ی یک دستور شرطی قرار می دهیم.
کاربرد دستور range در لوپ for
فرض کنید بخواهیم دنباله ای از اعداد صحیح 0 تا 9 را در نظر بگیریم و در لوپ از آن استفاده کنیم. یکی از روش های ایجاد این دنباله استفاده از دستور range است که سازنده ی آبجکتی از نوع range است. البته ما هنوز در مورد مفاهیم Constructor (کانستراکتور یا سازنده) کلاس ها توضیحی نداده ایم، اما فعلاً این دستور را مانند یک تابع در نظر می گیریم که یک عدد صحیح مثبت -برای مثال 10- را به عنوان آرگومان ورودی می گیرد و بازه یا دنباله ای از اعداد 0 تا 9 را تولید می کند. یکی از کاربردهای range در لوپ for است. برای مثال برنامه ی زیر که اسکریپت آن را در فایل range.py ذخیره کرده ایم را در نظر بگیرید:

# range(stop)
for i in range(10):
print(i)
خروجی این برنامه به صورت زیر است:

0
1
2
3
4
5
6
7
8
9
>>>
بنابراین می توانیم با دادن نقطه ی پایانی به دستور range دنباله ای از اعداد صحیح کم تر از آن عدد را که از صفر شروع می شود به دست بیاوریم. گاهی نیاز داریم که دنباله ای از اعداد صحیح را در بازه ی مشخصی ایجاد کنیم. برای این کار از الگوی (range(start, stop استفاده می کنیم و دو آرگومان یکی به عنوان نقطه ی شروع و دیگری به عنوان نقطه ی پایانی به دستور range می دهیم. برای مثال برنامه ی زیر را در نظر بگیرید:

# range(start,stop)
for i in range(5,10):
print(i)
خروجی این برنامه به صورت زیر است:

5
6
7
8
9
>>>
همان طور که می بینید در خروجی برنامه اعضای دنباله ی تولید شده توسط دستور ()range آمده است که اولین عضو آن برابر با اولین آرگومان داده شده به دستور ()range، یعنی عدد صحیح 5 است و اعضای بعدی نیز به ترتیب آمده اند و با رسیدن به نقطه ی انتهایی یعنی عدد صحیح 10 که با آرگومان دوم تعیین می شود دنباله پایان می یابد و خود عدد 10 به عنوان عضو دنباله حساب نمی شود.

نکته
توجه داشته باشید که در این الگو آرگومان اول و دوم می توانند اعداد صحیحی با مقدار منفی هم باشند و تنها لازم است عدد شروع (آرگومان اول) از عدد پایان (آرگومان دوم) دنباله کوچک تر باشد، در غیر این صورت دنباله ای بدون عضو تولید می شود.
گاهی ممکن است ما بخواهیم دنباله ای از اعداد را داشته باشیم که اعضای آن با هم فاصله یکسان اما بیش تر از یک داشته باشند. در این شرایط می توانیم از دستور ()range با الگوی (range(start, stop, step استفاده کنیم. برای مثال برنامه ی زیر را در نظر بگیرید:

# range(start,stop,step)
for i in range(0,20,3):
print(i)
خروجی این برنامه به صورت زیر است:

0
3
6
9
12
15
18
>>>
همان طور که می بینید اعضای دنباله ی تولید شده در این مثال در بازه ی 0 تا 20 قرار می گیرند (البته خود 20 را شامل نمی شود) و هر عضو با عضو قبل و بعد از خود به اندازه ی 3 گام یا 3 واحد فاصله دارد. البته می توان از این الگو به صورت دیگری هم استفاده کرد که نمونه ی آن را در برنامه ی زیر می بینید:

# range(start,stop,negativeStep)
for i in range(20,2,-2):
print(i)
خروجی این برنامه به صورت زیر است:

20
18
16
14
12
10
8
6
4
2
>>>
همان طور که می بینید این بار دنباله با عدد بزرگ تر آغاز می شود و با گام های متوالی منفی به سمت عدد کوچک تر دنباله که در انتها قرار دارد می رود و در آخر باز هم عدد صفر که آرگومان پایان دهنده ی ()range است چاپ نمی شود. توجه داشته باشید که در این الگو هر سه آرگومان باید از نوع اعداد صحیح باشند. برای تعیین آرگومان stop منفی، باید آرگومان گام را نیز به شکل منفی تعیین کنیم.

استفاده از لوپ های for به صورت تو در تو
پیش از این گفتیم که از دستورهای مرکب پایتون می توان در بدنه ی هم به صورت تو در تو استفاده کرد؛ بنابراین همان طور که از دستور if در بدنه ی یک لوپ می توانیم استفاده کنیم، از یک دستور لوپ for هم می توانیم در لوپ دیگری استفاده کنیم. برای مثال برنامه ی زیر که اسکریپت آن در فایل NestedLoop.py ذخیره شده است را در نظر بگیرید:

for i in range(1, 4):
for j in range(1, 4):
print(i,"*",j," = ",i * j)
در این برنامه از دو لوپ for به صورت تو در تو استفاده کرده ایم که خروجی آن به صورت زیر است:

========= RESTART: C:/SokanAcademy/NestedLoop.py =========
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
>>>
استفاده از دستور else در لوپ for
اگر به خاطر داشته باشید در زمان بکارگیری لوپ while می توانستیم از دستور else هم استفاده کنیم و در صورتی که مفسر با دستور break از بدنه ی لوپ خارج نمی شد، بدنه ی دستور else را اجرا می کرد. در لوپ for هم می توانیم از دستور else استفاده کنیم. برای مثال برنامه ی زیر که اسکریپت آن را در فایل ForElse.py ذخیره کرده ایم را در نظر بگیرید:

n = int(input("Enter a number -->"))
for i in range(2, n):
if n % i == 0:
print(n, "is not a prime number")
break
else:
print(n, "is a prime number")
در این برنامه عددی را از کاربر دریافت می کنیم و می خواهیم برنامه بگوید که عدد وارد شده یک عدد اول است یا نه؟

نکته
عدد اول عددی است که به غیر از خودش و 1، مقسوم علیه دیگری ندارد. یعنی اگر یک عدد اول را بر تمام اعداد کوچک تر از آن به جز یک تقسیم کنیم باقی مانده ی تقسیم هیچ وقت صفر نخواهد شد.
بر اساس تعریف بالا می توانیم اول بودن یک عدد را این طور تست کنیم که آن را بر تمام اعداد کوچک تر از خودش تقسیم کنیم. لذا از یک لوپ for استفاده کرده ایم و با استفاده از دستور (range(2, n دنباله ای که از عدد 2 شروع می شود و تمام اعداد کوچک تر از عدد وارد شده توسط کاربر -یعنی n- در برمی گیرد را برای استفاده در لوپ تولید کرده ایم.

حال در هر بار تکرار لوپ for یک دستور شرطی if بررسی می شود. اگر عدد n بر عضوی از دنباله بخش پذیر باشد شرط if برابر با true ارزیابی می شود و دستورهای داخل بدنه ی آن اجرای می شوند. یعنی ابتدا دستور پرینت در خروجی چاپ می کند که عدد وارد شده اول نیست و بعد مفسر با اجرای دستور break از بدنه ی لوپ خارج می شود. در این صورت دستور بدنه ی else هم که بعد از لوپ for آمده است اجرا نخواهد شد. برای مثال نمونه ای از این حالت با وارد کردن عدد غیر اول 25 در زمان اجرای برنامه اتفاق می افتد:

========== RESTART: C:/SokanAcademy/ForElse.py ==========
Enter a number -->25
25 is not a prime number.
>>>
اما در حالتی که عدد وارد شده به هیچ کدام از اعداد صحیح کوچک تر از خود بخش پذیر نباشد، در هیچ یک از تکرارهای لوپ for مفسر وارد بدنه ی دستور شرطی if نخواهد شد و در این صورت با پایان یافتن لوپ بدون برخورد با تابع break از لوپ خارج خواهد شد. در این شرایط دستور داخل بدنه ی else اجرا می شود و تابع ()print عبارتی را در خروجی چاپ می کند که می گوید عدد وارد شده توسط کاربر یک عدد اول است. برای نمونه اگر کاربر عدد 23 که یک عدد اول است را وارد کند برنامه خروجی زیر را به او خواهد داد:

========== RESTART: C:/SokanAcademy/ForElse.py ==========
Enter a number -->23
23 is a prime number
>>>
بنابراین فرم کلی لوپ for به صورت زیر خواهد بود:

for target in object: # Assign object items to target
statements # Repeated loop body: use target
else: # Optional else part
statements # If we didn't hit a 'break'
 

برخی موضوعات مشابه

بالا