文档章节

一些Python的惯用法和小技巧:Pythonic

熟悉的防守
 熟悉的防守
发布于 2016/03/29 21:30
字数 1020
阅读 56
收藏 3

Pythonic其实是个模糊的含义,没有确定的解释。网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯。本文主要是说明一些Python的惯用法和小技巧,其实与上一篇《编码规范》有异曲同工之妙,都是为了增加代码可读性,但Pythonic可能还会从性能的角度进行考虑。

首先是两个不得不说的Python的特性List Comprehension和Generator Expression,非常精简的语法,很大程度上取代了冗长for循环。

1. 列表解析(List Comprehension)List Comprehension是在Python2.0版本中加进入的,是一种更高效、简洁的for结构替代品,作为新手写上几个后就对它爱不释手,惊呼太好用了。

例子:将原始列表中的所有元素进行某种操作后赋值给新的列表。

如果用for循环,代码如下:

oldlist = [] 

for item in oldlist: 

newlist.append(func(item))

如果使用List Comprehension,代码如下:

newlist = [func(item) for item in oldlist]

我们明显看到差别,3行变一行,代码可读性增强,而且性能也提升很多,据说基本可以达到c语言的速度。

List Comprehension还支持过滤功能,在列表生成过程中套用for if字句,非常好用。示例如下:

evens = [even for even in range(10) if even % 2 == 0]

只需要一行,就将得到0到9的数字中的所有偶数,过滤掉了奇数。

2. 生成器表达式(Generator Expression):Python2.4中引入了Generator Expression。它功能上类似于List Comprehension,这你就要问了,为什么要加入这个呢。因为Generator Expression更加高效,避免了生成整个列表,改善性能及内存占用,取而代之的是返回一个generator object,通过它迭代的返回列表中的每一个值。

而且Generator Expression的使用方法也很简单,就是将List Comprehension中的中括号[]改成小括号(),示例如下:

newlist = (func(item) for item in oldlist)

这个返回的newlist其实并不是一个list,而是前面提到的generator object,可以理解为列表的一个迭代器,类似于C++中的iter。 可以通过newlist.next()迭代获得列表中的每一项。

List Comprehension和Generator Expression实在是Python中的亮点,简洁高效,一定要经常用、时时用、秒秒用。

然后是一些小技巧(大多数是很多语言都提倡的编程实践):

1. 字符串拼接:使用’’.join进行字符串拼接,而不是a += b这种形式。因为join将保证这个过程的时间复杂度为线性的,效率更高。道理很多人都知道,但是大多数人还是喜欢用“+”,因为这个实在太简洁了。其实很多语言都提供了拼接字符串的方法或者相应的类,良好编程习惯从拼接字符串开始。

2. 异常类型:基于类的异常总是好过基于字符串的异常。我们最好构造一个基于Exception的子类。

当抛出一个异常的时候,使用”raise ValueError(‘message’)”替代”raise ValueError, ’message’”的形式。

3. None判断:判断一个实例变量是否为空的时候,应该总是用’is’或者’is not’,而不要使用相等操作符。

4. 对象类型判断:对象类型的比较应该始终用isinstance()代替直接比较类型。例如:

使用if isinstance(obj, int): 而不是 if type(obj) is type(1):

5. 字符串前后缀判断:在检查前缀或后缀时避免对字符串进行切片。用startswith()和endswith()代替,因为它们是明确的并且错误更少。例如:

使用if foo.startswith('bar'): 替代 if foo[:3] == 'bar':

6. 变量值交换:在其他语言中,我们经常这样交换两个变量的值。t=a; a=b; b=t;

但是在Python中,我们还有一个简单的办法,a, b = b, a,并且这种方法更快,更酷。

本文转载自:

熟悉的防守
粉丝 0
博文 12
码字总数 335
作品 0
程序员
私信 提问
加载中

评论(0)

Pythonic到底是什么玩意儿?

这是几个月前在 EuroPython 邮件列表(主要用来组织和计划 EuroPython 会议的邮件列表)出现的问题。这是一个非常有意思的问题,我看到这个词被无数次地使用,但鲜有人尝试解释它的含义。在这...

陶邦仁
2013/01/15
449
2
对比几段代码,看看你是 Python 菜鸟还是老鸟

Python 里有个小彩蛋: 在 Python Shell 里输入 这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如: 优美胜于丑陋 明确胜于隐晦 简单胜于复杂 …...

crossin
2019/03/05
128
0
后悔没早知道这些Python特性

  师长虽然是java的,但是作为架构师,其实多类语言都必须掌握,就像写 Python, 也玩了好几年时间了。讲道理,在工作中大家肯定遇到过这样的场景:      这个故事告诉我们什么?先造轮...

java进阶架构师
2019/10/13
0
0
能让你代码更 Pythonic 的小技巧

下面例举几个在工作中用到过,个人认为比较 Pythonic 的一些实现个技巧: cached_property 它的作用是将一个方法的计算结果缓存到对象的 当中,熟悉 Flask 的人对这个应该不陌生,Django 应该...

实验楼
2018/06/19
0
0
Python|19个优雅的Python编程技巧,涨姿势

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀...

糖宝lsh
2018/12/04
84
0

没有更多内容

加载失败,请刷新页面

加载更多

数组foreach()遍历中的传递引用

在PHP的foreach ($arr as $k => $v) 的遍历中,每一轮的遍历,都发生了以下事情 $k = currentKey($arrCopy); //将副本数组本轮次的键的值分配给$k,比如下标0,1,2等;$v = currentVal($arrCo...

vinci321
今天
140
0
将文件从Docker容器复制到主机 - Copying files from Docker container to host

问题: I'm thinking of using Docker to build my dependencies on a Continuous Integration (CI) server, so that I don't have to install all the runtimes and libraries on the agent......

技术盛宴
今天
117
0
略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
138
0
elasticsearch 第三讲

es的详细介绍 SearchTemplate tmdb 表示的是模板名称 dmdb1 表示的是当前的索引 脚本方式编辑 ##编辑模板POST _scripts/tmdb{ "script": { "lang": "mustache", "source": { ......

鸡蛋炒馒头
今天
209
0
IDEA新建springMVC项目,启动后访问Controller报404

IDEA新建springMVC项目,启动后可以访问到默认的index.jsp,但是访问controller就报404 查看web.xml配置 spingmvc.xml配置 都没有问题 请求的url也和定义的@RequestMapping一致。也没有问题。...

vicky_dimi
今天
316
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部