当前位置: 首页 > 编程日记 > 正文

瞧瞧,这样的代码才叫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

安装有常用有&#xff1a;远程网络安装、U盘安装、光盘安装三种方式&#xff0c;以下为光盘进行安装1.出现引导界面&#xff0c;选择安装或升级现有系统&#xff0c;选择第一个安装系统。Install or upgrade an existing system 安装或升级现有的系统 install system with basi…

使用 .NET 对事件进行编程

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

tomcat项目自动发布脚本.脚本运行效果

./update -------------------------------------------------------------- | 确定特定用户执行,否则退出 | -------------------------------------------------------------- Yes,we are the user of testtomcat --------------------------------------------------…

11.11大促来袭,京东如何保障云安全?

2020年4月&#xff0c;国家发改委首次就“新基建”概念作出正式解释。云计算被纳入信息基础设施中的新技术基础设施。据IDC统计&#xff0c;2019年全球云计算基础设施规模超过传统IT基础设施&#xff0c;占全球IT基础设施的50%以上。云计算发展势如破笋&#xff0c;云计算也成为…

分享Kali Linux 2017年第11周镜像文件

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

实现无刷新DropDownList联动效果

在做一个文章添加功能时&#xff0c;想在选择大类后&#xff0c;自动将其所属二级小类显示出来&#xff0c;使用DropDownList的SelectedIndexChanged事件可以很容易实现&#xff0c;但每次选择后页面总要刷新一次&#xff0c;让人感觉很不爽。为实现DropDownList无刷新二级联动…

偷天换日,逼真的天空置换算法

责编 | 晋兆雨来源 | Jack Cui头图 | CSDN付费下载于视觉中国前言天空&#xff0c;是摄像中的一个关键元素。游戏的天空&#xff0c;我们可以随意调节&#xff0c;可以是晴空万里&#xff0c;也可以是风雨交加。现实的天空&#xff0c;我们也可以使用算法进行调整&#xff0c;算…

office2003/2007/2010版本降低宏安全设置方法

如果在公司内部环境中&#xff0c;因为各种系统对Office环境的要求&#xff0c;需要通过降低Office宏安全性的方法来提高系统访问效率的话&#xff0c;可以参考一下方法设置。 Office2003所需的设置如下&#xff1a; 1、打开Office2003&#xff0c;选择"工具"&#x…

【WEB API项目实战干货系列】- API登录与身份验证(三)

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

ASP.NET中的页面指示标识

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

⑨③-不能浪费拥有的年轻资本

⑨③-不能浪费拥有的年轻资本 老男孩语录⑨③-不能浪费拥有年轻资本 万两黄金易得&#xff0c;年轻资本难求&#xff01; 同学们&#xff0c;我们不能浪费比万两黄金还贵重的年轻资本&#xff0c;因为&#xff0c;转眼间你就不再拥有这个资本了&#xff0c; 趁着年轻&#xff0…

滴滴AI语音团队获国际顶尖智能对话系统竞赛世界第一

出品 | AI科技大本营头图 | CSDN付费下载于视觉中国近日&#xff0c;在国际顶尖人工智能竞赛第九届对话系统技术挑战赛&#xff08;DSTC9&#xff09;中&#xff0c;滴滴语音和NLP技术团队参与端到端多领域面向任务型对话系统任务荣获世界第一&#xff0c;充分彰显滴滴公司在自…

RHEL5+PXE+DHCP+Apache+Kickstart安装RHCE5.1 i386实验室环境

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

用ASP.Net(C#)连接Oracle数据库的方法

今天看了一下asp.net连接oracle数据库的方法&#xff0c;得到了如下代码。这段代码打开了MyTable表&#xff0c;并把操作员的名字列出。字段类型是OracleString。读取的时候用的是字段编号&#xff0c;我不知道怎么使用字段名来读取某字段的内容。下面是代码&#xff1a;//首先…

NLP任务中的文本预处理步骤、工具和示例

作者 | Viet Hoang Tran Duong来源 | DeepHub IMBA头图 | CSDN付费下载于视觉中国数据是新的石油&#xff0c;文本是我们需要更深入钻探的油井。文本数据无处不在&#xff0c;在实际使用之前&#xff0c;我们必须对其进行预处理&#xff0c;以使其适合我们的需求。对于数据也是…

github设置添加SSH

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

在asp.net中使用客户端脚本

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

一个DIV调用多个CSS样式

1使用以上两个CSS样式表对描述同一个DIV的写法class利用class可以对于同一个标签多重定义样式. 比如用1、2两种样式同时控制一个DIV&#xff0c;可以写成以下格式&#xff1a; <div class"1 2"> </div> 使用以上两个CSS样式表对描述同一个DIV&#xff0…

最新!百度首发 OCR 自训练平台 EasyDL OCR

今年以来&#xff0c;人工智能愈发火热。在2020年4月&#xff0c;政府已将人工智能基础设施列入新基建范围。在利好政策引导下&#xff0c;人工智能的应用范围越来越广。以 OCR&#xff08;文字识别技术&#xff09;为例&#xff0c;随着智能手机与各种端边电子产品的增多&…

性能测试初学_loadrunner base64/md5 编码 解码

参考这3篇文章&#xff1a; MD5&#xff1a; http://bbs.51testing.com/forum.php?modviewthread&tid1111323 base64&#xff1a; http://www.cnblogs.com/preftest/archive/2011/06/12/2079178.html http://www.51testing.com/html/41/15103841-3707341.html 主要思路为&…

ASP.NET管理状态的十种途径

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

sed学习系列---第3/3部分

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

11位科幻作家参与,首次AI人机共创写作实验启动

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

笔记之远程桌面服务(RDS)

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

用Asp.net 传送大文件

Chris Hynes我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题&#xff0c;因为ASP.NET会block直到把整个文件载入内存后&#xff0c;再加以处理。实际上&#xff0c;如果文件很大的话&#xff0c;我们经常会见到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前沿技术公司——思谋科技今天宣布&#xff0c;已完成A轮融资。据知情人士透露&#xff0c;思谋科技此次融资金额超1亿美元&#xff0c;成为业内最年轻的“准独角兽”AI企业&#xff0c;本新投资方包括松禾资本、红杉资本中国基金、基石资本、闻天下投资等。今年6月…

C语言 · 征税程序

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

在ASP.NET中随意创建图形信息

如果没有一个外部组件的支持&#xff0c;在ASP中是不能动态创建图形的&#xff0c;不管它是一个图表&#xff0c;一个横幅或仅仅是一个图形计数器。可喜的是&#xff0c;这一点在ASP.NET中改变了。现在&#xff0c;我们只需要使用内置功能&#xff0c;就能够很容易动态创建图形…

做动态图表没有数据?用Python就能获取

来源 | 法纳斯特&#xff08;ID:walker398&#xff09;刷爆全网的动态条形图&#xff0c;原来 5 行 Python 代码就能实现&#xff01;这是小F在国庆之前写的一篇文章&#xff0c;既然有了Python这个制作动态条形图工具&#xff0c;缺的那便是数据了。先看一下B站2019年「数据可…