编程路上,必不可少的编程技巧
- 2019 年 11 月 20 日
- 筆記
-Tester-也哥-
在编程的过程中,有很多技巧,但是若不注意,就很容易忽略,即使是高级程序员会出现一些问题。今天,就几个编程技巧,进行一下总结,看看这些你是否有注意到?
根据出现的频率来调整判断条件的顺序
在写if…elif…else语句时,可以根据判断条件出现的频率来调整顺序,使得出现频率越高的条件,越在前面。这样可以减少判断条件的次数,提高代码的性能与效率。
例如,在计算成绩的时候,大家都清楚成绩通常是正太分布的,所以先判断B和C时,能够减少判断的次数,提高代码效率,如下所示:
if score > 70 and score < 80: performance = "B" elif score > 60 and score < 70: performance = "C" elif score > 90: performance = "A" else: performance = "D"
另外,大家应该都比较熟悉短路判断,即:
if A and B
如果A不满足的话,不再对B进行比较。所以,在写代码时,可以将不容易满足的条件设置为A,减少比较次数,提高代码效率。
同理,对于
if A or B
当A满足条件时,则不执行B。所以,大家在写代码时,可以将容易满足的条件放在A,而不容易满足的放在B,减少比较次数,提升代码质量。
采用缓存的机制
相信缓存大家已经很熟悉了,Redis,MemoryCache等都是经典的缓存实现,但是在代码中如何利用缓存呢?
这里,最经典的就是动态规划。
看这样一个问题:一个楼梯有10级,每次走1级或两级,请问从底走到顶一共有多少种走法?比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。再比如,每次走2级台阶,一共走5步,这是另一种走法。我们可以简写成 2,2,2,2,2。当然,除此之外,还有很多很多种走法。
很容易将问题建立模型为:
F(1) = 1
F(2) = 2
F(n) = F(n-1) + F(n-2) (3 <= n <= 10)
采用动态规划来求解,算法代码如下:
def climbStairs(n): """ 计算n级台阶的走法,每次可走1步或者2步 :param n: 台阶总数 :return: n级台阶的走法 """ if n < 1: return 0 elif n == 1: return 1 elif n == 2: return 2 else: return climbStairs(n - 1) + climbStairs(n - 2)
熟悉递归调用的同学知道,这样会有很多重复计算。那么,如何避免重复计算呢?答案很简单,就是在代码中采用缓存的机制,当然,也有一些说法是备忘录机制,大同小异了。算法代码如下:
def climbStairs(n, value): """ 计算n级台阶的走法,每次可走1步或者2步 :param n: 台阶总数 :param value: 存储各个不同台阶走法的dict :return: n级台阶的走法 """ if value.get(n) is not None: return value.get(n) else: if n < 1: value[n] = 0 elif n == 1: value[n] = 1 elif n == 2: value[n] = 2 else: value[n] = climbStairs(n - 1, value) + climbStairs(n - 2, value) return value[n]
另外,在一些计算过程中,对于需要频繁计算的结果,也可以采用这种缓存机制,能够较好的提升代码效率。
简化相关的数学运算
在编程的过程中,可能会遇到一些数学方面的计算,如果不做简化的话,将会降低代码的效率。这里比如说,大家都清楚 log()方法返回x的自然对数,对于x>0。但是如果要求以2为底的对数该怎么办呢?
通常,根据公式 logb(x) = log(x)/log(b),所以,Python代码可以如下:
def log2(x): import math return math.log(x)/math.log(2)
实现是没有问题的,但是效率呢?必然会很低。因为每次都会计算log(2),势必会增大运算量。如何降低运算量呢?很简单,将math.log(2)的结果设置为一个常量即可。