【问题标题】:LPTHW Excercise #40- dictionary troublesLPTHW 练习 #40- 字典问题
【发布时间】:2012-02-12 20:26:10
【问题描述】:

我一直在努力完成这个练习,虽然我了解整个程序的作用,但我无法继续进行。请纠正我哪里出错:首先创建字典cities,然后在该字典中将纽约和波特兰分配给纽约和 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

【问题讨论】:

  • 在python中,名称前的下划线通常表示不应访问的内部函数。在这种情况下,我认为下划线将其与列表中的其他条目区分开来。本练习用于演示 可以 使用 dicts 做什么,而不一定是应该做什么。调用 find_city() 函数是一种完全合法的处理方式。

标签: python function dictionary while-loop


【解决方案1】:

让我们看看。

find_city 本身是有道理的:

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

所以我不确定你是否会感到困惑的 if 语句。如果state是map中的key,则返回对应的value;如果不是(“else”),则返回字符串“未找到”。而是。

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

是的!你已经明白了,因为 city['_find'] 返回函数 find_city。这有点奇怪——大多数人会使用类而不是字典,其中函数和数据混合在一起——但它确实有效。

【讨论】:

  • 我希望我能给你更多的支持——这非常有帮助!我有一个小问题是为什么只有当你按下回车时while循环才会中断,但是如果你输入一个非状态,它会显示 Not Found 并继续循环。
  • @user1198611:它为什么不继续循环?循环内唯一的中断条件(在解决缩进问题之后)是“if not state: break”,因为 state 是一个字符串,所以基本上意味着“if len(state) == 0: break”。如果你想让它中断,你可以输入一个 "if city_found == "Not found.": break condition 自己。
  • 啊,好吧,只要输入一串字符,就不会中断。
  • 是的,就是这样。并欢迎三字母命名用户的大家庭。这就像匿名但不完全一样。 ;-)
【解决方案2】:

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

【讨论】:

  • 啊,你是对的!将内容复制并粘贴到 stackoverflow 中似乎并没有为我保留缩进,而且我一定错过了最后两行。关于函数的有趣点,它们似乎是实际上做更多事情的对象。我的理解正在慢慢提高,非常感谢您的回复。
  • 没问题。改进上述示例的一种很酷的方法是使用偏函数应用的思想。查看此要点以获取添加到此练习的示例:gist.github.com/93e102af9f988dbba8b3
猜你喜欢
  • 1970-01-01
  • 2016-03-31
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多