For 循环和多个条件
Posted
技术标签:
【中文标题】For 循环和多个条件【英文标题】:For loops and multiple conditions 【发布时间】:2011-09-02 06:55:48 【问题描述】:在 C++ 中,可以这样说:
for (int i = 0; i < 100 && !found; i++)
if (items[i] == "the one I'm looking for")
found = true;
所以你不需要使用“break”语句。
在 Python 中,我猜你需要编写:
found = False
for item in items:
if item == "the one I'm looking for"
found = True
break
我知道我可以编写一个包含相同代码的生成器,这样我就可以隐藏这个中断的东西。但我想知道是否有任何其他方法可以在不使用额外变量或 while 循环的情况下实现相同的事情(具有相同的性能)。
我知道我们可以说:
found = "the one I'm looking for" in items
我只是想了解是否可以在 for 循环中使用多个条件。
谢谢。
【问题讨论】:
是的,在 C++ 中可以说您刚才所说的,但我向您保证,它并没有达到您的预期——逗号运算符评估其左侧参数(没有副作用此处),然后计算其右手参数并得出该值。 C++ 真的应该是:for (int i = 0; i < 100 && !found; ++i)
这取决于如果找不到该项目,您希望发生什么。
@Richard 是的,谢谢 :) 我修好了!
@Matthieu 我知道,这只是比较 Python 和 C++ 中的 for 循环的一个例子。这不是要在循环中找到一个项目,它可能会更复杂。因此,在列表中查找项目并非如此。
【参考方案1】:
由于 Python 中的 for
loops 迭代的是序列而不是条件和突变语句,因此 break
是提早退出的必要条件。换句话说,python 中的for
不是条件循环。与 C++ 的 for
等效的 Python 将是 while
loop。
i=0
found=False
while i < 100 and !found:
if items[i] == "the one I'm looking for":
found=True
i += 1
即使在 C++ 中,for
loops can be rewritten as while
loops 如果它们不包含 continue
语句。
int i = 0;
while (i < 100 && !found)
if (items[i] == "the one I'm looking for")
found = true;
i++;
【讨论】:
嗯,有人应该为此功能编写 PEP :)for
在 Python 中类似于 c# 中的 foreach
,与 C、C++ 或 Java 中的 for
完全不同。
@Richard 是的,但如果有这个功能就好了。
@pocoa:类似 C 的 for
的 PEP 可能会因为不符合 Python 标准而被否决。
@pocoa:Lennart 可能对你的想法不友好,但他并不想批评你。你当然是有道理的,因为我们理解你。如果你在路上遇到一个想法,就把它打掉。【参考方案2】:
if
不是在 Python 中获得else
子句的唯一语句:
for item in items:
if item == "the one I'm looking for":
break
else:
print "Item not found! Run away! Run away!"
return
do_something_with(item)
while
和 try
也有 else
子句。
【讨论】:
谢谢,但这不是我的问题 :) @Ignacio:截至目前,else
的缩进与if
的缩进不匹配。
@pocoa:有时 Python 会迫使您以不同的方式思考。这就是让来自其他语言的程序员感到困惑的地方。
@pocoa,您的问题询问如何将 C 习语翻译成 Python。这里的重点是,在真正的 Python 中,found
变量之类的变量并不经常需要,因为循环结构与 C(和其他语言)相似但不同。除非您乐于编写蹩脚的 Python 代码,否则了解这些差异很重要
@pocoa:简单的答案是“不”。更复杂的答案是“你不需要”。【参考方案3】:
这样的?
def search(match, items):
for item in items:
if item == match:
return True
return False
编辑:
def search(match, test, items):
for item in items:
if item == match and test(item) and the_sky_is_not_falling:
return True
return False
【讨论】:
是的,但这不是我想要的。我只是想了解 Python 是否支持 for 循环中的多个条件。 Python 根本不支持for
中的条件。 for
不处理条件。【参考方案4】:
>>> from itertools import dropwhile
>>> try:
... item = next(dropwhile(lambda x: x!="the one I'm looking for", items))
... found = True
... except:
... found = False
当然你也可以在没有 lambda 函数的情况下这样写
>>> from itertools import dropwhile
>>> try:
... item = next(dropwhile("the one I'm looking for".__ne__, items))
... found = True
... except:
... found = False
现在在我看来它是使用额外变量的 C 版本
如果你真的只需要找到的变量集(并且不需要知道项目),那么只需使用
found = any(item=="the one I'm looking for" for item in items)
【讨论】:
啊!后者真的很整洁。 @gnibber 我可以从你的帖子中学到一些新东西,所以我会接受你的回答。谢谢。【参考方案5】:可以!
>>> found = False
>>> for x in (x for x in range(10) if not found):
... print x
... if x == 5:
... print "Found!"
... found = True
...
0
1
2
3
4
5
Found!
但这很愚蠢,因为即使在找到 x 之后您仍继续循环,所以不要这样做。 :-)
【讨论】:
以上是关于For 循环和多个条件的主要内容,如果未能解决你的问题,请参考以下文章
C ++:for循环中的多个退出条件(多个变量):AND -ed或OR -ed?