Python中的For循环:在for循环外继续迭代

问题描述 投票:0回答:2

我有一个包含 for 循环的函数。 a_laps 是 400 米一圈所需的时间(以秒为单位)。到目前为止我定义的函数是这样的:


LAP_DISTANCE = 400 

def log_track_run(a_laps, a_last_lap_distance):
    r_output = ""
    total_time = 0
    total_distance = 0
    n_laps = len(a_laps)
    i_lap = None
    average_lap_time = None

    for i_lap in range(n_laps):
        lap_time = a_laps[i_lap]
        total_time = total_time + lap_time
        total_distance = total_distance + LAP_DISTANCE
        average_lap_time = (total_time) / (i_lap + 1)
        r_output += f"lap #{i_lap + 1} time = {a_laps[i_lap]}s, average lap time ={round(average_lap_time)}s, {total_distance}m in {total_time}s\n"

如果 a_last_lap_distance = 400 且 a_laps = [68, 70, 74, 68],我得到以下输出,这是正确的输出:

lap #1 time = 68s, average lap time = 68s, 400m in 68s
lap #2 time = 70s, average lap time = 69s, 800m in 138s
lap #3 time = 74sdef log_track_run(a_laps, a_last_lap_distance):

如果a_last_lap_distance小于400,这意味着最后一圈没有完成,你不能只给i_lap加1,因为这一圈还没有完成。您必须添加 (a_last_lap_distance)/LAP_DISTANCE 才能获得与 400 的比率的单圈长度。我想仅更改 a_laps 范围内最后一项的迭代计算 - 在本例中,对于最后一圈所花费的时间68秒。

我尝试过以下功能:

def log_track_run(a_laps, a_last_lap_distance):
    r_output = ""
    total_time = 0
    total_distance = 0
    n_laps = len(a_laps)
    i_lap = None
    average_lap_time = None

    for i_lap in range(n_laps - 1 ):
        lap_time = a_laps[i_lap]
        total_time = total_time + lap_time
        total_distance = total_distance + LAP_DISTANCE
        average_lap_time = (total_time) / (i_lap + 1)
        r_output += f"lap #{i_lap + 1} time = {a_laps[i_lap]}s, average lap time = {round(average_lap_time)}s, {total_distance}m in {total_time}s\n"
    for i_lap in range(n_laps[-1]):
        lap_time = a_laps[i_lap]
        total_time = total_time + lap_time
        total_distance = total_distance + a_last_lap_distance
        average_lap_time = (total_time) / (i_lap + (a_last_lap_distance)/LAP_DISTANCE)
        r_output += f"lap #{i_lap + 1} time = {a_laps[i_lap]}s, average lap time {round(average_lap_time)}s, {total_distance}m in {total_time}s\n"

这会产生语法错误。如何修改该函数,以便第二个循环仅针对范围中的最后一项,同时基于前一个 for 循环中的前一个迭代?

我尝试编写第二个 for 循环,它基于前一个 for 循环,但仅适用于这一圈中的最后一个项目。

python string loops for-loop iteration
2个回答
1
投票

一个选项是填充一个列表

distances
,其中包含
len(a_laps)-1
last_distance/LAP_DIST
作为最后一个元素。然后,
zip
计算距离和时间,并计算运行平均值:

def log_track_run(a_laps, a_last_lap_distance):
    distances = [1] * (len(a_laps) - 1) + [a_last_lap_distance / LAP_DISTANCE]

    total_time = 0
    total_dist = 0

    for n, (dist, time) in enumerate(zip(distances, a_laps), 1):
        total_dist += dist
        total_time += time
        print(f'lap {n}: avg={total_time / total_dist}')

1
投票

我首先会建立一个时间和距离列表,其中我将使用参数

last_lap_distance_actual
last_lap_distance_expected
来弄清楚如何将最后一圈“标准化”为预期距离。

为了完整性,我将在这里设置一堆变量,以说明我们如何完成每一圈。可能有些你不需要。

def log_track_run(laps_times, last_lap_distance_actual=400, last_lap_distance_expected=400):
    total_time_actual = 0.0
    total_time_normalized = 0.0
    total_distance_actual = 0.0
    total_distance_normalized = 0.0
    total_laps_actual = 0.0
    total_laps_normalized = 0.0

    ## ---------------
    ## pre generate a list of times and distances
    ## ---------------
    lap_times_and_distances = [[lap_time, last_lap_distance_expected] for lap_time in laps_times]
    lap_times_and_distances[-1][1] = last_lap_distance_actual
    ## ---------------

    print("--------------------------")
    for lap_time_actual, lap_distance_actual in lap_times_and_distances:
        lap_count_actual = lap_distance_actual / last_lap_distance_expected

        lap_count_normalized = 1
        lap_time_normalized = lap_time_actual * last_lap_distance_expected / lap_distance_actual
        lap_distance_normalized = last_lap_distance_expected

        total_time_actual += lap_time_actual
        total_time_normalized += lap_time_normalized
        total_distance_actual += lap_distance_actual
        total_distance_normalized += lap_distance_normalized
        total_laps_actual += lap_count_actual
        total_laps_normalized += lap_count_normalized

        avg_lap_time_actual = total_time_actual / total_laps_actual
        avg_lap_time_normalized = total_time_normalized / total_laps_normalized

        print(f"Lap: {total_laps_actual:.2f} average lap time = {avg_lap_time_actual:.4f}s {int(total_distance_actual)}m in {total_time_actual:.4f}s")
        if last_lap_distance_expected != lap_distance_actual:
            print(f"\tThis lap was less than {last_lap_distance_expected}m. Projecting results.")
            print(f"\tLap: {total_laps_normalized:.2f} average lap time = {avg_lap_time_normalized:.4f}s {int(total_distance_normalized)}m in {total_time_normalized:.4f}s")
    print("--------------------------")

## a 1500m race outdoors
log_track_run([68, 70, 74, 68], 300)

## a 200m race indoors
log_track_run([26], 200, 200)

这应该给你:

--------------------------
Lap: 1.00 average lap time = 68.0000s 400m in 68.0000s
Lap: 2.00 average lap time = 69.0000s 800m in 138.0000s
Lap: 3.00 average lap time = 70.6667s 1200m in 212.0000s
Lap: 3.75 average lap time = 74.6667s 1500m in 280.0000s
        This lap was less than 400m. Projecting results.
        Lap: 4.00 average lap time = 75.6667s 1600m in 302.6667s
--------------------------

--------------------------
Lap: 1.00 average lap time = 26.0000s 200m in 26.0000s
--------------------------

如果需要,您可能会看到如何调整打印报表。

© www.soinside.com 2019 - 2024. All rights reserved.