1.交换赋值
1 #不推荐 2 temp = a 3 a = b 4 b = a 5 6 #推荐 7 a , b = b , a #先生成一个元组(tuple)对象,然后在unpack
2.Unpacking
1 #不推荐 2 l = ['David' , 'Pythonista' , '+1-514-555-1234'] 3 first_name = l[0] 4 last_name = l[1] 5 phone_number = l[2] 6 7 #推荐 8 l = ['David' , 'Pythonista' , '+1-514-555-1234'] 9 first_name, last_name, phone_number = l 10 #python 3 only 11 first, *middle, last = another_list
3.使用操作符in
1 #不推荐 2 if fruit = "apple" or fruit == "orange" or fruit == "berry": 3 #多次判断 4 #推荐 5 if fruit in ["apple","orange","berry"]: 6 #使用in更加简洁
4.字符串操作
1 #不推荐 2 colors = ['red' ,'blue' ,'green' , 'yellow' ] 3 4 result = ' ' 5 for s in colors: 6 result += s #每次赋值都丢弃以前的字符串对象,生成一个新对象 7 8 #推荐 9 colors = ['red' , 'blue' , 'green' , 'yellow' ] 10 result = ' '.join(colors) #没有额外的内存分配
5.字典键值列表
1 #不推荐 2 for key in my_dict.keys(): 3 #my_dict[key] ... 4 5 #推荐 6 for key in my_dict: 7 #my_dict[key] ... 8 9 #只有当循环中需要更改key值的情况下,我们需要使用 my_dict.keys() 10 #生成静态的键值列表
6.字典键值判断
1 #不推荐 2 if my_dict.has_key(key): 3 #...do something with d[key] 4 5 #推荐 6 if key in my_dict: 7 #...do something with d[key]
7.字典 get 和 setdefault 方法
1 #不推荐 2 navs = {} 3 for (portfolio, equity, position) in data: 4 if portfolio not in navs: 5 navs[portfolio] = 0 6 navs[portfolio] += position * prices[equity] 8 9 #推荐 10 navs = {} 11 for (portfolio, equity, position) in data: 12 # 使用 get 方法 13 navs[portfolio] = navs.get(portfolio,0) + position * prices[equity] 14 15 #或者使用 setdefault 方法 16 navs.setdefault(portfolio,0) 17 navs[portfolio] += position * prices[equity]
8.判断真伪
1 #不推荐 2 if x == True: 3 #... 4 if len(items) != 0: 5 #... 6 if items != []: 7 #... 8 9 #推荐 10 if x: 11 #... 12 if items: 13 #...
9.遍历列表以及索引
1 #不推荐 2 items = 'zero one two three'.split() 3 #method 1 4 i = 0 5 for item in items: 6 print i , item 7 i += 1 8 #method 2 9 for i in range(len(items)): 10 print i , items[i] 11 12 #推荐 13 items = 'zero one two three'.split() 14 for i,item in enumerate(items): 15 print i , item
10.列表推导
1 #不推荐 2 new_list = [] 3 for item in a_list: 4 if condition(item): 5 new_list.append(fn(item)) 6 7 #推荐 8 new_list = [fn(item) for item in a_list if condition(item)]
11.列表推导-嵌套
1 #不推荐 2 for sub_list in nested_list: 3 if list_condition(sub_list): 4 for item in sub_list: 5 if item_condition(item): 6 #do something... 7 8 #推荐 9 gen = (item for s1 in nested_list if list_condition(s1) 10 for item in s1 if item_condition(item)) 11 for item in gen: 12 #do something
12.循环嵌套
1 #不推荐 2 for x in x_list: 3 for y in y_list: 4 for z in z_list: 5 #do something for x &y 6 7 #推荐 8 from itertools import product 9 for x, y, z in product(x_list, y_list, z_list): 10 #do something for x, y, z
13.尽量使用生成器代替列表
1 #不推荐 2 def my_range(n): 3 i = 0 4 result = [] 5 while i <n: 6 result.append(fn(i)) 7 i += 1 8 return result #返回值 9 10 #推荐 11 def my_range(n): 12 i = 0 13 result = [] 14 while i < n: 15 yield fn(i) #使用生成器代替列表 16 i += 1 17 18 #【尽量用生成器代替列表,除非必须用到列表特有的函数】
14.中间结果尽量使用 imap/ifilter 代替 map/filter
1 #不推荐 2 reduce(rf, filiter(ff, map(my, a_list))) 3 4 #推荐 5 from itertools import ifilter,imap 6 reduce(rf, ifilter(ff, imap(mf, a_list))) 7 #【lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候】
15.使用 any/all 函数
1 #不推荐 2 found = False 3 for item in a_list: 4 if condition(item): 5 found = True 6 break 7 if found: 8 #do something if found... 9 10 #推荐 11 if any(condition(item) for item in a_list): 12 #do something if found...
16.属性(property)
1 #不推荐 2 class Clock(object): 3 def __init__(self): 4 self.__hour = 1 5 def setHour(self,hour): 6 if 25 >hour >0: self.__hour = hour 7 else: raise BadHour Exception 8 def getHour(self): 9 return self.__hour 10 11 #推荐 12 class Clock(object): 13 def __init__(self): 14 self.__hour = 1 15 def __setHour(self,hour): 16 if 25 >hour > 0: self.__hour = hour 17 else:raise BadHour Exception 18 def __getHour(self): 19 return self.__hour 20 hour = property(__getHour,__setHour)
17.使用 with 处理文件打开
1 #不推荐 2 f = open("some_file.txt") 3 try: 4 data = f.read() 5 #其他文件操作 ... 6 finally: 7 f.close() 8 9 #推荐 10 with open("some_file.txt") as f: 11 data = f.read() 12 #其他文件操作 ...
18.使用 with 忽视异常(仅限Python 3)
1 #不推荐 2 try: 3 os.remove("somefile.txt") 4 except OSError: 5 pass 6 7 #推荐 8 from contextlib import ignored #python 3 only 9 10 with ignored(OSError): 11 os.remove("something.txt')
19.使用 with 处理加锁
1 #不推荐 2 import threading 3 lock = threading.Lock() 4 5 lock.acquire() 6 try: 7 #互斥操作 ... 8 finally: 9 lock.release() 10 11 #推荐 12 import threading 13 lock = threading.Lock() 14 15 with lock: 16 #互斥操作 ...