Argumentos predeterminados en Python

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: 

  1. En el caso de pasar los argumentos de palabras clave, el orden de los argumentos es importante.
  2. Solo debe haber un valor para un parámetro.
  3. El nombre de la palabra clave pasada debe coincidir con el nombre de la palabra clave real.
  4. 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'))
Producción

['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))
Producción

{'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))
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.

Publicación traducida automáticamente

Artículo escrito por priyankagujral y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *