else块永远不会执行

时间:2011-11-21 21:21:22

标签: python if-statement

我正在尝试将用户输入与列表中的每个元素进行比较,其中NL是列表,但由于某种原因,它永远不会进入else循环。

NL = range(1, sc.NLayer + 1)

if (x for x in NL if x < sc.NLayer): 
    print 'true'
else:
    print 'false'

sc.NLayer是用户输入。

假设sc.NLayer = 5;它没有达到其他条件。请帮忙

3 个答案:

答案 0 :(得分:3)

您可能希望使用内置的any函数。

any([True, False, 0, []])
=> True

所以在你的代码中,它将是:

if any(x for x in NL if x < sc.NLayer):
    print 'true'
else:
    print 'false'

或可能是for循环:

for x in NL:
    if x < sc.NLayer:
        print 'true'
    else:
        print 'false'

答案 1 :(得分:2)

是的,没有。

if any(x for x in NL if x <sc.NLayer): 
  print 'true'
else:
  print 'false'

答案 2 :(得分:1)

如果其他回复中不清楚,那么您的问题就在于:

if (x for x in NL if x < sc.NLayer):

在这种语法中,你创建了一个所谓的generator expression,它就像一个列表推导,但它返回了一个生成器。生成器本身是一个复杂的对象,因此如果返回,它将始终评估为True 。生成器有自己的协议,您必须在其中一次显式检索一个项目。迭代时,这并不是很明显,因为迭代会自动为您执行此操作,但在评估时它是不同的。

相反,如果您实际执行此操作作为列表理解,您应该得到所需的结果,因为空列表([])的计算结果为False!我认为这更接近你想要的。

这是一个简单的例子来说明mylist的内容,其中列表理解将返回一个空列表:

>>> mylist = range(10)
>>> [x for x in mylist if x == 'a']  
[]

这是你的空列表。现在使用bool()对其进行评估,并观察它是False

>>> bool([x for x in mylist if x == 'a'])
False

好的,那么如果你把它作为生成器表达式来评估呢:

>>> (x for x in mylist if x == 'a')
<generator object <genexpr> at 0xb7ebc644>
>>> bool((x for x in mylist if x == 'a'))
True

为了说明,如果将此生成器表达式转换为列表,您可以看到它实际上没有结果:

>>> list((x for x in mylist if x == 'a'))
[]

我希望有所帮助!