LPTHW练习#40-字典麻烦

时间:2012-02-12 20:26:10

标签: python function dictionary while-loop

我一直在努力练习这个练习,虽然我理解整个课程的作用,但我无法遵循。请纠正我出错的地方:首先创建字典cities,然后将纽约和波特兰分配到NY和该字典中的OR。然后创建一个名为find_city的函数,其参数为themapstate。此函数中的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 个答案:

答案 0 :(得分:2)

我们来看看。

find_city本身是有道理的:

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

所以我不确定你发现的if语句会让你感到困惑。如果state是map中的键,则返回相应的值;如果不是(“else”),则返回字符串“Not found”。代替。

cities['_find'] = find_city

这条线的作用是有趣的部分。字典不需要只存储一种对象作为一个值(或者一个关键字,尽管键具有更严格的要求 - 在真正的字典中,如果你有一个句子或一个图片旁边没关系单词,但如果关键字正在改变,很难找到一些东西)。在这里,我们将函数本身存储在字典中,以便稍后调用。

初始前缀下划线只是对读者的暗示,这意味着“这是内部的”。 Python并不像其他语言那样拥有私有变量,但我们有时会遵循以下惯例:当内部或某些特殊内容时,我们使用一个前导下划线。

至于定义状态的地方,发生在这里:

state = raw_input("> ")

表示“从用户读取字符串输入并通过变量名称'state'标记它”。请注意,虽然这称为状态,而find_city的第二个参数称为状态,但它们是分开的。

最后,

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

是的!你已经准确了,因为cities ['_ find']返回函数find_city。这有点奇怪 - 大多数人会使用一个类而不是一个混合了函数和数据的字典 - 但它可以工作。

答案 1 :(得分:1)

首先,你对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)