位置参数

定义

def functionName(a, b)
  ...
  return

默认参数

定义

def functionName(..., 形参=形参值):
  ...
  return

使用默认参数的好处:降低调用函数的难度

def powerWithDefault(x, n=2):
  s = 1
  while n > 0:
    n -= 1
    s *= x                                                                                                                                            
  return s

  print(powerWithDefault(5))      // => 25
  print(powerWithDefault(5, 3))   // => 125

注意: 默认参数必须指向不变对象

错误写法

  def add_end(L=[])
    L.append('END')
    return L

  print(add_end())  // => ['END']
  print(add_end())  // => ['END', 'END']
  print(add_end())  // => ['END', 'END', 'END']

正确写法

  def add_end(L=None)
    if L is None:
      L = []
    else:
      L.append('END')
    return L

  print(add_end())  // => ['END']
  print(add_end())  // => ['END']
  print(add_end())  // => ['END']

可变参数

定义

传入的参数可以是0个或多个

说明

在可变函数内部, 可变参数的类型是tuple

默认参数形式

def calc_sum(nums):                                                                                                                     
  s = 0 
  for n in nums:
      s = s + n * n 
  return s

print(calc_sum([1, 2, 3]))  // => 14
print(calc_sum((1, 2, 3)))  // => 14

可变参数形式

def calc_sum_with_variable_parameters(*nums):
  s = 0 
  for n in nums:
      s = s + n * n 
  return s

print(calc_sum_with_variable_parameters(1, 2, 3))  // => 14

如果列表已经定义, 可使用*将列表转成可变参数
mlist = [1, 2, 3]
print(calc_sum_with_variable_parameters(*mlist))   // => 14

关键字参数

定义

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def person(name, age, **kv):
    print('name:', name, 'age:', age, 'other', kv)

person('xiaoming', 27)  // => name: xiaoming age: 27 other {}
person('xiaohong', 28, city='Beijing') // => name: xiaohong age: 28 other: {'city': 'Beijing'}
person('xiaoqiang', 29, gender='M',  job='Engineer') // => name: xiaoqiang age: 29 other: {'gender': 'M', 'job': 'Engineer'}

命名关键字参数

定义

命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数

def person(name, age, *, city, job):
  ...
return ...

说明

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。

def person(name, age, **kv):
    print('name:', name, 'age:', age, 'other', kv)

 person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)

如果要限制关键字参数的名字,就可以用命名关键字参数
命名关键字参数可以有缺省值, 比如

def personWithDefaultNamedKeyword(name, age, *, city='Shanghai', job):
    print(name, age, city, job)
personWithDefaultNamedKeyword('Jack', 24, job='Engineer')

参数组合

定义函数, 可以随意组合必选参数、默认参数、可变参数、关键字参数和命名关键字参数,但是参数定义的顺序是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数