首页 > 编程语言 > 详细

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

时间:2020-03-14 14:32:34      阅读:47      评论:0      收藏:0      [点我收藏+]

七、函数

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

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

原文:https://www.cnblogs.com/augustcode/p/python_6.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!