瞧瞧,这样的代码才叫Pythonic
来源 | Python编程时光(ID: Cool-Python)
Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。
要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些大牛代码,这里明哥收集了一些比较常见的 Pythonic 写法,帮助你养成写优秀代码的习惯。
01. 变量交换
交换两个变量的值,正常都会想利用一个中间临时变量来过渡。
tmp = a
a = b
b = tmp
能用一行代码解决的(并且不影响可读性的),决不用三行代码。
a,b = b,a
02. 列表推导
下面是一个非常简单的 for 循环。
my_list = []
for i in range(10):my_list.append(i*2)
在一个 for 循环中,如果逻辑比较简单,不如试用一下列表的列表推导式,虽然只有一行代码,但也逻辑清晰。
my_list = [i*2 for i in range(10)]
03. 单行表达式
上面两个案例,都将多行代码用另一种方式写成了一行代码。
这并不意味着,代码行数越少,就越 Pythonic 。
比如下面这样写,就不推荐。
print('hello'); print('world')if x == 1: print('hello,world')if <complex comparison> and <other complex comparison>:# do something
建议还是按照如下的写法来
print('hello')
print('world')if x == 1:print('hello,world')cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:# do something
04. 带索引遍历
使用 for 循环时,如何取得对应的索引,初学者习惯使用 range + len 函数
for i in range(len(my_list)):print(i, "-->", my_list[i])
更好的做法是利用 enumerate 这个内置函数
for i,item in enumerate(my_list):print(i, "-->",item)
05. 序列解包
使用 *
可以对一个列表解包
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
06. 字符串拼接
如果一个列表(或者可迭代对象)中的所有元素都是字符串对象,想要将他们连接起来,通常做法是
letters = ['s', 'p', 'a', 'm']
s=""
for let in letters:s += let
更推荐的做法是使用 join 函数
letters = ['s', 'p', 'a', 'm']
word = ''.join(letters)
07. 真假判断
判断一个变量是否为真(假),新手习惯直接使用 ==
与 True、False、None 进行对比
if attr == True:print('True!')if attr == None:print('attr is None!')
实际上,""
、[]
、{}
这些没有任何元素的容器都是假值,可直接使用 if not xx
来判断。
if attr:print('attr is truthy!')if not attr:print('attr is falsey!')
08. 访问字典元素
当直接使用 []
来访问字典里的元素时,若key不存在,是会抛异常的,所以新会可能会先判断一下是否有这个 key,有再取之。
d = {'hello': 'world'}
if d.has_key('hello'):print(d['hello']) # prints 'world'
else:print('default_value')
更推荐的做法是使用 get
来取,如果没有该 key 会默认返回 None(当然你也可以设置默认返回值)
d = {'hello': 'world'}print(d.get('hello', 'default_value')) # prints 'world'
print(d.get('thingy', 'default_value')) # prints 'default_value'
09. 操作列表
下面这段代码,会根据条件过滤过列表中的元素
a = [3, 4, 5]
b = []
for i in a:if i > 4:b.append(i)
实际上可以使用列表推导或者高阶函数 filter 来实现
a = [3, 4, 5]
b = [i for i in a if i > 4]
# Or:
b = filter(lambda x: x > 4, a)
除了 filter 之外,还有 map、reduce 这两个函数也很好用
a = [3, 4, 5]
b = map(lambda i: i + 3, a)
# b: [6,7,8]
10. 文件读取
文件读取是非常常用的操作,在使用完句柄后,是需要手动调用 close 函数来关闭句柄的
fp = open('file.txt')
print(fp.read())
fp.close()
如果代码写得太长,即使你知道需要手动关闭句柄,却也会经常会漏掉。因此推荐养成习惯使用 with open
来读写文件,上下文管理器会自动执行关闭句柄的操作
with open('file.txt') as fp:for line in fp.readlines():print(line)
11. 代码续行
将一个长度较长的字符串放在一行中,是很影响代码可读性的(下面代码可向左滑动)
long_string = 'For a long time I used to go to bed early. Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'
稍等注重代码可读性的人,会使用三个引号 \
来续写
long_string = 'For a long time I used to go to bed early. ' \'Sometimes, when I had put out my candle, ' \'my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'
不过,对我来说,我更喜欢这样子写 使用括号包裹 ()
long_string = ("For a long time I used to go to bed early. Sometimes, ""when I had put out my candle, my eyes would close so quickly ""that I had not even time to say “I’m going to sleep.”"
)
导包的时候亦是如此
from some.deep.module.inside.a.module import (a_nice_function, another_nice_function, yet_another_nice_function)
12. 显式代码
有时候出于需要,我们会使用一些特殊的魔法来使代码适应更多的场景不确定性。
def make_complex(*args):x, y = argsreturn dict(**locals())
但若非必要,请不要那么做。无端增加代码的不确定性,会让原先本就动态的语言写出更加动态的代码。
def make_complex(x, y):return {'x': x, 'y': y}
13. 使用占位符
对于暂不需要,却又不得不接收的的变量,请使用占位符
filename = 'foobar.txt'
basename, _, ext = filename.rpartition('.')
14. 链式比较
对于下面这种写法
score = 85
if score > 80 and score < 90:print("良好")
其实还有更好的写法
score = 85
if 80 < score < 90:print("良好")
如果你理解了上面的链式比较操作,那么你应该知道为什么下面这行代码输出的结果是 False
>>> False == False == True
False
15. 三目运算
对于简单的判断并赋值
age = 20
if age > 18:type = "adult"
else:type = "teenager"
其实是可以使用三目运算,一行搞定。
age = 20
b = "adult" if age > 18 else "teenager"
更多精彩推荐
算力至上?四大AI芯片大对决
韩辉:国产操作系统的最大难题在于解决“生产关系”
直播电商都用上 AI 实时翻译了!歪果仁也能听懂李佳琦
区块链赋能供应链金融|应用优势与四类常见模式
蓝色巨人IBM全力奔赴的混合云之旅能顺利吗?
相关文章:

