-
Python学习笔记(六)函数的参数、文档、内部函数以及闭包、匿名函数
七、函数
def printName(name):
print('my name is ' + name)
1、参数
(1) 形参、实参
略
(2) 关键字参数
在参数比较多时,如果实参的顺序与形参不同,没有一一对应,那么函数就会发生错误,所以我们就可以用关键字参数来避免这个问题
def makeSentence(sub, pre, obj):
'''
sub为主语
pre为谓语
obj为宾语
函数的作用是把主谓宾连成一句话
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence('I', 'eat', 'food')
输出结果:I eat food
=========================================
makeSentence('eat', 'food', 'I') #如果实参顺序错误
输出结果:eat food I #结果出错
=========================================
makeSentence(pre='eat', obj='food', sub='I') #使用关键字参数
输出结果:I eat food #结果正确
(3) 默认参数
在定义函数形参时,可以定义一个默认的参数,如果调用参数且没有对应形参,则自动使用默认参数
def makeSentence(sub = 'August', pre = 'has', obj = 'phones'):
'''
sub为主语
pre为谓语
obj为宾语
函数的作用是把主谓宾连成一句话
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence() #没有参数
输出结果:August have phones
注意,有默认值的参数必须要放在没有默认值的参数的后面
例如
def makeSentence(sub = 'August', pre, obj):
'''
sub为主语
pre为谓语
obj为宾语
函数的作用是把主谓宾连成一句话
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence('eats', 'food')
运行结果:SyntaxError: non-default argument follows default argument
===============================================
所以正确写法应为:
def makeSentence(pre, obj, sub = 'August'): #将有默认值的参数放到所有无默认值的参数后面
'''
sub为主语
pre为谓语
obj为宾语
函数的作用是把主谓宾连成一句话
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence(pre='eats', obj='food')
输出结果:August eats food
(4) 收集参数
定义函数的时候,在参数前加一个 * 号,函数可以接收零个或多个值作为参数,返回结果是一个元组。
传递零个参数时函数并不报错,而是返回一个空元组。
以上这种方法有局限性,它不能收集关键字参数。
def func1(*parameters_1):
print('参数为:', parameters_1)
print('参数长度为:', len(parameters_1))
print('第二个参数为:', parameters_1[1])
func1('August', 'Tsugua', 3, 4, 5)
输出结果:参数为: ('August', 'Tsugua', 3, 4, 5)
参数长度为: 5
第二个参数为: Tsugua
对关键字参数进行收集则使用另一种收集参数机制:使用两个星号 ( ** ) ,用法同上。最后返回一个以参数名为键、参数值为键值的字典。
def func2(**parameters_2):
print(parameters_2)
func2(a = 1, b = 2, c = 'FWTY')
输出结果:{'a': 1, 'b': 2, 'c': 'FWTY'}
2、函数文档
在函数内部的第1行开始,使用三引号作为帮助文档的标记字符
函数在执行时并不会打印文档的内容
def funADD(num1, num2):
'''函数的作用是返回两个参数的和'''
return num1 + num2
print(funADD(1,2))
输出结果:3
可以使用函数的__doc__属性或者help()方法查看文档内容
print(funADD.__doc__)
输出结果:函数的作用是返回两个参数的和
==================================
help(funADD)
输出结果:
Help on function funADD in module __main__:
funADD(num1, num2)
函数的作用是返回两个参数的和
3、内嵌函数(内部函数)和闭包
(1) 内嵌函数(内部函数)
内嵌函数(内部函数)就是指在函数的内部再定义一个函数
def fun1():
print('调用fun1')
def fun2(): #在fun1内部再定义一个fun2
print('调用fun2')
fun2()
fun1()
输出结果:调用fun1
调用fun2
注意,上面fun2函数的作用域是在fun1函数之内的,也就是说,无法在fun1函数之外直接调用fun2
def fun1():
print('调用fun1')
def fun2(): #在fun1内部再定义一个fun2
print('调用fun2')
fun2()
fun2()
输出结果:NameError: name 'fun2' is not defined
(2) 闭包
在一个外部函数中定义了一个内部函数,内部函数里运用了外部函数的临时变量,并且外部函数的返回值是内部函数的引用,这样就构成了一个闭包,称这个内部函数为闭包函数
也就是说:
- 闭包函数必须是外部函数的返回对象
- 闭包函数必须引用外部变量(一般不能是全局变量)
def funX(x):
def funY(y): #闭包函数
return x*y #内部函数引用了外部函数的临时变量
return funY #返回内部函数
==================================
#闭包函数的调用1
i = funX(8) #此时i是一个函数,输出i:<function funX.<locals>.funY at 0x00000268DDE2A048>
print(i(5))
输出结果:40
==================================
#闭包函数调用2
print(funX(8)(5))
输出结果:40
4、Lambda表达式(匿名函数)
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。 lambda所表示的匿名函数的内容应该是简单的,如果复杂的话,干脆就重新定义一个函数了。
lambda [arg1 [,arg2,.....argn]]:expression
#例如:
def add(x, y):
return x + y
#上面的函数就等于
lambda x, y: x + y
==============================
g = lambda x, y: x + y
print(g(3,4))
输出结果:7
lambda表达式常用于:
- 写一些执行脚本时,省略定义函数的过程,使代码更精简
- 代替一些比较抽象且调用次数较少的函数