print(“ YNEOS” [(w%2)|(w <= 2):: 2]的工作方式

时间:2018-06-29 04:35:34

标签: python-3.x

我只是想解决this problem on Codeforces:检查是否可以将数字w(1≤w≤100)分解为2个偶数之和

我解决了问题,并开始寻找其他解决方案。我找到了解决方法:

w=int(input())
print("YNEOS"[(w%2)|(w<=2)::2])

花了一半的时间来解决问题,然后才解决。不幸的是,我没有得到它的工作方式以及为什么它比我的快。我的解决方法是:

n = int(input())
if (n-2)%2==0 and n > 2:
    print("YES")
else:
    print("NO")

我是python的初学者。因此,如果我得到正确的解释,这对我将非常有帮助。

1 个答案:

答案 0 :(得分:0)

::部分称为slicing。通用语法为start:stop[:step],它将从原始索引中创建一个新的数组或字符串,从索引start before stop,每step (默认= 1)。它实际上是slice(start, stop, step)的语法糖,它返回slice object。如果省略stop,则将提取到字符串末尾的所有元素

您可能需要阅读An Informal Introduction to Python以获得有关切片的更多信息


现在(w%2)|(w<=2)计算开始索引。 |bitwise-OR operatorw<=2是布尔表达式,但在Python "Booleans are a subtype of integers"中,因此True和False分别转换为1和0

  • 如果w是奇数数字,则w % 2 == 1。无论剩下的部分如何,在这种情况下,(w%2)|(w<=2)都将始终为1,并且表达式变为"YNEOS"[1::2],该表达式将占用从索引1开始的字符串中的第二个字母。结果是字符串NO
  • 如果w是偶数数字,则w % 2 == 0。根据问题描述1 ≤ w ≤ 100,唯一有效的偶数属于[2,100]范围
    • 如果w == 2,则w <= 2返回1,输出为NO,如上
    • 如果w > 2,则(w%2)|(w<=2)的两面均为0,而"YNEOS"[0::2]则采用第一个,第三个和第5个字母,即YES

意识到表达式总是返回0或1,我们将有一个更易读的解决方案,它使用直接寻址而不是切片

w=int(input())
print(['YES', 'NO'][(w % 2) | (w <= 2)])

顺便说一句,您有一个多余的减法:(n-2)%2==0n % 2 == 0完全相同