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



相关文章
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80
|
22天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
51 14
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
32 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
45 2
|
1月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
64 18
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
113 2

热门文章

最新文章