专栏首页进击的Coder实用炫酷!这样写Python代码四两拨千斤!

实用炫酷!这样写Python代码四两拨千斤!

这是「进击的Coder」的第 416 篇技术分享

作者:闲欢

来源:Python 技术「ID: pythonall」

阅读本文大概需要 5 分钟。

判断一个程序员水平的高低,不能光看他的发量,也不能光看他的代码量,还要看他代码蕴含的思想,代码的质量。代码蕴含的思想主要体现在各种设计模式的运用上,而代码的质量就既要实现需求,又要保证代码的简洁优雅。保证代码质量是需要长期积累,养成良好的编程习惯,不断思考优化的。

今天就给大家介绍一种实用的保证代码简洁的武功—— Python 推导四式。

什么是推导式

推导式 comprehensions(又称解析式),是 python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列。

看定义很抽象,下面我们来看看具体的例子,通过例子来学习这四种推导式。

列表推导式

我们先来看一个需求:

快速创建一个包含元素 1-9 的平方的列表

面对这个需求,我们通常的实现方式是这样的:

lis = []
for i in range(1, 10):
    lis.append(i*i)
print(lis) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

用列表推导式怎么实现呢?你只需要一行代码:

lis = [x * x for x in range(1, 10)]
print(list) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

这就是推导式。我们可以看到列推导式的语法是这样的:

变量名 = [表达式 for 变量 in 列表]

再来一个复杂点的:

list = [x * y for x in range(1, 10) for y in range(1, 10)]
print(lis)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

这个是多个变量的类型,因此我们可以扩展上面的语法:

变量名 = [表达式 for 变量 in 列表 for 变量 in xxx]

当然,还有一种带条件的列推导式,它的语法是这样的:

变量名 = [表达式 for 变量 in 列表 if 条件]

我们来看一个需求:快速创建一个包含 1-10 之间所有偶数的列表。

lis = [i for i in range(1, 11) if i % 2 == 0]
print(lis) # [2, 4, 6, 8, 10]

字典推导式

字典推导式的形式和列表推导式类似,语法也是类似的,只不过字典推导式返回的结果是字典。

变量名 = {key: value表达式}

我们来看一个例子:

dic = {x: x/2 for x in range(1,11) if x % 2 == 0}
print(dic) # {2: 1.0, 4: 2.0, 6: 3.0, 8: 4.0, 10: 5.0}

如果这里我写成下面这种方式,返回的结果是什么呢?

dic = {'half': x/2 for x in range(1,11) if x % 2 == 0}
print(dic)

大家可以自己尝试运行一下,看跟你想的结果是不是一样的。

集合推导式

看了前面两个推导式,想必你已经知道集合推导式怎么写了。语法如下:

变量名 = {表达式 for 变量 in 列表 for 变量 in xxx}

或者

变量名 = {表达式 for 变量 in 列表 if 条件}

来一个实际的例子:创建一个存储10个偶数的集合。

set1 = {x for x in range(10) if x % 2 == 0}
print(set1) # {0, 2, 4, 6, 8}

元组推导式

我们先来看一个例子:

tup=(x for x in range(1,10))
print(tup) # <generator object <genexpr> at 0x1101fade0>

看到这个结果打印是不是有点懵?

上面的代码返回的变量其实是一个生成器,并不是一个元组。其实没有真正的元组推导式,我们只能用一个类似的方法来生成元组,暂且叫做“伪元组推导式”吧。

上面的例子我们来改进一下:

tup=tuple(x for x in range(1,10))
print(tup) # (1, 2, 3, 4, 5, 6, 7, 8, 9)

在前面加上 tuple 来显式进行类型转换就行了。

总结

这里介绍了四种 python 的推导式,主要是用来简化 循环的代码,生成不同的数据结构用的。当然,从这些基础的表达式语法出发,还可以运用到复杂的推导式,大家在写代码时留心使用就会发现它的强大之处。这种一行代码既简洁明了,又可以在新手面前炫技,用起来不要太爽!

End

