2015-08-23 2 views
-4

Я очень смутился с использованием функций и словарей. В книге, которую я использую для изучения питона, есть пример, но это не объясняет, почему автор написал это так. Вот почему я надеюсь, что кто-нибудь сможет объяснить мне, почему сценарий написан в этой форме. Вот сценарий:Значение вызова функции со словарями

def get_specials(): 
    monday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 
    tuesday = {'B': 'Sausage gravy over biscuits. Note: Toast can be subbed.',\ 
    'L': 'Grilled cheese and tomato soup. Note: We have vegan cheese.', 
    'D': 'Meatloaf. Note: Comes with catsup on the top. Not optional.'} 
    wednesday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 
    thursday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 
    friday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 
    saturday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 
    sunday = {'B': 'Horseradish omelet. Note: better than it sounds', \ 
    'L': 'Momma\'s curry. Note: can be made spicy.',\ 
    'D': 'Beef brisket. Note: Comes with au jus. That\'s pronounced "Oh jhoo", not "Ow Juice"'} 

    specials = {'M': monday, 'T': tuesday, 'W': wednesday, 'R': thursday, 'F': friday, 'St': saturday, 'Sn': sunday} 
    return specials 

def print_special(special): 
    print "The special is: " 
    print special 
    print "*"*15 

def get_day(): 
    while True: 
     day = raw_input("Day (M/T/W/R/F/St/Sb): ") 
     if day.upper() in ['M', 'T', 'W', 'R', 'F', 'ST', 'SN']: 
      return day.upper() 
     else: 
      print "I'm sorry, but {} isn't valid.".format(day) 

def get_time(): 
    while True: 
     time =raw_input("Time (B/L/D): ") 

     if time.upper() in ['B', 'L', 'D']: 
      return time.upper() 
     else: 
      print "I'm sorry, but {} isn't a valid time.".format(time) 

def main(): 
    specials = get_specials() 
    print "This script will tell you the specials for any day of the week, and any time." 

    while True: 
     day = get_day() 
     special = specials[day] 

     time = get_time() 
     print_special(special[time]) 
     another = raw_input("Do you want to check another day and time? (Y/N)") 

     if another.lower() == 'n': 
      break 

if __name__ == '__main__': 
    main() 

Мои сомнения касаются главным образом раздела def main(). Может ли кто-нибудь объяснить мне, как все это называется? Заранее спасибо!!!

+8

на основании unpythonic обратных косых черт, я рекомендую вам получить другую книгу. – jonrsharpe

+1

Возможно, вас заинтересует http://learnpythonthehardway.org/book/ –

+0

Наряду с обратными косыми чертами, которые совершенно не нужны, вся программа выглядит так, будто она была преобразована с какого-то другого языка или просто плоха.К сожалению, в мире слишком много плохих уроков. – msw

ответ

1

Вы, вероятно, следует изменить функцию get_day так, что подсказка предлагает правильный код для каждого дня, который отображает в строке (например, «ST» вместо «Sb»):

def get_day(): 
    while True: 
     day = raw_input("Day (M/T/W/R/F/ST/SN): ") 
     if day.upper() in ['M', 'T', 'W', 'R', 'F', 'ST', 'SN']: 
      return day.upper() 
     else: 
      print "I'm sorry, but {} isn't valid.".format(day) 

Затем, изменение возвращаемое значение get_specials, чтобы соответствовать:

specials = {'M': monday, 'T': tuesday, 'W': wednesday, 'R': thursday, 'F': friday, 'ST': saturday, 'SN': sunday} 
return specials 

Теперь для объяснения:

get_specials Retuns словарь словарей.

specials является словарем каждого дня (monday, tuesday ...) и каждый день является ДИКТ с ключами для времени ['B','L','D']

В связи main процедуры, вы побуждая пользователь ввести день и время. Процедура main затем возвращает элемента, соответствующий с днем ​​(как special), и от того, возвращает значение, связанное с времени ключа.

В main процедуры, эта строка возвращает specials,

specials = get_specials() 

Если вспомнить, из приведенных выше объяснений это возвращает словарь словарей:

specials является словарем каждого дня (monday , tuesday ...) и каждый день - это диктофон с ключами на время ['B','L','D']

Эта строка затем возвращает второй уровень specials возвращается выше, таким образом, она возвращает B/L/словарь D для конкретного дня

special = specials[day] 

Поскольку это также словарь индексировано по B/L/D (время), то мы можем получить специальный для конкретного времени:

print_special(special[time])  
+0

Большое спасибо за ваше объяснение и помощь. У меня есть еще один вопрос. почему special = specials [day] и print_special (специальный [время])? Я не очень понимаю эту часть. почему я не могу поставить специальные = специальные [день] и специальные = специальные [время]? –

+0

Да, если __name__ == ... определяет, что нужно запускать при вызове модуля –

+0

Спасибо за ваш ответ. Я имел в виду, в чем разница между ними? Можете ли вы объяснить мне, что означают эти два выражения? –