在编程语言中,函数是对代码最基本的封装,是实现代码复用的直接体现。Python语言中,函数的定义用关键字def实现,函数的返回值用return语句实现。例如:

def my_func():
    return 'hello'

注意不要漏掉了圆括号后面的冒号(:)
如果没有return语句,函数执行至函数块最后一行也会返回,返回值为None。例如:

def my_func1():
    print('hello')

注意:在Python中,函数也是一个对象,可以将函数名赋值给一个变量,或者返回值也可以是一个函数。例如:

def my_func2():
    return abs
test = my_func2()
print(test(-2))

上述代码的运行结果为2. 具体分析如下:my_func函数是自定义函数,返回一个Python的内建函abs,abs的功能是对输入参数求绝对值。test=my_func2() 这句语句是将返回的abs函数赋值给test,运行test(-2) 实际上时运行abs(-2)

Python中函数的参数有多种玩法,具体包括:

  • 必选参数
  • 默认参数
  • 可变参数
  • 关键字参数
  • 命名关键字参数
    下面依次对上述参数进行描述。

1.必选参数(位置参数)

必选参数是在函数定义的时候就确定要输入的参数,传入参数的值是按照顺序依次复制过去的。例如:

def sayhello(name):
    print('hello', name)

上述函数中,name就是必选参数。根据函数定义可以看到,函数必须有一个输入参数。如果运行sayhello()则会引发如下异常:

---------------------------------------------------------------------------
TypeError     Traceback (most recent call last)
<ipython-input-29-8dc54479c35f> in <module>()
----> 1 sayhello()

TypeError: sayhello() missing 1 required positional argument: 'name'

表明函数缺少一个必须的位置参数‘name’

2.默认参数

如果定义函数时使用了默认参数,在调用过程中则可以不提供相应的参数。例如:

def my_func3(name, gender='M'):
    print(name,'is',gender)

当调用
name='Chris'
my_func3(name)

时,输出为Chris is M。
当调用my_func3('Rachel',gender='F') 时,输出为Rachel is F
默认参数有一个非常需要注意的地方:不要把可变类型作为默认参数。因为Python在函数定义的时候,默认参数就已经被计算出来了。如果默认参数时一个可变类型,在程序运行时如果改变了默认参数,再次调用函数时,默认参数将是上一次计算的结果。典型的例子如下:

def bug_example(arr = []):
    arr.append('a')
    return arr

当连续两次调用bug_example()时,发现返回结果为[‘a’, ‘a’]。说明第二次调用时,arr的值默认为[‘a’],已经改变。

3.可变参数

有时候,定义函数时不确定参数的个数,例如计算一个list各个元素的和时,list的长度不确定,此时应该使用可变参数。Python中,使用一个tuple存储可变参数,例如:

def my_func4(*args):
    print(args)

此时调用函数my_func4('hello','world') 输出为('hello', 'world') ,表现为一个tuple。

4.关键字参数

使用两个星号可以将参数搜集到一个dict里,参数的名字是dict的key,对应参数为dict的value。例如:

def my_func5(**kwargs):
    print(kwargs)

调用my_func5(python='happy')时,输出为{'python': 'happy'}

5.命名关键字参数

命名关键字参数用于限制关键字参数的key值。例如,如果函数只允许输入location和gender这两个关键字参数,而不允许任意多的关键字参数,此时应该使用命名关键字参数。命名关键字参数使用‘*’作为分隔符,‘*’后面的参数被视为命名关键字参数。例如

def my_func6(name, age, *, locaton, gender):
    print(name,age,location,gender)

调用my_func6('chr1s', 18,favorite='basketball',gender='M')时报错:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-71-b52d1185c0b7> in <module>()
----> 1 my_func6('chr1s', 18,favorite='basketball',gender='M')

TypeError: my_func6() got an unexpected keyword argument 'favorite'

说明获取了一个不希望得到的关键字参数‘favorite’。

总结

Python函数的参数类型很多,而且可以混合使用,需要在实际编程中多加练习,多多体会。上述函数运行结果在jupyter notebook上进行测试。