Python函数进阶

文章目录

    • 函数进阶
      • 多返回值
      • 函数的传参
        • 位置参数
        • 关键字参数
        • 缺省参数
        • 不定长参数
          • 位置传递
          • 关键字传参
      • 函数式编程的高阶函数
        • 函数作为参数传递
        • lambda匿名函数
        • filter()函数
        • map()函数
        • reduce()函数
        • sorted()函数

函数进阶

多返回值

当在函数中想要返回多个返回值时,写多个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)) # 结果是

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]

你可能感兴趣的:(Python,python,函数,类和对象)