1.2.4.3 参数
必选参数(位置参数)
In [24]:
def double_it(x):
return x * 2
double_it(3)
Out[24]:
6
In [25]:
double_it()
------------- ------------- ------------- ------------- -----------------------
TypeError Traceback (most recent call last)
<ipython-input-25-51cdedbb81b0> in <module>()
----> 1 double_it()
TypeError: double_it() takes exactly 1 argument (0 given)
可选参数(关键词和命名参数)
In [26]:
def double_it(x=2):
return x * 2
double_it()
Out[26]:
4
In [27]:
double_it(3)
Out[27]:
6
关键词参数允许你设置特定默认值。
警告:默认值在函数定义时被评估,而不是在调用时。如果使用可变类型(即字典或列表)并在函数体内修改他们,这可能会产生问题,因为这个修改会在函数被引用的时候一直持续存在。
在关键词参数中使用不可变类型:
In [2]:
bigx = 10
def double_it(x=bigx):
return x * 2
bigx = 1e9 # 现在真的非常大
double_it()
Out[2]:
20
在关键词参数中使用可变类型(并且在函数体内修改它):
In [3]:
def add_to_dict(args={'a': 1, 'b': 2}):
for i in args.keys():
args[i] += 1
print args
add_to_dict
Out[3]:
<function __main__.add_to_dict>
In [4]:
add_to_dict()
{'a': 2, 'b': 3}
In [5]:
add_to_dict()
{'a': 3, 'b': 4}
In [6]:
add_to_dict()
{'a': 4, 'b': 5}
更复杂的例子,实现Python的切片:
In [7]:
def slicer(seq, start=None, stop=None, step=None):
"""Implement basic python slicing."""
return seq[start:stop:step]
rhyme = 'one fish, two fish, red fish, blue fish'.split()
rhyme
Out[7]:
['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']
In [8]:
slicer(rhyme)
Out[8]:
['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']
In [9]:
slicer(rhyme, step=2)
Out[9]:
['one', 'two', 'red', 'blue']
In [10]:
slicer(rhyme, 1, step=2)
Out[10]:
['fish,', 'fish,', 'fish,', 'fish']
In [11]:
slicer(rhyme, start=1, stop=4, step=2)
Out[11]:
['fish,', 'fish,']
关键词参数的顺序不重要:
In [12]:
slicer(rhyme, step=2, start=1, stop=4)
Out[12]:
['fish,', 'fish,']
但是,最好是使用与函数定义相同的顺序。
关键词参数是特别方便的功能,可以用可变数量的参数来定义一个函数,特别是当函数据绝大多数调用都会使用默认值时。