我正在尝试学习python,我正在阅读编程python这本书。我非常了解java所以我决定尝试python。我正在使用循环的示例,我对此代码中发生的事情感到困惑
for person in people:
for (name, value) in person:
if name == 'name': print(value)
我知道有两个循环,每次循环时person增加1,我不明白的是第二个循环中(name,value)发生了什么。 有人可以向我解释发生了什么事吗?
答案 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
列表会将每个对解压缩为两个单独的变量:name
和value
,稍后用于检查字段类型和打印值(如果它是名称字段)。
在结果中,此代码段将打印所有人的姓名。
答案 1 :(得分:3)
不,person
每次循环都不会增加1。这不是一个数字。 person
每次通过循环从people
收到下一个项目。
第二个循环是相同的:person
是一个列表(或其他序列),列表中的每次迭代都会从列表中检索一个项目。
person
中的每个项目都是一个键值对,表示为两项列表(或其他序列;可能是一个元组),其中键为第一个,值为第二个。我们知道有两个项目,而不是迭代这个列表,我们可以将项目解包到变量name
和value
(一个常见的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中的每个值必须是一个元组或带有两个元素的列表,一对。循环的每次迭代,下一对被解压缩到name
和value
。
答案 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), ...]