zoukankan      html  css  js  c++  java
  • 一十九条优雅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     #互斥操作 ...
  • 相关阅读:
    .Net中获取打印机的相关信息
    如何在windows server 2008上配置NLB群集
    jvm分析内存泄露
    JVM调优
    线程池工作队列饱和策略
    线程池的处理流程:
    Java的Executor框架和线程池实现原理(转)
    线程池实现原理详解:
    futer.get()(如果任务没执行完将等待)
    sql注入
  • 原文地址:https://www.cnblogs.com/Lee1010/p/9871070.html
Copyright © 2011-2022 走看看