基础知识

放这个帖子是因为reportlab后期制作时要用assert类比DocAssert(val, 'val is False')DocAssert一句带过,反而assert多说了几句,就决定在视频下方加上解释assert的链接,一查发现以前没放过。

我知道我比蜗牛还慢,没法在这里解释每天都干了啥,时间是咋祸害没的,因为那样这个号就会跑偏。虽然这个号的主人没啥正经事,长期失踪偶尔冒泡,但好歹咱主题是明确的,咱就放跟python有关的帖子。

内容方面没有章法,在网站pythonabc.org那里有分门别类,尽管那上面有些图片消失了,链接需要更新,因为这个活儿太吃时间,只能先放在那里。

同志们,原谅我掉坑里还爬不出来,实在没有精力经常更新🙏

 

提一下assertassert是确保某个条件得到满足,否则程序直接崩溃,并给出错误代号AssertionError。用处是帮助程序员迅速锁定错误原因,省去寻找分析错误原因的时间。AssertionError这个错误是设计上的错误,不是运行时的错误。之前用try……except处理的多是运行上的错误,比如打开的文件不存在,输入的除数为0……。

举个例子来说明assert帮忙找出设计上的错误:在游戏里控制小汽车穿过十字路口。小汽车过十字路口是要看十字路口的红绿灯的,红绿灯的转换顺序是绿 ->  ->  -> 绿,十字路口有两套红绿灯,一个控制东西方向,一个控制南北方向。如果直接按红灯停绿灯行的原则写代码运行代码,红绿灯转换虽然没问题,十字路口虚拟通行的小汽车却会被撞个稀巴烂。因为程序没有考虑到南北方向和东西方向的红灯必须有一个是亮着的,否则某一时刻十字路口东西方向和南北方向的交通灯都是通行的(非红灯),撞车必然会发生。

用assert语句可以要求程序确保东西方向和南北方向必须有一个红灯,一旦这个条件没得到满足,程序立刻崩溃,并给出AssertionoError的错误提示。

若设计时没有assert语句保证十字路口只一个方向通行,运行时就只看到程序一运行虚拟汽车马上被撞个稀巴烂,什么原因却不知道,要分析各种可能导致汽车被撞毁的原因。有assert语句会节省掉这些时间,AssertionError马上锁定是红绿灯两个方向都能通行的缘故。

Stone_Scissor = {'南北':'红灯', '东西':'绿灯'}       
# 用字典来表达南北方向的剪刀路与东西方向的石头路交汇的十字路口的红绿灯:keys:’南北’方向、’东西’方向,values:红绿灯现在的颜色。
 
def switchLights(stoplight):  # 形参stoplight接收传过来的实参。
 
    for key in stoplight.keys():   
    # 循环变量key遍历字典stoplight的键值(先’南北’,再’东西’)。
    
        # 红绿灯按照设定的顺序进行变换:绿灯->黄灯->红灯->绿灯……。
        if stoplight[key] == ‘绿灯':               
            stoplight[key] = '黄灯'
        elif stoplight[key] == '黄灯':
            stoplight[key] = '红灯'
        elif stoplight[key] == '红灯':
            stoplight[key] = '绿灯'
   
    assert '红灯' in stoplight.values(), '警告:交汇路口都显示可以通行(没有红灯亮着)' + str(stoplight)               
    # 确保南北方向和东西方向必须有个红灯是亮的。stoplight.values()取得两个方向的红绿灯颜色,’红灯' in stoplight.values()判断两个方向是不是有一个红灯是亮着的。不满足条件输出:警告!交汇路口都显示可以通行(没有红灯亮着)。assert语句的结构是:assert 条件表达式,条件表达式为False输出的信息。
 
# 主函数:
switchLights(Stone_Scissor)   # 字典变量作为实参调用红绿灯切换函数。

程序运行结果:

Traceback (most recent call last):

  File "/Users/……/8-5.py", line 17, in <module>

switchLights(Stone_Scissor)

  File "/Users/……/8-5.py", line 15, in switchLights

    assert '红灯' in stoplight.values(), '警告:交汇路口都显示可以通行(没有红灯亮着)' + str(stoplight)

AssertionError: 警告:交汇路口都显示可以通行(没有红灯亮着){'南北': '绿灯', '东西': '黄灯'}

红绿灯转换时如果出现两个方向都是黄灯或绿灯的情况,程序立即崩溃,给出错误提示:

AssertionError: 警告!交汇路口都显示可以通行(没有红灯亮着){'南北':'绿灯', '东西':'黄灯'}

AssertionError是错误名称;“警告!交汇路口都显示可以通行(没有红灯亮着){'南北':'绿灯', '东西':'黄灯'}”是assert语句定义的错误显示信息。见到这条错误,就知道目前设计的代码不能杜绝两条交叉路可以同时行车的可能,需要改进设计。