一十九条优雅Python编程技巧

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     #互斥操作 ...
原文地址:https://www.cnblogs.com/Lee1010/p/9871070.html