文章目录
前言
前面我们已经学习了 python 函数的基础知识,那么今天我将为大家分享函数进阶的知识:递归、lambda表达式和一些高阶函数的使用。🚗🚗🚗
递归
在编程中,递归(Recursion)是一种函数调用自身的技术或方法。在递归过程中,函数通过解决一个问题的较小或相似的子问题来重复调用自身,直到达到某个基本条件,然后逐步返回结果,并合并得到最终的解决方案。
递归函数的基本思想是将一个大问题分解为一个或多个相似的子问题,这些子问题与原始问题相同但规模较小。然后通过递归调用来解决子问题,并将其子问题的解组合起来解决原始问题。递归函数必须具有停止递归的条件,以防止无限循环。
我们通过一个例子来了解递归:
用递归实现1-3数字累加
def sum_add(x):
if x == 1: # 递归结束条件,也就是递归的出口
return 1
return x + sum_add(x-1)
result = sum_add(3)
print(result) # 6
在这里我们需要注意,在递归的过程中函数必须越来越接近递归结束的条件,否则就会无限递归下去,最终会停止程序。
lambda表达式
lambda表达式是一种匿名函数(无需定义函数名称)的简洁形式。它是一种轻量级的函数定义方式,可以在需要函数对象的地方使用。lambda表达式最突出的特点就是简化代码,当一个函数只有一个返回值,并且只有一句代码的时候,就可以使用lambda表达式。
在 python 中,lambda语法是这样的 lambda 参数列表 : 返回语句
用 lambda 表达式计算两数之和。
fn = lambda a,b : a+b # 这相当于将匿名函数的地址给fn
result = fn(10,20) # fn()调用函数
print(result) # 30
我们也可以将此 lambda 表达式更加简化。
print((lambda a,b : a+b)(10,20))
虽然可以这样写,但是这里 lambda 表达式只可以使用一次,当使用完成之后,因为他是匿名的,所以就没人能记住他的位置,很快就会被销毁。
lambda 的参数形式
前面我们说过了普通函数的参数形式:无参数、位置参数、缺省参数和可变参数,这些参数在 lambda 表达式中同样适用。
无参数
当没有参数的时候,我们可以直接省略参数列表。
fn = lambda : 100
print(fn()) # 100
位置参数
传递参数的时候,要和 lambda 表达式参数列表的参数位置和数量保持一致。
fn = lambda a,b : f'a = {a},b = {b}'
print(fn(10,20))
关键字参数
在传递参数的时候,可以使用 键 = 值
的形式,来取消对用位置的限制。
fn = lambda a,b : f'a = {a},b = {b}'
print(fn(b = 200,a = 100))
缺省参数
在定义参数列表的时候,我们可以指定某个参数具有的默认值,在传递参数的时候可以省略传递该参数使用默认值,或者也可以传递该参数取消使用默认值。但是记住了,默认参数必须在参数列表的后面。
# 使用默认参数
fn = lambda a,b,c=100 : a+b+c
print(fn(100,50)) # 250
# 取消使用默认参数
fn = lambda a,b,c=100 : a+b+c
print(fn(100,50,200)) # 350
可变参数
参数的个数可以设置为可变的,你传递参数的时候可以传递任意个。
1.包裹位置传递
lambda *args : 返回语句
参数被合并为一个元组传入
fn = lambda *args : args
print(fn(10,20,30))
2.包裹关键字传递
lambda **args : 返回语句
参数被合并成一个字典传入。
fn = lambda **args : args
print(fn(name = 'zhangsan',age = 18,gender = 'man'))
带判断条件的lambda表达式
lambda 表达式还可以加上一些简单的判断语句。
fn = lambda a,b : a if a > b else b
print(fn(10,20)) 3 20
列表数据按照字典key的值进行排序
我们都知道列表有 字典序列.sort(以什么作为排序标准,reverse = True(降序)/Fasle(升序))
的排序方法,那么我们可以搭配着 lambda 表达式来简化代码。
# 以字典的 name值 作为排序的标准
list1 = [
{'name':'zhangsan','age':18,'gender':'man'},
{'name':'lisi','age':20,'gender':'woman'},
{'name':'wangwu','age':28,'gender':'man'}
]
list1.sort(key = lambda x:x['name'],reverse = False)
for i in list1:
print(i)
# 以年龄作为排序标准
list1 = [
{'name':'zhangsan','age':18,'gender':'man'},
{'name':'lisi','age':20,'gender':'woman'},
{'name':'wangwu','age':28,'gender':'man'}
]
list1.sort(key = lambda x:x['age'],reverse = False)
for i in list1:
print(i)
高阶函数的使用
在Python中,高阶函数是指接受一个或多个函数作为参数,并/或返回一个函数的函数。高阶函数是函数式编程的重要概念,它们提供了一种更抽象、灵活和可复用的方式来处理函数和数据。
在进行数据之间的计算时,往往需要先对数字进行处理之后再进行计算。
def sum_add(a,b):
return abs(a) + abs(b) # abd函数返回数字的绝对值
print(sum_add(-10,20))
我们这样写代码会显得十分呆,如果我们对数字的处理不是绝对值,而是四舍五入的值时,我们就需要更改函数里面的代码,那么有没有一种可能:我们可以将需要进行的操作作为参数传入进去呢?当然是可以的,这就是高阶函数。
def 函数名(a,b,f) # 这里 f 为函数
def sum_add(a,b,f):
return f(a) + f(b)
print(sum_add(1.25,2.75,round)) # 4
内置高阶函数
以下是一些常见的Python高阶函数:
-
map(function, iterable): 接受一个函数和一个可迭代对象,对可迭代对象中的每个元素应用函数,并返回一个新的可迭代对象,其中包含应用函数后的结果。
-
filter(function, iterable): 接受一个函数和一个可迭代对象,根据函数的返回值为True或False过滤可迭代对象中的元素,并返回一个新的可迭代对象,其中包含满足条件的元素。
-
reduce(function, iterable[, initializer]): 从Python 3中已移除,被移到functools模块中。它接受一个函数和一个可迭代对象,对可迭代对象中的元素进行累积计算,并返回最终结果。例如,使用reduce可以计算累加、累乘等操作。
1.map()
map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
# 返回列表中每个元素的平方
def func(x):
return x ** 2
list1 = [1,2,3,4,5]
print(list(map(func,list1)))
结合lambda表达式简化代码
list1 = [1,2,3,4,5]
print(list(map((lambda x : x ** 2),list1)))
这里因为 python3 返回的是一个迭代器,所以我们将返回值转换为列表打印。
2.reduce()
reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。
import functools # 使用reduce方法需要导入functools模块
def func(x,y):
return x + y
list1 = [1,2,3,4,5]
print(functools.reduce(func,list1)) # 15
结合lambda表达式简化代码
import functools
list1 = [1,2,3,4,5]
print(functools.reduce((lambda x,y : x+y),list1))
3.filter()
ilter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象,。如果要转换为列表,可以使用 list() 来转换。
def func(x):
return x % 2 == 0
list1 = [i for i in range(1,11)]
print(list(filter(func,list1)))
结合lambda表达式简化代码
list1 = [i for i in range(1,11)]
print(list(filter((lambda x : x % 2 == 0),list1)))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192610.html