本教程旨在解决python电梯模拟中,如何将起始楼层设置为0(大堂)的问题。通过分析现有代码的循环和打印逻辑,我们将展示只需简单修改初始楼层变量,即可使模拟系统完美支持0层起始,并正确显示楼层变化及抵达信息,无需对核心移动函数进行额外改动。
1. 问题背景与原始代码分析
在许多建筑中,大堂层通常被标识为0层,而非传统的1层。当我们构建一个模拟电梯系统时,往往需要使其符合这种现实世界的约定。假设我们有以下python电梯模拟代码,它能够控制电梯上下移动并打印当前楼层:
def goDownfloor(current, target): for floor in range(current, target, -1): current -= 1 if floor != target + 1: print(f"current floor is {current}.") else: print(f"Arrived at the {target} . Goodbye.") return current def goUpfloor(current, target): for floor in range(current, target): current += 1 if floor != target - 1: print(f"current floor is {current}.") else: print(f"Arrived at the {target} . Goodbye.") return current currentFloor = 1 # 初始楼层设置为1 while(True): targetFloor = int(input("Enter the floor you want to go to (enter -100 for outages):")) if targetFloor == -100: break else: if targetFloor > currentFloor: currentFloor = goUpfloor(currentFloor, targetFloor) elif targetFloor < currentFloor: currentFloor = goDownfloor(currentFloor, targetFloor) elif targetFloor == currentFloor: print('Please re-enter another floor.')
这段代码在初始设定 currentFloor = 1 时工作正常。然而,当尝试将其改为 currentFloor = 0 时,一些开发者可能会遇到困惑,认为需要修改 goUpfloor 或 goDownfloor 函数内部的逻辑。实际上,原有的循环和打印机制已经足够灵活,可以自然地适应0层起始。
2. 解决方案:初始化为0层
要使电梯模拟从0层(大堂)开始,并正确处理所有楼层,我们只需对代码进行一个简单的修改:将 currentFloor 的初始值从 1 改为 0。
currentFloor = 0 # 将初始楼层设置为0
完整的修改后代码如下:
def goDownfloor(current, target): for floor in range(current, target, -1): current -= 1 if floor != target + 1: print(f"current floor is {current}.") else: print(f"Arrived at the {target} . Goodbye.") return current def goUpfloor(current, target): for floor in range(current, target): current += 1 if floor != target - 1: print(f"current floor is {current}.") else: print(f"Arrived at the {target} . Goodbye.") return current currentFloor = 0 # 核心修改:初始楼层设为0 while(True): targetFloor = int(input("Enter the floor you want to go to (enter -100 for outages):")) if targetFloor == -100: break else: if targetFloor > currentFloor: currentFloor = goUpfloor(currentFloor, targetFloor) elif targetFloor < currentFloor: currentFloor = goDownfloor(currentFloor, targetFloor) elif targetFloor == currentFloor: print('Please re-enter another floor.')
3. 楼层显示逻辑详解
为什么仅仅修改 currentFloor = 0 就能奏效,而不需要改动 goUpfloor 或 goDownfloor 函数内部的逻辑呢?这主要得益于Python range() 函数的特性以及代码中巧妙的打印条件。
立即学习“Python免费学习笔记(深入)”;
3.1 goUpfloor 函数分析
以 goUpfloor(0, 3) 为例,目标是从0层上升到3层:
- for floor in range(0, 3): range(0, 3) 会生成序列 0, 1, 2。注意,range 函数是左闭右开的,不包含终点。
- 第一次循环 (floor = 0):
- current += 1:current 从0变为1。
- if floor != target – 1 (即 0 != 3 – 1,0 != 2):条件为真。
- print(f”current floor is {current}.”):输出 “current floor is 1.”
- 第二次循环 (floor = 1):
- current += 1:current 从1变为2。
- if floor != target – 1 (即 1 != 3 – 1,1 != 2):条件为真。
- print(f”current floor is {current}.”):输出 “current floor is 2.”
- 第三次循环 (floor = 2):
- current += 1:current 从2变为3。
- if floor != target – 1 (即 2 != 3 – 1,2 != 2):条件为假。
- 进入 else 分支:print(f”Arrived at the {target} . Goodbye.”):输出 “Arrived at the 3 . Goodbye.”
可以看到,current += 1 操作先于打印,因此 print(f”current floor is {current}.”) 总是显示电梯即将抵达或已经抵达的下一层。当 floor 达到 target – 1 时,表示这是 range 中的最后一个迭代值,此时 current 已经更新为 target,因此打印 “Arrived at…” 是正确的。
3.2 goDownfloor 函数分析
以 goDownfloor(3, 0) 为例,目标是从3层下降到0层:
- for floor in range(3, 0, -1): range(3, 0, -1) 会生成序列 3, 2, 1。
- 第一次循环 (floor = 3):
- current -= 1:current 从3变为2。
- if floor != target + 1 (即 3 != 0 + 1,3 != 1):条件为真。
- print(f”current floor is {current}.”):输出 “current floor is 2.”
- 第二次循环 (floor = 2):
- current -= 1:current 从2变为1。
- if floor != target + 1 (即 2 != 0 + 1,2 != 1):条件为真。
- print(f”current floor is {current}.”):输出 “current floor is 1.”
- 第三次循环 (floor = 1):
- current -= 1:current 从1变为0。
- if floor != target + 1 (即 1 != 0 + 1,1 != 1):条件为假。
- 进入 else 分支:print(f”Arrived at the {target} . Goodbye.”):输出 “Arrived at the 0 . Goodbye.”
同样,current -= 1 操作先于打印,print(f”current floor is {current}.”) 显示的是电梯下降后的当前层。当 floor 达到 target + 1 时,表示这是 range 中的最后一个迭代值,此时 current 已经更新为 target,打印 “Arrived at…” 也是正确的。
4. 注意事项与总结
- range() 函数的包容性: 理解 range(start, stop, step) 在生成序列时不包含 stop 值是关键。这使得循环体内部对 current 的最终更新恰好能达到 target。
- 打印时机: current += 1 或 current -= 1 发生在 print 语句之前,确保了打印出的 current 值是电梯移动后的新楼层。
- 条件判断的巧妙: if floor != target – 1 (上升) 和 if floor != target + 1 (下降) 精确地判断了当前迭代是否是到达目标楼层前的最后一步。这使得中间楼层和最终抵达信息能够被正确区分和显示。
通过这个案例,我们看到,有时一个看似复杂的需求(如将起始楼层改为0)可以通过对现有代码的深入理解和微小调整来解决,而无需进行大规模的重构。这种对代码逻辑的精确把握是编写高效、可维护程序的关键。
评论(已关闭)
评论已关闭