Кортеж для распаковки
Я наткнулся на следующий код:
for i,a in enumerate(attributes):
labels.append(Label(root, text = a, justify = LEFT).grid(sticky = W))
e = Entry(root)
e.grid(column=1, row=i)
entries.append(e)
entries[i].insert(INSERT,"text to insert")
Я не понимаю, что "i, a" и поиск google для информации о "for" - это боль в заднице, и когда я пытаюсь и экспериментирую с кодом, я получаю ошибку:
ValueError: требуется больше 1 значения для распаковки
Кто-нибудь знает, что он делает или что-то с этим делать, чтобы я мог google узнать больше?
Ответы
Ответ 1
Вы можете использовать Google для "распаковки кортежа". Это можно использовать в разных местах на Python. Самое простое в назначении
>>> x = (1,2)
>>> a, b = x
>>> a
1
>>> b
2
В цикле for работает аналогично. Если каждый элемент итерабельного является кортежем, то вы можете указать две переменные, и каждый элемент цикла будет распакован на два.
>>> x = [(1,2), (3,4), (5,6)]
>>> for item in x:
... print "A tuple", item
A tuple (1, 2)
A tuple (3, 4)
A tuple (5, 6)
>>> for a, b in x:
... print "First", a, "then", b
First 1 then 2
First 3 then 4
First 5 then 6
Функция перечисления создает итерабельность кортежей, поэтому ее можно использовать таким образом.
Ответ 2
Перечисление в основном дает вам индекс для работы в цикле for. Итак:
for i,a in enumerate([4, 5, 6, 7]):
print i, ": ", a
Будет напечатан:
0: 4
1: 5
2: 6
3: 7
Ответ 3
Возьмите этот код в качестве примера:
elements = ['a', 'b', 'c', 'd', 'e']
index = 0
for element in elements:
print element, index
index += 1
Вы перебираете список и сохраняете индексную переменную. enumerate()
делает то же самое, но более кратко:
elements = ['a', 'b', 'c', 'd', 'e']
for index, element in enumerate(elements):
print element, index
Обозначение index, element
требуется, потому что enumerate
возвращает кортеж ((1, 'a')
, (2, 'b')
,...), который распаковывается на две разные переменные.
Ответ 4
[i for i in enumerate(['a','b','c'])]
Результат:
[(0, 'a'), (1, 'b'), (2, 'c')]
Ответ 5
Функция enumerate
возвращает объект-генератор, который на каждой итерации дает кортеж, содержащий индекс элемента (i
), нумеруемый начиная с 0
по умолчанию, в сочетании с самим элементом (), а цикл for
позволяет вам получить доступ к обоим полям сгенерированных кортежей и присвоить им имена переменных.