在编程语言中,函数是对代码最基本的封装,是实现代码复用的直接体现。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中函数的参数有多种玩法,具体包括:
必选参数是在函数定义的时候就确定要输入的参数,传入参数的值是按照顺序依次复制过去的。例如:
def sayhello(name):
print('hello', name)
上述函数中,name就是必选参数。根据函数定义可以看到,函数必须有一个输入参数。如果运行sayhello()则会引发如下异常:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
input -29-8dc54479c35f> in <module>()
----> 1 sayhello()
TypeError: sayhello() missing 1 required positional argument: 'name'
表明函数缺少一个必须的位置参数‘name’
如果定义函数时使用了默认参数,在调用过程中则可以不提供相应的参数。例如:
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’],已经改变。
有时候,定义函数时不确定参数的个数,例如计算一个list各个元素的和时,list的长度不确定,此时应该使用可变参数。Python中,使用一个tuple存储可变参数,例如:
def my_func4(*args):
print(args)
此时调用函数my_func4('hello','world')
输出为('hello', 'world')
,表现为一个tuple。
使用两个星号可以将参数搜集到一个dict里,参数的名字是dict的key,对应参数为dict的value。例如:
def my_func5(**kwargs):
print(kwargs)
调用my_func5(python='happy')
时,输出为{'python': 'happy'}
。
命名关键字参数用于限制关键字参数的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)
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上进行测试。