TG Telegram Group & Channel
Библиотека Python разработчика | Книги по питону | United States America (US)
Create: Update:

Обычно вам не нужно заботиться об объектах-итераторах; они создаются и используются автоматически конструкциями for, list или другими механизмами, которые выполняют итерацию за вас. Однако в некоторых редких случаях вам может понадобиться получить итератор из итерируемого объекта явно. Правильный способ сделать это — использовать встроенную функцию iter (которая использует методы __iter__ или __getitem__ объекта для получения итератора):


part_sizes = [3, 2, 5]
iterator = iter(range(100))

result = []
for size in part_sizes:
part = []
for _ in range(size):
part.append(next(iterator))
result.append(part)

assert result == [
[0, 1, 2],
[3, 4],
[5, 6, 7, 8, 9],
]


Забавный факт: iter можно использовать совершенно другим способом. Вместо создания итератора из объекта, он также может создавать итератор из функции (или любого вызываемого объекта). Если вызвать iter с двумя аргументами, первый должен быть вызываемым объектом, а второй — контрольным значением (sentinel). При каждом вызове __next__ созданный итератор будет вызывать переданную функцию без аргументов. Если возвращённое значение равно sentinel, возбуждается исключение StopIteration; в противном случае возвращается полученное значение.

Обычно это удобно для чтения строк до появления определённого маркера:


In : list(iter(input, 'END'))
a
b

END
Out: ['a', 'b', '']


👉@BookPython

Обычно вам не нужно заботиться об объектах-итераторах; они создаются и используются автоматически конструкциями for, list или другими механизмами, которые выполняют итерацию за вас. Однако в некоторых редких случаях вам может понадобиться получить итератор из итерируемого объекта явно. Правильный способ сделать это — использовать встроенную функцию iter (которая использует методы __iter__ или __getitem__ объекта для получения итератора):


part_sizes = [3, 2, 5]
iterator = iter(range(100))

result = []
for size in part_sizes:
part = []
for _ in range(size):
part.append(next(iterator))
result.append(part)

assert result == [
[0, 1, 2],
[3, 4],
[5, 6, 7, 8, 9],
]


Забавный факт: iter можно использовать совершенно другим способом. Вместо создания итератора из объекта, он также может создавать итератор из функции (или любого вызываемого объекта). Если вызвать iter с двумя аргументами, первый должен быть вызываемым объектом, а второй — контрольным значением (sentinel). При каждом вызове __next__ созданный итератор будет вызывать переданную функцию без аргументов. Если возвращённое значение равно sentinel, возбуждается исключение StopIteration; в противном случае возвращается полученное значение.

Обычно это удобно для чтения строк до появления определённого маркера:


In : list(iter(input, 'END'))
a
b

END
Out: ['a', 'b', '']


👉@BookPython
👍4


>>Click here to continue<<

Библиотека Python разработчика | Книги по питону




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)