Python异常 ValueError的问题详解

Posted LinuxProbe19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python异常 ValueError的问题详解相关的知识,希望对你有一定的参考价值。

导读 这篇文章主要介绍了Python异常 ValueError的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Python异常 ValueError
ValueError: invalid literal for int() with base 10: \'*\'

试图将一个与数字无关的类型转化为整数,会抛出该异常。

>>> int("99 years ago.")
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for int() with base 10: \'99 years ago.\'

规避方法:int函数参数应该合法使用。int函数使用传送门:Python中的int函数使用

ValueError: too many values to unpack (expected 2)

试图遍历字典时同时遍历键和值。

>>> demo = "China": "Beijing", "Japan": "Tokyo"
>>> for k, v in demo:
...     print(k, v)
...
Traceback (most recent call last):
  File "", line 1, in 
ValueError: too many values to unpack (expected 2)

Python只允许对字典key的遍历,因此上面的遍历方式是错误的。

规避方法

方法一:使用dict[key]的方式同时获取value

>>> demo = "China": "Beijing", "Japan": "Tokyo"
>>> for key in demo:
...     print(key, demo[key])
...
China Beijing
Japan Tokyo

方法二:使用items方法

>>> demo = "China": "Beijing", "Japan": "Tokyo", "the United States": "Washington D.C."
>>> for key, value in demo.items():
...     print(key, value)
...
China Beijing
Japan Tokyo
the United States Washington D.C.
ValueError: binary mode doesn\'t take an encoding argument

试图以二进制模式读取文件时指定编码方式。www.linuxprobe.com

>>> with open("protoc-gen-go", "rb+", encoding="utf-8") as file:
...     data = file.read()
...
Traceback (most recent call last):
  File "", line 1, in 
ValueError: binary mode doesn\'t take an encoding argument
规避方法:避免使用encoding关键字
>>> with open("protoc-gen-go", "rb+") as file:
...     data = file.read(10)
...
>>> data
b\'\\xcf\\xfa\\xed\\xfe\\x07\\x00\\x00\\x01\\x03\\x00\'

Python CodeLab 关于异常的问题——尝试,除了 ValueError

【中文标题】Python CodeLab 关于异常的问题——尝试,除了 ValueError【英文标题】:Python CodeLab Question About Exceptions -- Try, Except ValueError 【发布时间】:2020-08-02 02:44:29 【问题描述】:

问题

“三个变量——x、y 和 z——应该包含数字字符串,适合转换为整数。编写将这些变量转换为整数的代码并打印这三个整数的和。但是,如果任何变量有值不能转换为整数的,打印出字符串“bad value(s) in:”,后跟具有错误值的变量的名称(以空格分隔,按字母升序排列)。

例如,如果 x、y 和 z 的值分别为“3”、“9”和“2”,则将打印数字 14。另一方面,如果值是“abc”、“15”和“boo”,那么输出将是:bad value(s) in: x z。


注意:这个问题来自图灵的Craft CodeLab,它似乎需要特定的标准输入才能得到正确的答案。我包含了 CodeLab 在每次尝试后提供给我的“错误分析”,让您了解它正在寻找的格式。


尝试 #1

error_output = "Bad values in:"
numeric_output = 0
inputs = input().strip().split(" ")
try:
    x = int(inputs[0])
    numeric_output += x
except ValueError:
    error_output += " x"
try:
    y = int(inputs[1])
    numeric_output += y
except ValueError:
    error_output += " y"
try:
    z = int(inputs[2])
    numeric_output += z
except ValueError:
    error_output += " z"
if error_output != "Bad values in:":
    print(error_output)
else:
    print(numeric_output)

