از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
حلقه ها در پایتون
سرفصلهای مطلب
معرفی
یک زبان برنامه نویسی معمولاً از چندین نوع عنصر اساسی مانند تکالیف، شرطی ها و حلقه ها تشکیل شده است. ایده پشت یک حلقه تکرار بخشی از کد است که در بدنه حلقه است. انواع مختلفی از حلقه ها رایج هستند. به عنوان مثال، حلقه ها اجرا می شوند:
- در حالی که یک شرط مشخص درست است (یعنی وقتی شرط برقرار است، کاری انجام دهید)
- تا زمانی که شرط خاصی برآورده شود (یعنی کاری را انجام دهید تا زمانی که شرط محقق شود)
- برای تعداد ثابتی از مراحل (تکرار) (یعنی برای
x
تکرار، کاری انجام دهید) - به عنوان یک حلقه بی پایان و خروج / شکستن روی شرایط (در حالی که
condition_1
درست است کاری انجام دهید و خارج شوید رویcondition_2
)
پایتون ساختارهای مختلفی را برای اجرای حلقه ها ارائه می دهد. این مقاله آنها را معرفی می کند و مشاوره می دهد روی استفاده خاص آنها علاوه بر این، ما همچنین نگاهی به عملکرد هر ساختار حلقه در کد پایتون شما خواهیم داشت. ممکن است برای شما تعجب آور باشد.
ساختارهای حلقه پشتیبانی شده توسط پایتون
پایتون تعدادی جزئی از ساختارهای نامگذاری شده در بالا را پشتیبانی میکند، به علاوه پسوندهای منحصر به فردی را برای انواعی که ذکر کردیم ارائه میکند.
پایه ای while
حلقه ها
while condition:
statements
تا زمانی که condition
برآورده شده است، تمام اظهارات در بدنه while
حلقه حداقل یک بار اجرا می شود. پس از هر بار اجرای دستور بدنه، شرط مجدداً ارزیابی می شود. در اینجا یک مثال از یک حلقه while واقعی آورده شده است:
fruits = ("banana", "apple", "orange", "kiwi")
position = 0
while position < len(fruits):
print(fruits(position))
position = position + 1
print("Reached the end of the list")
این کد یک عنصر لیست را بعد از بعدی خروجی می دهد:
banana
apple
orange
kiwi
Reached the end of the list
while
حلقه ها با یک else
عبارت
این ساختار مخصوص زبان پایتون است و بسیار مفید است:
while condition:
statements
else:
statements
این while
حلقه شبیه به معمولی عمل می کند while
حلقه همانطور که قبلا معرفی شد. اظهارات در else
بخش به محض اینکه شرط دیگر درست نیست اجرا می شود. به عنوان مثال، هنگامی که به پایان یک لیست رسید، مانند مثال قبلی ما. هنگامی که شرط حلقه دیگر برآورده نمی شود، می توانید آن را به عنوان “سپس” تفسیر کنید:
fruits = ("banana", "apple", "orange", "kiwi")
position = 0
while position < len(fruits):
print(fruits(position))
position = position + 1
else:
print("Reached the end of the list")
این یک عنصر لیست را بعد از بعدی، به اضافه متن اضافی از خروجی می دهد print
بیانیه در else
عبارت:
banana
apple
orange
kiwi
Reached the end of the list
این نوع حلقه با یک else
بند برای خروجی پیام یا اجرای دستورات در صورت عدم موفقیت شرایط مفید است.
توجه داشته باشید: نکته مهمی که باید به آن توجه کرد این است که else
بند است نه اعدام می شود اگر شما break
بیرون از while
حلقه یا اگر خطایی از داخل پرتاب شود while
حلقه
بی نهایت while
حلقه ها
حلقههای بینهایت همیشه بهعنوان مولفههای حیاتی آموزش داده میشوند و اگر شرایط شکست موضوع پیچیدهای باشد، باید از آنها اجتناب کرد. اگرچه مواردی وجود دارد که در آن حلقه های بی نهایت به شما کمک می کند تا کد را به روشی زیبا بنویسید.
در اینجا فقط چند مورد استفاده از حلقه های بی نهایت آورده شده است:
- دستگاه هایی که سعی می کنند اتصالات شبکه را فعال نگه دارند، مانند نقاط دسترسی بی سیم
- مشتریانی که سعی می کنند دائماً داده ها را با a host سیستم، مانند یک سیستم فایل مبتنی بر شبکه (NFS یا Samba/CIFS)
- حلقه های بازی برای ترسیم و به روز رسانی وضعیت بازی شما
while True:
if condition:
break
statements
به خاطر داشته باشید که دستورات موجود در بدنه یک حلقه بی پایان حداقل یک بار اجرا می شوند. به همین دلیل توصیه می کنم در صورت امکان شرط شکست را به عنوان اولین دستور بعد از سر حلقه بنویسید. به دنبال کد مثال ما، یک حلقه بی نهایت به صورت زیر است:
fruits = ("banana", "apple", "orange", "kiwi")
position = 0
while True:
if position >= len(fruits):
break
print(fruits(position))
position = position + 1
print("Reached the end of the list")
for
حلقه ها با یک Iterator
روش معمولی برای کار با لیست ها در یک حلقه در پایتون با for
حلقه، در ترکیب با یک تکرار کننده:
for temp_var in sequence:
statements
این کد پایتون را برای پردازش لیست ما ساده می کند:
fruits = ("banana", "apple", "orange", "kiwi")
for food in fruits:
print(food)
print("Reached the end of the list")
در این نوع ساختار حلقهای، مفسر پایتون، تکرار را روی فهرست انجام میدهد و مراقب است که حلقه خارج از محدوده لیست اجرا نشود. به خاطر داشته باشید که عبارات موجود در بدنه حلقه یک بار برای هر عنصر در لیست اجرا می شوند – مهم نیست که فقط یک عنصر باشد یا بیست هزار.
در صورت خالی بودن لیست، دستورات موجود در بدنه حلقه اجرا نمی شوند.
توجه داشته باشید: تغییر لیست از نظر افزودن یا حذف عناصر در داخل را for
حلقه ممکن است مفسر پایتون را گیج کند و مشکلاتی ایجاد کند، پس مراقب باشید!
for
حلقه با Iterator و else
عبارت
شبیه به while
حلقه، پایتون نیز یک را ارائه می دهد else
بیانیه برای for
حلقه به طور مشابه کار می کند و می تواند به عنوان “سپس”، درست مانند قبل تفسیر شود. شبه کد به صورت زیر است:
for temp_var in sequence:
statements
else:
statements
با استفاده از این کلمه کلیدی، کد ما به صورت زیر تغییر می کند:
fruits = ("banana", "apple", "orange", "kiwi")
for food in fruits:
print(food)
else:
print("Reached the end of the list")
ساختارهای حلقه پشتیبانی نشده
همانطور که در ابتدا گفته شد، سبک های حلقه مختلفی وجود دارد. با این حال، پایتون از همه آنها پشتیبانی نمی کند. به عنوان مثال، پایتون از a پشتیبانی نمی کند do-until
یا الف foreach
ساختار حلقه، که احتمالاً از PHP شناخته می شود.
توجه داشته باشید: چنین مواردی با استفاده از پایتون حل می شوند in
اپراتور که اگر با آن آشنایی داشته باشید، کد کاملا سکسی ایجاد می کند.
به عنوان مثال، الف foreach
حلقه در ساخته شده است for <variable> in <collection>
روش. که دقیقا همان منطق را ایجاد می کند foreach
حلقه، اما نحوی کمی متفاوت دارد. ممکن است متوجه شده باشید که این نحوی است که در مثال های بالا استفاده کرده ایم.
کدام حلقه را انتخاب کنیم؟
به طور کلی، while <condition>
حلقه ها نیاز به یک شرط دارند که قبل از عبارات حلقه مشخص شود. این ممکن است منجر به این شود که دستورات موجود در بدنه حلقه هرگز اجرا نشوند. همچنین، همیشه مشخص نیست که حلقه برای چند بار اجرا می شود while
حلقه ها از سوی دیگر، for
حلقهها برای استفاده از یک تکرارکننده مناسبتر هستند که به تکرار روی عناصر ساختار داده، مانند یک آرایه، کمک میکند.
توصیه می شود از a for
اگر تعدادی عنصر برای تکرار دارید، یا اگر نیاز دارید کد را چند بار ثابت اجرا کنید، حلقه بزنید. در مقابل، الف while
حلقه بهتر است زمانی که شما یک عبارت بولی برای ارزیابی، و نه لیستی از عناصر برای حلقه زدن.
بهبود کیفیت کد شما
بسیاری از برنامه نویسان جوان بیشتر مستعد نوشتن کدهای ناکارآمد هستند، عمدتاً به این دلیل که در زمانی بزرگ شده اند که در آن هیچ کس مجبور نیست به حافظه یا ظرفیت پردازش فکر کند – ما فقط مقدار زیادی از آن را در رایانه های مدرن در دسترس داریم. در عوض، توسعهدهندگان با تجربهتر (معروف به «قدیمیتر») تمایل بیشتری به بهینهسازی کدشان تا حد امکان دارند و ممکن است شمارش دستورالعملهای CPU و تعداد اسلاتهای حافظه در حال استفاده را به خاطر بسپارند.
بنابراین کیفیت امروز به چه معناست؟ از نظر کارایی، به معنای نوشتن کدی است که کمترین زمان ممکن را از حافظه و CPU بگیرد. اولاً، با مفسرهای امروزی، زمان اجرا، چارچوب ها و سایر انتزاعات، محاسبه درست آن بسیار دشوار است. و ثانیاً، همیشه یک مبادله بین این دو اقدام است. سؤالات کلیدی این است که این کد چند وقت یکبار استفاده می شود و چقدر زمان باید صرف کنیم روی بهینه سازی آن برای بردن چند میکروثانیه از زمان CPU؟
به عنوان مثال، اجازه دهید نگاهی به a for
تکرار حلقه روی یک لیست معمولاً آن را به صورت زیر می نویسیم:
for entry in range(0, 3):
print(entry)
این خروجی مقادیر 0، 1، و 2 range()
روش تکرارپذیر را ایجاد می کند (0, 1, 2)
هر بار که سر حلقه ارزیابی می شود. بنابراین بهتر است آن را به صورت زیر بنویسید:
entryRange = range(0, 3)
for entry in entryRange:
print(entry)
در حالی که ممکن است این بهینه سازی بزرگ برای مثال داده شده به نظر نرسد، در نظر بگیرید که آیا محدوده از 0 تا 1,000,000 یا بیشتر بوده است. همانطور که لیست ما بزرگتر می شود، در زمان بیشتری صرفه جویی می کنیم و کد ما سریعتر اجرا می شود.
علاوه بر این، این اظهارات را می توان به صورت یک بیان کرد while
حلقه:
entryRange = range(0, 3)
index = 0
while index < len(entryRange):
print(entryRange(index))
index = index + 1
و در این مرحله، حتی استفاده از آن کمی بیهوده به نظر می رسد range()
تابع. در عوض، ممکن است فقط از یک ثابت برای شرطی و استفاده کنیم index
به عنوان شمارنده برای مشروط و چاپ:
index = 0
while index < 3:
print(index)
index = index + 1
توجه داشته باشید: بهینهسازیهای کوچکی مانند اینها میتوانند بهبود عملکرد کمی را برای حلقههای شما ایجاد کنند، بهخصوص که تعداد تکرارها بسیار زیاد میشود.
تست های عملکرد
تا اینجا در مورد کد حلقه و روش صحیح نوشتن آن صحبت کردیم. یک تست عملکرد ممکن است به روشن کردن نور کمک کند. این ایده با مهربانی از یک مقاله وبلاگ جالب وام گرفته شده است ند بچلدر.
در حال استفاده است پرف ابزاری که تست های عملکرد را برای کد برنامه اجرا شده انجام می دهد. تماس اصلی است perf stat program
در حالیکه stat
آمار را مخفف می کند و برنامه تماسی است که می خواهیم ارزیابی کنیم. برای آزمایش انواع حلقه ما این فراخوان ها انجام شد:
perf stat python3 while-1.py
perf stat python3 while-2.py
perf stat python3 while-3.py
perf stat python3 for-4.py
perf stat python3 for-5.py
perf stat python3 for-6.py
perf stat python3 for-7.py
perf stat python3 while-8.py
این نتایج بر اساس میانگین هستند روی 10 به دلیل اختلاف بار در هسته لینوکس اجرا می شود. جدول زیر نتایج را نشان می دهد:
موضوع | لیست 1 | لیست 2 | لیست 3 | لیست 4 | لیست 5 |
---|---|---|---|---|---|
ساعت کاری (میلی ثانیه) | 20.160077 | 18.535264 | 15.975387 | 15.427334 | 15.503672 |
سوئیچ های زمینه | 10 | 11 | 10 | 13 | 10 |
مهاجرت های cpu | 0 | 0 | 2 | 1 | 1 |
page گسل | 851 | 849 | 855 | 848 | 851 |
چرخه ها | 41,915,010 | 44,938,837 | 44,403,696 | 42,983,392 | 42,489,206 |
دستورالعمل ها | 46,833,820 | 46,803,187 | 46,926,383 | 46,596,667 | 46,701,350 |
برای لیست های 6-8 به صورت زیر به نظر می رسد:
موضوع | لیست 6 | لیست 7 | فهرست 8 |
---|---|---|---|
ساعت کاری (میلی ثانیه) | 16.480322 | 18.193437 | 15.734627 |
سوئیچ های زمینه | 9 | 11 | 11 |
مهاجرت های cpu | 0 | 0 | 1 |
page گسل | 850 | 851 | 853 |
چرخه ها | 42,424,639 | 42,569,550 | 43,038,837 |
دستورالعمل ها | 46,703,893 | 46,724,190 | 46,695,710 |
نتیجه
پایتون راه های مختلفی برای تکرار اعمال و نوشتن حلقه ها ارائه می دهد. انواع مختلفی برای هر مورد استفاده خاص وجود دارد. آزمایشهای ما نشان دادهاند که حلقهها با تفاوتهای کمی در یک بعد هستند و بهینهسازی مفسر پایتون بسیار خوب است.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-01 21:37:02