Hello World
1.6K subscribers
71 photos
6 videos
3 files
161 links
Be so good that you cannot be ignored. And then, go one step beyond.
Download Telegram
Как работает цикл for в Python?

Python не имеет традиционных циклов for. Для того, чтобы объяснить это, рассмотрим цикл for написанный в C стиле:
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < size; ++i) {
printf(“%d\n”, numbers[i]);
}


Так работает типичный цикл for в C-подобных языках программирования. Но цикл в Python так не работает. Цикл в Python это скорее foreach цикл.
numbers = [1, 2, 3, 4, 5]
for n in numbers:
print(n)


📎 В циклах Python нет индексной переменной
📎 Здесь нет инициализации индекса, проверки границ или инкрементации индекса
📎 Циклы в Python работают со всеми элементами листа
📎 Именно поэтому эти циклы могут работать с любыми итерируемыми объектами, например:
numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers)
for item in iterator:
print(item)


#for #iterators #tips
Чай из itertools

Если вы читали предыдущие посты про итераторы, то примерно представляете как они работают (если нет, ищите по тегу #generators). Итератор обычно выдает значения по одному (с помощью метода __next__, например). Это означает, что получать значения из итератора может только один потребитель. Однако, это можно исправить.

📌tee принимает два аргумента: исходный итератор и количество новых итераторов, на которые разделится исходный. А возвращает он кортеж из новых итераторов.
from itertools import tee

def get_iter():
for i in range(5):
yield i

one, two, three = tee(get_iter(), 3)

print(f'next is {next(one)}')
print(f'next is {next(two)}')
for item in three:
print(f'next is {item}')


Вывод:
next is 0
next is 0
next is 0
next is 1
next is 2
next is 3
next is 4


Видно, что каждый из полученных итераторов по сути является независимой копией исходного get_iter.

Несколько замечаний:
📌Не следует пытаться итерировать исходный get_iter, иначе производные итераторы могут потерять некоторые значения.
📌tee хранит в памяти извлеченные элементы, чтобы остальные потребители могли их получить, даже если исходный итератор уже сместился. Поэтому, если элементов много либо они большие, это может серьезно повлиять на расход памяти.

#tee #iterators
Chains 🔗

itertools.chain
Возвращает по одному элементу из первого итератора, потом из второго, до тех пор, пока итераторы не кончатся. Итоговый массив содержит все элементы данных итераторов.

📌Пример использования:

from itertools import chain

print(list(chain(['a', 'b', 'c'], range(4))))
# Output: ['a', 'b', 'c', 0, 1, 2, 3]


itertools.chain.from_iterable
Работает аналогично chain. Также выполняется объединение списков. Отличие заключается в том, что аргумент только один – вложенный список со списками, которые надо объединить.

📌Пример использования:

from itertools import chain

print(list(chain.from_iterable([['a', 'b', 'c'], range(4)])))
# Output: ['a', 'b', 'c', 0, 1, 2, 3]


#iterators #chain