一些Python的惯用法和小技巧:Pythonic
来源:互联网 发布:小黑屋写作mac 编辑:程序博客网 时间:2024/05/24 06:10
(非常nice的一些小技巧,学习了之后还想收藏以便日后查看,转载自http://www.cr173.com/html/8108_1.html)
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 0
- 一些Python的惯用法和小技巧:Pythonic
- Python的惯用法技巧和创建型设计模式
- Python的魅力(Pythonic)及各种“不为人知”的小技巧
- 一些pythonic的代码
- 一些Pythonic的写法
- Pythonic的一些用法
- 减少编译时依赖的意义和一些惯用法
- Python的一些小技巧小知识
- Python的一些小技巧小知识
- Python的一些小技巧小知识
- python学习的一些小技巧小结
- 关于Python的一些使用小技巧
- Python爬虫的一些小技巧
- 一些Ruby惯用法
- python-pythonic
- Python-pythonic
- 一些web的小程序和技巧
- Python中一些小技巧
- InputStream与String,Byte之间互转
- Rotate Image
- Binary Tree Postorder Traversal
- record for read ·
- Leetcode Blog Post Algorithms
- 一些Python的惯用法和小技巧:Pythonic
- Coursera
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 最长公共子串(Longest-Common-Substring,LCS)
- VC C/C++ 4种方法获取文件大小 Windows API
- STL文件读写基础
- [leet code] Pascal's Triangle II
- 15分钟学会使用Git和远程代码库
- [LeetCode] 25倍速度被完虐的 Sum3