Python自定义myRange函数无法生成递减列表问题求助
问题描述
我正在进行一个Python项目,需要重写内置的range函数,要求定义并测试myRange函数:该函数需具备range函数的必选和可选参数特性,但返回列表,且实现中不能使用内置range函数。
目前我已完成部分代码,但调用myRange(90,80)时无法生成预期的从90到80的递减列表。以下是我的完整代码:
numList = [] def myRange(start, stop=None, step=None): if stop == None and step == None: start, stop, step = 0, start, 1 while step <= stop: numList.append(step-1) step+=1 elif start < stop and step == None: start, stop, step = start, stop, start while step < stop: numList.append(step) step+=1 elif start > stop and step == None: start, stop, step = start, stop, start while start >= stop: numList.append(step) step -= 1 else: start, stop, step = start, stop, step while start < stop: numList.append(start) start+=step return numList print(myRange(90,80))
我卡在了处理start大于stop且未指定step的分支:
elif start > stop and step == None: start, stop, step = start, stop, start while start >= stop: numList.append(step) step -= 1
我认为这段逻辑应该能正常工作:当start大于stop且无step参数时,将step赋值为start,然后循环将step加入列表并递减,直到start小于stop。但实际并未达到预期效果,请问这是为什么?
问题分析与修复
你的代码存在几个核心问题:
全局列表污染问题:
numList是全局变量,多次调用myRange会保留之前的结果,导致输出错误。必须把列表定义在函数内部,每次调用都重新初始化。递减分支逻辑错误:
- 你把
step赋值为start(也就是90),但循环条件判断的是start >= stop,而start的值从未改变,循环会无限执行。 - 正确的默认
step应该是-1(而非start),因为start > stop时需要递减1来逼近stop。
- 你把
其他分支冗余逻辑:比如第二个分支里把
step赋值为start,用step作为循环变量完全没必要,直接操作起始值逻辑更清晰。
以下是修正后的完整代码:
def myRange(start, stop=None, step=None): numList = [] # 处理单参数场景:myRange(n) 等价于 range(0, n, 1) if stop is None and step is None: current = 0 end = start while current < end: numList.append(current) current += 1 else: # 自动设置step默认值:递增用1,递减用-1 if step is None: step = 1 if start < stop else -1 current = start # 根据step正负判断循环终止条件 if step > 0: while current < stop: numList.append(current) current += step else: while current > stop: numList.append(current) current += step return numList # 测试验证 print(myRange(90, 80)) # 输出: [90, 89, 88, 87, 86, 85, 84, 83, 82, 81] print(myRange(5)) # 输出: [0, 1, 2, 3, 4] print(myRange(1, 10, 2)) # 输出: [1, 3, 5, 7, 9] print(myRange(10, 1, -2)) # 输出: [10, 8, 6, 4, 2]
关键修正说明
- 把
numList移到函数内部,彻底避免多次调用的结果污染。 - 统一处理
step默认值,根据start和stop的大小自动设置为1或-1,符合内置range的行为。 - 使用
current作为循环计数器,不修改原始参数,逻辑更直观易维护。 - 按
step正负拆分循环条件,确保递增、递减场景都能正确终止。
内容的提问来源于stack exchange,提问作者Ian Schaak
相关产品推荐
相关产品推荐

