Python函数式编程自带函数

简介: Python函数式编程自带函数

​### 一.map函数

需求1:num1=[1,2,3,4],我的需求是把num1中的每个元素平方后组成新列表。

ret = []
num1 = [1,2,3,4]
for i in num1:
    ret.append(i**2)

print(ret)

# 输出结果:
>>>[1, 4, 9, 16]
AI 代码解读

需求2:如果有1万个列表呢,怎么办?

思路:如果用for循环,当然功能上是没问题的,但是需要写很多重复代码,重复代码?? 顿时想到函数的特性就是避免重复代码,哈哈哈,天才也....

num1 = [1,2,3,4]
def foo(array):
    ret = []
    for i in array:
        ret.append(i**2)
    return ret
print(foo(num1))

"""
每个列表调用1次函数即可,一万个列表调用1万次foo函数就行了,不用写一万个for循环,问题解决。
"""

# 输出结果:
>>>[1, 4, 9, 16]
AI 代码解读

需求3:如果1万个列表,同时需要每个元素自加1,自减1,自乘1,自平方...???

思路:看到题目就在想,你是猴子派来玩我的吗??? 如果安装2中的方法,我去,需要一个功能一个函数,这真的可以吗? 当然不行,这样太out了...

def add_one(x):          # 定义自加一处理逻辑
    return x+1
def reduce_one(x):      # 定义自减一处理逻辑
    return x-1
def plus_one(x):        # 定义自平方处理逻辑
    return x**2


def map_test(func,array):
    ret = []
    for i in array:
        res = func(i)   # 相当于 res = add_one(i)
        ret.append(res)
    return ret

print(map_test(add_one,[1,2,3,4]))

# 运行结果
>>>[2, 3, 4, 5]
AI 代码解读

突发奇想:3中的代码在定义处理逻辑的时候,不就是lambda的处理方式吗,可不可以使用lambda代替呢??答案是肯定的。

