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

سرور مجازی NVMe

راهنمای enumerate() در پایتون – آسان برای حلقه ها با شمارش

0 56
زمان لازم برای مطالعه: 4 دقیقه


معرفی

حلقه زدن با متغیر/شاخص شمارنده – کلاسیک در علوم کامپیوتر! به طور معمول، یا به طور صریح یک متغیر/شاخص شمارنده تعریف می‌کنید و به صورت دستی آن را افزایش می‌دهید. روی هر حلقه، یا شما استفاده می کنید مقداری نوعی قند نحوی برای جلوگیری از این امر 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 هدف – شی.

پیشنهاد می‌کنیم بخوانید:  در حال بارگیری... انیمیشن در جاوا اسکریپت Vanilla هنگام توسعه وب سایت ها و برنامه های کاربردی وب، از جمله بارگذاری انیمیشن، می تواند تجربه کاربر را به طور قابل توجهی با برقراری ارتباط با آنچه در حال انجام است بهبود بخشد. روی. این کار کاربران را درگیر می کند و توجه آنها را در حین بارگذاری محتوا حفظ می کند و به کاربران کمک می کند بفهمند چه اتفاقی می افتد روی به جای اینکه آنها را حدس بزنند. در این راهنما، ما...

استفاده از استاندارد پایتون 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

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

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

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