2012-02-12 133 views
0

我一直在为这个练习而苦苦挣扎,虽然我明白整个程序不能跟随。请纠正我错误的地方:首先创建字典cities,然后在该字典中将纽约和波特兰分配到NY和OR。然后创建一个名为find_city的函数,其参数为themapstate。这个函数中的if声明让我误解了它究竟是如何工作的。LPTHW Excercise#40-字典麻烦

函数后面的第一行似乎不是必要的,但也许这是我的知识需要扩展的地方。为什么分配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 
+0

在python中,名称前的下划线通常表示不应该被访问的内部函数。在这种情况下,我认为下划线将它与列表中的其他条目区分开来。这个练习是用来说明一个人可以用字典做什么,而不一定要做什么。调用find_city()函数是处理它的完全合法的方式。 – 2012-02-12 20:44:51

回答

2

让我们来看看。

find_city本身是有道理的:

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

所以我不知道的if语句你发现什么混乱。如果状态是映射中的键,则返回相应的值;如果不是(“else”),则返回字符串“未找到”。代替。

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)`. 

没错!你完全明白了,因为城市['_ find']返回函数find_city。这有点奇怪 - 大多数人会使用一个类而不是一个函数和数据混合在一起的字典 - 但它是有效的。

+0

我希望我能更多地赞扬你 - 这非常有帮助!我有一个小问题,就是为什么while循环只有按下enter键才会中断,但是如果你键入一个非状态,它会显示Not Found并且继续循环。 – ZCJ 2012-02-12 20:54:52

+0

@ user1198611:为什么它不会循环?循环内唯一的中断条件(修复缩进问题后)是“if not state:break”,因为state是一个字符串,所以基本上意思是“if len(state)== 0:break”。如果你想让它打破,你可以把在“如果city_found ==‘未找到’:断点条件自己 – DSM 2012-02-12 20:59:58

+0

啊确定,所以只要字符的字符串是输入,也不会断裂 – ZCJ 2012-02-12 21:10:15

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) 
+0

啊,你说得对!请复制并粘贴到事情计算器似乎并没有保留缩进我,我一定是错过了最后两行。有关职能有趣的观点,它们似乎是实际做多的对象。我的理解是慢慢提高,非常感谢您的答复。 – ZCJ 2012-02-12 21:13:23

+0

没问题。一个很酷的方式来提高上面的例子是使用部分功能应用的想法看看这个要点为例它加入到这个练习。https://gist.github.com/93e102af9f988dbba8b3 – fourk 2012-02-12 21:23:59