You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:11:19