VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 数据分析 >
  • 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表达式常用于:

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

相关教程