python笔记(3)---函数(1)

函数以及函数使用的注意事项(1)

函数的基本定义方式

在python中定义一个函数的方式的模板如下:

def fun_name(arg):
    return value

其中必须写的是def相当于英文的definite(定义)的意思,直接可以理解为定义一个名为fun_name的函数,其中函数的参数是arg,也可以不只是一个值,可以是多个值,用逗号分割符隔开,返回一个value

指定参数的位置和参数的初始化方式

在python中假如你定义了一个函数:

def fun(a,b):
    print(a,b)
a=10
b=20
print(fun(a,b))

在上面的函数中分析一下执行过程如下:首先你定义了一个名称为fun的函数,这个函数有两个参数:a,b,但是没有返回值:所以最底下的print(fun(a,b))执行完成后输出打印的是None

参数的默认值

依旧是上面的代码 我们考虑下面这样的情况:

def fun(a,b=20):
    print(a,b)

a=20
print(fun(a))

观察和上面的代码不同的地方是我们给参数b增加了一个默认的值,这个默认值可以指定任何的类型就像命名一样,但是有一个潜规则:指定默认值的参数必须在不指定默认值的参数的后面,上面的函数输出是20,20
可以采用只输入没有指定默认值的参数就像上面那样,也可以输入两个参数像这样:

fun(10,12)
#也可以
fun(a=10,b=12)
fun(b=12,a=10)
#用参数的名字指定参数的值

这样a的值初始化为10,b的默认值20被覆盖掉变为12进入到函数中

指定位置的参数传递方式

在python3.8中新加入了一种指定位置传参数的方式,通俗的来讲,就是传递参数的时候只能按照参数的顺序进行传递,不能按照参数的名字进行传递参数也就是说不能使用上面指定的fun(a=10,b=12)的方式进行传递参数,只能fun(10,12)的进行传递,要想让函数中的参数是这样的规则进行调用,初始化函数的语法应该如下:

def fun(a,b,/,c): #在'/'符号之前的所有参数都被设置为按位置传参
    #在'/'之后的参数可以使用fun(1,1,12)(c=12),也可以使用fun(1,1,c=12)的方式
    print(a,b,c)
指定参数的传递方式

在上面调用函数的例子中有一种调用的格式是fun(a=10,b=12)的方式,这种方式就是指定参数的传递,因为用到了参数名字去指定参数的值,在指定参数的传递中
你可以不考虑参数的位置因素,例如fun(a=10,b=12)和fun(b=12,a=10)是相同的效果的传递和函数调用
如何在函数中使用这样的规则局限于一部分的参数:

def fun(*,a,b): #在参数之前用符号'*'表示之后的参数都要按照参数传递
    print(a,b)
fun(a=1,b=3)#正确
fun(b=3,a=1)#正确
fun(1,3)#错误

Question1:说说为什么上面的fun(1,3)是错误的?

小结:

对于一个函数如下

def fun(a,b,/,c,d,*,e,f):
    print(a,b,c,d,e,f)

对于参数a,b而言我们知道参数a,b是按照位置传递的参数,而e,f是按照参数进行传递的参数,那么c,d呢?
c,d是既能按照参数传递也能按照位置传递的参数,也就是说你可以直接fun(1,2,3,4,e=5,f=6)的初始化,也可以
fun(1,2,c=3,d=4,e=5,f=6)的进行初始化,两种规则都适合使用

函数的返回值

函数的返回值通常来讲只有一个,紧跟在return关键字之后:

def fun(a):
    return a
#a可以是任何对象(list tuple 字典 字符串)以及任何的数据类型 

如果函数没有写返回值的话,那么默认的返回值是None

Question2 :如何在函数中返回多个值?写出代码检验你的想法?

函数中的函数(子函数):

先看下面的代码:

def fun():
    def subfun1(x):
        print(x)
    return subfun1
f=fun()
print(f(1))

分析:考虑上面的函数fun()我们定义了一个subfun1(x)的函数,并且调用这个函数之后将subfun1的函数座位返回值返回
然后用f接受这个返回值也就是说此时f=subfun(x)的函数f是这个函数的第二个名字,通过f(1)调用这个函数,print(1)进行输出打印

理论上来讲子函数可以定义任意多个,对于变量的作用域的问题:

def fun():
    x1=10
    def subfun1(x):
        x2=12
        x1=x1+1#错误,不可以使用外部的块的内容 
    x2=x2+1#错误 不能使用子函数块的内容
    return subfun1

也就是说子函数和外部的函数之间是彼此独立的不可以互相沟通

lambda函数

lambda函数作为一种简单的使用的方式,有时候可以当成一种规则的去使用:在有的python的内置函数中可以传递lamda函数作为参数
比如:排序 映射 之类的函数(sorted(),map())都可以传递一个lambda函数
lambda函数有时候也叫做匿名函数

定义方式如下:

f=lambda x,y:x*y #调用方式为
f(1,2) #x=1 y=2 返回1*2
# lambda arg1,arg2...:函数体
#首先写一个lambda 紧接着是参数列表 arg1,arg2.... 在:后跟的是函数体

使用场景

L=[1,1,2,3,4]
print(sorted(L,key=lambda x:abs(3-x)))

按照L中的值和3的距离的大小进行排序,key是一个仅按照参数传递的参数

list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

对列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中的值都进行x*x的操作

posted @ 2020-11-23 19:39  差三岁  阅读(214)  评论(0编辑  收藏  举报