代码之家  ›  专栏  ›  技术社区  ›  user225312

默认和非默认参数的顺序

  •  14
  • user225312  · 技术社区  · 15 年前

    在Python中,我理解默认参数位于末尾,非默认参数不能跟随默认参数。那很好。例如:

    >>> def foo(x=0, y):
            return x, y
    SyntaxError: non-default argument follows default argument
    

    果然没问题。

    第一个参数应该是默认参数 x 必须是第一个参数,其默认值应为0。

    有可能这样做吗?我问是因为即使在 range

    def range(start=0, end):
        pass
    

    那么这是如何做到的,如果不可能,这是如何实现的 范围 范围 举个例子,因为它完全符合我的问题。当然可以实现 范围 def range(end, start=0) ,但这不是重点。

    5 回复  |  直到 15 年前
        1
  •  10
  •   jw013    13 年前

    好, range 是可以做得稍微好一点的C代码。无论如何,你可以这样做:

    def range(start, stop=None):
        if stop is None: # only one arg, treat stop as start ...
            stop = start
            start = 0
        ...
    

    并相应地记录功能。

        2
  •  3
  •   Peter Shinners    15 年前

    有几种方法。第一种方法是在函数中切换参数,如果某些参数为“None”。这样就行了。

    def range1(value, end=None):
        if end == None:
            end = value
            value = 0
        return _generate_range_values(value, end)
    

    另一个主要方法是让您的函数获取它接收到的所有参数的列表。然后它可以根据参数的数量来决定要做什么。

    def range2(*args):
        if len(args) == 1:
            start = 0
            end = int(args[0])
        elif len(args) == 2:
            start = int(args[0])
            end = int(args[1])
        return _generate_range_values(start, end)
    

    第三种方法是鼓励用户将命名参数传递给函数,这样顺序就不那么重要了。

    def range3(end, start=0):
        return _generate_range_values(start, end)
    

    for i in range3(55, start=12)
    
        3
  •  2
  •   khachik    15 年前

    它不是由 range *args **args 把元组或字典当作你想要的。例如:

    def f(*args):
      if len(args) == 1:
         print "assuming the first is default"
      elif len(args) == 2:
         print "two arguments were passed"
      else:
         print "Complaining"
    
        4
  •  1
  •   Vince Spicer    15 年前

    def Range(start=0, end=None):
        if end is None:
            raise AttributeError("end value not specified")
         pass
    
        5
  •  1
  •   Steven Rumbalski    14 年前

    我没有射程的代码,但我确信它会执行这种把戏:

    def range(start, stop=None, step=1):
        if stop is None:
            start, stop = 0, start
        ...
    

    编辑: