وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

حلقه ها در پایتون

0 5
زمان لازم برای مطالعه: 7 دقیقه


معرفی

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

  • در حالی که یک شرط مشخص درست است (یعنی وقتی شرط برقرار است، کاری انجام دهید)
  • تا زمانی که شرط خاصی برآورده شود (یعنی کاری را انجام دهید تا زمانی که شرط محقق شود)
  • برای تعداد ثابتی از مراحل (تکرار) (یعنی برای 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید