当前位置: 首页 > news >正文

73、Python之函数式编程:“一行流”大全,人生苦短,我用Python

引言

先说句题外话,TIOBE 9月编程语言排行榜更新了,Python依然“遥遥领先”。

25dc7e2ae2b6d54505bb4d14ed88b06b.jpeg

人生苦短,我用Python!

编程的世界里,也有一些流派之分,比如“一行流”,能用一行代码解决的问题,绝对不多写第二行。

其实,编程世界里的流派,具体来说,是编程风格的区分。

Python中的一行流在函数式编程中被用得比较多,所以,本文就来简单聊一下什么是“一行流”,以及“一行流”中的典型实例。

本文的主要内容有:

1、什么是一行流

2、一行流的典型实例

3、关于一行流的思考

什么是一行流

一行流(One-liner Programming Style)是一种编程风格,主要是指用一行代码来完成某个特定的功能。

这种编程风格可以使得代码更加简洁紧凑,但是,不同于其他语言,在Python中,对语句的缩进级别有严格的要求。所以,并不是什么功能都可以简单地用一行代码可以解决的,也不是多行代码强行写在一行代码里。

在Python中,要想实现一行流,主要可以有以下途径:

1、列表推导式,当然也包括字典推导式

2、生成器表达式

3、lambda表达式

4、高阶函数和纯函数组合

从这些途径中,也可以看出,一行流与函数式编程有着比较紧密的关联。

一行流的典型实例

如同 Liunx 之父 Linus Torvalds 的经典名言——Talk is cheap, show me the code. 关于一行流,我们不需要做过多的解释说明,直接看实际的代码实例,会更加直观。接下来,我们展示几个实际场景的一行流代码。需要说明的是,有些写法跟函数式编程范式是无关的,比如列表推导式等。

1、列表元素的处理

from functools import reducedef pprint(content):print(f'======{content}======')nums = [1, 2, 3, 4, 5]
# 1、列表元素求和
pprint('1、列表元素求和: ')
print('方法1:sum')
print(sum(nums))
print('方法2:reduce')
print(reduce(lambda x, y: x + y, nums))# 2、列表元素求积
pprint('2、列表元素求积: ')
print(reduce(lambda x, y: x * y, nums))# 3、列表元素平方
pprint('3、列表元素平方: ')
print('方法1:列表推导式')
print([x * x for x in nums])
print('方法2:map')
print(list(map(lambda x: x * x, nums)))# 4、列表元素过滤,比如只保留偶数
pprint('4、列表元素过滤,比如只保留偶数:')
print('方法1:列表推导式')
print([x for x in nums if x % 2 == 0])
print('方法2:filter')
print(list(filter(lambda x: x % 2 == 0, nums)))

执行结果:

c2c22c62e9338a6f4d42b71edbc80df7.jpeg

2、字符串操作

def pprint(content):print(f'======{content}======')s1 = 'hello Python'
# 1、字符串内容翻转
pprint('1、字符串内容翻转')
print(s1[::-1])
# 2、字符串按照单词翻转
pprint('2、字符串按照单词翻转')
print(' '.join(s1.split(' ')[::-1]))
# 3、判断是否回文串
pprint('3、判断是否回文串')
print((lambda s: s == s[::-1])('abcba'))
print((lambda s: s == s[::-1])('hello world'))
# 4、统计字符出现的次数:
pprint('4、统计字符出现的次数')
print({k: s1.count(k) for k in s1})

执行结果:

36ba9dc99264aac6c0d9cba8930a1a61.jpeg

3、条件判断

def pprint(content):print(f'======{content}======')nums = [1, 2, 3, 4, 5]
# 1、是否全为正数
pprint('1、是否全为正数')
print(all(x > 0 for x in nums))
# 2、是否存在偶数
pprint('2、是否存在偶数')
print(any(x % 2 == 0 for x in nums))

执行结果:

742309c1f82c1923f4a176ce97b651a9.jpeg

4、一行流的斐波那契数列

from functools import reducedef pprint(content):print(f'======{content}======')# 使用reduce计算斐波那契数列的前n项
pprint('使用reduce计算斐波那契数列的前n项')
fib = lambda n: reduce(lambda x, _: x + [x[-1] + x[-2]], range(n - 2), [0, 1])
print(fib(10))

执行结果:

e2fe0880bed26fb2f0f53a2a98d8398a.jpeg

关于一行流的思考

从前面的一行流的例子中,我们可以看到,在Python中可以利用列表推导式、字典推导式、列表生成式、高阶函数、lambda表达式,以及纯函数的组合,从而通过一行代码实现某个独立的功能。

一行流的优点在于代码的简洁性,而且很多时候并没有对性能造成影响。

但是,其缺点也是显而易见的:过于复杂的一行流代码会降低代码的可读性和可维护性。

所以,对于一行流的使用,要适当克制,很好地平衡简洁性与可读性。

毕竟,如同 Donald Knuth所说的,“编程是一种让他人了解你想让电脑做什么的艺术”。

总结

本文简单介绍了“一行流”的编程风格,并列举了一些一行流的代码实例。一行流的优缺点也比较直观,提高了代码的简洁性,却相应地降低了代码的可读性和可维护性。所以,关于一行流的使用,需要进行很好地权衡。

以上,就是本文的全部内容了,感谢您的拨冗阅读,希望对您有所帮助。

ddfb73c91adfba932931c7054d504b84.jpeg


http://www.mrgr.cn/news/29995.html

相关文章:

  • [智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
  • 工作和学习遇到的技术问题
  • 安科瑞工业绝缘监测装置:保障煤矿井下6kV供电系统安全运行的关键应用——安科瑞 丁佳雯
  • Mysql数据库里的SSH连接
  • 【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
  • (实战)WebApi第14讲:前端(JS)想要同步执行得使用回调、岗位搜索功能【在前端实现,不推荐】、同步/异步执行
  • scanf()函数的介绍及基础用法
  • Ubuntu LLaMA-Factory实战
  • 全新 HLOB 模型:预测限价订单簿中间价格变化方向的利器
  • Qt窗口——QToolBar
  • C++map,set,multiset,multimap详细介绍
  • 基于Jeecgboot3.6.3的flowable流程增加任务节点操作按钮的控制(一)
  • 【pytorch学习笔记,利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn】
  • Spring Boot中的响应与分层解耦架构
  • 如何兼容性地开发响应式站点——WEB开发系列40
  • ‍♀️焦虑症患者的救赎之路:这5项运动让你重拾宁静与力量!
  • python 实现average median平均中位数算法
  • 9.3 溪降技术:携包游泳
  • 新手怎样制作网页?
  • 可靠轻便,开箱即用的数据安全交换系统怎么选?关键在这三点
  • nodejs桌面消息通知
  • 基于Jeecgboot3.6.3的flowable流程增加任务节点字段的控制(二)
  • 华为OD机试 - 字符串划分(Java 2024 E卷 100分)
  • [数据集][目标检测]文本表格检测数据集VOC+YOLO格式6688张5类别
  • 光伏检测数据集(六种)
  • 基于web的工作管理系统设计与实现