Python permite que los argumentos de funciones tengan valores predeterminados. Si la función se llama sin el argumento, el argumento obtiene su valor predeterminado.
Argumentos predeterminados:
Python tiene una forma diferente de representar la sintaxis y los valores predeterminados para los argumentos de las funciones. Los valores predeterminados indican que el argumento de la función tomará ese valor si no se pasa ningún valor de argumento durante la llamada a la función. El valor predeterminado se asigna utilizando el operador de asignación (=) del formulario nombre de palabra clave =valor.
Entendamos esto a través de una función. alumno . La función alumno contiene 3 argumentos de los cuales 2 argumentos tienen asignados valores predeterminados. Entonces, la función alumno acepta un argumento requerido ( nombre de pila ), y los dos argumentos restantes son opcionales.
Python3
def> student(firstname, lastname>=>'Mark'>, standard>=>'Fifth'>):> >print>(firstname, lastname,>'studies in'>, standard,>'Standard'>)> |
>
>
Necesitamos tener en cuenta los siguientes puntos al llamar funciones:
- En el caso de pasar argumentos de palabras clave, el orden de los argumentos es importante.
- Sólo debe haber un valor para un parámetro.
- El nombre de la palabra clave pasada debe coincidir con el nombre de la palabra clave real.
- En el caso de llamar a una función que contiene argumentos que no son palabras clave, el orden es importante.
Ejemplo 1: Llamar a funciones sin argumentos de palabras clave
Python3
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'>)> |
>
>
Producción:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard>
En la primera llamada, solo hay un argumento requerido y el resto de los argumentos usan los valores predeterminados. En la segunda convocatoria, apellido y el valor de los argumentos estándar se reemplaza del valor predeterminado al nuevo valor de paso. Podemos ver que el orden de los argumentos es importante en la segunda, tercera y cuarta llamadas de la función.
Ejemplo #2: Llamar a funciones con argumentos de palabras clave
Python3
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'>)> |
>
transmitir cadena a int
>
Producción:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard>
En la primera llamada, solo se requiere un argumento de palabra clave. En la segunda llamada, uno es un argumento obligatorio y el otro es opcional (estándar), cuyo valor se reemplaza del predeterminado a un nuevo valor de paso. En la tercera llamada, podemos ver que el orden en el argumento de la palabra clave no es importante.
Ejemplo #3: Algunas llamadas a funciones no válidas
Python3
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 código anterior arrojará un error porque:
- En la primera llamada, no se pasa valor para el parámetro nombre de pila cual es el parámetro requerido.
- En la segunda llamada, hay un argumento que no es una palabra clave después de un argumento de palabra clave.
- En la tercera llamada, el argumento de la palabra clave que se pasa no coincide con los argumentos del nombre de la palabra clave real.
Usar objetos mutables como valores de argumento predeterminados en Python
Esto debe hacerse con mucho cuidado. La razón es que los valores predeterminados de los argumentos se evalúan solo una vez cuando el control alcanza la función.
Definición por primera vez. Después de eso, se hace referencia a los mismos valores (u objetos mutables) en las llamadas a funciones posteriores.
Las cosas quedarán mucho más claras con el ejemplo.
Python3
# 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'>))> |
>
>Producción
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']>
Lo que esperaba si supone que se crea una nueva lista en cada llamada a función cuando no le pasamos una lista
['computadora portátil']
['lápiz']
['borrador']
Pero como puede ver en el resultado real del programa, cada vez que se llama a la función, se usa la misma lista, no se crea ninguna lista nueva en una nueva llamada.
Ejemplo usando diccionario
Python3
# 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>))> |
>
>Producción
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}> Lo que esperaba si supone que se crea un nuevo diccionario en cada llamada de función
{'cuaderno': 4}
{'lápiz': 1}
{'borrador': 1}
Pero se puede ver claramente que el resultado real del programa es diferente e indica el uso del mismo diccionario en cada llamada posterior.
La conclusión clave aquí es que debemos evitar tales escenarios.
Mejores prácticas
Asigne el valor predeterminado como ninguno y luego verifique en la función si el argumento de lista o diccionario esperado es ninguno o no.
Si no es ninguno, asígnele una lista o diccionario según sus necesidades.
Python3
# 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>))> |
>
>Producción
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}> Aquí puede ver claramente que cada vez que se llama a una función y no se pasa una lista o diccionario como argumento a la función, se crea una nueva lista o diccionario.