python如何“知道”如何处理“in”关键字?
我有点困惑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如何“知道”,通过提供一个variables我想分配一个variables的元组,并通过提供三个variables,我想分配每个值从元组的variables之一?
根据复合对账单文件 :
每个项目依次使用分配的标准规则分配给目标列表…
这些“标准规则”在转让声明文件中 ,具体为:
将对象分配给目标列表的recursion定义如下。
如果目标列表是单个目标:将对象分配给该目标。
如果目标列表是以逗号分隔的目标列表:对象必须是与目标列表中的目标相同数目的项目,并且项目从左到右分配给相应的目标。
所以,这种不同的行为,取决于你是分配给单个目标还是分配给目标列表,这个行为被直接引入到Python的基本原理中,并且适用于任何使用赋值的地方。
这不是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更多地知道如何处理分配:
- 分配一个元组到一个variables,或者
- 将一个元组分配给与元组中项目数相等的variables
这就是所谓的元组拆包 ,与in
关键字无关。
for
循环返回单个事物(在这种情况下是一个tuple
),然后该tuple
被分配到第二种情况下的单个项目或第一种情况下的多个项目。
如果您尝试指定不正确的variables数量:
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
迭代器在理论上返回一个单一的项目( for a in b
语法)。
编译器知道,如果你指定了多于一个的东西,那么一个返回值本身就是可迭代的,并且包含与你的variables列表相同数量的项目。 它会抛出一个运行时错误,如果你有for a, b in c
和for a, b in c
的元素不包含确切的两个项目。
所以总之“知道”是因为这是你所说的。 它会在运行时爆炸,如果你撒谎…