Python方法如何处理任意参数?

时间:2016-01-20 03:27:36

标签: python parameter-passing

我将使用key.get_pressed()函数作为此问题的主要示例。

我经常使用range来生成数字列表。但是,我经常使用不同的参数,特别是不同的NUMBER个参数。这让我想知道range如何轻松处理不同数量的参数并将它们分配给各自的值(如果它们代表最高值,或最小值,或值之间的间隔)。 range如何做到这一点?它是否使用range语句来处理每个场景,还是有更有效的方法?

3 个答案:

答案 0 :(得分:2)

在更高级别,Python允许您将函数定义为:

def foo(*args, **kwargs)

这种抽象定义形式允许任意数量的参数。然后,实现是开发人员的选择。范围函数原型是:

 range(start, stop[, step])

表示预期开始和停止,步骤是可选的。但是,这样做的实现允许备用原型

 range(stop)

其中start默认为0,步骤默认为1.唯一使范围看起来像重载函数的是它能够为start接受隐式0值,尽管它是第一个参数。

答案 1 :(得分:1)

有两种方法可以处理可变数量的参数,您可以提供默认参数:
注意:范围不是以这种方式实现的,而只是用于说明:

def my_range(start=0, stop=None, step=1):
    if stop == None:
        start, stop = 0, start
    while start < stop:
        yield start
        start += step

现在你可以这样称呼:

list(my_range(10))          # 0..9
list(my_range(2, 10))       # 2..9
list(my_range(10, step=2))  # 0,2,4,6,8

另一种方法是将*用于未命名的args,将**用于关键字args,上面使用*args**kwargs实现的内容非常麻烦。

def my_range(*args, **kwargs):
    d = {'start':0, 'stop':None, 'step':1}
    for arg, v in zip(('start', 'stop', 'step'), args):
         d[arg] = v
    d.update(kwargs)
    start, stop, step = (d[arg] for arg in ('start', 'stop', 'step'))
    if stop == None:
        start, stop = 0, start
    while start < stop:
        yield start
        start += step

显然前者更容易实现,后者通常保留用于特殊情况,不会用于实现上述内容。

答案 2 :(得分:0)

Python函数allow a variable number of arguments,具有默认参数值:

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

     while (step > 0 and start < stop) or (step < 0 and start > stop):
         yield start
         start += step

(这不是范围的所有语义的完整实现)。或者,使用*args and **kwargs

def range(*args, **kwargs):
    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 'start' in kwargs:
        start = kwargs['start']
    if 'stop' in kwargs:
        stop = kwargs['stop']
    if 'step' in kwargs:
        step = kwargs['step']

     while (step > 0 and start < stop) or (step < 0 and start > stop):
         yield start
         start += step

请注意,标准库range不接受任何关键字参数,从而大大简化了其实现。