为何满足break条件时列表仍追加元素?输出出现1.0的原因
问题分析与解决
问题背景
编写了一段Python代码,循环计算角度的正弦值并存入列表,期望当正弦值y > 0.9999时终止循环,但发现满足条件的元素仍被添加到列表中,且Y列表出现了1.0,修改判断条件为y >= 0.9999也无法解决。
原代码
from math import sin, pi X = [] Y = [] x = 0 y = 0 while True: x += 1 X.append(x) y = sin(x * pi / 180) Y.append(y) if y > 0.9999: print(f"breaking on y = {y}") break print(f"sin {x} degree = {y}") print(f"List X = {X}") print(f"List Y = {Y}")
运行输出
sin 1 degree = 0.01745240643728351 sin 2 degree = 0.03489949670250097 ... sin 89 degree = 0.9993908270190958 sin 90 degree = 0.9998476951563913 breaking on y = 1.0 List X = [0, 1, 2,... 89, 90] List Y = [0.01745240643728351, 0.03489949670250097,... 0.9998476951563913, 1.0]
核心原因
- 逻辑顺序错误:代码中先将
x和计算出的y添加到列表,再进行终止条件判断。这意味着即使y满足>0.9999,该次循环的元素已经被存入列表,之后才会触发break,所以满足条件的元素必然出现在结果里。 - 90度正弦值的精确计算:数学上
sin(90°)=1.0,Python的math.sin对sin(π/2)可以精确计算出1.0。而90度之前的角度(比如89度)正弦值约为0.99939,90度的正弦值实际为1.0(输出可能存在笔误),之前的数值都不满足>0.9999,所以循环会继续到x=90时计算出1.0,触发终止条件,但此时元素已经被添加到列表。
解决方法
调整逻辑顺序,先计算并判断终止条件,再将元素添加到列表。这样当满足条件时,直接终止循环,不会将该元素存入列表。
修改后的代码:
from math import sin, pi X = [] Y = [] x = 0 while True: x += 1 y = sin(x * pi / 180) # 先判断是否触发终止 if y > 0.9999: print(f"breaking on y = {y}") break # 不满足条件才添加元素并打印 X.append(x) Y.append(y) print(f"sin {x} degree = {y}") print(f"List X = {X}") print(f"List Y = {Y}")
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

