2016-04-28 6 views
0
months = ['January', 
     'February', 
     'March', 
     'April', 
     'May', 
     'June', 
     'July', 
     'August', 
     'September', 
     'October', 
     'November', 
     'December'] 
checker = False 
def valid_month(month): 
    for mon in months: 
     if mon.lower() == month.lower(): 
      print mon 
      checker = True 

    print "out of the loop, checker = " + str(checker) 
    if checker is False: 
     print None 

print valid_month("jaNuary") 

Это должно только напечатать январь. Но по какой-то причине результат выглядит следующим образом:Python check for boolean

January 
out of the loop, checker = True 
None 

шашка верно, то почему это проходит, если заявление? что «если контрольная панель False:»

+1

Инициализация 'checker' вне функции - плохая идея, и она никогда ничего не возвращает. – jonrsharpe

+2

«Нет» в конце напечатан, потому что 'valid_month (« jaNuary »)' возвращает None; не потому, что checker False. Вы печатаете возвращаемое значение функции. Если вы замените его на 'Checker is True', вы должны увидеть два' None's – Esref

ответ

3

Вы не возвращают значение из valid_month. В конце функции добавьте

def valid_month(month): 
    #existing code here 

    return checker 

Вы также должны принести checker = False линию в вашей функции.

+0

Большое вам спасибо. Это решило проблему – Nayana

0

Вам не нужны все эти петли. Сделайте свой метод valid_month выглядеть следующим образом:

def valid_month(month): 
    return month.lower() in [m.lower() for m in months] 

if valid_month("jaNuary"): 
    print("jaNuary") 
1

Просто к сведению, вы можете упростить это, используя calendar модуль для создания отображения строчного месяца Name-> надлежащего названия месяца, а затем использовать это в качестве поиска для вашей печати, например:

from calendar import month_name 

VALID_MONTHS = {m.lower(): m for m in month_name[1:]} 

def valid_month(month): 
    return VALID_MONTHS.get(month.lower()) 

print valid_month('JaNuary') 
1

Все это может быть сведено к одной строке и без необходимости в понимании списков, как в других ответах.

print "jaNuary".capitalize() in months 
0

Как утверждают другие ответы, вы должны вернуть что-то из вашей функции для того, чтобы напечатать что-то другое, чем None.

Вы печатаете Нет в настоящее время, потому что valid_month возвращает None, поэтому окончательный оператор print печатает возвращаемое значение.

С учетом сказанного, есть еще один вопрос здесь:

При инициализации переменной вне функции в глобальном масштабе, вы не можете ничего с этой переменной делать в функции.

Если вы хотите изменить или доступ глобальной переменной, вам нужно, чтобы начать функцию с

global var_name 

где var_name это имя переменной.

Или вы можете просто привести переменную в функцию, поскольку она больше не нужна нигде и должна быть возвращена из функции, как общая передовая практика.

0

Вы можете заменить всю вещь одной строкой. Скажем month = jaNuaRY

status = "valid" if month.lower() in months else "invalid" 

Так записи в months должны быть, как вы дали выше.Если вы не уверены, то

status = "valid" if month.lower() in (m.lower() for m in months) else "invalid"