0

在下面的代码中理解两件事时遇到问题。问题1:我不明白什么是地图以及它的用途。通常当我们创建带有 2 个参数的函数时,如下所示:

def find_city(themap,state):我们不应该在运行程序时输入 2 个参数的值 themap吗?state然而,我们只给出状态值,即我们输入 CA OR MI OR FL 。我不明白这是themap用来做什么的。

问题 2:我不明白我在cities['_find'] = find_city 谷歌搜索的那一行'_find' python,我发现的唯一一件事是参考了 zed shaw 的书。它属于哪个类别,或者我应该阅读什么以了解有关此行的更多信息?

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."

# ok pay attention!
cities['_find'] = find_city

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

    if not state: break

    # this line is the most important ever! study!
    city_found = cities['_find'](cities, state)
    print city_found

编辑:您能否告诉我应该学习哪个章节或 python 主题才能更好地理解这一点。我的意思是,为了更好地理解我提出的问题。

4

9 回答 9

5

这条线

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

正在打电话

def find_city(themap, state):

所以

themap ==> cities
state ==> state
于 2012-04-30T06:12:19.267 回答
2

当调用到时find_city(注意之前的分配cities['_find'] = find_city

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

您将字典citiesstate. 标识符在函数中cities 重新映射(如果您愿意,可以重命名),在这部分代码中保持不变:themapstate

def find_city(themap, state)

即,在您的“主程序”中,您将字典称为cities但当您调用该函数时,该函数将其称为themap. state保持不变。名称由调用中的标识符和函数头中列出的标识符之间的位置匹配。

cities[_find]允许您在函数中使用索引到cities字典 中。statefind_city

阅读更多关于函数和参数传递机制、函数赋值(到变量)和 Python 中的字典应该有助于巩固你对这种类型的代码结构的理解。希望这可以帮助。

于 2012-04-30T06:12:58.497 回答
2

def find_city(themap,state):我们在运行程序时不应该输入themap和state这2个参数的值吗?

不; 当我们调用函数时,我们应该两个参数传递给函数。

并非程序使用的每条数据都必须来自用户。它可以提供自己的数据,从文件中读取内容等。

我不明白这行城市['_find'] = find_city

cities是一本字典。因此cities[<anything in here>] = <anything over there>,将<anything over there>值与 key 一起放入字典中<anything over here>。这里我们的键是字符串'_find',值是函数find_city。是的,在 Python 中,一切都是对象,其中包括函数。所以我们当然可以将函数存储在容器中:)

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

在这里,我们评估cities['_find']- 即,我们'_find'在字典中查找键cities,找到函数find_city;然后我们将该结果与(cities, state). 因此,它就像我们写的一样find_city(cities, state);这是一个正常的函数调用。state是用户输入的值,它被传递为state; 并且cities是字典,它作为themap. 在函数内部,在cities字典中查找命名状态。

于 2012-04-30T06:27:49.367 回答
2
city_found = cities['_find'](cities, state)  

这里你使用了一个调用函数,它调用了预定义的函数 DEF ---
它为城市调用“themap”,
为州调用“state”

但问题仍然存在,为什么要在“查找”之前使用“_”符号……谢谢。

于 2012-04-30T07:19:17.927 回答
0
  1. 是的,你是对的 - find_city 接受两个参数,并且在调用它时给出了多少,即

    城市['_find'](城市,州)

  2. 这只是意味着将一个条目添加到城市地图中。条目的键是字符串“_find”,值是函数 find_city。这就是为什么表达式 city['_find'] 返回函数然后你用两个参数调用它的原因。

于 2012-04-30T06:14:29.267 回答
0

嗯,themap是一个所谓的地图或字典或基于散列的容器。它就像一个数组一样使用,因为它operator[]以某种方式被重载(我来自 C++ 背景,它在 C++ 中是可行的)。当您分配'New York'cities['NY']键时,会自动创建“NY”,并且与该键对应的值是“New York”。

要回答您的第二个问题,find_city是某种与 key 配对的函数指针'_find'。这_find是任意键的选择。您可以使用findFind其他任何您想要的东西。难怪你在谷歌上没有找到任何关于它的东西。该行cities['_find'](cities, state)实际上在内部被翻译为find_city(cities, state).

希望我有所帮助,:)。

于 2012-04-30T06:15:18.597 回答
0

地图不是地理意义上的城市地图。Python 地图是一种数据类型。很明显,该函数正在传递一个带有城市的容器,并且在该函数中它传递了一个要在容器中查找的城市。也许你真的是新手——在函数的上下文中,参数有不同的名称,但在函数顶部具有相同的值。

在 python 中,任何东西都有一个可以赋值的值,甚至是函数。您要问的问题 2 只是同一功能的新名称。

于 2012-04-30T06:12:07.200 回答
0

函数是可以传递的值。

Sayingcities['_find']等价于 say find_city,因为它们都对那个函数求值。fn = 城市['_find'] fn(城市,州)

在 python 中,应用于一个值的函数调用语法会尝试使用参数调用该值(如果它是可调用的)。所以在你的情况下,cities['_find'].__call__(cities, state)最终被执行。

于 2012-04-30T10:40:00.950 回答
-1

您只需查看代码中的两行:

  1. cities['_find'] = find_city

  2. city_found = cities['find'](cities, state)

(1) 的解释:

由于城市是您使用之前的字典cities['_find']。打印它...

print(cities)
Output: {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville', 'NY': 'New York', 'OR': 'Portland'} 

现在使用后cities['_find']=find_city

print(cities)  
Output: {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville', 'NY': 'New York', 'OR': 'Portland', *'_find': <function find_city at 0x01BAB738*>}
  

这里最后一个字典项添加了键_find,值是函数find_city

(2) 的解释:

现在city_found = cities['find'](cities, state)

现在我们知道 find_city 在 dict 中_find,这意味着我们可以使用它。它可以这样分解:

  1. Python 看到city_found =并知道我们想要创建一个新变量。

  2. 然后它读取城市并找到该变量,它是一个字典。

  3. 然后是['_find']which 将索引到 city dict 并取出任何位于_find.

  4. 什么是['_find']我们的函数find_city,所以 Python 知道它有一个函数,并执行函数调用。

  5. 参数城市,状态被传递给这个函数find_city,它运行是因为它被调用了。

  6. find_city然后尝试查找城市内的州,并返回它找到的内容。

  7. Python 获取find_city返回的内容,最后将其分配给city_found.

于 2018-01-26T08:00:00.760 回答