python如何“知道”如何处理“in”关键字?

时间:2015-08-03 21:17:34

标签: python

我对python中的“in”关键字感到有点困惑。

如果我采用元组的样本列表:

data = [
    (5, 1, 9.8385465),
    (10, 1, 8.2087544),
    (15, 1, 7.8788187),
    (20, 1, 7.5751283)
]

我可以做两个不同的“for-in”循环并得到不同的结果:

for G,W,V in data:
    print G,W,V

这会在一行上打印每组值,例如5, 1, 9.8385465

for i in data:
    print i

这会打印整个元组,例如: (5, 1, 9.8385465)

python如何“知道”通过提供一个变量我想将元组分配给变量,并且通过提供三个变量,我想将元组中的每个值分配给其中一个变量?

4 个答案:

答案 0 :(得分:36)

根据the for compound statement documentation

  

依次使用标准将每个项目分配到目标列表   作业规则......

那些“标准规则”位于the assignment statement documentation,具体为:

  

将对象分配给目标列表以递归方式定义为   如下:

     
      
  • 如果目标列表是单个目标:将对象分配给该目标。

  •   
  • 如果目标列表是以逗号分隔的目标列表:对象必须是具有与目标相同数量的项目的可迭代项   在目标列表中,项目从左到右分配到   相应的目标。

  •   

因此,根据您是分配给单个目标还是目标列表,这种不同的行为会直接进入Python的基础,并适用于使用任务的任何位置。

答案 1 :(得分:23)

这不是in关键字的功能,而是Python语言的功能。同样适用于作业。

x = (1, 2, 3)
print(x)
>>> (1, 2, 3)

a, b, c = (1, 2, 3)
print(a)
>>> 1
print(b)
>>> 2
print(c)
>>> 3

所以为了回答你的问题,当你要么Python知道如何处理任务时更是如此:

  • 将一个元组分配给变量,或
  • 将一个元组分配给多个等于元组中项目数的变量

答案 2 :(得分:12)

它名为tuple unpacking,与in关键字无关。

for循环返回单个内容(在这种情况下为tuple),然后将tuple分配给第二个案例中的单个项目,或多个项目在第一种情况下。

如果您尝试指定不正确的变量数:

for G,W in data:
    print G,W

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

答案 3 :(得分:3)

迭代器在概念上返回单个项(for a in b语法)。

编译器知道如果为a指定多个内容,则返回的一个值本身必须是可迭代的,并且包含与变量列表相同数量的项。如果您有for a, b in c并且c的元素不包含恰好两个项目,则会抛出运行时错误。

简而言之,它“知道”,因为这就是你所说的。如果你撒谎,它会在运行时爆炸......