首页 > 编程语言 >Python中除了lambda函数能实现一句话程序,还有什么方式能够实现呢?

Python中除了lambda函数能实现一句话程序,还有什么方式能够实现呢?

时间:2022-11-22 18:34:31浏览次数:31  
标签:函数 推导 Python 列表 实现 元组 写法 lambda

引言

我们都知道python中使用lambda函数能够实现一句话程序,一句话能实现复杂功能,是一件多么炫酷的事情.但也是有利有弊的,至少一句话代码虽然简洁,但可读性不好,毕竟现实中都是多人合作编程,结对编程也是很多人提倡的,所以代码不只是要让机器看懂,同时也要让人读明白.

说到这里也许很多初学者还不知道什么是lambda函数,在Python中,lambda函数就是我们使用lambda关键字来声明的一个匿名函数,这就是为什么我们将它们称为“lambda函数”。匿名函数是指没有声明函数名称的函数。尽管它们在语法上看起来不同,lambda函数的行为方式与使用def关键字声明的一般函数相同。lambda和普通的函数相比,就是省去了函数名称而已,同时这样的匿名函数,又不能共享在别的地方调用。以下是Python中 lambda函数的特点:

lambda函数可以接受任意数量的参数,但函数只能包含一个表达式。表达式是lambda函数执行的一段代码,它可以返回任何值,也可以不返回任何值。lambda函数可以返回函数对象。从语法上讲,lambda函数只能有一个表达式。举个例子:

lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开冒号右边的为表达式

普通函数:

def f(x):
return x+2
print f(4)

lambda函数:

g = lambda x : x+2
print g(4)

开发中不太建议使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。使用它的时候要注意场景,我可以将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。

上面只是简单的举例,lambda还能把更多的语句写成一句话函数,不过lambda不是我们今天的重点.我们今天要说的是Python的推导式.

推导式又叫解析式,Python 推导式是一种Python独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。

Python 支持各种数据结构的推导式:

  1. 列表(list)推导式
  2. 字典(dict)推导式
  3. 集合(set)推导式
  4. 元组(tuple)推导式

接下来我们通过和普通写法来对比来学习推导式

列表推导式

用一个表达式创建或控制一个有规律列表

列表推导式格式为:

[表达式 for 变量 in 列表] 
[out_exp_res for out_exp in input_list]

或者

[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]

语法解析:

  1. out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  2. for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
  3. if condition:条件语句,可以过滤列表中不符合条件的值。

例子:过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母:

推导式写法:

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [name.upper()for name in names if len(name)>3]
print(new_names)

普通写法:

new_names2 = []
for name in names:
if len(name) > 3:
new_names2.append(name.upper())

print(new_names2)

这就是列表推导式,很简洁。上面对比看起来其实与for循环写法差不多。但推导式的好处是:不需要像for循环那样,先定义一个列表,然后在循环中编写如何把结果放入列表的代码。可以节省不必要的内存开销

字典推导式

快速合并列表为字典或提取字典中目标数据

字典推导式的格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

例子:使用字符串及其长度创建字典

推导式的写法:

listdemo = ['Zhangsan','Lisi', 'Wangwu']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
newdict = {key:len(key) for key in listdemo}
print(newdict)
#结果:'Zhangsan': 8, 'Lisi': 4, 'Wangwu': 6}

普通写法:

listdemo = ['Zhangsan','Lisi', 'Wangwu']
newdict2 = {}
for key in listdemo:
newdict2[key] = len(key)
print(newdict2)

集合推导式

集合有数据去重功能

集合推导式基本格式:

{ expression for item in Sequence }

{ expression for item in Sequence if conditional }

例子:判断不是 hel 的字母并输出:

推导式的写法:

seta = {x for x in 'helracheladhelbrheahl' if x not in 'hel'}
print(seta)
#结果:{'d', 'r', 'b', 'c', 'a'}

普通写法:

seta2 = set()
for x in 'helracheladhelbrheahl':
if x not in 'hel':
seta2.add(x)

print(seta2)

元组推导式

元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。

元组推导式格式:

(expression for item in Sequence )

(expression for item in Sequence if conditional )

元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。

例子:生成一个包含数字 1~9 的元组:

推导式的写法:

a = (x for x in range(1,10))
print(a) #结果:<generator object <genexpr> at 0x0000000002606BA0>
print(tuple(ta)) #结果:(1, 2, 3, 4, 5, 6, 7, 8, 9)

普通写法:

ta2 = tuple()
for x in range(1,10):
ta2 = (ta2 + (x,))

print(ta2)#结果:(1, 2, 3, 4, 5, 6, 7, 8, 9)

从上面的两种写法可以看出,虽然转成元组结果一样,但是推导式的写法默认返回的是一个生成器对象

总结

对于开发来说,推导式一种更高效更简洁的处理序列方式,但是他也有可读性不好的缺点,所以使用时一定要注意使用场景.在正确的场景使用或许能有事半功倍的效果.

标签:函数,推导,Python,列表,实现,元组,写法,lambda
From: https://blog.51cto.com/micai01/5878324

相关文章

  • Python 命令行参数
    Python命令行参数参考文章:https://zhuanlan.zhihu.com/p/56922793目标:编写出可执行参数的脚本文件并打包;1.sys模块方法使用sys.argv获取执行参数;"""开发终端参......
  • 2211-22学习记录之python百分数,time模块
    百分数print('{:.0%}'.format(84/100))输出为84%以上百分数输出是使用到了字符串格式化函数format(),在其中将分数42/50作为值给传递了进去。如果将分子分母同时乘以2......
  • 2. pycharm终端提示无法加载文件 F:\Users\Administrator\PycharmProjects\python
    问题如下:终端(terminnal)遇到下面红色问题。   怎么解决??pycharm终端提示无法加载文件F:\Users\Administrator\PycharmProjects\pythonProject\venv\Scripts\activa......
  • python之路33 MySQL 1
    存取数据的演变1.文本文件文件路径不固定:C:\aaa.txtD:\bbb.txtE:\ccc.txt数据格式不统一:jason|123jason$123jason1232.软件开发目录规范规定......
  • 微服务实现
    一、数据库驱动的微服务实现使用openAPI和Swagger实现API优先设计使用SpringDataJPA实现数据库驱动微服务二、事件驱动的微服务实现事件如何驱动微服务设计与异步消......
  • 几句话说清python中的零宽断言
    1、所谓零宽,是指”一个字符位置,不占字符宽度“。故称为“零宽”。2、所谓的先行断言,后发断言,......等等不一而足的种种称谓,只能徒增初学者理解上的困难。其实,以正则表达式中......
  • vue:路由实现原理
    随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式。大型单页应用最显著特点之一就是采用的前端路由系统,通过改变URL,在不重......
  • 19:使用pickle实现序列化和反序列化_神经元记忆移植
    ###使用pickle序列化Python中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。......
  • 使用MSIL采用Emit方式实现C#的代码生成与注入常用代码
    本文主要使用微软提供的一套C#的API函数,通过这些API函数,可以对已经编译过的.Net体系生成的EXE,DLL文件进行修改,而不是修改源码编译的方式,来完成新功能的加入、或者原有功......
  • vue中利用pinyin-pro纯前端实现拼音的模糊搜索
    1、安装配置插件pinyin-pro官网网址:pinyin-pro-npm(npmjs.com) npm安装npminstallpinyin-pro 项目中引入import{pinyin}from'pinyin-pro'; 2.......