An Interesting Python Function

2019/08/07

Tags: python

这里看到的,感觉挺有意思的,记录一下。题目来自这里

如何让下面这个函数返回 True

1
2
3
4
5
def check(x):
    if x+1 is 1+x:
        return False
    if x+2 is not 2+x:
        return True

解法1: 自定义类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def check(x):
    if x+1 is 1+x:
        return False
    if x+2 is not 2+x:
        return False
    return True

class Test(int):
    def __add__(self, v):
        if v == 1:
            return 0
        else:
            return v

print(check(Test()))
# output: True

如果一个对象是在 + 的左侧,那会调用 __add__ ,如果在右侧,会调用 __radd__ 。上面的 Test 类继承自 int,重写了其中的 __add__ 方法,但是保留了 __radd__ ,所以上面的例子里面, Test()+1 会返回 0, 1+test() 会返回 1。 Test()+2 会返回 2, 2+Test() 也会返回 2。

解法2:特殊的整数

1
2
3
4
5
6
7
8
9
def check(x):
    if x+1 is 1+x:
        return False
    if x+2 is not 2+x:
        return False
    return True

print(check(-7))
# output: True

只有 -7 可以。python 里面对于 -5 - 256 这些整数会提前生成,这些都是单例。所以 -7+1 is 1-7False ,以及 -7+2 is not 2-7False ,两个 if 条件都不成立。

Comments