python笔记(3)---函数(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的操作