你不能。默认参数必须位于参数列表的最后。如果您想要不同的行为,那么您必须在函数内部进行验证。def primes_in_interval(start=2, end=None): assert(end is not None) # Rest of code.primes_in_interval(end=10)您可以执行类似的操作来获取您正在寻找的调用约定。def primes_in_interval(end_or_start, end=None): if end is None: start = 2 end = end_or_start else: start = end_or_start end = end # Rest of code.primes_in_interval(10) # Start will be 2 and end 10primes_in_interval(8, 16) # Start will be 8 and end 16
你不能。range定义参数的方式是内置range的,并且使用不同的解析参数的方式,大致相当于接收*args, **kwargs和手动解析它们(它手动拒绝非空kwargs,但仍然必须接受它们,因为CPython 的 C API 的约定)。如果你想自己做,也可以,但 Python 没有帮助:def myrange(*args): if not args or len(args) > 3: raise TypeError("Expected 1-3 args") if len(args) == 1: start, step = 0, 1 stop, = args else: start, stop, step = (args + (1,))[:3] # Stupid trick to reduce number of cases # Actual work done here