# zip (iter1, [iter2, [...]])  --> zip object
# ограничение на количество итерабельных последовательностей(iter) нет
# Iterate over several iterables in parallel, producing tuples with an item from each one.

a = [5, 15, 15, 25]

b = [10, 20, 30, 40]
for i in range(4):
print(a[i], b[i]) # если индекси не совпадают то, выдаст ошибку
# 5 10
# 15 20
# 15 30
# 25 40

a = [5, 15, 15, 25]

b = [10, 20, 30, 40]
rez = zip(a, b)
print(rez) # так ка zip - inetrator - уго можно перевести в список
# 5 10
# 15 20
# 15 30
# 25 40

print(list(rez))

# [(5, 10), (15, 20), (15, 30), (25, 40)] - вывело набор кортежей, которые состоят из списков "a" и "b".

# print(len(rez)) --> Это работать не будет, так как переменная итератор
# print(rez[0]) --> Это работать не будет, так как переменная итератор

a = [5, 15, 15, 25]

b = [10, 20, 30, 40]
rez = zip(a, b)
for i in rez:
print(i)
print('-----')
for i in rez:
print(i)
# (5, 10) ---> обход итератора проходит один раз
# (15, 20)
# (15, 30)
# (25, 40)
# ----- ---> повторного вывода нет
# для повторного обхода, нужно эту переменную обернуть в список
# list(zip(rez))

a = [5, 15, 15, 25, 35, 45, 55]

b = [10, 20, 30]
c = 'abcde'
d = list(zip(a, b, c))

print(d) # [(5, 10, 'a'), (15, 20, 'b'), (15, 30, 'c'), (25, 40, 'd')]
# кортежи формируются по колекции с наименьшим числом индексов
# колекция "b" оказала влияние на формирование последовательнсти кортежей

# множественное присвоение i1, i2, i3 в цикле for и обход zip(a, b, c)
a = [5, 15, 15]

b = [10, 20, 30]
c = 'abcd'
for i1, i2, i3 in zip(a, b, c):

print(i1, i2, i3)
# 5 10 a
# 15 20 b
# 15 30 c

# множественное присвоение, распаковка переменной d
a = [5, 15, 15, 25, 35, 45, 55]

b = [10, 20, 30]
c = 'abcde'
d = list(zip(a, b, c))

a1, a2, a3 = zip(*d) # за счет: *d происходит распаковка.
print(a1, a2, a3) # (5, 15, 15) (10, 20, 30) ('a', 'b', 'c')