Python实用技巧 Pythoner必由之路

发布时间:2020-05-26编辑:脚本学堂
本文详细介绍了python编程中的一些技巧,网上有朋友说这篇文章是pythoner们的必经之路,呵呵,如果你也这么努力与向往成为python大牛,这篇文章不要错过。
创建String: 从列表中创建
开始定义一个 string  列表:
 

复制代码 代码示例:
colors = ['red', 'blue', 'green', 'yellow'] 

当我们需要将上面的列表连接成一个字符串。尤其当 list 是一个很大的列表时....
不要这样做:
 

复制代码 代码示例:
result = '' 
for s in colors: 
    result += s
这种方式效率非常低下的,它有可怕的内存使用问题,至于为什么,如果你是 javaer 的话,其中的 string 连接,我想你并不陌生。
相反,应该这样做:
复制代码 代码示例:
result = ''.join(colors) 

当只有几十或几百个string项连接时,它们效率上并不会太大的差别。但你要在养成写高效代码的习惯,因为当字符串数千时,join 比起 for 连接性能会能有所提升。

如果你需要使用一个函数来生成一个字符串列表,同样可以使用:
 

复制代码 代码示例:
result = ''.join(fn(i) for i in items) 

尽可能的使用
 

复制代码 代码示例:
Good:
for key in d: 
    print key 

使用 in 一般情况下是非常快的。
这种方式也适用于其它的容器对象(如 list,tuple 和 set)。
in 是操作符(正如上面所看到的)。
 

复制代码 代码示例:
Bad:
for key in d.keys(): 
    print key 

保持与上面的一致性,使用 use key in dict 方式,而不是 dict.has_key():
 

复制代码 代码示例:
# do this: 
if key in d: 
    ...do something with d[key] 
# not this: 
if d.has_key(key): 
    ...do something with d[key] 

字典中的 get 函数
我们经常需要在字典中初始化数据:

不好的实现方法:
 

复制代码 代码示例:
navs = {} 
for (portfolio, equity, position) in data: 
    if portfolio not in navs: 
        navs[portfolio] = 0 
    navs[portfolio] += position * prices[equity] 

使用dict.get(key, default) 删除 if 判断代码:
 

复制代码 代码示例:
navs = {} 
for (portfolio, equity, position) in data: 
    navs[portfolio] = (navs.get(portfolio, 0) 
                       + position * prices[equity]) 
 

这种方式更为直接。

字典中的 setdefault 函数 (1)
当我们要初始化一个可变字典的值。每个字典的值将是一个列表。下面是不好的做法:
初始化可变字典的值:
 

复制代码 代码示例:
equities = {} 
for (portfolio, equity) in data: 
    if portfolio in equities: 
        equities[portfolio].append(equity) 
    else: 
        equities[portfolio] = [equity] 

通过 dict.setdefault(key, default) 使这段代码工作的更好:
 

复制代码 代码示例:
equities = {} 
for (portfolio, equity) in data: 
    equities.setdefault(portfolio, []).append( 
                                        equity) 
 

dict.setdefault()等同于“ get, or set & get“ 或"如果没有,就设置";  如果你的字典Key是复杂的计算或long类型,使用 setdefault 是特别有效的。

字典中的 setdefault 函数 (2)
在我们看到的setdefault字典方法也可以作为一个独立的语句使用:
 

复制代码 代码示例:
avs = {} 
for (portfolio, equity, position) in data: 
    navs.setdefault(portfolio, 0) 
    navs[portfolio] += position * prices[equity] 

在这里忽略了字典的setdefault方法返回的默认值。我们正利用的setdefault中的作用,仅仅只是在dict中没有 key 的值的时候才会设置。

创建 & 分割字典
如果你有两份 list 对象,希望通过这两个对象构建一个 dict 对象。
 

复制代码 代码示例:
given = ['John', 'Eric', 'Terry', 'Michael'] 
family = ['Cleese', 'Idle', 'Gilliam', 'Palin'] 
pythons = dict(zip(given, family)) 
>>> pprint.pprint(pythons) 
{'John': 'Cleese', 
 'Michael': 'Palin', 
 'Eric': 'Idle', 
 'Terry': 'Gilliam'} 

同样,如果希望获取两份列表,也是非常简单:
 

复制代码 代码示例:
>>> pythons.keys() 
['John', 'Michael', 'Eric', 'Terry'] 
>>> pythons.values() 
['Cleese', 'Palin', 'Idle', 'Gilliam'] 

注意:
上面 list 虽然是有序的,但是 dict 中的  keys 和 values 是无序的,这正是因为 dict 本质就是无序存储的。

索引 & 项 (1)
如果你需要一个列表,这里有一个可爱的方式来节省你的输入:
 

复制代码 代码示例:
>>> items = 'zero one two three'.split() 
>>> print items 
['zero', 'one', 'two', 'three'] 

如果我们需要遍历这个 list ,而且需要 index 和 item: 
 

复制代码 代码示例:
                  - or - 
i = 0 
for item in items:      for i in range(len(items)): 
    print i, item               print i, items[i] 
    i += 1 

索引 & 项 (2): enumerate
通过 enumerate 可以返回 list 中的 (index, item)元组:
 

复制代码 代码示例:
>>> print list(enumerate(items)) 
[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')]