Как это работает для цикла? - PullRequest
3 голосов
/ 27 декабря 2011

Я пытаюсь выучить питон и прохожу через книгу программирование на питоне. Я знаю Java очень хорошо, поэтому я решил попробовать Python. Я рассматриваю пример с использованием циклов, и я не понимаю, что происходит в этом коде

for person in people:
  for (name, value) in person:
    if name == 'name': print(value)

Я знаю, что есть два цикла, и значение person увеличивается на 1 каждый раз, когда оно проходит, я не понимаю, что происходит с (имя, значение) во втором цикле. Может кто-нибудь объяснить мне, что происходит?

Ответы [ 5 ]

8 голосов
/ 27 декабря 2011

Скорее всего, он должен иметь дело с трехмерным списком следующего формата:

people = [
    [['name', 'John'], ['age', 21]],
    [['name', 'Ann'],  ['age', 45]],
    [['name', 'Tom'],  ['age', 32]],
]

for person in people:
  # person is like [['name', 'Ann'],  ['age', 45]] here
  for (name, value) in person:
    # unpack [field_name, field_value] to name = field_name, value = field_value
    # so name is like 'name' (or 'age') and value is like 'Ann' (or 45)
    if name == 'name': print(value)

Информация для каждого человека хранится в списке пар. Итерация по этому списку person таким способом распаковывает каждую пару в две отдельные переменные: name и value, которые позже используются для проверки типа поля и печати значения, если это поле имени.

В результате этот фрагмент будет печатать имена всех людей.

3 голосов
/ 27 декабря 2011

Нет, person не увеличивается на 1 каждый раз в цикле. Это не число. person получает следующий элемент из people каждый раз через цикл.

Второй цикл такой же: person - это список (или другая последовательность), и каждая итерация по списку извлекает один элемент из списка.

Каждый элемент в person представляет собой пару ключ-значение, представленную в виде списка из двух элементов (или другой последовательности; вероятен кортеж) с ключом первым и значением вторым. Вместо того, чтобы перебирать этот список, так как мы знаем, что есть два элемента, мы можем распаковать элементы в переменные name и value (общая идиома Python).

Если мы найдем пару ключ-значение, которая начинается с «имени», то мы нашли имя человека, поэтому распечатаем его.

Это немного сбивает с толку, потому что слово "имя" используется для ключа пары ключ-значение, а также для ключа, который мы ищем. Если бы я писал это, я бы использовал вместо этого «ключ» для переменной цикла.

Короче говоря, people - это список списков. Каждый список в people представляет человека и сам является списком пар ключ-значение. Каждая пара ключ-значение представляет собой список из двух элементов. Внешний цикл перебирает людей, внутренний цикл перебирает пары ключ-значение в человеке.

1 голос
/ 27 декабря 2011

Короче говоря, «name» и «value» получают присвоенные значения от «person» для каждого элемента «person» в «people».

Давайте немного вернемся назад.

for person in people:

перебирает элементы списка с именем "people".При каждом прохождении этого цикла переменной с именем person присваивается следующий элемент из списка с именем people.

for (name, value) in person:

Переменная с именем person представляет собой список, в котором каждый элемент является кортежем.с двумя переменными с именем «имя» и «значение».При каждом прохождении этого цикла текущий элемент списка «person» разделяется на составные части: «name» и «people».

Таким образом, «people» выглядит как

[person1, person2, person3, ...]

и каждый "человек" выглядит как

[(name1, value1), (name2, value2), (name3, value3), ...]
1 голос
/ 27 декабря 2011

Цикл for имеет форму:

for vars in iterable:

, и переменные могут быть любым, что может появиться в левой части оператора присваивания.Затем каждое значение из итерируемого присваивается этой левой стороне.

В Python вы можете назначить сразу несколько имен, в этом случае правая часть должна быть списком или кортежем сстолько значений:

a, b, c = 1, 2, 3

Так что в вашем цикле for каждое значение от person должно быть кортежем или списком с двумя элементами, парой.На каждой итерации цикла следующая пара распаковывается в name и value.

1 голос
/ 27 декабря 2011

Предполагая, что person - это список кортежей / списков, для которых он извлекает первое и второе значение.

Это в основном так же, как:

for x in person:
    name = x[0]
    value = x[1]
    # or
    name, value = x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...