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

时间:2014-09-13 11:21:44

标签: python

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您似乎正在混淆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的尴尬表明您不应该对此情况使用列表推导。 (你必须调用它一次才能进行转换,但是再次调用条件。保存一次调用的结果当然是一个STATEMENT,我们不能嵌入到EXPRESSION中。)

语句包含一个或多个表达式。表达式是语句的组成部分。 Python在语句和表达式之间严格描述。赋值是Python中的语句。这些区别可以是微妙的,并且还有其他编程语言,其中赋值是表达式而不是由语言的语法严格定义为语句。

因此,只要在迭代任何类型的数据集时处理可能的异常,并且通常需要对通过列表推导映射函数生成的结果进行过滤时,请使用for循环。

顺便说一下,在这个例子中必须明确使用表达式is not None。如果我试图使用Python的隐式布尔处理将该测试简化为if mk_integer_if_possible(x),那么我们无意中过滤掉了b中评估为整数0的任何条目以及由我的不明智的职能作为None哨兵返回的任何内容。

在Python中,使用隐式布尔值作为条件通常很好。 NoneFalse以及任何数字零值,任何空字符串或任何类型的空列表,元组或字典都被视为" false"在布尔上下文中。但是,在处理哨兵值时,最好使用is运算符并明确测试对象标识。否则,您的情况可能会与您的哨兵以外的其他值相匹配。

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

顺便说一句......我应该注意到这段代码在技术上并不是只从列表中获取数字。"它返回列表中可以转换为其的所有条目的整数。这是一个挑剔;但任何优秀的工程师都会注意到它的区别。是否要从输入列表中返回所有整数?或者你想将所有条目作为整数返回,如果可以这样转换?您的代码建议您尝试完成后者;以便我如何为您实施我的工作示例。但是,要实现后面的语义,您可能想要使用(数学)加法或乘法标识属性,如下所示:

# ... from within some function:
try:
    results = x == x + 0  # Additive identity
except (TypeError, ValueError):
    results = None
return results

答案 1 :(得分:0)

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

在此处详细了解列表理解:https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions