2

我正在阅读 Python 2.7 教程,并且正在查看以下语句的输出:

def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]

所以,如果我这样调用程序:

cheeseshop("Cheddar", "No.", "Seriously?",
       Shopkeeper="Michael Palin",
       Client="John Cleese")

它输出:

Do you have any Cheddar?
I'm sorry, we're all out of Cheddar
No.
Seriously?
--------------------------------------
Client: John Cleese
Shopkeeper: Michael Palin

这是对的。

如果我将该打印语句更改为print keywords,我会得到以下表示:

{'Shopkeeper': 'Ryan Lambert', 'Client': 'John Cleese'}

我对打印如何keywords[kw]返回一个名称感到有点困惑,而keywords没有。

4

3 回答 3

2

在 Python 中,您可以通过将 a**放在函数参数列表的前面来传递可选的关键字参数。

所以keywords变量实际上是一个字典类型。因此,如果你这样做:

print keywords

你回来了(重新格式化以使映射更明显)

{
    'Shopkeeper': 'Ryan Lambert', 
    'Client': 'John Cleese'
}

这是一本字典。如果你这样做:

print keywords[kw]

您将取回与 key 关联的字典的值kw。所以如果kw'Shopkeeper',那么keywords[kw]变成'Ryan Lambert',如果kw'Client',那么keywords[kw]变成'John Cleese'

于 2013-07-16T13:24:42.877 回答
0

关键字存储为字典。(查看更多

如果您打印字典本身,它将输出它包含的完整对集(键,值)。

在你的程序上:

  • 键是:“店主”和“客户”
  • 值分别是:'Ryan Lambert' 和 'John Cleese'

访问值的一种方法是使用其键“搜索”它:dict[key]

因此,当您写:“keywords[kw]”时,您实际上是在传递一个键,python 将为您提供相应的值。

您可以认为它类似于访问数组值:

a = ['a', 'b', 'c']

如果你:

print a #output: ['a', 'b', 'c']    
print a[0] # outputs: 'a'

与数组不同,数据不是“整齐”地存储在内存中,而是使用散列

希望它有所帮助,干杯

于 2013-07-16T13:27:04.880 回答
0

当您使用

cheeseshop("Cheddar", "No.", "Seriously?",
           Shopkeeper="Michael Palin", Client="John Cleese")

keywords参数采用 value {'Shopkeeper': 'Ryan Lambert', 'Client': 'John Cleese'},即它是一个字典。

这等效于(并且比它更容易阅读)调用函数为

cheeseshop("Cheddar", *["No.", "Seriously?"],
           **{"Shopkeeper":"Michael Palin", "Client":"John Cleese"})

也就是说,第一个函数调用中的值会自动包装在*argumentsand **keywords参数中——这就是那些*and**的用途。

现在,当你这样做时:

keys = sorted(keywords.keys())
for kw in keys:
    print kw, ":", keywords[kw]

keyword.keys()is ['Shopkeeper', 'Client'],即字典中的“键”。接下来,您对这些键进行排序,并为每个键打印字典中的相应条目,例如“客户”的“John Cleese”。

于 2013-07-16T13:34:38.747 回答