这个循环如何工作?

时间:2011-12-27 19:36:57

标签: python for-loop

我正在尝试学习python,我正在阅读编程python这本书。我非常了解java所以我决定尝试python。我正在使用循环的示例,我对此代码中发生的事情感到困惑

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

我知道有两个循环,每次循环时person增加1,我不明白的是第二个循环中(name,value)发生了什么。 有人可以向我解释发生了什么事吗?

5 个答案:

答案 0 :(得分:8)

很可能它应该处理以下格式的三维列表:

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列表会将每个对解压缩为两个单独的变量:namevalue,稍后用于检查字段类型和打印值(如果它是名称字段)。

在结果中,此代码段将打印所有人的姓名。

答案 1 :(得分:3)

不,person每次循环都不会增加1。这不是一个数字。 person每次通过循环从people收到下一个项目。

第二个循环是相同的:person是一个列表(或其他序列),列表中的每次迭代都会从列表中检索一个项目。

person中的每个项目都是一个键值对,表示为两项列表(或其他序列;可能是一个元组),其中键为第一个,值为第二个。我们知道有两个项目,而不是迭代这个列表,我们可以将项目解包到变量namevalue(一个常见的Python习语)。

如果我们找到以“name”开头的键值对,那么我们找到了该人的姓名,因此我们将其打印出来。

这有点令人困惑,因为“name”这个词用于键值对的键以及我们正在寻找的键。如果我写这篇文章,我会使用“key”代替循环变量。

简而言之,people是一个列表清单。 people中的每个列表代表一个人,它本身就是一个键值对列表。每个键值对是两个项目的列表。外循环遍历人,内循环遍历人的键值对。

答案 2 :(得分:1)

假设person是元组/列表的列表,它正在提取第一个和第二个值。

它基本上与:

相同
for x in person:
    name = x[0]
    value = x[1]
    # or
    name, value = x

答案 3 :(得分:1)

for循环的格式为:

for vars in iterable:

和vars可以是任何可以出现在赋值语句左侧的东西。然后将迭代中的每个值分配给该左侧。

在Python中,您可以一次分配多个名称,在这种情况下,右侧必须是包含许多值的列表或元组:

a, b, c = 1, 2, 3

所以在你的for循环中,person中的每个值必须是一个元组或带有两个元素的列表,一对。循环的每次迭代,下一对被解压缩到namevalue

答案 4 :(得分:1)

简而言之,“name”和“value”从“person”中为“people”中的每个元素“person”分配值。

让我们稍微回顾一下。

for person in people:

遍历名为“people”的列表的元素。每次通过此循环时,名为“person”的变量将被分配名为“people”的列表中的下一个元素。

for (name, value) in person:

名为“person”的变量是一个列表,其中每个元素都是一个元组,其中包含两个名为“name”和“value”的变量。每次通过这个循环,当前的“人”列表元素被分成其组成部分,“名称”和“人”。

所以“人”看起来像

[person1, person2, person3, ...]

并且每个“人”看起来像

[(name1, value1), (name2, value2), (name3, value3), ...]