本文分享自微信公众号 - 进击的Coder(FightingCoder)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《Vue3.0抢先学》系列之:一个简单的例子

    书接上文:你被我撩拨了一下,从Github上下载了Vue3.0的源码。然后呢,你是不是已经迫不及待的想知道到底怎么样快速的把这个源代码用起来呢?

    一斤代码
  • 【技术创作101训练营】Streamlit:快速创建机器学习应用的利器

    大家好,我是Frank,一直从事数据挖掘相关的工作。今天给大家分享一个快速创建机器学习应用的Python库,使用它可以简洁快速地部署自己的机器学习模型。

    FrankZhang99
  • 「镁客·请讲」圣创智能刘圣佳:以科技之名,RED Board将改变你的出行方式

    镁客网
  • 移动设备网页打电话、发短信、发邮件的html5链接实现方法

    在移动浏览器中实现拨打电话,调用sms发短信,发送email等功能,移动手机WEB页面(HTML5)协议提供的接口是一个好办法。采用url href链接的方式,...

    疯狂的技术宅
  • 9个独特的 CSS 背景视觉效果

    腾讯NEXT学位
  • 填坑!完结娱乐圈明星关系图谱

    娱乐圈明星关系图谱体验地址,建议先体验后阅读本文,或者先打开链接,等阅读完没准页面也加载好了(太卡警告!或者去B站看下录制的28s超短视频:超酷炫的娱乐圈明星关...

    古柳_DesertsX
  • 死亡凝视!幽灵机械狗午夜惊现街头,感觉世界要被机器支配了

    在加拿大安大略省北部的人行道上,人们可能做梦也没想到,一只四条腿的「机械怪物」竟然大半夜肆无忌惮地乱跑!

    新智元
  • 编程答疑:记不住运算符优先级怎么办?

    最近有几个初学者问了我几个编程上的问题,我觉得其中一个特别有代表性,拿出来和大家分享一下,让大家避一下坑。

    卤代烃
  • 逆天!波士顿动力再出视频,机器狗大跳火星哥热舞

    在波士顿动力最新视频中,SpotMini竟然跳起了红遍全球的魔性《Uptown Funk》,太空步、断头舞、电臀舞,最潮街舞元素应有尽有!

    新智元
  • 为什么外行认为写代码不值钱?

    有朋友来找你,或者你朋友给你介绍了一个活,说要开发一个 App ,「很简单」,就是一个购物的,跟淘宝或者京东差不多?你感觉需要多少钱?

    非著名程序员
  • 这些在 2016 年融了钱的明星AI初创公司,今年都在干嘛?

    商汤科技 最近商汤科技的各种传言不断,大的传言大家也可能都知道了,至于哪些是真哪些是假,si间、si间会给你答案。 咱直接看看他们今年的融资情况。今年 4 月,...

    BestSDK
  • 揭秘冬奥会“北京八分钟”里的黑科技

    昨晚,在平昌冬奥会闭幕式上, 燃烧了17天的圣火缓缓熄灭, 张艺谋和其团队带来了“北京八分钟”, 抛开了以往的“人海战术”, 这一次参与表演的只有24名演员,...

    钱塘数据
  • 【允悲】波士顿动力机器人跪了!搬箱子不成反摔倒

    【新智元导读】波士顿动力稍有动静就会引发轰动,这次也不例外。一段最新流出的视频显示了波士顿动力的Atlas机器人试着搬箱子然后放到架子上——尝试很久未果,最终无...

    新智元
  • 波士顿动力机器人离下一次震惊世界还需要一点时间,搬箱子不成反摔倒

    波士顿动力稍有动静就会引发轰动,这次也不例外。一段最新流出的视频显示了波士顿动力的Atlas机器人试着搬箱子然后放到架子上——尝试很久未果,最终无情倒下。此前业...

    机器人网
  • Macbook发布会前来一发 — Surface Studio

    时见疏星
  • Jupyter Notebook界面也可以如此炫酷?有人把Notebook玩出了新花样

    对全世界的 Python 高手而言,Jupyter Notebook 是目前最流行的编程环境,尤其是对那些从事机器学习和数据科学的人而言。数月前我第一次开始认真...

    机器之心
  • 浅谈硬件PM与软件PM在产品设计上的差异

    导语 | 在鹅厂经历了一个较为完整的智能硬件项目,在项目实践过程中,有一些感悟,准备结合这个产品作为例子做个总结,与大家一起分享下,希望对公司未来做硬件相关的团...

    腾讯大讲堂
  • 利用Spark通过nginx日志离线统计网站每日pv

    天策
  • 带你玩正则1--数据遍地是,看你取不取

    implementation 'com.google.code.gson:gson:2.8.5'

    张风捷特烈

扫码关注云+社区

领取腾讯云代金券