考虑以下代码片段:
cur = 1176
allowed = {1, 3, 4, 9}
r = [digit in allowed for block in divmod(cur, 60) for digit in divmod(block, 10)]
以上返回[True, True, True, False]
。
我不明白第三行是干什么的。在我看来,它甚至不应该起作用,因为第一个divmod
将返回一个2-元组,这将是第二个divmod
的第一个参数,而这个内置不能接受这种类型的组合,例如
divmod(divmod(cur, 60), 10)
TypeError: unsupported operand type(s) for divmod(): 'tuple' and 'int'
这里发生了什么?
divmod(1176, 60)
给我们(19, 36)
。然后,这些按以下顺序传递到第二个divmod
:
divmod(19, 10)
给了我们(1, 9)
divmod(36, 10)
给了我们(3, 6)
然后检查新序列,看看它们是否在allowed
:中
1 in {1, 3, 4, 9}
=>真9 in {1, 3, 4, 9}
=>真3 in {1, 3, 4, 9}
=>真6 in {1, 3, 4, 9}
=>错误
所以得到的列表是[True, True, True, False]
。
实际操作顺序如下:
-
divmod(1176, 60)
给我们(19, 36)
-
divmod(19, 10)
为我们提供(1, 9)
1 in {1, 3, 4, 9}
=>真9 in {1, 3, 4, 9}
=>真
-
divmod(36, 10)
给了我们(3, 6)
3 in {1, 3, 4, 9}
=>真6 in {1, 3, 4, 9}
=>错误
-