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,