3.7学堂在线python学习笔记

3.7学堂在线python学习笔记

重要笔记

  1. 启发式算法
    启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有蚁群算法、模拟退火法、神经网络等。

  2. 现代启发式算法的研究,在理论方面还处于不断发展中,新思想和新方法仍不断出现。分析目前的现状和发展方向,其发展方向有如下几个方面:
    (1)整理归纳分散的研究成果,建立统一的算法体系结构。
    (2)在现有的数学方法(模式定理、编码策略、马尔可夫链理论、维数分析理论、复制遗传算法理论、二次动力系统理论、傅立叶分析理论、分离函数理论、Walsh函数分析理论)的基础上寻求新的数学工具。
    (3)开发新的混合式算法及开展现有算法改进方面的研究。
    (4)研究高效并行或分布式优化算法。

  3. 好的黑盒测试必须要包含所有已知条件,这样才能够最大可能地发现bug并且及时改正

def union(set1, set2):
   """
   set1 and set2 are collections of objects, each of which might be empty.
   Each set has no duplicates within itself, but there may be objects that
   are in both sets. Objects are assumed to be of the same type.

   This function returns one set containing all elements from
   both input sets, but with no duplicates.
   """

你会对这样的描述,给出什么样的测试集?

  • set1 is an empty set; set2 is an empty set set1 is an empty set;
  • set2 is of size greater than or equal to 1
  • set1 is of size greater than or equal to 1; set2 is an empty set
  • set1 and set2 are both nonempty sets which do not contain any objects in common
  • set1 and set2 are both nonempty sets which contain objects in common
  1. Glass-box测试的基本想法
  • 执行if语句的所有分支
  • 确保所有的except分支都包括好了
  • 检查循环是否执行,是否仅用了一次
  • 检查while循环是否有出口,和recursive分步执行

一个简单的构造所有测试集的Glass-box测试集

def maxOfThree(a,b,c) :
    """
    a, b, and c are numbers

    returns: the maximum of a, b, and c        
    """
    if a > b:
        bigger = a

    else:
        bigger = b

    if c > bigger:
        bigger = c

    return bigger

可以看见第一个if分支有两种可能,乘上第二个分支两种可能,就要构造4个不同的测试集,分别执行下面的四个语句测试


    maxOfThree(2, -10, 100),
    maxOfThree(7, 9, 10),
    maxOfThree(6, 1, 5),
    maxOfThree(0, 40, 20)
  1. 构建测试集的意义可能在于,我不用对所有语句都执行逻辑上的推导,只要测试集没有出错,就认为这样的结果可以接受,虽然数学上并不严密,但是对大部分结果却是好的
    这样带来的直接好处就是时间上节省了非常多推导的时间

def union(set1, set2):
   """
   set1 and set2 are collections of objects, each of which might be empty.
   Each set has no duplicates within itself, but there may be objects that
   are in both sets. Objects are assumed to be of the same type.

   This function returns one set containing all elements from
   both input sets, but with no duplicates.
   """
   if len(set1) == 0:
      return set2
   elif set1[0] in set2:
      return union(set1[1:], set2)
   else:
      return set1[0] + union(set1[1:], set2)

针对这个好的Glass-box测试集应该测试len(set1)==0情况,set1[0]在set2中情况和set1[0]不在set2中情况,为此还要测试递归深度为0,1以及大于1的情况

可以看到,这样的测试集

union('','abc'),
 union('a','abc'), 
 union('ab','abc'),
 union('d','abc')

分别测试了递归深度为0,1,2,1的代码
并且满足了上面的三条逻辑分支

  1. 对这样的代码,也许可以考虑三个分支:只执行一次循环,不执行循环,执行多次循环
def foo(x, a):
   """
   x: a positive integer argument
   a: a positive integer argument

   returns an integer
   """
   count = 0
   while x >= a:
      count += 1
      x = x - a
   return count

那么相应的测试集可以看成

foo(10, 3), foo(1, 4), foo(10, 6)
  1. 测试代码小技巧:使用初值假设和结果假设,如果程序前面部分没有写好,猜几个结果赋值上,然后测试后面的代码就好了
  2. 养成良好的测试习惯:先测试单个函数,再测试整体,不断交替。而且如果改进了代码,后面要测试前面用过的测试集,来保证我们的更新没有把以前的工作破坏了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值