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表达式常用于:
- 写一些执行脚本时,省略定义函数的过程,使代码更精简
- 代替一些比较抽象且调用次数较少的函数
上一篇: 移动端常用单位(%和rem)
下一篇: 病好转的根据