我将使用key.get_pressed()
函数作为此问题的主要示例。
我经常使用range
来生成数字列表。但是,我经常使用不同的参数,特别是不同的NUMBER个参数。这让我想知道range
如何轻松处理不同数量的参数并将它们分配给各自的值(如果它们代表最高值,或最小值,或值之间的间隔)。 range
如何做到这一点?它是否使用range
语句来处理每个场景,还是有更有效的方法?
答案 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
不接受任何关键字参数,从而大大简化了其实现。