Упражнение № 40 - словарь проблем - PullRequest
0 голосов
/ 13 февраля 2012

Я боролся с этим упражнением, и хотя я понимаю, что делает вся программа, я не могу следовать ей.Пожалуйста, исправьте меня, если я ошибаюсь: сначала создается словарь cities, затем в этом словаре назначаются Нью-Йорк и Портленд для NY и OR.Затем создается функция с именем find_city с параметрами themap и state.Оператор if в этой функции смущает меня относительно того, как именно она работает.

Первая строка после функции не кажется необходимой, но, возможно, именно здесь мои знания должны быть расширены.Зачем назначать cities['_find']=findcity?Кроме того, почему перед переменной _find стоит подчеркивание?Я знаю, что вы можете создавать переменные, которые являются строками, как хотите, но кажется довольно произвольным просто иметь случайное подчеркивание в качестве первого символа в этой строке, возможно, есть причина?

Итак, цикл while -пользователю предлагается ввести состояние, и если оно не state, цикл прерывается.Я не уверен точно, как определяется state, поскольку я вижу только одно из параметров find_city.

Строка city_found=cities['_find'](cities,state) кажется эквивалентной city_found=find_city(cities,state).Следующая строка печатает city_found, что, по-видимому, является выводом функции find_city.Я просто не могу понять процесс достаточно хорошо, чтобы создать похожую программу со словарями.Извините за длинный пост, я застрял здесь на некоторое время.Любая помощь с благодарностью!

cities = {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville'}

cities['NY'] = 'New York' 
cities['OR'] = 'Portland'

def find_city(themap, state): 
    if state in themap:
        return themap[state] 
    else:
        return "Not found." 

cities['_find'] = find_city

while True: 
    print "State? (ENTER to quit)", 
    state = raw_input("> ")

    if not state: break

city_found = cities['_find'](cities, state) 
print city_found

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Посмотрим.

сам по себе find_city имеет смысл:

def find_city(themap, state): 
    if state in themap:
        return themap[state] 
    else:
        return "Not found." 

Так что я не уверен, что насчет заявления if, которое вы находите запутанным. Если состояние является ключом в карте, оно возвращает соответствующее значение; если нет («else»), возвращается строка «Not found». вместо этого.

cities['_find'] = find_city

Что делает эта строчка, так это забавная часть Словари не должны хранить только один тип объекта в качестве значения (или ключ в этом отношении, хотя ключи имеют более строгие требования - в реальном словаре не имеет значения, есть ли у вас предложение или картинка рядом с словом, но сложно что-то найти, если ключевые слова меняются). Здесь мы храним саму функцию в словаре, которая будет вызвана позже.

Начальное подчеркивание префикса - просто подсказка читателю, что означает «это внутреннее». Python на самом деле не имеет закрытых переменных, как некоторые другие языки, но мы иногда следуем соглашению, что, когда что-то внутреннее или немного особенное, мы используем одно подчеркивание.

Что касается определения состояния, то здесь это происходит:

state = raw_input("> ")

, что означает «читать вводимые пользователем строки и помечать их именем переменной« состояние »». Обратите внимание, что хотя это и называется состоянием, а второй аргумент find_city называется состоянием, это разные вещи.

Наконец,

`city_found=cities['_find'](cities,state)` seems to be the equivalent of `city_found=find_city(cities,state)`.

Да! У вас это точно, потому что city ['_ find'] возвращает функцию find_city. Это немного странно - большинство людей используют класс вместо словаря, в котором смешаны функции и данные - но это работает.

1 голос
/ 13 февраля 2012

Во-первых, ваша путаница вокруг утверждения if.Я думаю, что часть вашей путаницы вокруг утверждения if заключается в том, что вы неправильно скопировали программу.Последние две строки в вашем коде должны иметь отступ, чтобы они были внутри блока while True:.

При правильном отступе все работает, когда вы нажимаете клавишу ввода (без ввода какого-либо другого текста) во время state = raw_input("> "), state присваивается значение "" или пустая строка.Проверка правильности с использованием bool("") возвращает False.

Подчеркивание в качестве первого символа в Python обычно обозначает функцию, которая используется внутри объекта.Это просто соглашение об именах, сам Python фактически не интерпретирует его по-другому.В других языках ключевое слово private будет использоваться вместо этого соглашения.Не беспокойтесь о подчеркивании.

Идея поместить функцию find_city в словарь в качестве значения, вероятно, научит вас, что функции в python считаются "гражданами первого класса",термин информатики, означающий, что вы можете хранить саму функцию и передавать ее, как любой другой объект.Это означает, что вы можете сделать что-то вроде этого:

def callFirstParamWithOtherParams(arg1, arg2, arg3):
    return arg1(arg2, arg3)

callFirstParamWithOtherParams(find_city, cities, state)
...