Pythonista 容易忽略的python编程方式

Python 之禅python

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
优美胜于丑陋(Python以编写优美的代码为目标)
Explicit is better than implicit.
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格类似)
Simple is better than complex.
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
Complex is better than complicated.
复杂胜于凌乱(若是复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
Flat is better than nested.
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
Sparse is better than dense.
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
Readability counts.
可读性很重要(优美的代码是可读的)
Special cases aren"t special enough to break the rules.
Although practicality beats purity.
即使假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
Errors should never pass silently.
Unless explicitly silenced.
不要包容全部错误,除非你肯定须要这样作(精准地捕获异常,不写except:pass风格的代码)
In the face of ambiguity, refuse the temptation to guess.
当存在多种可能,不要尝试去猜想
There should be one-- and preferably only one --obvious way to do it.
而是尽可能找一种,最好是惟一一种明显的解决方案(若是不肯定,就用穷举法)
Although that way may not be obvious at first unless you"re Dutch.
虽然这并不容易,由于你不是 Python 之父(这里的Dutch是指Guido)
Now is better than never.
Although never is often better than right now.
作也许好过不作,但不假思索就动手还不如不作(动手以前要细思量)
If the implementation is hard to explain, it"s a bad idea.
If the implementation is easy to explain, it may be a good idea.
若是你没法向人描述你的方案,那确定不是一个好方案;反之亦然(方案测评标准)
Namespaces are one honking great idea -- let"s do more of those!
命名空间是一种绝妙的理念,咱们应当多加利用(倡导与号召)编程

一、python编程空格和缩进数据结构


一、每次缩进使用4个空格
二、不要使用Tab,更不要Tab和空格混用
三、两个方法之间使用一个空行,两个Class之间使用两个空行
四、添加一个空格在字典、列表、序列、参数列表中的“,“后,以及在字典中的”:“以后,而不是以前
五、在赋值和比较两边放置一个空格(参数列表中除外)
六、紧随括号后面或者参数列表前一个字符不要存在空格app

二、使用以下方式交换pyhton的值less

b, a = a, b

# 其余例子

In [1]: people = ["David", "Pythonista", "15145551234"]
In [2]: name, title, phone = people
In [3]: name
Out[3]: "David"
In [4]: title
Out[4]: "Pythonista"
In [5]: phone
Out[5]: "15145551234"

这种语法在For循环中很是实用:

In [6]: people = [["David", "Pythonista", "15145551234"], ["Wu", "Student", "15101365547"]]
In [7]: for name, title, phone in people:
...: print name, phone
...:
David 15145551234
Wu 15101365547

PS:在使用这种语法时,须要确保左边的变量个数和右边tuple的个数一致,不然,Python会抛出ValueError异常。

三、合并字符串的值
result = ",".join(colors)
这样的效率要比使用for循环进行拼接的效率高,当list元素越多的时候,约明显ide

四、使用关键字in
当要判断一个key是否在字典中的时候,ui


d = {"a": 1, "b": 2} if "c" in d: print True # DO NOT USE if d.has_key("c"): print True for key in d: print key # DO NOT USE for key in d.keys(): print key

Python的dict对象是对KEY作过hash的,而keys()方法会将dict中全部的KEY做为一个list对象;因此,直接使用in的时候执行效率会比较快,代码也更简洁。idea

五、字典
dict是Python内置的数据结构,在写Python程序时会常常用到。这里介绍一下它的get方法和defaultdict方法。
a、get
在获取dict中的数据时,咱们通常使用index的方式,可是若是KEY不存在的时候会抛出KeyError。这时候你可使用get方法,使用方法:dict.get(key, default=None),能够避免异常。例如:spa

d = {"a": 1, "b": 2}
print d.get("c") # None
print d.get("c", 14) # 14

b、fromkeys
dict自己有个fromkeys方法,能够经过一个list生成一个dict,不过得提供默认的value,例如:code

# ⽤序列作 key,并提供默认value
>>> dict.fromkeys(["a", "b", "c"], 1)
# {"a": 1, "c": 1, "b": 1}请输入代码

c、有些状况下,咱们须要给dict的KEY一个默认值,你能够这样写:


equities = {} for (portfolio, equity) in data: equities.setdefault(portfolio, []).append(equity)

setdefault方法至关于"get, or set & get",或者至关于"set if necessary, then get"

六、defaultdict
defaultdict()和namedtuple()是collections模块里面2个很实用的扩展类型。一个继承自dict系统内置类型,一个继承自tuple系统内置类型.

七、字典操做
在Python中,你可使用zip方法将两个list组装成一个dict,其中一个list的值做为KEY,另一个list的值做为VALUE:

>>> given = ["John", "Eric", "Terry", "Michael"]
>>> family = ["Cleese", "Idle", "Gilliam", "Palin"]
>>> pythons = dict(zip(given, family))
>>> print pythons
{"John": "Cleese", "Michael": "Palin", "Eric": "Idle", "Terry": "Gilliam"}

相反的,你可使用dict的keys()和values()方法来获取KEY和VALUE的列表:


>>> pythons.keys() ["John", "Michael", "Eric", "Terry"] >>> pythons.values() ["Cleese", "Palin", "Idle", "Gilliam"]

八、python的True
在Python中,判断一个变量是否为True的时候,你能够这样作:


False True
False (== 0) True (== 1)
"" (空字符串) 除 "" 以外的字符串(" ", "anything")
0, 0.0 除 0 以外的数字(1, 0.1, -1, 3.14)
[], (), {}, set() 非空的list,tuple,set和dict ([0], (None,), [""])
None 大部分的对象,除了明确指定为False的对象

对于本身声明的class,若是你想明确地指定它的实例是True或False,你能够本身实现class的nonzerolen方法。当你的class是一个container时,你能够实现len方法,以下:

class MyContainer(object):
    def __init__(self, data):
        self.data = data
    def __len__(self):
    """ Return my length. """
        return len(self.data)

若是你的class不是container,你能够实现nonzero方法,以下:

class MyClass(object):
    def __init__(self, value):
        self.value = value
    def __nonzero__(self):
    """ Return my truth value (True or False). """
        # This could be arbitrarily complex:
        return bool(self.value)

在Python 3.x中,nonzero方法被bool方法替代。考虑到兼容性,你能够在class定义中加上如下的代码:

__bool__ = __nonzero__
相关文章
相关标签/搜索