Для циклов и нескольких условий - PullRequest
8 голосов
/ 26 мая 2011

В 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

IЯ просто пытаюсь узнать, возможно ли использовать несколько условий для циклов.

Спасибо.

Ответы [ 5 ]

5 голосов
/ 26 мая 2011
>>> from itertools import dropwhile
>>> try:
...     item = next(dropwhile(lambda x: x!="the one I'm looking for", items))
...     found = True
... except:
...     found = False

Конечно, вы также можете написать это без лямбда-функции как

>>> 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)
3 голосов
/ 26 мая 2011

Поскольку for loop в Python итерируют последовательность, а не условие и оператор мутации, break необходимо выручить на ранней стадии. Другими словами, for в python не является условным циклом. Python, эквивалентный C ++ for, будет 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 можно переписать как циклы while , если они не содержат оператора continue.

{
    int i = 0;
    while (i < 100 && !found) {
        if (items[i] == "the one I'm looking for")
            found = true;
        i++;
    }
}
2 голосов
/ 26 мая 2011

if - не единственный оператор для получения предложения else в Python:

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 предложения.

1 голос
/ 26 мая 2011

как то так?

def search(match, items):
    for item in items:
        if item == match:
            return True
    return False

EDIT:

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
0 голосов
/ 26 мая 2011

Да, вы можете!

>>> 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 найден, так что не делайте этого.: -)

...