欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python学习笔记(六)函数的参数、文档、内部函数以及闭包、匿名函数

程序员文章站 2022-03-29 18:41:42
七、函数 1、参数 (1) 形参、实参 略 (2) 关键字参数 在 参数比较多 时,如果实参的顺序与形参不同,没有一一对应,那么函数就会发生错误,所以我们就可以用关键字参数来避免这个问题 (3) 默认参数 在定义函数形参时,可以定义一个默认的参数,如果调用参数且没有对应形参,则自动使用默认参数 ​ ......

七、函数

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表达式常用于:

  • 写一些执行脚本时,省略定义函数的过程,使代码更精简
  • 代替一些比较抽象且调用次数较少的函数