列表推导式和%函数

3
当我使用以下代码时:
[i for i in range(-9, 10, 2) if not i%3)] 

它提供了

> (-9, -3, 3, 9)

为什么会得到那个答案?'i%3'是什么意思?
谢谢。

mylist = [] 是多余的。我正在删除它。 - jamylak
2个回答

5
在您的例子中,%取模运算符a % b 返回a / b 的余数。
因此,在您的示例中,循环执行以下操作:
[-9, -7, -5, -3, -1, 1, 3, 5, 7, 9]
-9 % 3等于0,因为-9可以被3整除,所以没有余数。然而,5 % 3的结果是2,因为3可以整除5一次,所以5 - 3 == 2not i % 3有点棘手。首先,计算i % 3。如果结果大于0,则视为Truenot是一个布尔运算符,它得到布尔值的反义。所以not TrueFalsenot False is True)。 0被认为是False,所以如果i % 3 == 0,那么i将包含在新列表中。
现在,print("%s %s", ("hello", "world"))输出"hello world"的原因是因为这不是模运算符。这是字符串格式化。文档会比我解释得更好:p。只是碰巧使用了%

2

i%3 是将 i 除以 3 的余数。但是,它会被 not 运算符转换为布尔值(true/false);Python 通过使 0 为 false,任何其他数字为 true 来实现这一点。因此,只有当 i%3 为 0 时,not i%3 才为 true;换句话说,当 i 可以被 3 整除时,它才为 true。

range(-9,10,2) 产生从 -9 开始以 2 递增的整数,只要它们小于 10。换句话说,它产生了介于 -9 和 +9 之间的奇数整数。因此,选择在 -9 和 +9 之间可被 3 整除的奇数整数的组合,这些整数恰好是你展示的整数 (-9, -3, 3, 9)


“%” 的定义是它是一个除数吗? - Emma
@Haidro 或 rici,你们能解释一下为什么这个代码:print("%s %s", ("hello", "world"))会输出 hello world 吗? - Emma
@Emma,我可以在那个问题上发布一个答案吗? - TerryA
是的,你可以随意做!感谢你的帮助,希望这些问题不太愚蠢。 - Emma
@Emma 对于每个对象,% 的行为可以进行自定义。对于数字,它作为模数,对于字符串,它执行旧的字符串格式化。我建议使用新的字符串格式化 '{0}'.format(1),而不是 %d' % 1 - jamylak
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接