揭秘python函数:编程艺术的核心力量(3)

简介: 揭秘python函数:编程艺术的核心力量(3)


前言

前面我们已经学习了 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

无参数

当没有参数的时候,我们可以直接省略参数列表。

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)))



相关文章
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
169 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
259 1
|
1月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
155 0
|
2月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
269 101
|
2月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
210 99
|
2月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
186 98
|
2月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
286 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
310 104
|
1月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
179 3

推荐镜像

更多