嵌套如果For循环中的循环不起作用(Python)

时间:2018-03-27 22:17:37

标签: python for-loop if-statement

我有以下循环似乎不起作用,我无法弄清楚为什么。首先是我的变量:

Joe_speed = 1.25  ##speed in m/s --> 4.5km/h = ((4.5*1000)/60)/60) = 1.25m/s
Jill_speed = 1.9
dog_speed = 5
total_distance = 5500 ## distance in meter between Joe and Jille when starting

JJtotal_speed = Joe_speed + Jill_speed
total_time = total_distance / JJtotal_speed ##time in seconds until meeting 
totaltime = int(total_time)
Jill_distance = total_time * Jill_speed
Joe_distance = total_time * Joe_speed
dog_start = total_distance


for i in range (1, (totaltime +1)*1000) : # multiplied by 1000 for milliseconds
    Jill_position = 0 + ((Jill_speed/1000) * i)
    Joe_position = total_distance - ((Joe_speed/1000) * i)
    dog_position = dog_start - ((dog_speed/1000) * i)
    if dog_position == Jill_position or dog_position == Joe_position:
        print("Hi")
    else:
        print("Ciao")   

我在for循环中的if循环似乎不起作用。不知何故,“Hi”和“Ciao”​​都没有被打印出来,即if循环没有发生?当我在for循环的末尾添加print(“...”)时(在底部的最左侧,正在打印。

有人可以帮我吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

最有可能的是,totaltime的值使得for循环永远不会被执行。您可以通过添加print语句作为for循环中的第一个语句进行检查。

<强> [更新]

根据您更新的代码,上面的答案是正确的。这是正在发生的事情:

  1. totaltime评估为1746年。
  2. 您的range上限为totaltime / 1000。在Python中分割两个整数时,结果是整数,由截断生成的浮点数创建。所以1746 / 1000在Python中是1
  3. 因此,您的范围是1比1,永远不会执行for循环。
  4. 您可以通过使表达式中的一个数字成为浮点数来避免整数截断问题(即,编写1000.0而不是1000,但这没有用,因为{{ 1}}需要整数参数。

答案 1 :(得分:1)

你的第一个问题是,如果totaltime是1746,那么(totaltime +1) //1000)就是1.所以你循环range(1, 1),这意味着你根本就没有循环。< / p>

你的第二个问题是尺度完全没有,可能是因为你有一个*/混在一起。每个人都在移动得如此缓慢,以至于在乔遇见吉尔之前需要花费大量的步骤。

但即使你忽略了你的totaltime并添加了大量的步骤,他们也都不会遇到你的狗。他们没有连续移动,他们正在离散地移动。所以乔最终会在两步之间穿过狗的位置。

尝试添加print来调查每个步骤中的所有三个位置,您将看到所有这些问题。

即使您调整了数字,以便其中一个人应该完全按照其中一个步骤与狗会面,但它可能仍然失败。你正在使用花车。大多数实数不能完全表示为浮点数,因此两个不同的计算结果在理想数学中应该都达到900.0可能会超过900,而浮点数学则不到900。您可以使用math.isclose代替==来解决此问题。但无论如何你需要解决以前的问题,这样做可以解决这个问题。

那么,在解决前两个问题的计算后,你怎么解决最后两个问题呢?您需要以适当的方式使用<=>=,而不是==。这可能意味着要记录上次循环结果。如果Joe&lt;狗现在,但乔&gt;狗步前,他们互相交叉。这就是你需要测试的东西。