Python permet que els arguments de funció tinguin valors predeterminats. Si la funció es crida sense l'argument, l'argument obté el seu valor per defecte.
Arguments per defecte:
Python té una manera diferent de representar la sintaxi i els valors predeterminats per als arguments de funció. Els valors per defecte indiquen que l'argument de la funció prendrà aquest valor si no es passa cap valor de l'argument durant la crida de la funció. El valor per defecte s'assigna mitjançant l'operador assignment(=) del formulari nom de paraula clau = valor.
Entenem-ho a través d'una funció estudiant . La funció estudiant conté 3 arguments dels quals 2 s'assignen amb valors per defecte. Per tant, la funció estudiant accepta un argument requerit ( nom ), i la resta de dos arguments són opcionals.
Python 3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> |
>
>
Hem de tenir en compte els punts següents quan cridem funcions:
- En el cas de passar els arguments de la paraula clau, l'ordre dels arguments és important.
- Només hi hauria d'haver un valor per a un paràmetre.
- El nom de la paraula clau passat ha de coincidir amb el nom de la paraula clau real.
- En el cas de cridar una funció que conté arguments que no són de paraula clau, l'ordre és important.
Exemple #1: Crida a funcions sense arguments de paraula clau
Python 3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 positional argument> student(> 'John'> )> # 3 positional arguments> student(> 'John'> ,> 'Gates'> ,> 'Seventh'> )> # 2 positional arguments> student(> 'John'> ,> 'Gates'> )> student(> 'John'> ,> 'Seventh'> )> |
>
>
Sortida:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard>
A la primera crida, només hi ha un argument obligatori i la resta d'arguments utilitzen els valors per defecte. En la segona convocatòria, cognom i el valor dels arguments estàndard es substitueix del valor predeterminat al valor de pas nou. Podem veure que l'ordre dels arguments és important a partir de la 2a, 3a i 4a crida de la funció.
Exemple 2: crida a funcions amb arguments de paraula clau
Python 3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 keyword argument> student(firstname> => 'John'> )> # 2 keyword arguments> student(firstname> => 'John'> , standard> => 'Seventh'> )> # 2 keyword arguments> student(lastname> => 'Gates'> , firstname> => 'John'> )> |
>
>
Sortida:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard>
A la primera trucada, només hi ha un argument de paraula clau obligatori. A la segona crida, un és un argument obligatori i l'altre és opcional (estàndard), el valor del qual es substitueix des del valor predeterminat per un nou valor de pas. A la tercera trucada, podem veure que l'ordre en l'argument de la paraula clau no és important.
Exemple #3: Algunes trucades de funcions no vàlides
Python 3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # required argument missing> student()> # non keyword argument after a keyword argument> student(firstname> => 'John'> ,> 'Seventh'> )> # unknown keyword argument> student(subject> => 'Maths'> )> |
>
>
El codi anterior generarà un error perquè:
- A la primera crida, no es passa valor per al paràmetre nom que és el paràmetre requerit.
- A la segona crida, hi ha un argument que no sigui de paraula clau després d'un argument de paraula clau.
- A la tercera trucada, l'argument de la paraula clau que passa no coincideix amb els arguments reals del nom de la paraula clau.
Ús d'objectes mutables com a valors d'argument predeterminats a Python
Això s'ha de fer amb molta cura. El motiu és que els valors per defecte dels arguments s'avaluen només una vegada quan el control arriba a la funció
Definició per primera vegada. Després d'això, es fa referència als mateixos valors (o objectes mutables) a les trucades de funcions posteriors.
Les coses quedaran molt més clares amb l'exemple
Python 3
# mutable default argument values example using python list> # itemName is the name of the item that we want to add to list> # that is being passed, or if it is not passed then appending in> # the default list> def> appendItem(itemName, itemList> => []):> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> |
>
>Sortida
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']>
El que esperàveu si suposeu que es crea una llista nova a cada trucada de funció quan no li passem una llista
['quadern']
['llapis']
['goma d'esborrar']
Però com podeu veure a la sortida real del programa cada vegada que es crida la funció, s'utilitza la mateixa llista, no es fa cap llista nova en una nova trucada.
Exemple amb el diccionari
Python 3
# mutable default argument values example using python dictionary> # itemName is the name of item and quantity is the number of such> # items are there> def> addItemToDictionary(itemName, quantity, itemList> => {}):> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))> |
>
>Sortida
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}>
Què espereu si suposeu que es crea un diccionari nou a cada trucada de funció
{‘quadern’: 4}
{‘llapis’: 1}
{'goma d'esborrar': 1}
Però podeu veure clarament que la sortida real del programa és diferent i indica l'ús del mateix diccionari en cada trucada posterior.
La clau aquí és que hem d'evitar aquests escenaris.
Millors pràctiques
Assigneu el valor per defecte com a cap i, a continuació, comproveu a la funció si l'argument de la llista o del diccionari esperat és cap o no.
Si no n'hi ha cap, assigneu-lo amb una llista o diccionari segons les vostres necessitats.
Python 3
# using None as values of the default arguments> print> (> '#list'> )> def> appendItem(itemName, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => []> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> # using None as value of default parameter> print> (> '
#dictionary'> )> def> addItemToDictionary(itemName, quantity, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => {}> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))> |
>
>Sortida
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}>
Aquí podeu veure clarament que cada vegada que es crida una funció i una llista o diccionari no es passa com a argument a la funció, llavors es crea una llista o diccionari nou.
algorisme k-nn