Home > Backend Development > Python Tutorial > 《Python之禅》中对于Python编程过程中的一些建议

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

WBOY
Release: 2016-06-06 11:23:30
Original
1113 people have browsed it

围绕一门语言,学习它的文化精髓,能让你成为一名更优秀的程序员。如果你还没读过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]
Copy after login

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

两个变量的交换:

a, b = b, a
Copy after login

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

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

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

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

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

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

使用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()  # 只有在迭代时每请求一次才生成一个值
Copy after login

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

使用isinstance 而不是type

不要这样做:

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

应该是这样:

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

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

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

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

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

201543105902114.jpg (319×212)

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

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

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

Copy after login

一种更好的方案如下:

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

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

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

其它集合

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

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

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

Copy after login

条件赋值

x = 3 if (y == 1) else 2
Copy after login

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

x = 3 if (y == 1) else 2 if (y == -1) else 1
Copy after login

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

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

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

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

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

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

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)
Copy after login

因为有了__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)
Copy after login

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

>>> x = MyClass(11, 34, 23, 12)
>>> x[...]
[11, 34, 23, 12]
Copy after login

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template