《Python之禅》中对于Python编程过程中的一些建议


Posted in Python onApril 03, 2015

围绕一门语言,学习它的文化精髓,能让你成为一名更优秀的程序员。如果你还没读过Python之禅(Zen of Python) ,那么打开Python的命令提示符输入import this,列表中的每一项你都可以在这里找到相对应的例子。
吸引我注意力的一条是:

优雅胜于丑陋 (Beautiful is better than ugly)

看下面例子:

一个带有数字参数的list函数其功能是返回参数中的奇数可以分开写:
 

#-----------------------------------------------------------------------
 halve_evens_only = lambda nums: map(lambda i: i/2,\
 filter(lambda i: not i%2, nums))
 #-----------------------------------------------------------------------
def halve_evens_only(nums):
   return [i/2 for i in nums if not i % 2]

记住Python中那些非常简单的事

两个变量的交换:
 

a, b = b, a

参数在切片操作中的步骤,如:
 

a = [1,2,3,4,5]
>>> a[::2] # 以步长为2的增量迭代整个list对象
[1,3,5]

 一个特殊的例子 `x[::-1]`用来反转x的实用语法。
 

>>> a[::-1]
 [5,4,3,2,1]

不要用可变对象作为默认参数值(Don't use mutable as defaults)
 

def function(x, l=[]):     # 不要这么干
def function(x, l=None):    # 更好的一种方式
  if l is None:
    l = []

使用iteritems而不是items

iteriterms 使用的是 generators,所以当迭代很大的序列是此方法更好
 

d = {1: "1", 2: "2", 3: "3"}
 
for key, val in d.items()    # 调用items()后会构建一个完整的list对象
 
for key, val in d.iteritems()  # 只有在迭代时每请求一次才生成一个值

此情景和range与xrange的关系相似。

使用isinstance 而不是type

不要这样做:
 

if type(s) == type(""): ...
if type(seq) == list or \
  type(seq) == tuple: ...

应该是这样:
 

if isinstance(s, basestring): ...
if isinstance(seq, (list, tuple)): ...

至于为什么这样做,看这里:http://stackoverflow.com/a/1549854/504262

需要注意的是这里使用basestring而不是str是因为你可能会用一个unicode对象去检查是否为string,例如:
 

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False

因为在Python中3.0以下的版本存在两种字符串类型str和unicode

《Python之禅》中对于Python编程过程中的一些建议

学习各种集合(learn the various collections)

python有各种各样的容器数据类型,在特定情况下选择python内建的容器如:list和dict。通常更多像如下方式使用:

freqs = {}
for c in "abracadabra":
  try:
    freqs[c] += 1
  except:
    freqs[c] = 1

一种更好的方案如下:
 

freqs = {}
  for c in "abracadabra":
    freqs[c] = freqs.get(c, 0) + 1

一种更好的选择 collection类型defautdict:
 

from collections import defaultdict
freqs = defaultdict(int)
  for c in "abracadabra":
    freqs[c] += 1

其它集合
 

namedtuple()    # 用指定的域创建元组子类的工厂函数
deque      # 类似list的容器,快速追加以及删除在序列的两端
Counter     # 统计哈希表的dict子类
OrderedDict      # 记录实体添加顺序的dict子类
defaultdict      # 调用工厂方法为key提供缺省值的dict子类

当创建类时Python的魔术方法:

__eq__(self, other)   # 定义相等操作的行为, ==.
__ne__(self, other)   # 定义不相等操作的行为, !=.
__lt__(self, other)   #定义小于操作的行为, <.
__gt__(self, other)   #定义不大于操作的行为, >.
__le__(self, other)   #定义小于等于操作的行为, <=.
__ge__(self, other)   #定义大于等于操作的行为, >=.

条件赋值
 

x = 3 if (y == 1) else 2

表达式请起来恰恰像:如果y等于1就把3赋值给x,否则把2赋值给x,当然同样可以使用链式条件赋值如果你还有更复杂的条件的话。
 

x = 3 if (y == 1) else 2 if (y == -1) else 1

然而到了某个特定的点,它就有点儿过分了。

记住,你可以在任何表达式中使用if-else例如:
 

(func1 if y == 1 else func2)(arg1, arg2)

func1将被调用如果y等于1的话,反之func2被调用。两种情况下,arg1和arg2两个参数都将附带在相应的函数中。

类似地,下面这个表达式同样是正确的
 

x = (class1 if y == 1 else class2)(arg1, arg2)

class1和class2是两个类

在有必要的时侯使用Ellipsis

创建类时,你可以使用__getitem__,让你的类像字典一个工作,拿下面这个类举例来说:
 

class MyClass(object):
  def __init__(self, a, b, c, d):
    self.a, self.b, self.c, self.d = a, b, c, d
 
  def __getitem__(self, item):
    return getattr(self, item)
 
x = MyClass(10, 12, 22, 14)

因为有了__getitem__,你就能够通过对象x的x[‘a']获取a的值,这应该是公认的事实。

这个对象通常用于继承Python的切片(slicing) (http://docs.python.org/library/stdtypes.html#bltin-ellipsis-object),如果添加如下语句:
 

def __getitem__(self, item):
   if item is Ellipsis:
     return [self.a, self.b, self.c, self.d]
   else:
     return getattr(self, item)

我们就可以使用x[…]获取的包含所有项的序列
 

>>> x = MyClass(11, 34, 23, 12)
>>> x[...]
[11, 34, 23, 12]
Python 相关文章推荐
python实现的各种排序算法代码
Mar 04 Python
Python脚本实现代码行数统计代码分享
Mar 10 Python
python 用下标截取字符串的实例
Dec 25 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
Python小进度条显示代码
Mar 05 Python
python导入pandas具体步骤方法
Jun 23 Python
PHP统计代码行数的小代码
Sep 19 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
python os模块常用的29种方法使用详解
Jun 02 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
用Python简陋模拟n阶魔方
Apr 17 Python
给Python初学者的一些编程技巧
Apr 03 #Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 #Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 #Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 #Python
举例讲解Python中is和id的用法
Apr 03 #Python
详解Python2.x中对Unicode编码的使用
Apr 03 #Python
对于Python中线程问题的简单讲解
Apr 03 #Python
You might like
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
用户注册常用javascript代码
2009/08/29 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python机器学习之神经网络实现
2018/10/13 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Python实现扫码工具的示例代码
2020/10/09 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
体育教师工作总结的自我评价
2013/10/10 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
小学生演讲稿
2014/01/12 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
车辆管理制度范本
2015/08/05 职场文书
护士旷工检讨书
2015/08/15 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA