Más sobre Funciones#

En la clase de hoy veremos algunos temas pendientes de la clase pasada.

Para definir funciones, usamos la palabra reservada def. Por ejemplo, podemos definir la función que verifica si un año es o no bisiesto:

def es_bisiesto(anio):
    """ Esta función determina si
        un año es bisiesto"""
    
    if(anio%4 == 0 and not anio%100==0 or anio%400==0):
        return True
    else:
        return False
        
anio = input('Ingrese anio :')    
print(type(anio))
# Esto está bien:
print(es_bisiesto(int(anio)))    
# Esto no va a andar:
print(es_bisiesto(anio)) 
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
Cell In[1], line 10
      7     else:
      8         return False
---> 10 anio = input('Ingrese anio :')    
     11 print(type(anio))
     12 # Esto está bien:

File /opt/miniconda3/lib/python3.9/site-packages/ipykernel/kernelbase.py:1172, in Kernel.raw_input(self, prompt)
   1165 """Forward raw_input to frontends
   1166 
   1167 Raises
   1168 ------
   1169 StdinNotImplementedError if active frontend doesn't support stdin.
   1170 """
   1171 if not self._allow_stdin:
-> 1172     raise StdinNotImplementedError(
   1173         "raw_input was called, but this frontend does not support input requests."
   1174     )
   1175 return self._input_request(
   1176     str(prompt),
   1177     self._parent_ident["shell"],
   1178     self.get_parent("shell"),
   1179     password=False,
   1180 )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.

Ejemplo#

Pangrama#

Un pangrama es una frase que contiene todas las letras del abecedario. Vamos a usar el inglés, así nos evitamos los acentos y otras cuestiones del castellano. Por ejemplo

the quick brown fox jumps over the lazy dog

es un pangrama muy usado en la creación de fonts, es decir, fuentes o tipos de letra, justamente porque contiene todas las letras del abecedario.

El problema es escribir una función que determine si una frase es un pangrama o no.

s = "the quick brown fox jumps over the lazy dog"


def is_pangram(frase):
    
    pass

Múltiples argumentos de entrada y salida#

def divide_seguro(x,y):
    if(y==0):
        return None,"Error: y vale 0"
    else:
        return x/y, "Ok"

a = 8.2
b = 0
    
cociente, result = divide_seguro(a,b)
print("cociente: ",cociente,", result:",result)

c = 2.5
cociente, result = divide_seguro(a,c)
print("cociente: ",cociente,", result:",result)
    

Un poco de ayuda de mis amigos#

La función help nos da ayuda sobre las funciones, ya sean del lenguaje o las que programamos, si es que tienen el docstring adecuado.

help(sum)
help(fib)
help(al_cuadrado)

Argumentos opcionales#

def caida_libre(t, h0, v0 = 0., g=9.8):
    """
    Devuelve la velocidad y la posición de una partícula en
    caída libre para condiciones iniciales dadas
    
    """
    v = v0 - g*t
    h = h0 - v0*t - g*t**2/2.
  
    return v, h

v1, h1 = caida_libre(10, 1000)

print(v1)
print(h1)

v1, h1 = caida_libre(10, 1000, g = 12)

print(v1)
print(h1)
-98.0
509.99999999999994
-120.0
400.0

Ámbito de las variables#

def func1(x):
    print('x entró a la función con el valor', x)
    x = 2
    print('El nuevo valor de x es', x)

y = 50
print('Originalmente x vale',y)
func1(y)
print('Ahora y vale',y)  
Originalmente x vale 50
x entró a la función con el valor 50
El nuevo valor de x es 2
Ahora y vale 50
x = [50]
print('Originalmente x vale',x)

def func2(x):
    print('x entró a la función con el valor', x)
    x = [2]
    print('El nuevo valor de x es', x)

func2(x)
print('Ahora x vale',x) 
Originalmente x vale [50]
x entró a la función con el valor [50]
El nuevo valor de x es [2]
Ahora x vale [50]
x = [50]
print('Originalmente x vale',x)

def func3(x):
    print('x entró a la función con el valor', x)
    x[0] = 2
    print('El nuevo valor de x es', x)

func3(x)
print('Ahora x vale',x)  
Originalmente x vale [50]
x entró a la función con el valor [50]
El nuevo valor de x es [2]
Ahora x vale [2]
x = [50]
print('Originalmente x vale',x)

def func3(x):
    print('x entró a la función con el valor', x)
    x = 'lala'
    print('El nuevo valor de x es', x)

func3(x)
print('Ahora x vale',x)  
Originalmente x vale [50]
x entró a la función con el valor [50]
El nuevo valor de x es lala
Ahora x vale [50]
x = [1,2,3,4,5]
print('Originalmente x vale',x)

def func3(x):
    print('x entró a la función con el valor', x)
    x[2] = 108
    print('El nuevo valor de x es', x)

func3(x)
print('Ahora x vale',x)  
Originalmente x vale [1, 2, 3, 4, 5]
x entró a la función con el valor [1, 2, 3, 4, 5]
El nuevo valor de x es [1, 2, 108, 4, 5]
Ahora x vale [1, 2, 108, 4, 5]

Algo de I/O#

Con las siglas I/O se hace referencia usualmente a los procedimientos de entrada y salida (del inglés, Input/Output). Esto se refiere la mayor parte de las veces a leer o escribir datos, ya sea de pantalla, archivo, etc.

Ya vimos la función print que escribe en la pantalla. Su contrapartida es la función input, que permite leer datos por pantalla:

algo_ingresado = input('Ingrese algo: ')

print(algo_ingresado)
print("El tipo de dato ingresado es:",type(algo_ingresado))
Ingrese algo: True
True
El tipo de dato ingresado es: <class 'str'>

Al igual que la función print, que siempre escribe un tipo string, input siempre recibe el tipo string.

Cargar y escribir archivos de texto#

Otra operación fundamental de I/O es la carga de datos desde archivos, y su escritura:

writeme = open('ejemplo.txt','w') 
# print('writeme es de tipo :',type(writeme))

texto = 'Esta es la primer línea,\nesta es la segunda\ny esta es la tercera.'

writeme.write(texto)

writeme.close()
writeme es de tipo : <class '_io.TextIOWrapper'>
readme = open('ejemplo.txt') 

texto_leido = readme.read()

print(texto_leido)

readme.close()
Esta es la primer línea,
esta es la segunda
y esta es la tercera.
Esta es la cuarta línea.
readme = open('ejemplo.txt') 

texto_leido = readme.read(16)

print('texto_leido:',texto_leido)

mas_texto_leido = readme.read()

print('mas_texto_leido:',mas_texto_leido)

readme.close()
texto_leido: Esta es la prime
mas_texto_leido: r línea,
esta es la segunda
y esta es la tercera.
Esta es la cuarta línea.
readme = open('ejemplo.txt')

for linea in readme:
    print(linea)
    
readme.close() 
Esta es la primer línea,

esta es la segunda

y esta es la tercera.

Esta es la cuarta línea.
readme = open('ejemplo.txt')
lineas = readme.readlines()

print(type(lineas))
print(len(lineas))
print(lineas)
print(lineas[0])
<class 'list'>
4
['Esta es la primer línea,\n', 'esta es la segunda\n', 'y esta es la tercera.\n', 'Esta es la cuarta línea.']
Esta es la primer línea,