else块从不执行

2024-04-19 06:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将用户输入与列表的每个元素进行比较,其中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;它没有达到else条件。请帮忙


Tags: 用户infalsetrue元素列表forif
3条回答

如果从其他答复中看不清楚,您的问题在于:

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'))
[]

我希望这有帮助!你知道吗

是的,不

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

您可能需要使用内置的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'

相关问题 更多 >