Python permite que los argumentos de las funciones tengan valores predeterminados. Si se llama a la función 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 la función. 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 mediante el operador de asignación (=) del formulario nombre de palabra clave = valor.
Entendamos esto a través de una función estudiante . La función estudiante contiene 3 argumentos de los cuales 2 argumentos se asignan con valores predeterminados. Entonces, la función estudiante acepta un argumento requerido ( firstname ), y el resto de dos argumentos son opcionales.
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'): print(firstname, lastname, 'studies in', standard, 'Standard')
Debemos tener en cuenta los siguientes puntos al llamar funciones:
- En el caso de pasar los argumentos de palabras clave, el orden de los argumentos es importante.
- Solo 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: funciones de llamada 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 se requiere un argumento y los demás argumentos usan los valores predeterminados. En la segunda llamada, el apellido y el valor de los argumentos estándar se reemplazan del valor predeterminado al nuevo valor de paso. Podemos ver que el orden de los argumentos es importante desde la segunda, tercera y cuarta llamada de la función.
Ejemplo #2: funciones de llamada 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')
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 n.º 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 firstname , que 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 pasa no coincide con los argumentos reales del nombre de la palabra clave.
Uso de objetos mutables como valores de argumento predeterminados en python
Esto debe hacerse con mucho cuidado. El motivo es que los valores predeterminados de los argumentos se evalúan solo una vez cuando el control llega a la función.
Definición por primera vez. Después de eso, se hace referencia a los mismos valores (u objetos mutables) en las siguientes llamadas a funciones.
Las cosas será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'))
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']
Lo que esperaba si asume que se crea una nueva lista en cada llamada de función cuando no le pasamos una lista
Pero como puede ver en la salida real del programa, cada vez que se llama a la función, se usa la misma lista, no se crea una nueva lista 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))
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}
Lo que esperaba si asume que se crea un nuevo diccionario en cada llamada de función
Pero puede ver claramente que la salida 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 la lista esperada o el argumento del diccionario es ninguno o no.
Si no es ninguno, asígnelo con una lista o diccionario según sus requisitos.
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('\n\n#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))
#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.
Publicación traducida automáticamente
Artículo escrito por priyankagujral y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA