gpt4 book ai didi

python - 在python中使用带有for循环的异常

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:35 25 4
gpt4 key购买 nike

嘿,伙计们是 python 应用程序开发的新手..我一直在尝试使用 for 循环从列表中只获取数字..但是我对正确的语法感到困惑..我使用的代码如下所示。

babe = [10,11,13,'vv']
int(honey) [for honey in babe]:
print honey

当我运行它时,我遇到了语法错误。我尝试了很多情况。但它根本没有帮助我。对不起这个愚蠢的问题..

我想在第二行添加方括号或其他内容吗?

我真的被卡住了。希望你们能帮助我。提前谢谢

最佳答案

您似乎在混淆 for 的语法循环(一个语句后跟一组语句......也称为“代码块”)和一个列表推导(一个表达式)。

这是一个列表理解:

#!/usr/bin/python
# Given:
b = [1,2,3,'vv']
a = [int(x) for x in b]

...这在语法上是有效的。但是,该示例的语义将引发异常,因为 'vv' 不是有效的文字(字符串)。它不能解释为十进制整数。

这是 for环形:
#!/usr/bin/python
# Given:
b = [1,2,3,'vv']
a = list()
for x in b:
try:
a.append(int(x))
except ValueError:
pass

在这种情况下,我们显式循环遍历给定列表( b )并忽略任何 ValueError我们 try 时引发的异常将这些条目中的每一个转换为整数。

没有合理的方法来处理列表理解中的异常。您可以编写一个函数,为任何无效的输入值返回一些标记值(来自表达式)。看起来像这样:
#/usr/bin/python
# Given:
b = [1, 2, 3, 'vv']

def mk_integer_if_possible(n):
'''Returns an integer or the sentinel value None
'''
results = None
try:
results = int(n)
except ValueError:
pass
return results

# Use that function:
a = [mk_integer_if_possible(x) for x in b if mk_integer_if_possible(x) is not None]

注意:荒谬的函数名称是故意的。这是一种丑陋的做法,而且不得不为 b 的每个元素调用这个假定函数 TWICE 的尴尬。表示您不应该在这种情况下使用列表推导。 (您必须调用一次才能进行转换,但要再次调用条件。保存一次调用的结果当然是一个语句,我们不能将其嵌入到表达式中)。

语句包含一个或多个表达式。表达式是语句的组成部分。 Python 严格区分语句和表达式。赋值是 Python 中的语句。这些区别可能是细微的,还有其他编程语言,其中赋值是表达式,而不是被语言的语法严格定义为语句。

因此,请使用 for当您在迭代任何类型的数据集时必须处理可能的异常时,通常当您需要过滤通过将函数映射到列表理解上生成的结果时,循环。

顺便说一下, is not None 表达式的显式使用在这个例子中是必要的。如果我试图将该测试缩短为 if mk_integer_if_possible(x)使用 Python 的隐式 bool 处理,我们会无意中过滤掉 b 中的任何条目计算为整数 0 以及作为 None 返回的任何值我不明智的职能的哨兵。

在 Python 中,使用隐式 bool 值作为条件通常很好。 NoneFalse以及任何数字为零的值、任何空字符串或任何类型的空列表、元组或字典,在 bool 上下文中都被视为“假”。但是,在处理标记值时,最好使用 is运算符并显式测试对象身份。否则,您将遇到极端情况,您的条件可能与您的哨兵以外的值匹配。

(小技巧:如果您遇到需要允许 None 通过某种过滤器或传递它,但您需要一些其他哨兵...只需使用 sentinel = object() ...您可以创建(实例化)一个通用 Python object 并使用 is 匹配它以进行哨兵处理。这将是您的代码唯一的,没有其他 Python 对象或类型可以匹配它。保证)。

顺便说一句......我应该注意,这段代码在技术上不是“只从列表中获取数字”。它为列表中的所有条目返回整数,这些条目可以转换为整数。这是吹毛求疵;但这是任何优秀工程师都会注意到的区别。你想从输入列表中返回所有整数吗?或者如果可以这样转换,您是否希望将所有条目作为整数返回?您的代码表明您正在尝试完成后者;这就是我为您实现工作示例的方式。但是,要实现后面的语义,您可能希望使用(数学)加法或乘法身份属性,如下所示:
# ... from within some function:
try:
results = x == x + 0 # Additive identity
except (TypeError, ValueError):
results = None
return results

关于python - 在python中使用带有for循环的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25822697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com