1.2.4.3 参数

必选参数(位置参数)

In [24]:

  1. def double_it(x):
  2. return x * 2
  3. double_it(3)

Out[24]:

  1. 6

In [25]:

  1. double_it()
  1.  ------------- ------------- ------------- ------------- -----------------------
  2. TypeError Traceback (most recent call last)
  3. <ipython-input-25-51cdedbb81b0> in <module>()
  4. ----> 1 double_it()
  5. TypeError: double_it() takes exactly 1 argument (0 given)

可选参数(关键词和命名参数)

In [26]:

  1. def double_it(x=2):
  2. return x * 2
  3. double_it()

Out[26]:

  1. 4

In [27]:

  1. double_it(3)

Out[27]:

  1. 6

关键词参数允许你设置特定默认值。

警告:默认值在函数定义时被评估,而不是在调用时。如果使用可变类型(即字典或列表)并在函数体内修改他们,这可能会产生问题,因为这个修改会在函数被引用的时候一直持续存在。

在关键词参数中使用不可变类型:

In [2]:

  1. bigx = 10
  2. def double_it(x=bigx):
  3. return x * 2
  4. bigx = 1e9 # 现在真的非常大
  5. double_it()

Out[2]:

  1. 20

在关键词参数中使用可变类型(并且在函数体内修改它):

In [3]:

  1. def add_to_dict(args={'a': 1, 'b': 2}):
  2. for i in args.keys():
  3. args[i] += 1
  4. print args
  5. add_to_dict

Out[3]:

  1. <function __main__.add_to_dict>

In [4]:

  1. add_to_dict()
  1. {'a': 2, 'b': 3}

In [5]:

  1. add_to_dict()
  1. {'a': 3, 'b': 4}

In [6]:

  1. add_to_dict()
  1. {'a': 4, 'b': 5}

更复杂的例子,实现Python的切片:

In [7]:

  1. def slicer(seq, start=None, stop=None, step=None):
  2. """Implement basic python slicing."""
  3. return seq[start:stop:step]
  4. rhyme = 'one fish, two fish, red fish, blue fish'.split()
  5. rhyme

Out[7]:

  1. ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']

In [8]:

  1. slicer(rhyme)

Out[8]:

  1. ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']

In [9]:

  1. slicer(rhyme, step=2)

Out[9]:

  1. ['one', 'two', 'red', 'blue']

In [10]:

  1. slicer(rhyme, 1, step=2)

Out[10]:

  1. ['fish,', 'fish,', 'fish,', 'fish']

In [11]:

  1. slicer(rhyme, start=1, stop=4, step=2)

Out[11]:

  1. ['fish,', 'fish,']

关键词参数的顺序重要:

In [12]:

  1. slicer(rhyme, step=2, start=1, stop=4)

Out[12]:

  1. ['fish,', 'fish,']

但是,最好是使用与函数定义相同的顺序。

关键词参数是特别方便的功能,可以用可变数量的参数来定义一个函数,特别是当函数据绝大多数调用都会使用默认值时。