از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
itertools پایتون – count()، cycle() و chain()
سرفصلهای مطلب
معرفی
پایتون ابزارهای داخلی زیادی دارد که به ما امکان تکرار و تبدیل داده ها را می دهد. یک مثال عالی است itertools
ماژول، که چندین عملکرد تکرار راحت را ارائه می دهد. هرکدام از اینها تکرار کننده توابع (آنها تولید می کنند تکرار کننده ها) می تواند به کار رود روی خود، یا ترکیبی.
این ماژول از زبان های کاربردی مانند APL، هاسکل، و SPL و عناصر درون itertools
از پایتون جبر تکرار شونده.
Iterable در مقابل Iterator
قبل از شیرجه رفتن در تکراربیایید ابتدا تمایز بین دو اصطلاح مهم را تعریف کنیم: قابل تکرار و اشاره گر.
یک قابل تکرار یک شی است که می توان آن را تکرار کرد. هنگام استفاده از iter()
تابع، یک اشاره گر در حال تولید است. به طور کلی، بیشتر دنباله ها تکرارپذیر هستند، مانند لیست ها، تاپل ها، رشته های، و غیره.
یک اشاره گر همچنین یک شی است که برای تکرار روی an استفاده می شود قابل تکرار و یک تکرار کننده نیز می تواند تکرار کند خود. این کار با استفاده از next()
روش، عبور در اشاره گر که سعی می کنیم از آن عبور کنیم.
next()
متد عنصر بعدی یک شیء تکرارپذیر را برمی گرداند. یک تکرار کننده می تواند از یک تکرار شونده (با استفاده از iter()
):
list = (1,2,3,4,5)
iterator = iter(list)
print(iterator)
این نتیجه در:
<list_iterator object at 0x0000018E393A0F28>
حالا بیایید به next()
عنصر (از اولین مورد شروع می شود) با استفاده از ما iterator
:
print(next(iterator))
این نتیجه در:
1
این عملاً چیزی است که در زیر کاپوت اتفاق می افتد for
حلقه – تماس می گیرد iter()
روی مجموعه ای که روی آن تکرار می کنید، و پس از آن، next()
عنصر قابل دسترسی است n
بار.
در این آموزش، ما نگاهی به چند ابزار تکرار پایتون خواهیم داشت:
شمردن() تابع
count(start, step)
تابع یک تکرار کننده ایجاد می کند و برای تولید مقادیر با فواصل مساوی استفاده می شود، جایی که فضای بین آنها توسط step
بحث و جدل. start
آرگومان مقدار شروع تکرار کننده را تعریف می کند – و اینها روی تنظیم می شوند start=0
و step=1
به صورت پیش فرض.
بدون شرایط ترمز، count()
تابع به طور نامحدود به شمارش ادامه خواهد داد (روی سیستمی با حافظه نامحدود):
from itertools import count
iterator_count = count(start=0, step=5)
for i in iterator_count:
if(i == 25):
break
print(i)
توجه داشته باشید: استفاده کردن count()
مثل این غیرعادی است شما به طور معمول آن را با روش های دیگر ، مانند zip()
، map()
، یا imap()
.
تکرارکننده در اینجا روی خودش تکرار میکند و مقادیر را در مراحل 5 چاپ میکند:
0
5
10
15
20
با توجه به ماهیت مولد آن، این تابع بیشتر با توابع دیگری که انتظار جدید یا تولید دنباله دارند استفاده می شود.
به عنوان مثال، هنگام استفاده از zip()
برای زیپ کردن چندین مورد از یک لیست، ممکن است بخواهید آنها را از طریق یک نمایه موقعیتی حاشیه نویسی کنید. در حین زیپ کردن، استفاده می کنیم count()
برای تولید مقادیر برای این شاخص ها:
from itertools import count
list = ('John', 'Marie', 'Jack', 'Anna')
for i in zip(count(), list):
print(i)
این نتیجه در:
(0, 'John')
(1, 'Marie')
(2, 'Jack')
(3, 'Anna')
چرخه () تابع
cycle()
تابع یک را می پذیرد قابل تکرار و ایجاد می کند اشاره گر، که شامل تمام عناصر تکرارپذیر است. علاوه بر این عناصر، حاوی الف کپی 🀄 از هر عنصر
هنگامی که ما تا انتهای عناصر تکرار می کنیم، از طریق کپی ها شروع به تکرار می کنیم. در حین تکرار از طریق کپی ها، کپی های جدیدی ساخته می شوند. هنگامی که اولین مجموعه از نسخه ها تمام شد – ما از طریق مجموعه جدید تکرار می کنیم.
این process به طور نامحدود تکرار می شود.
توجه داشته باشید: با توجه به این واقعیت، با استفاده از cycle()
، بخصوص برای سکانس های طولانی تر، به شدت حافظه را سنگین می کند.
مراقب منطق ایجاد بی نهایت و بازگشتی باشید، زیرا به راحتی حافظه شما تمام می شود تا همه آن را در خود جای دهید:
from itertools import cycle
list = (1,2,3,4)
iterator = cycle(list)
for i in iterator:
print(i)
این نتیجه در:
1
2
3
4
1
2
3
4
...
تا زمانی که برنامه را خاتمه دهیم یا حافظه آن تمام شود. که گفته شد – باید همیشه یک شرط خروج/خاتمه برای cycle()
تابع.
با توجه به این واقعیت که cycle()
میتوانیم در هر تکراری بچرخیم، به راحتی میتوانیم آن را روی رشتهها و تاپلها نیز اعمال کنیم:
from itertools import cycle
string = "This is a random string"
iterator = cycle(string)
for i in iterator:
print(i)
این منجر به یک دنباله بی پایان از:
T
h
i
s
i
s
a
r
a
n
d
o
...
زنجیر() تابع
chain()
تابع استفاده می شود تکرارهای متعدد زنجیره ای با هم، با ایجاد یک تکرار کننده که آنها را به ترتیب، یکی پس از دیگری طی می کند:
result = list(chain((1, 2, 3),
("one", "two", "three"),
"String",
("this", "is", "a", "tuple")))
print(result)
خروجی خواهد بود:
(1, 2, 3, 'one', 'two', 'three', 'S', 't', 'r', 'i', 'n', 'g', 'this', 'is', 'a', 'tuple')
در اینجا، ما چهار نوع تکرار شونده مختلف داریم – هر کدام به هم زنجیر شده اند.
بااینکه ("one", "two", "three")
لیستی از رشته ها است، chain()
این را به عنوان یک لیست تلقی می کند و به سادگی عناصر آن را بدون فراخوانی بعدی زنجیره می کند chain()
برای هر یک از رشته ها از سوی دیگر، "String"
به شخصیت های تشکیل دهنده آن تقسیم می شود.
اولی را می توان با روش دیگری به دست آورد که از آن مشتق شده است chain()
تابع – chain.from_iterable()
:
result2 = list(chain(("one", "two", "three")))
result3 = list(chain.from_iterable(("one", "two", "three")))
print(result2)
print(result3)
chain()
عملکرد همان رفتاری است که قبلاً مشاهده کردیم – آن عناصر را زنجیر می کند همانطور که هستند. از سوی دیگر، chain.from_iterable()
روش هر کدام را درمان می کند عنصر به عنوان یک قابل تکرار و عناصر تشکیل دهنده آن را در کنار سایر عناصر که به همین شکل تجزیه شده اند برمی گرداند:
('one', 'two', 'three')
('o', 'n', 'e', 't', 'w', 'o', 't', 'h', 'r', 'e', 'e')
معمولا، شما استفاده می کنید chain.from_iterable()
برای محاسبه مجموع ارقام موجود در چندین مجموعه که ابتدا می توانید زنجیر با هم، و سپس محاسبه کنید sum()
برای:
from itertools import chain
number_list = ((1, 2, 3),(4, 5, 6),(7, 8, 9))
result = list(chain.from_iterable(number_list))
print(sum(result))
هر عنصر از number_list
مجموعه لیست دیگری است. از آنجایی که لیست ها هستند قابل تکرار، chain.from_iterable()
call اینها را به یک لیست واحد شامل عناصر از تجزیه می کند (1..9)
، پس از آن ما آنها را محاسبه می کنیم sum()
و print نتیجه:
45
نتیجه
itertools
ماژول ما را با چندین تابع مفید برای کار با تکرارپذیرها و تکرار آشنا می کند.
بسیاری از اینها را می توان به عنوان توابع راحتی مستقل استفاده کرد، اما معمولاً با توابع دیگر برای تبدیل داده ها زنجیر می شوند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-10 08:30:12