از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای enumerate() در پایتون – آسان برای حلقه ها با شمارش
سرفصلهای مطلب
معرفی
حلقه زدن با متغیر/شاخص شمارنده – کلاسیک در علوم کامپیوتر! به طور معمول، یا به طور صریح یک متغیر/شاخص شمارنده تعریف میکنید و به صورت دستی آن را افزایش میدهید. روی هر حلقه، یا شما استفاده می کنید مقداری نوعی قند نحوی برای جلوگیری از این امر process از طریق افزایش یافته است for
حلقه ها:
some_list = ('Looping', 'with', 'counters', 'is', 'a', 'classic!')
i = 0
for element in some_list:
print(f'Element Index: {i}, Element: {element}')
i += 1
for i in range(len(some_list)):
print(f'Element Index: {i}, Element: {some_list(i)}')
هر دوی این قطعهها خروجی یکسانی دارند:
Element Index: 0, Element: Looping
Element Index: 1, Element: with
Element Index: 2, Element: counters
Element Index: 3, Element: is
Element Index: 4, Element: a
Element Index: 5, Element: classic!
با توجه به رایج بودن این حلقه در کارهای روزمره – the enumerate()
تابع در فضای نام پایتون ساخته شده است. شما می توانید بدون هیچ گونه وابستگی اضافی، با یک متغیر/شاخص شمارنده خودکار با نحوی به سادگی از طریق یک تکرار در پایتون حلقه بزنید:
for idx, element in enumerate(some_list):
print(idx, element)
توجه داشته باشید: نامگذاری ایندکس به عنوان یک قرارداد معمول است، اما ضروری نیست idx
اگر هیچ برچسب دیگری قابل استفاده نباشد، از آنجا که id
یک کلمه کلیدی رزرو شده است. معمولا، مبتنی بر روی تکراری که با آن کار میکنید، میتوان نامهای معنیداری بیشتری نسبت داد، مانند: batch_num, batch in enumerate(...)
.
این قطعه کد نتیجه می دهد:
0 Looping
1 with
2 counters
3 is
4 a
5 classic!
بیایید به عملکرد شیرجه بزنیم و روش عملکرد آن را بررسی کنیم! این یک کلاسیک و رایج است – و به روش واقعی پایتون، یک عملیات معمول و اضافی را ساده می کند و خوانایی کد شما را بهبود می بخشد.
را شمارش () تابع در پایتون
را enumerate()
تابع یک را می پذیرد مجموعه تکراری (مانند یک تاپل، لیست یا رشته)، و an را برمی گرداند enumerate
شی، که از الف تشکیل شده است مجموعه کلید و مجموعه ارزش، جایی که کلیدها با a مطابقت دارند متغیر شمارنده (شروع از 0) و مقادیر مربوط به عناصر اصلی مجموعه تکرار شونده است:
obj = enumerate(some_list)
print(type(obj))
توجه داشته باشید: را enumerate
شیء به خودی خود قابل تکرار است! می توانید از استاندارد استفاده کنید for
نحو، باز کردن بسته بندی کلیدها و ارزش های از enumerate
هدف – شی.
استفاده از استاندارد پایتون for
نحو، ما می توانیم کلیدها و مقادیر را از این شی باز کنیم و انواع آنها را بررسی کنیم:
for key, value in obj:
print(type(key), type(value))
انواع داده از ارزش های (عناصر از مجموعه اصلی) حفظ می شوند، بنابراین حتی اگر انواع داده های سفارشی را ارسال کنید، تا زمانی که آنها یک مجموعه قابل تکرار معتبر هستند – آنها به سادگی خواهند بود حاشیه نویسی شده است با یک متغیر شمارنده اگر بخواهید خود شی را در یک لیست جمع آوری کنید، ساختار آن بسیار واضح می شود:
print(list(obj))
این فقط مجموعه ای از تاپل ها هر کدام با دو عنصر – یک متغیر شمارنده که از 0 شروع می شود و هر عنصر تکرارپذیر اصلی به شاخص ها نگاشت می شود.
می توانید یک گزینه اختیاری تنظیم کنید start
آرگومان، نشان دهنده شاخص شروع در تکرارپذیر نیست، بلکه نشان دهنده مقدار شروع برای اولین شمارنده/شاخصی است که تابع ایجاد خواهد کرد. به عنوان مثال، بگویید که ما می خواهیم از آن شروع کنیم 1
بجای 0
:
obj = enumerate(some_list, 1)
print(list(obj))
حلقه از طریق Iterable با شمارش ()
با گفتن همه اینها – حلقه زدن از طریق یک enumerate
شی مانند حلقه زدن از طریق تکرارهای دیگر است. را for
حلقه در اینجا مفید است زیرا می توانید متغیرهای مرجع را به مقادیر تاپلی برگشتی اختصاص دهید. علاوه بر این، نیازی به ارجاع صریح شی وجود ندارد، زیرا به ندرت از آن استفاده می شود خارج از از یک حلقه منفرد بنابراین مقدار برگشتی معمولاً مستقیماً در خود حلقه استفاده می شود:
for idx, element in enumerate(some_list):
print(f'{idx}, {element}')
این منجر به:
0, Looping
1, with
2, counters
3, is
4, a
5, classic!
اگر میخواهید درباره f-strings و خروجی قالببندی در پایتون بیشتر بخوانید، راهنمای قالببندی رشتهها با f-strings پایتون 3 را بخوانید!
حاشیه نویسی هر عنصر در یک تکرار – یا بهتر است بگوییم، افزایش شمارنده و برگرداندن آن، در حالی که دسترسی به عناصر تکرارپذیر به همین سادگی است!
شایان ذکر است که واقعاً هیچ چیز خاصی در داخل رخ نمی دهد enumerate()
تابع. واقعاً از نظر عملکردی معادل حلقه اولیه ای است که نوشتیم، با یک متغیر شمارنده صریح که با یک عنصر برگردانده می شود. اگر به یادداشت موجود در اسناد رسمی، نتیجه تابع از نظر عملکردی معادل است با:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
می بینید که کد کاملاً شبیه اولین پیاده سازی است که ما تعریف کرده ایم:
i = 0
for element in some_list:
print(f'Element Index: {i}, Element: {some_list(i)}')
i += 1
def our_enumerate(some_iterable, start=0):
i = start
for element in some_iterable:
yield i, element
i += 1
نکته کلیدی در اینجا این است – yield
کلمه کلیدی a را تعریف می کند ژنراتور، که قابل تکرار است. توسط تسلیم شدن ایندکس و خود عنصر را به عقب برگردانیم، یک شی مولد تکرارپذیر ایجاد میکنیم، که سپس میتوانیم روی آن حلقه بزنیم و عناصر (و شاخصهای آنها) را از طریق for
حلقه
اگر می خواهید در مورد استفاده از آن بیشتر بخوانید
yield
کلمه کلیدی در اینجا، راهنمای ما برای درک کلمه کلیدی “بازده” پایتون را بخوانید!
اگر قرار بود از our_enumerate()
به جای عملکرد داخلی، نتایج تقریباً یکسانی خواهیم داشت:
some_list = ('Looping', 'with', 'counters', 'is', 'a', 'classic!')
for idx, element in our_enumerate(some_list):
print(f'{idx}, {element}')
obj = our_enumerate(some_list)
print(f'Object type: {obj}')
این منجر به:
0, Looping
1, with
2, counters
3, is
4, a
5, classic!
Object type: <generator object our_enumerate at 0x000002750B595F48>
تنها تفاوت این است که ما فقط یک ژنریک داریم شی ژنراتور، به جای نام کلاس زیباتر.
نتیجه
در نهایت، enumerate()
تابع صرفاً قند نحوی است که یک اجرای حلقه ای بسیار رایج و ساده را در بر می گیرد.
در این راهنمای کوتاه، نگاهی به آن انداختهایم enumerate()
تابع در پایتون – روش آسان داخلی برای تکرار روی یک مجموعه و حاشیه نویسی عناصر با شاخص ها.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-07 05:40:04