编程路上,必不可少的编程技巧

  • 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)的结果设置为一个常量即可。