jcpython2 发表于 2022-9-12 23:00:28

这两段代码那段更高效?

有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。

输入输入一行,包括两个整数x、y,以一个空格分开,表示坐标(x,y)。输出输出一行,如果点在正方形内,则输出yes,否则输出no。样例输入

1 1
样例输出

yes


temp = input().split()
a,b = int(temp),int(temp)
if -1 <= a <= 1 and -1 <= b <= 1:
    print('yes')
else:
    print('no')

s=input().split()

x=float(s)

y=float(s)

if x>1 or x<-1 or y>1 or y<-1:

    print("no")

else:

    print("yes")


第一段代码我写的,判断ab同时满足条件才输出,第二段代码网上看到的,理论上if x>1 or x<-1 or y>1 or y<-1大部分情况不需要跑完就跳到else结果,这样效率更高?是吗?

而我写的and,代码必须完全跑完,理论上效率比第二段高,以后优先第二段代码这种写法??

lightninng 发表于 2022-9-12 23:29:24

我们假设需要判断的点,平均分布在在由正方形四个边分割出的9个区域里面,再简化一点,每个区域有一个点。
那么第一段代码,9个点中:左侧3个点,各需要判断1次;右侧3个点,各需要判断2次;中间三个点,从上往下依次要判断4,4,3次
那么第二段代码,9个点中:左侧3个点,各需要判断2次;右侧3个点,各需要判断1次;中间三个点,从上往下依次要判断3,4,4次

在需要判断的点按照我上面说的方式平均分布时,两者效率没有本质区别。
上述两种写法,其实第一种是四个条件做且运算,第二种是四个条件做或运算,没记错的高中学过其实【两个条件做且运算的结果】等于这【两个条件做否运算后做或运算的结果在做否运算】,所以是可以相互转化的
虽然没有验证,但是我大胆猜测,上述两种写法中的条件,做或运算或者且运算的四个条件改变顺序后,当待判断点平均分不时,判断的次数依然相同。
以上~~~~
如果楼主有兴趣验证了,发现了错误,请来告知,谢谢拉~~~

Twilight6 发表于 2022-9-13 07:53:22


and 和 or 都有短路逻辑,只要一次条件不满足 True,即当条件为 False 时

就直接短路后续条件,返回 False,除非 and 遇到的都是 True ,就需要将所有条件全部判断完

但 or 只要有一次条件为 True ,就短路后续判断,若 or 条件一直返回 False ,那么就需要全部判断完

只是较区间来说,你是判断点是在正方形内区间,而第二段代码是判断点是在正方形外

假设坐标点在 -100, 100 这个区间,那么你的点面积只占了一小部分,绝大多数都是正方形外的点

jcpython2 发表于 2022-9-13 17:03:43

lightninng 发表于 2022-9-12 23:29
我们假设需要判断的点,平均分布在在由正方形四个边分割出的9个区域里面,再简化一点,每个区域有一个点。
...

你说的思路和理论我理解不到,我先记下来以后学深了再回味下

jcpython2 发表于 2022-9-13 17:04:25

Twilight6 发表于 2022-9-13 07:53
and 和 or 都有短路逻辑,只要一次条件不满足 True,即当条件为 False 时

就直接短路后续条件,返回 F ...

我就是理解到短路逻辑那里

但你说的我第二段是判断正方形外来判断,这个我还真没想过,我以为都在判断正方形内
页: [1]
查看完整版本: 这两段代码那段更高效?