如何定义类似Python range的参数形式自定义函数?
实现类似Python内置range的函数(单/双参数版本)
你需要实现一个函数,行为和Python内置range的前两种调用方式一致:
- 仅传入1个参数时,该参数为必选的
stop,start默认取0 - 传入2个参数时,第一个为
start,第二个为stop
下面提供两种实用的实现方案:
方案1:使用默认参数判断
这种方式通过给start设置默认值,在函数内部根据参数是否传入区分逻辑,代码直观易懂:
def my_range(start=None, stop=None): # 处理单参数情况:参数赋值给stop,start设为0 if stop is None: stop = start start = 0 # 生成序列(这里用列表返回,也可改成生成器) result = [] current = start while current < stop: result.append(current) current += 1 return result
测试调用
# 单参数:stop=5,start默认0 print(my_range(5)) # 输出: [0, 1, 2, 3, 4] # 双参数:start=1,stop=5 print(my_range(1, 5)) # 输出: [1, 2, 3, 4]
方案2:使用*args处理参数(更贴近内置range逻辑)
这种方式通过可变参数*args接收所有传入的参数,严格控制参数数量,和内置range的参数校验逻辑更一致:
def my_range(*args): # 校验参数数量 if len(args) == 1: start = 0 stop = args[0] elif len(args) == 2: start, stop = args else: raise TypeError(f"my_range expected 1 or 2 arguments, got {len(args)}") # 使用生成器返回(惰性求值,和内置range一致) current = start while current < stop: yield current current += 1
测试调用
# 单参数调用 print(list(my_range(5))) # 输出: [0, 1, 2, 3, 4] # 双参数调用 print(list(my_range(1, 5))) # 输出: [1, 2, 3, 4] # 传入3个参数会抛出错误 my_range(1, 5, 2) # 抛出 TypeError: my_range expected 1 or 2 arguments, got 3
扩展:支持step参数
如果需要和内置range完全一致,支持可选的step参数,可以扩展*args的判断逻辑:
def my_range(*args): if len(args) == 1: start = 0 stop = args[0] step = 1 elif len(args) == 2: start, stop = args step = 1 elif len(args) == 3: start, stop, step = args if step == 0: raise ValueError("my_range() step argument must not be zero") else: raise TypeError(f"my_range expected 1, 2 or 3 arguments, got {len(args)}") current = start # 根据step正负判断循环条件 if step > 0: while current < stop: yield current current += step else: while current > stop: yield current current += step
测试step参数
print(list(my_range(0, 10, 2))) # 输出: [0, 2, 4, 6, 8] print(list(my_range(10, 0, -2))) # 输出: [10, 8, 6, 4, 2]
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

