Estoy revisando el tutorial de Python 2.7 y observé el resultado de la siguiente statement:
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]
Entonces, si llamo al progtwig como tal:
cheeseshop("Cheddar", "No.", "Seriously?", Shopkeeper="Michael Palin", Client="John Cleese")
Produce:
Do you have any Cheddar? I'm sorry, we're all out of Cheddar No. Seriously? -------------------------------------- Client: John Cleese Shopkeeper: Michael Palin
Esto es correcto.
Si cambio esa statement de print keywords
para print keywords
, obtengo la siguiente representación:
{'Shopkeeper': 'Ryan Lambert', 'Client': 'John Cleese'}
Estoy un poco confundido sobre cómo imprimir keywords[kw]
simplemente vuelve con un nombre, y las keywords
no.
En Python, puede pasar parámetros opcionales de palabras clave colocando un **
delante de la lista de parámetros de la función.
Así que la variable de keywords
es en realidad un tipo de diccionario. Por lo tanto, si lo haces:
print keywords
vuelves (reformateo para que el mapeo sea más obvio)
{ 'Shopkeeper': 'Ryan Lambert', 'Client': 'John Cleese' }
que es un diccionario. Y si lo haces:
print keywords[kw]
recuperas el valor del diccionario asociado con la clave kw
. Entonces, si kw
era 'Shopkeeper'
, entonces las keywords[kw]
convierten en 'Ryan Lambert'
, y si kw
era 'Client'
, entonces las keywords[kw]
convierten en 'John Cleese'
palabras clave se almacena como un diccionario . (Ver esto para más)
Si imprime el diccionario, emitirá el conjunto completo de pares que contiene (clave, valor).
En su progtwig:
Una forma de acceder a los valores es “buscarlo” con su clave: dict [clave]
Así que cuando escribiste: “keywords [kw]” en realidad estás pasando una clave y python te dará el valor correspondiente.
Puedes pensar que es similar a acceder a un valor de matriz:
a = ['a', 'b', 'c']
si tu:
print a #output: ['a', 'b', 'c'] print a[0] # outputs: 'a'
a diferencia de las matrices, los datos no se almacenan “prolijamente” juntos en la memoria, sino que se utiliza el hash
Espero que haya ayudado, Saludos.
Cuando llamas a la función con
cheeseshop("Cheddar", "No.", "Seriously?", Shopkeeper="Michael Palin", Client="John Cleese")
el parámetro de las keywords
toma el valor {'Shopkeeper': 'Ryan Lambert', 'Client': 'John Cleese'}
, es decir, es un diccionario.
Esto es equivalente a (y mucho más fácil de leer que) llamar a la función como
cheeseshop("Cheddar", *["No.", "Seriously?"], **{"Shopkeeper":"Michael Palin", "Client":"John Cleese"})
Es decir, los valores de la primera llamada a la función se envuelven automáticamente dentro de los *arguments
y **keywords
parámetros de **keywords
: para eso están los *
y **
.
Ahora, cuando haces esto:
keys = sorted(keywords.keys()) for kw in keys: print kw, ":", keywords[kw]
keyword.keys()
es ['Shopkeeper', 'Client']
, es decir, las “teclas” en el diccionario. A continuación, ordena esas claves y para cada clave, imprime la entrada correspondiente en el diccionario, por ejemplo, “John Cleese” para “Cliente”.