2013-09-27 8 views
-1

par_list начато в некотором коде до этого. Для раздела я тестирую его, "calendar" не появляется. Почему тогда он вычисляет оператор if как True?Почему это утверждение if True

while cake: 
    print "Length of par_list = ", len(par_lst) 

    for rows in par_lst: 
     if "calendar" or "Calendar" in rows: 
      print "you shouldn't be here" 
      writer.writerow(rows) 
+3

Какой именно «это если» ??? Есть три if-утверждения? Сократите свой код до разумного теста. –

ответ

11

Это потому, что ваш код должен быть таким:

if "calendar" in rows or "Calendar" in rows: 

В Python, не пустые строки всегда вычисляться True. Кроме того, ваш текущий код в основном так же, как это:

if ("calendar") or ("Calendar" in rows): 

Это означает, что это условие будет всегда возвращать True потому "calendar" всегда будет True. На самом деле, он даже не дойдет до части ("Calendar" in rows).

В качестве демонстрации, считают это:

>>> bool("calendar" or "Calendar" in rows) 
True 
>>> 

Обратите внимание, как, хотя я даже не определилось rows, я не получаю NameError. Вместо этого код возвращает True. Это потому, что, как я сказал выше, он даже не доходит до части "Calendar" in rows. Фактически, все, что он делает, это оценка "calendar", которая, будучи непустой строкой, возвращает True.

1
if "calendar" or "Calendar" in rows: 

эквивалентно

if "calendar" or ("Calendar" in rows): 

Поскольку "calendar" является правдивой, условие проходит.

3
if "calendar" or "Calendar" in rows: 

Это всегда так. "calendar" является строкой, отличной от нулевой длины, это правда, и что or 'd с "Calendar" in rows всегда верно. Фактически, "Calendar" in rows никогда не оценивается, потому что верно "calendar".

Вы хотите:

if "calendar" in rows or "Calendar" in rows: 

Это не является наиболее эффективным, так как оно будет на самом деле искать rows дважды. Для того, чтобы искать его только один раз, попробуйте:

if (row.lower() = "calendar" for row in rows): 

Однако, это не может быть на самом деле быстрее, чем поиск строк дважды: первый, потому что это явный цикл, второй, потому что это lowercasing каждую строку перед тестированием. Он имеет то преимущество, что подходит любой случай, а не только «календарь» или «Календарь», но также «КАЛЕНДАРЬ» или «CALenDAR» или что-то еще.

Теперь у меня возникает ощущение, что это все еще может быть не тем, что вы хотите. Если ни одна из строк не точно строка "calendar" (в любом случае), это всегда будет ложным. Например, если вы прочитали список из файла, он может содержать концы строк, которые не позволяют совместить этот тест. Или может быть другой текст в строке, и вы просто хотите проверить, содержит ли каждая строка это слово.В этом случае напишите:

if any("calendar" in row.lower() for row in rows): 
Смежные вопросы