我真的学会python了吗?在写这篇博客前,我问我自己
本来觉得python简单,就很少去纠结python语法的细节
直到今天,发现了自己C语言思维惯性导致的bug
这个bug产生的主要原因是对于python运算符or的理解
特地写下这篇博客,解释一下python中or和C语言中||的不同
先看python代码,
i = 1
if i == (2 or 3 or 1):
print("yes")
else:
print("not")
你觉得结果是什么呢,按C语言的思维套路,当然是输出yes了
但是结果是not
我一开始以为是自己C语言学忘记了,才出现这个错误,特地去C语言里验证了一下
由于pycharm不能编译C文件,我只好用实验室的服务器了。。。
先通过vim新建一个C文件
vim test.c
按a进入插入模式
输入
#include <stdio.h>
int i = 1;
void main()
{
if (i==(2||3||1))
printf("yes \n");
else
printf("not \n");
}
按esc ,在按:wq保存退出
命令行中输入
gcc test.c -o test1
生成可执行程序test1
我本以为,这里的C语言和上面的python在逻辑上是一样的。。。
但是,通过
./test1
运行的结果是yes,
这就有些神奇了。。。至少说明我C语言的逻辑。。。还没有忘记。。。
通过查阅资料,发现python的or
和C的||不太一样
具体规则如下
声明a=10,b=20
x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
所以在执行if i == (2 or 3 or 1):的时候
他会先计算2 or 3,结果为2,再计算2 or 1,结果为2,最后才是i == 2
当然输出的是not
顺便挂上and,not的具体规则
声明a=10,b=20
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
表格参考菜鸟教程