linux基础(一)安装系统Centos6.5
安装有常用有:远程网络安装、U盘安装、光盘安装三种方式,以下为光盘进行安装1.出现引导界面,选择安装或升级现有系统,选择第一个安装系统。Install or upgrade an existing system 安装或升级现有的系统 install system with basi…

使用 .NET 对事件进行编程
作者:Ted Pattison 您可能已经对事件进行编程若干年了,但是迁移到 .NET Framework 仍然需要您重新检查事件的内部工作,因为 .NET Framework 中的事件位于委托的顶层。 对委托的了解越多,对事件进行编程时所具有的驾驭能力越强。 开始使用公…

tomcat项目自动发布脚本.脚本运行效果
./update -------------------------------------------------------------- | 确定特定用户执行,否则退出 | -------------------------------------------------------------- Yes,we are the user of testtomcat --------------------------------------------------…
11.11大促来袭,京东如何保障云安全?
2020年4月,国家发改委首次就“新基建”概念作出正式解释。云计算被纳入信息基础设施中的新技术基础设施。据IDC统计,2019年全球云计算基础设施规模超过传统IT基础设施,占全球IT基础设施的50%以上。云计算发展势如破笋,云计算也成为…

分享Kali Linux 2017年第11周镜像文件
分享Kali Linux 2017年第11周镜像文件 Kali?Linux官方于3月12日发布2017年的第11周镜像。这次维持了11个镜像文件的规模。默认的Gnome桌面的4个镜像,E17、KDE、LXDE、MATE、XFCE桌面的各一个,手机版的包括ARMEL和ARMHF。有最近要安装Kali?Linux系统的&…

实现无刷新DropDownList联动效果
在做一个文章添加功能时,想在选择大类后,自动将其所属二级小类显示出来,使用DropDownList的SelectedIndexChanged事件可以很容易实现,但每次选择后页面总要刷新一次,让人感觉很不爽。为实现DropDownList无刷新二级联动…
偷天换日,逼真的天空置换算法
责编 | 晋兆雨来源 | Jack Cui头图 | CSDN付费下载于视觉中国前言天空,是摄像中的一个关键元素。游戏的天空,我们可以随意调节,可以是晴空万里,也可以是风雨交加。现实的天空,我们也可以使用算法进行调整,算…
office2003/2007/2010版本降低宏安全设置方法
如果在公司内部环境中,因为各种系统对Office环境的要求,需要通过降低Office宏安全性的方法来提高系统访问效率的话,可以参考一下方法设置。 Office2003所需的设置如下: 1、打开Office2003,选择"工具"&#x…

【WEB API项目实战干货系列】- API登录与身份验证(三)
上一篇: 【WEB API项目实战干货系列】- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. 这一篇的主要原理是: API会提供一个单独的登录API, 通过用户名࿰…

ASP.NET中的页面指示标识
页面指示标识 的功能是用来确定在处理aspx文件的时候,需要系统做一些什么特殊的设定?它的语法是:<% directive attributevalue %> 比如:<%import namespace"System.Data"%> 注意属性之间需要空格&#…

⑨③-不能浪费拥有的年轻资本
⑨③-不能浪费拥有的年轻资本 老男孩语录⑨③-不能浪费拥有年轻资本 万两黄金易得,年轻资本难求! 同学们,我们不能浪费比万两黄金还贵重的年轻资本,因为,转眼间你就不再拥有这个资本了, 趁着年轻࿰…
滴滴AI语音团队获国际顶尖智能对话系统竞赛世界第一
出品 | AI科技大本营头图 | CSDN付费下载于视觉中国近日,在国际顶尖人工智能竞赛第九届对话系统技术挑战赛(DSTC9)中,滴滴语音和NLP技术团队参与端到端多领域面向任务型对话系统任务荣获世界第一,充分彰显滴滴公司在自…

RHEL5+PXE+DHCP+Apache+Kickstart安装RHCE5.1 i386实验室环境
此博文出自:http://andrewyu.blog.51cto.com/1604432/1100567 使用RHEL5PXEDHCPApacheKickstart安装RHCE5.1 i386实验室环境,根据文章内容也可批量安装了红帽RHEL系统或CentOS5.x,现阶段,由于需要大规模应用CentOS5.8 x86_64系统用…

