文章目录
函数进阶
多返回值
当在函数中想要返回多个返回值时,写多个return是行不通的,因为在执行第一个return的时候就会退出当前函数
def test_return():
return 1,2
x,y = test_return()
print(f"x={x},y={y}")
按照返回值的顺序,写对应顺序的多个变量接收即可
变量之间用逗号隔开
支持不同类型的数据return
函数的传参
位置参数
位置参数就是在调用函数时根据定义函数的参数位置来传递参数
def func(name,age,gender):
print(f"name={name},age={age},gender={gender}")
print(func("n",18,"male"))
需要注意的是传递的参数和定义的参数的顺序和个数必须要一致
关键字参数
在函数调用时通过“关键字=传入值”的形式进行参数的传递,可以不考虑参数传递的顺序
def func(name,age,gender):
print(f"name={name},age={age},gender={gender}")
print(func(age=18,gender="male",name='nn'))
需要注意的是,在关键字参数和位置参数混用的时候,位置参数必须在关键字参数的前面,关键字参数之间不存在先后顺序
缺省参数
也叫默认参数,为参数提供默认值,在调用时可以不传默认参数的值,要注意位置参数必须出现在默认参数之前,包括定义和调用
def func(name,gender,age=20):
print(f"name={name},age={age},gender={gender}")
print(func(gender="male",name='nn'))
函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值
不定长参数
也叫可变参数,用于不确定调用时可能传递多少个参数的场景,有两种类型
位置传递
def func(*args):
print(args)
func('aa')
func('aa',18)
传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递
关键字传参
def func(**kwargs):
print(kwargs)
fun(name='aa', age=18)
参数应当是以”键=值“的形式传入,并被kwargs接收保存为字典
函数式编程的高阶函数
函数作为参数传递
在之前的学习过程中,我们把各种数据作为参数传递,实际上函数也可以作为参数进行传递
例如
def add(x,y):
return x+y
def func(x,y,compute):
return compute(x,y)
print(func(1,2,add)) # 结果是3
在这个过程中,我们可以定义若干的关于x和y的操作函数,在调用时只需要调用func一个函数即可,只需要传入不同的函数名
lambda匿名函数
也叫lambda表达式,他的本质上是一个没有名称的函数,因此也只能临时使用一次
语法:
lambda 传入参数 : 函数体(一行)
lambda 是关键字,表示定义匿名函数,无法省略
例如
def func(x,y,compute):
return compute(x,y)
print(func(1,2,lambda x, y : x+y)) # 结果是3
这个函数的作用和上面的功能完全一致,只是lambda的函数是匿名的,无法二次使用
filter()函数
filter的意思是过滤器,他的函数的意思也是相同的
这个函数由两个参数,第一个function,意思是用于判断是否符合条件的函数,这个函数是你自己定义的,第二个是iterable意思是迭代对象(对象这个词我们后续会讲到,可以理解为object),实际上就是把序列中的每个元素依次传入function判断是否符合条件
这个函数的返回值是filter对象,因此不能直接使用,需要类型转换才能继续接下来的操作,例如
list1 = [1,2,3,4,5]
res1 = filter(lambda x: x % 2 == 0, list1)
print(type(res1)) # 结果是<class 'filter'>
list2 = list(res1)
print(list2) # 结果是[2, 4]
map()函数
函数是Python中的一个对象(object),而在map()函数中的第一个参数就是filter()函数。
map()函数会根据这个参数制定的规则将一个序列转换成另一个序列,那这样的两个序列中存在一一对应的关系,我们也将这样的关系称为映射(map)
他也可以理解为一个函数的操作,map中第一个参数,可以理解为数学中的函数,是对变量的操作,第二个以及以后的参数可以理解为这个数学中函数的变量,因此也可以传入多个序列
例如
def func(str):
return len(str)
res = map(func,('Summer','Morty','Rick'))
res = list(res)
print(res) # 结果是[6, 5, 4]
map与filter一样,返回值也是一个迭代器对象,我们也会详细介绍迭代器的用法,这里我们直接将其转化为list对象进行输出
对于多参数传递,例如传递两个列表,计算两个列表元素的和,map会按照位置进行相加,如果两个列表的元素个数不同,则会自动取长度小的列表为基准
reduce()函数
reduce的意思是减少或约定,这个函数会对序列中的元素按照规则进行减少,直到只有一个累计的数值
直接说概念理解上比较困难,这里我举出一个例子,大家就能快速理解了
from functools import reduce # 这里的操作我们以后再进行讲解,相当于导入reduce函数
res = reduce(lambda x, y: x+y, [1,2,3,4,5])
print(res) # 结果是15
lambda函数就是传入的函数,就是对这个序列进行的操作,通过结果大家可以猜出来这是用于计算列表元素和的一个过程,实际上细分过程就是,先取出前两个元素传入函数,之后每次取一个元素,带上前一次计算的结果,再次传入函数,直到结束
需要注意的是reduce的传入的函数必须是一个二元函数,他的返回值是最后计算的数值
sorted()函数
这是一个排序函数,实际上对于序列来说,他们本身就有排序的方法sort()
这个函数与之不同的地方就是他会产生一个新的序列,不会对原有序列产生影响
这个函数很好理解,我们主要讲两个参数,key和reverse
key是用于比较的函数,默认是从大到小排序,也可以自己写一个比较大小的函数,然后传入即可
reverse即为逆序输出,传入值是bool类型,True即为逆序,默认为False
例如,我们想按照绝对值进行排序
list1 = [1,2,3,-2,-1,9,-5]
list2 = sorted(list1,key=abs)
print(list2) # 结果是[1, -1, 2, -2, 3, -5, 9]