鱼C论坛

 找回密码
 立即注册
查看: 1704|回复: 12

[已解决]断言的作用?

[复制链接]
发表于 2021-3-4 14:58:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书上说assert是用来让程序在不符合条件时报错,那为什么不用try - expect或者if-else呢,assert可以被他们代替吗?
还有就是检查点时什么?
(我是新手,大神讲解请举栗子哈,谢谢)
最佳答案
2021-3-4 15:21:59
断言assert

可以用
  1. if not expression:
  2.     raise AssertionError
复制代码

替代

它最大的作用就是由你主动生成错误,终止程序。

在你做一个项目的时候

在上一个结果会影响下一个结果的情况下,你可以在上一个结果产出时通过设置断言来判断程序还有没有继续运行的价值

demo

  1. import random
  2. def fun1():
  3.     return random.randint(0,10)


  4. a = fun1()
  5. assert a
  6. b = fun1()

  7. c = b/a

  8. print(c)
复制代码

  1. Traceback (most recent call last):
  2.   File "C:\Users\admin\Desktop\test.py", line 9, in <module>
  3.     assert a
  4. AssertionError
  5. >>> a
  6. 0
复制代码


这个程序先生成分母,再生成分子

如果生成的分母是0的话,没有必要再去生成分子了,我们主动将程序报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-4 15:08:32 | 显示全部楼层
个人的理解就是,在猜大小那个游戏中

比如说 guess = input('猜一猜')

可以用 assert 判断用户输入是否是 一个数字

如果是就不会触发 assert

不是的话就会触发,并且返回自己设置好的错误提示

https://blog.csdn.net/hao5335156/article/details/81170661
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 15:21:59 | 显示全部楼层    本楼为最佳答案   
断言assert

可以用
  1. if not expression:
  2.     raise AssertionError
复制代码

替代

它最大的作用就是由你主动生成错误,终止程序。

在你做一个项目的时候

在上一个结果会影响下一个结果的情况下,你可以在上一个结果产出时通过设置断言来判断程序还有没有继续运行的价值

demo

  1. import random
  2. def fun1():
  3.     return random.randint(0,10)


  4. a = fun1()
  5. assert a
  6. b = fun1()

  7. c = b/a

  8. print(c)
复制代码

  1. Traceback (most recent call last):
  2.   File "C:\Users\admin\Desktop\test.py", line 9, in <module>
  3.     assert a
  4. AssertionError
  5. >>> a
  6. 0
复制代码


这个程序先生成分母,再生成分子

如果生成的分母是0的话,没有必要再去生成分子了,我们主动将程序报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 15:57:17 | 显示全部楼层
逃兵 发表于 2021-3-4 15:21
断言assert

可以用

那可不可以理解为:一旦报错,程序就不再运行
然后就比较好调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 15:59:53 | 显示全部楼层
柿子饼同学 发表于 2021-3-4 15:57
那可不可以理解为:一旦报错,程序就不再运行
然后就比较好调试

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 16:01:36 | 显示全部楼层
柿子饼同学 发表于 2021-3-4 15:57
那可不可以理解为:一旦报错,程序就不再运行
然后就比较好调试

那如果是这样,让他直接报错不是更好吗,比如当文件存在时创建同名文件,不需要写断言,它自己就报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 16:20:41 | 显示全部楼层

那如果是这样,让他直接报错不是更好吗,比如当文件存在时创建同名文件,不需要写断言,它自己就报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 16:21:33 | 显示全部楼层
assert的语法格式:
  1. assert expression
复制代码

&#160; &#160;它的等价语句为:
  1. if not expression:
复制代码
  1.     raise AssertionError
复制代码



1、assert语句用来声明某个条件是真的。
2、如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。
3、当assert语句失败的时候,会引发一AssertionError。

&#160; &#160;有时候与其让程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃,如果需要在程序中的某个条件一定为真的时候才能让程序正常工作的话,assert语句就有用了,它可以在程序中置入检查点。

  1. >>>age = 1
  2. >>>assert 0<age<10
  3. >>>age = -1
  4. >>>assert 0<age<10
复制代码

&#160; 当执行最后一句的时候,assert 0<age<10 失败,所以触发AssertionError,显示结果如下:


  1. Traceback (most recent call last):
  2.   File "<ipython-input-4-5ad9ee6f8005>", line 1, in <module>
  3.     assert 0<age<10
复制代码


————————————————
原文链接:https://blog.csdn.net/loster_Li/article/details/52840734https://blog.csdn.net/loster_Li/article/details/52840734
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 16:30:23 | 显示全部楼层
谢谢谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 17:07:13 | 显示全部楼层
柿子饼同学 发表于 2021-3-4 16:20
那如果是这样,让他直接报错不是更好吗,比如当文件存在时创建同名文件,不需要写断言,它自己就报错了{: ...

你说的这种情况确实不需要写断言,因为程序自己会识别报错

而断言是你自己在程序中所设定的错误,你自己用来调试的

如果你写的代码没有任何问题以后也不会出现任何问题,断言一点作用都没有。当你相信代码能够正确平稳运行的时候。或许你忘记了一些特殊发生的情况,在这种情况下,额外的运行时检查将帮助你尽可能早地捕获错误,而不是运行到最后才发现问题。

以你说的例子延展一下

假设你现在有一份文件a,里面记载了重要的信息

现在老板需要你提交一份文件a(与上面的文件同名),需要写入不同的内容

如果你不小心以with open(a,'w') as f:的方式写入,程序不会报错,但是源文件内容就会丢失

这个时候加一句断言,在发生事故之前,你的行为将被终止
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 17:33:39 | 显示全部楼层
逃兵 发表于 2021-3-4 17:07
你说的这种情况确实不需要写断言,因为程序自己会识别报错

而断言是你自己在程序中所设定的错误,你自 ...

那具体该怎么写呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-4 17:45:51 | 显示全部楼层
  1. import os

  2. file_list=os.listdir()

  3. filename='机密文件.txt'

  4. assert filename not in file_list

  5. with open(filename,'w') as f:
  6.     f.write('这是一个机密文件')
  7.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-4 18:07:09 | 显示全部楼层

谢谢,学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 01:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表