鱼C论坛

 找回密码
 立即注册
查看: 147|回复: 7

[已解决]关于try+except 和 if + else

[复制链接]
发表于 2024-7-1 21:40:54 | 显示全部楼层 |阅读模式

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

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

x
如果要预防出现一些错误,并且出错的可能性与不出错的可能性差不多

例如:
s = input(":")
print(int(s))

如果输入的是一个小数,就会导致报错

现在就有两种方法预防错误:
if "." in s:
    pass
else:
    int(s)
try:
    int(s)
except:
    pass

当然这只是一个大致的例子,实际上的情况可能会更加复杂,条件可能会更多,代码可能会更长

我想知道,当出现这种情况的时候,try + except 是不是大概率比 if else 更高效?
最佳答案
2024-7-2 11:37:45
实践出真知: tryorif.zip (488 Bytes, 下载次数: 5)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-1 21:41:44 | 显示全部楼层
@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 21:42:13 | 显示全部楼层
嘿,鱼油!你的问题很有趣呢,让我们来聊聊这个话题吧。

首先,先来看看 `if + else` 和 `try + except` 的基本区别:

1. **`if + else`:** 这种方法更加适合用于明确知道某个条件是否成立的情况。比如你要检查一个值是不是在某个范围内,或者一个字符串里是否包含某个特定的字符。
  
s = input(":")
    
    if "." in s:
        print("Looks like a float!")
    else:
        print(int(s))

2. **`try + except`:** 这种方法则适合用于某些操作可能会抛出异常的情况。比如你试图将一个字符串转换成整数,但这个字符串有时可能不是合法的整数格式。
  
s = input(":")
    
    try:
        print(int(s))
    except ValueError:
        print("That's not a valid integer!")

那么回到你的问题,“try + except 是不是大概率比 if + else 更高效?”这个问题的答案其实得看具体情况而定。

### 效率问题
从性能上看,如果错误发生得很频繁,那么 `try + except` 可能会变得较慢,因为异常捕获和处理是比较昂贵的操作。而 `if + else` 则会在每次都进行条件检查,在条件很复杂的情况下,这个过程可能也会比较慢。

#### 举个例子:
如果你的输入大多数都是正确的整数,那么 `try + except` 在大多数情况下都会更有效率,因为它只在出错的时候才会执行额外的异常处理代码。

相反,如果你的输入大部分时候都是小数,需要预防这类情况,那么 `if + else` 可能会更有效地跳过那些不需要处理的情况。

### 可读性问题
从代码可读性和维护性上来看,`try + except` 通常能让代码看起来更简洁,更易读,因为你不需要手动去检查所有可能的错误条件,只需专注于“正常路径”的代码即可。

### 最佳实践
在实际开发中,普遍的最佳实践是:
1. 对于简单的条件检查,使用 `if + else`。
2. 对于可能抛出异常的代码块,使用 `try + except`。

### 混合使用
有时候,你甚至可以混合使用这两种方法,比如你可以先用 `if + else` 做一些基本的检查,然后把可能出错的那部分代码放在 `try` 块里。
s = input(":")
if "." not in s:
    try:
        print(int(s))
    except ValueError:
        print("That's not a valid integer!")
else:
    print("Looks like a float!")

### 结论
所以,究竟哪种更高效,得看你的具体使用场景。一般来说,如果出错的可能性较小,那么 `try + except` 可能更高效且更优雅;但如果出错频率较高,那就得好好掂量一下了。

希望这样解释让你感觉像吃了一顿大餐,充分满足!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-7-1 21:44:57 | 显示全部楼层


嘿,鱼油,有啥问题尽管问!我是你的计算机教育专家,随时准备解答你的疑惑。记住,这里没有傻问题,只有聪明的脑袋!所以,来吧,有啥计算机相关的问题?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 21:49:51 | 显示全部楼层
FishC 发表于 2024-7-1 21:42
嘿,鱼油!你的问题很有趣呢,让我们来聊聊这个话题吧。

首先,先来看看 `if + else` 和 `try + except` ...

try except 是“比较昂贵的操作”是因为会先将try中的代码块执行一遍,然后出现报错了载去执行except吗

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 21:52:17 | 显示全部楼层
cjjJasonchen 发表于 2024-07-01 21:49
try except 是“比较昂贵的操作”是因为会先将try中的 ...


嘿,鱼油,你的理解很接近了。但是让我们一起深入了解一下代码执行背后的魔法吧。

### try except 的工作原理
在 Python 中,`try` 和 `except` 是用于处理异常的结构。在 `try` 块中放置可能会抛出异常的代码,一旦出现异常,Python 解释器会立即跳转到对应的 `except` 块,执行处理代码。这听起来很直观,但实际上它背后有一些复杂的操作。

1. **正常执行路径:**
   当你运行一个 `try` 块时,Python 会运行其中的代码,如果没有异常发生,这段代码正常执行结束,跳过 `except` 块。

2. **异常执行路径:**
   如果在 `try` 块中遇到了异常,Python 解释器就不会继续运行该 `try` 块的剩余部分,而是立即跳转到相应的 `except` 处理代码。

### 为什么说“比较昂贵”
这里说的“昂贵”并不是指它真的要花你很多钱,而是指它的计算成本和时间开销较高。原因如下:

1. **堆栈管理:**
   在进入 `try` 块时,Python 需要记录当前的执行状态,以便在发生异常时能够正确跳转到 `except` 块。这个过程涉及到调用堆栈的管理,这本身是一个稍微复杂的操作。

2. **异常处理机制:**
   当异常发生时,Python 不仅需要查找合适的 `except` 块,还需要构造异常对象,并可能逆向回溯调用堆栈以打印错误信息。这一系列操作相对于正常的顺序执行代码来说,要耗费更多的资源。

3. **性能影响:**
   异常处理会影响代码的可预测性,编译器和解释器优化代码的能力也会受到限制。因此,在频繁发生异常的情况下,性能会明显下降。

### 小例子大乐趣
让我们通过一个简单的示例来感受一下:
import timeit

setup_code = """
def using_try():
    try:
        int('abc')
    except ValueError:
        pass

def using_if():
    s = 'abc'
    if not s.isdigit():
        pass
"""

time_try = timeit.timeit("using_try()", setup=setup_code, number=1000000)
time_if = timeit.timeit("using_if()", setup=setup_code, number=1000000)

print(f"Time using try: {time_try}")
print(f"Time using if : {time_if}")

在这个例子中,`using_try` 和 `using_if` 分别使用了 `try` 和 `if` 来处理可能出现的错误。运行结果通常会显示 `using_if` 比 `using_try` 更快。

### 总结
所以,try-except 是一个强大且必要的工具,尤其在处理非预期错误时。但由于其涉及到额外的堆栈管理和异常处理机制,它确实会比普通的 `if-else` 条件判断更“昂贵”。

希望这段解释能让你对 `try-except` 有个更深刻的理解,感觉像发现了一片海底世界一样神奇!如果还有什么问题,尽管问,我们都愿意帮你解开谜团!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 11:37:45 | 显示全部楼层    本楼为最佳答案   
实践出真知: tryorif.zip (488 Bytes, 下载次数: 5)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 11:38:10 | 显示全部楼层
cjjJasonchen 发表于 2024-7-1 21:49
try except 是“比较昂贵的操作”是因为会先将try中的代码块执行一遍,然后出现报错了载去执行except吗

yes
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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