虽然这段代码在 Idle 和 Pycharm 上运行都没有问题,但它不是 CodeLab 上的正确答案...这是我 第一次尝试的 CodeLab 的“错误分析” :


    在每个测试用例中:a) stdout 不正确 和 b) 没有打印到标准输出 您几乎肯定应该使用:+ 我还没有看到使用以下方法的正确解决方案:" " 我还没有看到使用以下方法的正确解决方案:" x" 我还没有看到正确的解决方案使用:“y” 我还没有看到一个正确的解决方案使用:“z” 我们认为您可能需要考虑使用:== 我们认为您可能需要考虑使用:sum 采用您的方法的解决方案通常不使用:!= 采用您的方法的解决方案通常不使用:。 (句号) 采用您的方法的解决方案通常不使用:1 采用您的方法的解决方案通常不使用:2 采用您的方法的解决方案通常不使用:[ ] 采用您的方法的解决方案通常不使用:输入 采用您的方法的解决方案通常不使用:strip 我们认为您可能要考虑使用:

我的第二次尝试

try:
    print(int(x) + int(y) + int(z))
except ValueError:
    print("bad value(s) in:")
    if not x.isdigit():
        print(' x')
    if not y.isdigit():
        print(' y')
    if not z.isdigit():
        print(' z')

'错误分析' Attempt #2:


    在某些测试用例中stdout 不正确 您几乎肯定应该使用:= 我还没有看到使用以下方法的正确解决方案:"bad value(s) in:" 我还没有看到使用以下方法的正确解决方案:'x' 我还没有看到一个正确的解决方案使用:'y' 我还没有看到使用以下方法的正确解决方案:'z' 您几乎可以肯定应该使用:str 我们认为您可能需要考虑使用:,(逗号) 采用您的方法的解决方案通常不使用:ValueError

最后,这是我的第三次尝试(根据 CodeLab,这是最接近准确的):

try:
    print(int(x) + int(y) + int(z))
except ValueError:
    print("bad value(s) in:",end='')
    if not x.isdigit():
        print('x',end='')
    if not y.isdigit():
        print('y',end='')
    if not z.isdigit():
        print('z',end='')

'错误分析' Attempt #3:


    在某些测试用例中stdout 不正确 我还没有看到使用以下方法的正确解决方案:"bad value(s) in:" 采用您的方法的解决方案通常不使用:'' 采用您的方法的解决方案通常不使用:ValueError

我错过了什么?

【问题讨论】:

请更新您的代码,使其成为minimal reproducible example 【参考方案1】:

你为什么不尝试在每个变量之前添加空格,我想这会有所帮助。我也遇到过这类问题。

try:
    print(int(x) + int(y) + int(z))
except ValueError:
    print("bad value(s) in:",end='')
    if not x.isdigit():
        print(' x',end='')
    if not y.isdigit():
        print(' y',end='')
    if not z.isdigit():
        print(' z',end='')

【讨论】:

【参考方案2】:

这也应该可以工作:

try:
    print(int(x)+int(y)+int(z))
except ValueError:
    print('bad value(s) in:', end=' ')
    if not x.isdigit():
        print('x', end=' ')
    if not y.isdigit():
        print('y', end=' ')
    if not z.isdigit():
        print('z', end=' ')

【讨论】:

【参考方案3】:

感谢大家的帮助!我发现答案是:

try:
    sum = int(x) + int(y) + int(z)
    print(sum)
except ValueError:
    print("bad value(s) in:",end='')
    if not x.isdigit():
        print(' x',end='')
    if not y.isdigit():
        print(' y',end='')
    if not z.isdigit():
        print(' z',)

【讨论】:

【参考方案4】:
sum=0
badvalues=""
try:
    sum += int(x)
except ValueError:
    badvalues += " x"
try:
    sum += int(y)
except ValueError:
    badvalues += " y"
try:
    sum += int(z)
except ValueError:
    badvalues += " z"
if badvalues=="":
    print(sum)
else:
    print("bad value(s) in:"+badvalues)

【讨论】:

以上是关于Python异常 ValueError的问题详解的主要内容,如果未能解决你的问题,请参考以下文章

Python ValueError 继承了自定义异常行为

Python ValueError 异常没有被正确捕获

理解 ValueError:python 中的“无效数字”

使用 Python 训练 arima 模型时如何解决 LinAlgError 和 ValueError

python单元测试中的assertRaises没有捕获异常[重复]

Python中的零对数