Python初学之实用技巧<三>

继续一起学习Python的实用技巧

一、创建String: 从列表中创建开始定义一个 string 列表:
Python代码

colors = ['red', 'blue', 'green', 'yellow']

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

    result = '' 
   for s in colors:  
   result += s 

这种方式效率非常低下的,它有可怕的内存使用问题,至于为什么,如果你是 javaer 的话,其中的 string 连接,我想你并不陌生。
相反,你应该这样做:
Python代码

    result = ''.join(colors) 

当你只有几十或几百个string项连接时,它们效率上并不会太大的差别。但你要在养成写高效代码的习惯,因为当字符串数千时,join 比起 for 连接性能会能有所提升。
如果你需要使用一个函数来生成一个字符串列表,同样可以使用:
Python代码

    result = ''.join(fn(i) for i in items) 

尽可能的使用
Good:
Python代码

    for key in d:  
   print key 

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

    for key in d.keys():  
   print key 

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

     # do this:  
   if key in d:  
   ...do something with d[key]  
   
   # not this:  
   if d.has_key(key):  
   ...do something with d[key]  

二、字典中的 get 函数我们经常需要在字典中初始化数据:
以下是不好的实现方法:
Python代码

    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 判断代码:
Python代码

    navs = {}  
   for (portfolio, equity, position) in data:  
   navs[portfolio] = (navs.get(portfolio, 0)  
   + position * prices[equity]) 

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

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

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

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

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

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

    avs = {}  
   for (portfolio, equity, position) in data:  
   navs.setdefault(portfolio, 0)  
   navs[portfolio] += position * prices[equity] 

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

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

    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'} 

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

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

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