用ASP.Net(C#)连接Oracle数据库的方法
今天看了一下asp.net连接oracle数据库的方法,得到了如下代码。这段代码打开了MyTable表,并把操作员的名字列出。字段类型是OracleString。读取的时候用的是字段编号,我不知道怎么使用字段名来读取某字段的内容。下面是代码://首先…
NLP任务中的文本预处理步骤、工具和示例
作者 | Viet Hoang Tran Duong来源 | DeepHub IMBA头图 | CSDN付费下载于视觉中国数据是新的石油,文本是我们需要更深入钻探的油井。文本数据无处不在,在实际使用之前,我们必须对其进行预处理,以使其适合我们的需求。对于数据也是…

github设置添加SSH
https 和 SSH 的区别: 1、前者可以随意克隆github上的项目,而不管是谁的;而后者则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加 SSH key ,否则无法克隆。 2、https url 在push的时候是需要验证用户名和密码…

在asp.net中使用客户端脚本
我们常常在asp.net中需要使用到客户端脚本,在asp.net中使用客户端脚本很容易,使用到Page的RegisterClientScriptBlock方法就行了。下面是我写的一段C#代码,用来打开新窗口: using System; using System.Web.UI; namespace MyBill { …

一个DIV调用多个CSS样式
1使用以上两个CSS样式表对描述同一个DIV的写法class利用class可以对于同一个标签多重定义样式. 比如用1、2两种样式同时控制一个DIV,可以写成以下格式: <div class"1 2"> </div> 使用以上两个CSS样式表对描述同一个DIV࿰…
最新!百度首发 OCR 自训练平台 EasyDL OCR
今年以来,人工智能愈发火热。在2020年4月,政府已将人工智能基础设施列入新基建范围。在利好政策引导下,人工智能的应用范围越来越广。以 OCR(文字识别技术)为例,随着智能手机与各种端边电子产品的增多&…

性能测试初学_loadrunner base64/md5 编码 解码
参考这3篇文章: MD5: http://bbs.51testing.com/forum.php?modviewthread&tid1111323 base64: http://www.cnblogs.com/preftest/archive/2011/06/12/2079178.html http://www.51testing.com/html/41/15103841-3707341.html 主要思路为&…

ASP.NET管理状态的十种途径
HTTP协议是无状态的,ASP.NET提供了丰富的手段在页面之间管理状态。本文列举ASP.NET管理状态的十种途径。 ASP.NET中,从System.Web.UI.Page继承的类里有以下十种管理页面状态的途径: 1. Application对象: this.Application 2. …

sed学习系列---第3/3部分
为什么80%的码农都做不了架构师?>>> ---简介 在这篇 sed 系列的总结性文章中,Daniel Robbins 带您体验 sed 的真正力量。在介绍完几个重要的 sed 脚本之后,他将通过将一个 Quicken .QIF 文件转换成可读文本格式来演示一些基本 s…

11位科幻作家参与,首次AI人机共创写作实验启动
人工智能会怎样影响人类文学创作?人类智慧与机器智慧如何相互激发创作灵感? 10月27日,由传茂文化和创新工场联手打造的华语科幻AI人机共创写作实验项目《共生纪》启动,人类作家与AI算法将围绕环保、人机关系、性别、文化多样性等…

笔记之远程桌面服务(RDS)
Windows默认只能有2个用户同时通过RDP进行连接,非常不方便,于是借此机会学习了下Win2012R2的远程桌面配置。以下我把学习过程记录一下: 1. 最开始我觉得只需要安装“Remote Desktop Session Host”,事实证明这样没错,可…

用Asp.net 传送大文件
Chris Hynes我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer…

[转]Java Os Properties
2019独角兽企业重金招聘Python工程师标准>>> // File: io/properties/SysPropList.java // Description: Shows system properties. This must be an application. // An applet cant get this information. // Author: Fred Swartz // Date: 2 Feb…

思谋科技A轮融资超1亿美元 ,成为最年轻“准独角兽”AI企业
新一代视觉AI前沿技术公司——思谋科技今天宣布,已完成A轮融资。据知情人士透露,思谋科技此次融资金额超1亿美元,成为业内最年轻的“准独角兽”AI企业,本新投资方包括松禾资本、红杉资本中国基金、基石资本、闻天下投资等。今年6月…

C语言 · 征税程序
算法提高 征税程序 时间限制:1.0s 内存限制:512.0MB问题描述税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程序将计算出相应的税额tax,并把它显示在…

在ASP.NET中随意创建图形信息
如果没有一个外部组件的支持,在ASP中是不能动态创建图形的,不管它是一个图表,一个横幅或仅仅是一个图形计数器。可喜的是,这一点在ASP.NET中改变了。现在,我们只需要使用内置功能,就能够很容易动态创建图形…
做动态图表没有数据?用Python就能获取
来源 | 法纳斯特(ID:walker398)刷爆全网的动态条形图,原来 5 行 Python 代码就能实现!这是小F在国庆之前写的一篇文章,既然有了Python这个制作动态条形图工具,缺的那便是数据了。先看一下B站2019年「数据可…