def map_test(func, array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret

print(map_test(lambda x:x+1,[1,2,3,4]))

# 输出结果
>>> [2, 3, 4, 5]
AI 代码解读

哈哈,完美了...

此时我正沉浸在胜利的喜悦中,一个声音让我一下从天堂坠入地狱...

A:这个代码好臃肿啊,一行代码能完成的事情,为什么要写成这样呢???

我(心想):一行???吹呢吧,你要是能写,我拜你为师....

A:我告诉你吧,你的处理思维是没错的,但是Python自带的map函数完全可以替代你的上述代码,简单的很呦!!

print(map(lambda x:x+1,[1,2,3,4]))
# <map object at 0x0000000000597390>  map处理后得到的结果就是一个迭代器.
print(list(map(lambda x:x+1,[1,2,3,4])))

# 运行结果
>>> [2, 3, 4, 5]
# list函数可以把可迭代的对象变成列表

"""
map函数总结:
lambda x:x+1 (第一个参数)处理逻辑,不一定必须使用lambda
[1,2,3,4] (第二个参数)要处理的可迭代对象
"""

# 把字符串中的每个元素变成大写
msg = 'abcd'
print(list(map(lambda x:x.upper(),msg)))

# 运行结果
>>> ['A', 'B', 'C', 'D']
AI 代码解读

什么也不说了,师傅,请受徒儿一拜.....,抬头望去,人了??哎,高人就是不一样啊.....

二 .filter函数

需求1:电影院中有5个人在看电影,筛选出他们的名字前面不含sb字符的人

movie_people = ['sb_a','sb_b','sb_c','d','e']
ret = []
for p in movie_people:
    if not p.startswith('sb'):
        ret.append(p)

print(ret)

# 打印结果
>>> ['d', 'e']:
AI 代码解读

需求2:电影院中有5个人在看电影,筛选出他们的名字前后不含sb字符的人

movie_people = ['sb_a','sb_b','sb_c','d','e']

def sb_show(n):
    return n.startswith('sb')
def show_sb(n):
    return n.endstwith('sb')

def filter_test(array,func):
    ret = []
    for p in array:
        if  not func(p):
            ret.append(p)

    return ret

print(filter_test(movie_people,sb_show))

# 运行结果
>>> ['d', 'e']
AI 代码解读

终极版本:使用lambda代替上述代码中的show_sb和sb_show函数。

def filter_test(array,func):
    ret = []
    for p in array:
        if  not func(p):
            ret.append(p)

    return ret

print(filter_test(movie_people,lambda x:x.startswith('sb')))

# 运行结果
>>> ['d', 'e']
AI 代码解读

使用自带函数filter完成

movie_people = ['sb_a','sb_b','sb_c','d','e']
print(list(filter(lambda x:not x.startswith('sb'),movie_people)))

"""
filter说明:
第一个参数:处理逻辑,结果必须是一个布尔值
第二个参数:要处理的可迭代的内容
"""
AI 代码解读

三. reduce函数

reduce函数在Python2中可以直接使用,在Python3中需要引用(from functools import reduce)。

处理一个序列,然后把序列中的每个元素进行合并(相加、相乘等)操作。

实例

num_1 = [1,2,3,4]
from functools import reduce
print(reduce(lambda x,y:x+y,num_1,10))

# 运行结果
>>> 20

"""
第一个参数:处理逻辑
第二个参数:可迭代对象
第三个参数:初始值,如果有初始值,会把初始值也进行合并
"""
AI 代码解读

四.函数对照表

请在此添加图片描述

需求:有一个列表,筛选出age小于1000的人

思路:此需求中是要过滤age小于1000的人,三个函数中可以选择filter()

people = [
    {
   
   'name':'alex','age':1000},
    {
   
   'name':'wupeiq','age':10000},
    {
   
   'name':'linhaifeng','age':18}
]

print(list(filter(lambda x:x['age'] < 1000,people)))

# 运行结果
>>> [{
   
   'age': 18, 'name': 'linhaifeng'}]
AI 代码解读
目录
打赏
0
0
1
0
24
分享
相关文章
Python 的内建函数
Python 的内置函数列表,方便查询使用方法。
Python内置函数ord()详解
`ord()` 是 Python 中用于将单个字符转换为对应 Unicode 码点的核心函数,支持 ASCII、多语言字符及特殊符号。其返回值为整数(范围 0-1114111),适用于字符编码验证、数据清洗、自定义排序、基础加解密等场景。使用时需注意参数长度必须为 1,否则会触发 `TypeError`。结合 `chr()` 函数可实现双向转换,进阶技巧包括多字节字符处理、编码范围检测及字符分类验证等。
[oeasy]python091_列表_索引_index_中括号_索引函数
本文介绍了Python中列表与字符串的索引及index函数用法。通过range生成列表,使用索引[]访问和修改列表元素,index函数查找元素位置。字符串支持索引访问但不可直接修改。还探讨了16进制数在Python中的表示方法,以及日期、月份等特殊字符的Unicode范围。最后总结了列表与字符串操作的区别,并预告后续内容,提供蓝桥云课、GitHub和Gitee链接供进一步学习。
84 20
|
3月前
|
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
87 17
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
77 11
Python中main函数:代码结构的基石
在Python中,`main`函数是程序结构化和模块化的重要组成部分。它实现了脚本执行与模块导入的分离,避免全局作用域污染并提升代码复用性。其核心作用包括:标准化程序入口、保障模块复用及支持测试驱动开发(TDD)。根据项目复杂度,`main`函数有基础版、函数封装版、参数解析版和类封装版四种典型写法。 与其他语言相比,Python的`main`机制更灵活,支持同一文件作为脚本运行或模块导入。进阶技巧涵盖多文件项目管理、命令行参数处理、环境变量配置及日志集成等。此外,还需注意常见错误如全局变量污染和循环导入,并通过延迟加载、多进程支持和类型提示优化性能。
259 0
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
Python高级编程与实战:深入理解函数式编程与元编程
本文深入介绍Python的函数式编程和元编程。函数式编程强调纯函数与不可变数据,涵盖`map`、`filter`、`reduce`及`lambda`的使用;元编程则涉及装饰器、元类和动态属性等内容。通过实战项目如日志记录器和配置管理器,帮助读者掌握这些高级技术,编写更灵活高效的Python程序。
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
|
5月前
|
Python中的round函数详解及使用示例
`round()`函数是Python内置的用于四舍五入数字的工具。它接受一个数字(必需)和可选的小数位数参数,返回最接近的整数或指定精度的浮点数。本文详细介绍其用法、参数及示例,涵盖基本操作、负数处理、特殊情况及应用建议,帮助你更好地理解和运用该函数。
512 2

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等