一些Python的惯用法和小技巧:Pythonic
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,并且这种方法更快,更酷。
[转载] www.cr173.com/html/8108_1.html
一些Python的惯用法和小技巧:Pythonic的更多相关文章
- 关于Python ,requests的小技巧
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xie_0723/article/details/52790786 关于 Python Request ...
- python - opencv 的一些小技巧备忘
python - opencv 的一些小技巧备忘 使用python-opencv来处理图像时,可以像matlab一样,将一幅图像看成一个矩阵,进行矢量操作,以加快代码运行速度. 下面记录几个常用的操作 ...
- Python语言防坑小技巧
Python语言防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值即定义 1>.运行以下代码会出现报错 #!/usr/bin/env python #_*_ ...
- python实用30个小技巧
python实用30个小技巧 展开1.原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: ...
- 填坑总结:python内存泄漏排查小技巧
摘要:最近服务遇到了内存泄漏问题,运维同学紧急呼叫解决,于是在解决问题之余也系统记录了下内存泄漏问题的常见解决思路. 本文分享自华为云社区<python内存泄漏排查小技巧>,作者:luti ...
- Python 中的一些小技巧
这里是本人收集的一些 Python 小技巧,目前主要是一些实用函数,适合有一定基础的童鞋观看(不会专门介绍使用到的标准库函数).. 一.函数式编程 函数式编程用来处理数据,感觉很方便.(要是再配上管道 ...
- 30段极简Python代码:这些小技巧你都Get了么
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- Python中的一些小技巧
1.Boolean值可以当做一个数值 a = [5,6,7,8,9] print(a[True]) #prints 6 print(a[False]) #prints 5 2.两种方法实现 a = 1 ...
- Python全栈问答小技巧_2
Python全栈测试题(二) 作者:尹正杰 声明:答案如有偏差,欢迎指正!欢迎加入高级运维工程师之路:598432640 本文答题用的Python版本是:Python 3.5.2,请知晓! 1. 计算 ...
随机推荐
- Python模块:struct
各个编程语言都有自己的数据类型,当python需要接受其他语言或者网络传输来交互数据的时候,需要考虑到python的数据类型与其他平台之间交互问题.而python的struct就是解决这个问题的. s ...
- js正则获取图片的src属性及正则分割一个字符串
try{ var str='<P>xczxzxzxcxcxc<IMG src="http://file.ynet.com/2/1612/12/12119048.jp ...
- 细说;(function ($, undefined){ })(jQuery); 的使用
1. 对于function前面的分号(;)的使用:使用分号的目的是为了防止多个文件压缩合并时,以为其他文件最后一行语句没加分号,而引起合并后的语法错误. 2. (function ($, undefi ...
- 用SMIL语言编写一个简单的演示
一.首先需要注意的几点是: 1.用记事本编写代码时,要保存为后缀名为.smil或.smi的文件,并且编码格式选择为UTF-8. 2.打开.smil文件的播放器选择为:RealPlayer或是Ambul ...
- 图片javascript缩小
function SetSize(obj, width, height) { myImage = new Image(); myImage.src = obj.src; if (myImage.wid ...
- Android框架之AndroidAnnotations详细讲解
一: (1)一个activity如过使用AndroidAnnotions注入时, 那么它在 AndroidManifest.xml注册时,应该加入_ 比如: MainActivity的注册时 < ...
- C++的隐式类型转换
C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...
- BLE资料应用笔记 -- 持续更新
BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...
- JS组件系列——封装自己的JS组件
前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...
- C++基础知识易错点总结(2)
1. 若一组待排数据有序,花费时间最多的是:快速排序,T(n)=O(n^2): 2. 有 1000 个无序的整数,希望使用最快的方式找出前 50 个最大的,最佳的选择是? 快速排序:在最理想的情况下, ...