Modulo 4 Teoria, Labs, Quiz Completo Python
Modulo 4 Teoria, Labs, Quiz Completo Python
4.1.1.2 Funciones
Cuando se desea mostrar o imprimir algo en consola se utiliza print() . Cuando se desea leer el
valor de una variable se emplea input() , combinados posiblemente con int() o float() .
También se ha hecho uso de algunos métodos, las cuales también son funciones, pero declarados de
una manera muy especifica.
1
Ahora aprenderás a escribir tus propias funciones, y como utilizarlas. Escribiremos varias de ellas
juntos, desde muy sencillas hasta algo complejas. Se requerirá de tu concentración y atención.
Muy a menudo ocurre que un cierto fragmento de código se repite muchas veces en un programa.
Se repite de manera literal o, con algunas modificaciones menores, empleando algunas otras
variables dentro del programa. También ocurre que un programador ha comenzado a copiar y pegar
ciertas partes del código en más de una ocasión en el mismo programa.
Puede ser muy frustrante percatarse de repente que existe un error en el código copiado. El
programador tendrá que escarbar bastante para encontrar todos los lugares en el código donde hay
que corregir el error. Además, existe un gran riesgo de que las correcciones produzcan errores
adicionales.
Definamos la primer condición por la cual es una buena idea comenzar a escribir funciones
propias: si un fragmento de código comienza a aparecer en más de una ocasión, considera la
posibilidad de aislarlo en la forma de una función invocando la función desde el lugar en el que
originalmente se encontraba.
Puede suceder que el algoritmo que se desea implementar sea tan complejo que el código comience a
crecer de manera incontrolada y, de repente, ya no se puede navegar por él tan fácilmente.
Se puede intentar solucionar este problema comentando el código, pero pronto te darás cuenta que
esto empeorará la situación - demasiados comentarios hacen que el código sea más difícil de leer
y entender. Algunos dicen que una función bien escrita debe ser comprensible con tan solo una
mirada.
Un buen desarrollador divide el código (o mejor dicho: el problema) en piezas aisladas, y codifica
cada una de ellas en la forma de una función.
Esto simplifica considerablemente el trabajo del programa, debido a que cada pieza se codifica por
separado y consecuentemente se prueba por separado. A este proceso se le llama
comúnmente descomposición.
2
Existe una segunda condición: si un fragmento de código se hace tan extenso que leerlo o
entenderlo se hace complicado, considera dividirlo pequeños problemas por separado e
implementa cada uno de ellos como una función independiente.
Esta descomposición continua hasta que se obtiene un conjunto de funciones cortas, fáciles de
comprender y probar.
4.1.1.3 Funciones
Descomposición
Es muy común que un programa sea tan largo y complejo que no puede ser asignado a un solo
desarrollador, y en su lugar un equipo de desarrolladores trabajarán en el. El problema, debe ser
dividido entre varios desarrolladores de una manera en que se pueda asegurar su eficiencia y
cooperación.
3
Es inconcebible que más de un programador deba escribir el mismo código al mismo tiempo, por lo
tanto, el trabajo debe de ser dividido entre todos los miembros del equipo.
Este tipo de descomposición tiene diferentes propósitos, no solo se trata de compartir el trabajo,
sino también de compartir la responsabilidad entre varios desarrolladores.
Cada uno debe escribir un conjunto bien definido y claro de funciones, las cuales al ser combinadas
dentro de un módulo (esto se clarificara un poco mas adelante) nos dará como resultado el producto
final.
Esto nos lleva directamente a la tercera condición: si se va a dividir el trabajo entre varios
programadores, se debe descomponer el problema para permitir que el producto sea
4
implementado como un conjunto de funciones escritas por separado empacadas juntas en
diferentes módulos.
De Python mismo: varias funciones (como print() ) son una parte integral de Python, y
siempre están disponibles sin algún esfuerzo adicional del programador; se les llama a estas
funciones funciones integradas.
De los módulos preinstalados de Python: muchas de las funciones, las cuales comúnmente
son menos utilizadas que las integradas, están disponibles en módulos instalados juntamente
con Python; para poder utilizar estas funciones el programador debe realizar algunos pasos
adicionales (se explicará acerca de esto en un momento).
Directamente del código: tu puedes escribir tus propias funciones, colocarlas dentro del
código, y usarlas libremente.
Existe una posibilidad más, pero se relaciona con clases, se omitirá por ahora.
5
4.1.1.4 Escribir Funciones
Tu primer función
Observa el fragmento de código en el editor.
Tendrías que tomar algo de tiempo para cambiar el mensaje en todos los lugares donde
aparece (podrías hacer uso de copiar y pegar, pero eso no lo haría mas sencillo). Es muy
probable que cometas errores durante el proceso de corrección, eso traería frustración a ti
y a tu jefe.
¿Es posible separar ese código repetido, darle un nombre y hacerlo reutilizable?
Significaría que el cambio hecho en un solo lugar será propagado a todos los lugares
donde se utilice.
Para que esto funcione, dicho código debe ser invocado cada vez que se requiera.
Ejemplo de Código
a = int(input())
b = int(input())
c = int(input())
Console
Ingresa un valor:
10
Ingresa un valor:
20
Ingresa un valor:
30
6
4.1.1.5 Escribir funciones
Tu primer función
¿Cómo es que se crea dicha función?
def nombreFuncion():
cuerpoFuncion
def mensaje():
def mensaje():
7
print("Se termina aquí.")
Se comienza aquí.
Se termina aquí.
Esto significa que Python lee la definición de la función y la recuerda, pero no la ejecuta sin
permiso.
def mensaje():
mensaje()
Se comienza aquí.
Ingresa un valor:
Se termina aquí.
Ejemplo 1:
def mensaje():
8
Consola =
Se comienza aquí.
Se termina aquí.
Ejemplo 2:
def mensaje():
print("Ingresa un valor: ")
4.1.1.6 Funciones
9
La imagen intenta mostrar el proceso completo:
Cuando se invoca una función, Python recuerda el lugar donde esto ocurre y salta hacia
dentro de la función invocada.
El cuerpo de la función es entonces ejecutado.
Al llegar al final de la función, Python regresa al lugar inmediato después de donde ocurrió
la invocación.
Recuerda: Python lee el código de arriba hacia abajo. No va a adelantarse en el código para
determinar si la función invocada esta definida mas adelante, el lugar correcto para definirla es antes
de ser invocada.
mensaje()
def mensaje():
Se ha movido la función al final del código. ¿Podrá Python encontrarla cuando la ejecución llegue a
la invocación?
No intentes forzar a Python a encontrar funciones que no están definidas en el lugar correcto.
def mensaje():
10
print("Ingresa un valor: ")
mensaje = 1
El asignar un valor al nombre "mensaje" causa que Python olvide su rol anterior. La función con el
nombre de mensaje ya no estará disponible.
def mensaje():
mensaje()
def mensaje():
mensaje()
a = int(input())
mensaje()
b = int(input())
mensaje()
c = int(input())
11
El modificar el mensaje de entrada es ahora sencillo: se puede hacer con solo modificar el código
una única vez - dentro del cuerpo de la función.
Puntos Clave
1. Una función es un bloque de código que realiza una tarea especifica cuando la función es llamada
(invocada). Las funciones son útiles para hacer que el código sea reutilizable, que este mejor
organizado y más legible. Las funciones contienen parámetros y pueden regresar valores.
3. Las funciones propias se pueden definir utilizando la palabra reservada def y con la siguiente
sintaxis:
# el cuerpo de la función
Se puede definir una función sin que haga uso de argumentos, por ejemplo:
También es posible definir funciones con argumentos, como la siguiente que contiene un solo
parámetro:
12
nombre = input("Ingresa tu nombre: ")
Ejercicio 1
Revisar
Ejercicio 2
¿Qué es lo que ocurre cuando se invoca una función antes de ser definida? Ejemplo:
hola()
def hola():
print("hola!")
Revisar
Ejercicio 3
13
def hola():
print("hola")
hola(5)
Revisar
Se genera una excepción (la excepción TypeError ) - la función hola() no toma argumentos.
Un parámetro es una variable, pero existen dos factores que hacen a un parámetro diferente:
Los parámetros solo existen dentro de las funciones en donde han sido definidos, y el
único lugar donde un parámetro puede ser definido es entre los paréntesis después del
nombre de la función, donde se encuentra la palabra reservada def .
La asignación de un valor a un parámetro de una función se hace en el momento en
que la función se manda llamar o se invoca, especificando el argumento correspondiente.
def funcion(parametro):
###
Recuerda que:
Los parámetros solo existen dentro de las funciones (este es su entorno natural).
Los argumentos existen fuera de las funciones, y son los que pasan los valores a los
parámetros correspondientes.
14
def mensaje(numero):
###
Esta definición especifica que nuestra función opera con un solo parámetro con el nombre
de numero . Se puede utilizar como una variable normal, pero solo dentro de la función - no es
visible en otro lugar.
def mensaje(numero):
Se ha hecho buen uso del parámetro. Nota: No se le ha asignado al parámetro algún valor. ¿Es
correcto?
Si, lo es.
Esto significa que se está invocando la función pero está faltando el argumento.
Ejemplo:
def mensaje(numero):
print("Ingresa un número:", numero)
mensaje()
15
Consola =
Traceback (most recent call last):
File "main.py", line 4, in <module>
mensaje()
TypeError: mensaje() missing 1 required positional argument:
'numero'
def mensaje(numero):
mensaje(1)
Ingresa un número: 1
Ejemplo 2:
def mensaje(numero):
print("Ingresa un número:", numero)
mensaje(1)
Console
Ingresa un número: 1
¿Puedes ver como funciona? El valor del argumento utilizado durante la invocación ( 1 ) ha
sido pasado a la función, dándole un valor inicial al parámetro con el nombre de numero .
Es posible tener una variable con el mismo nombre del parámetro de la función.
def mensaje(numero):
16
numero = 1234
mensaje(1)
print(numero)
Ingresa un número: 1
1234
Ejemplo 3:
def mensaje(numero):
print("Ingresa un número:", numero)
numero = 1234
mensaje(1)
print(numero)
Console
Ingresa un número: 1
1234
17
Modifiquemos la función- ahora tiene dos parámetros:
Aquí esta:
mensaje("teléfono", 11)
mensaje("precio", 5)
mensaje("número", "número")
18
Estas es la salida del código anterior:
Ejecuta el código, modifícalo, agrega más parámetros y ve como esto afecta la salida.
Ejemplo:
def mensaje(que, numero):
print("Ingresa", que, "número", numero)
mensaje("teléfono", 11)
mensaje("precio", 5)
mensaje("número", "número")
Console
Ingresa teléfono número 11
Ingresa precio número 5
Ingresa número número número
Ya se ha utilizado, pero Python ofrece mucho más. Se abordará este tema a continuación.
miFuncion(1, 2, 3)
Ejemplo:
def miFuncion(a, b, c):
print(a, b, c)
miFuncion(1, 2, 3)
Console
1 2 3
19
Nota: el paso de parámetros posicionales es usado de manera intuitiva por las personas
en muchas situaciones. Por ejemplo, es generalmente aceptado que cuando nos
presentamos mencionamos primero nuestro nombre(s) y después nuestro apellido, por
ejemplo, "Me llamo Juan Pérez."
presentar("Luke", "Skywalker")
presentar("Jesse", "Quick")
presentar("Clark", "Kent")
Console
Hola, mi nombre es Luke Skywalker
Hola, mi nombre es Jesse Quick
Hola, mi nombre es Clark Kent
Ahora imaginemos que la función esta siendo utilizada en Hungría. En este caso, el código
sería de la siguiente manera:
presentar("Skywalker" ,"Luke" )
presentar("Quick", "Jesse")
presentar("Kent", "Clark")
Console
Hola, mi nombre es Skywalker Luke
Hola, mi nombre es Quick Jesse
Hola, mi nombre es Kent Clark
20
4.1.2.5 Como las funciones se comunican con su entorno
Console
Hola, mi nombre es James Bond
Hola, mi nombre es Luke Skywalker
El concepto es claro: los valores pasados a los parámetros son precedidos por el nombre
del parámetro al que se le va a pasar el valor, seguido por el signo de = .
introduction(apellido="Skywalker", primerNombre="Luke")
Inténtalo tu mismo.
21
Ejemplo:
introduction(apellido="Skywalker", primerNombre="Luke")
Console
Traceback (most recent call last):
File "main.py", line 4, in <module>
introduction(apellido="Skywalker", primerNombre="Luke")
NameError: name 'introduction' is not defined
suma(1, 2, 3)
Ejemplo:
def suma(a, b, c):
print(a, "+", b, "+", c, "=", a + b + c)
suma(1, 2, 3)
22
Dará como salida:
1 + 2 + 3 = 6
También, se puede reemplazar la invocación actual por una con palabras clave, como la
siguiente:
suma(c = 1, a = 2, b = 3)
Ejemplo:
def suma(a, b, c):
print(a, "+", b, "+", c, "=", a + b + c)
suma(c = 1, a = 2, b = 3)
2 + 3 + 1 = 6
suma(3, c = 1, b = 2)
Vamos a analizarla:
Ejemplo:
def suma(a, b, c):
print(a, "+", b, "+", c, "=", a + b + c)
suma(3, c = 1, b = 2)
3 + 2 + 1 = 6
23
Se cuidadoso, ten cuidado de no cometer errores. Si se intenta pasar mas de un valor a un
argumento, ocurrirá un error y se mostrará lo siguiente:
suma(3, a = 1, b = 2)
Ejemplo:
suma(3, a = 1, b = 2)
Console
Traceback (most recent call last):
File "main.py", line 4, in <module>
suma(3, a = 1, b = 2)
TypeError: suma() got multiple values for argument 'a'
suma(4, 3, c = 2)
Ejemplo:
def suma(a, b, c):
print(a, "+", b, "+", c, "=", a + b + c)
suma(4, 3, c = 2)
Console
24
4 + 3 + 2 = 9
Todo es correcto, pero el dejar solo un argumento con palabras clave es algo extraño -
¿Qué es lo que opinas?
Console
(vacío)
Solo se tiene que colocar el nombre del parámetro seguido del signo de = y el valor por
default.
presentar("Jorge", "Pérez")
Ejemplo:
presentar("Jorge", "Pérez")
25
Console
Hola, mi nombre es Jorge Pérez
¿Y? No parece haber cambiado algo, pero cuando se invoca la función de una manera
inusual, como esta:
presentar("Enrique")
o así:
presentar (primerNombre="Guillermo")
Pruébalo.
Ejemplo:
presentar("Enrique")
presentar (primerNombre="Guillermo")
Console
Hola, mi nombre es Enrique González
Hola, mi nombre es Guillermo González
26
Puedes hacerlo con mas parámetros, si te resulta útil. Ambos parámetros tendrán sus
valores por default, observa el siguiente código:
presentar ()
Ejemplo:
def presentar(primerNombre="Juan", segundoNombre="González"):
print("Hola, mi nombre es ", primerNombre, segundoNombre)
presentar ()
presentar(segundoNombre="Rodríguez")
La salida es:
Pruébalo.
Ejemplo:
def presentar(primerNombre="Juan", segundoNombre="González"):
print("Hola, mi nombre es ", primerNombre, segundoNombre)
presentar(segundoNombre="Rodríguez")
Console
Hola, mi nombre es Juan Rodríguez
27
4.1.2.8 RESUMEN DE SECCIÓN
Puntos Clave
def hola(nombre):
print("Hola,", nombre)
hola("Greg")
print("Hola,", nombre2)
print("Hola,", nombre1)
holaTodos("Sebastián", "Felipe")
c = input("Calle: ")
cd = input("Ciudad: ")
28
Paso de argumentos posicionales en la cual el orden de los parámetros es
relevante (Ejemplo 1).
Paso de argumentos con palabras clave en la cual el orden de los argumentos
es irrelevante (Ejemplo 2).
Una mezcla de argumentos posicionales y con palabras clave (Ejemplo 3).
Ejemplo 1
print(a - b)
resta(5, 2) # salida: 3
resta(2, 5) # salida: -3
Ejemplo 2
print(a - b)
Ex. 3
print(a - b)
resta(5, 2) # salida: 3
print(a - b)
29
resta(a=5, 2) # Syntax Error
Ejercicio 1
intro()
Revisar
Ejercicio 2
intro(b="Sergio López")
Revisar
Ejercicio 3
30
def intro(a, b="Bond"):
print("Mi nombre es", b + ".", a + ".")
intro("Susan")
Revisar
Ejercicio 4
suma(a=1, c=3)
Revisar
Por supuesto, las funciones, al igual que las funciones matemáticas, pueden tener resultados.
Para lograr que las funciones devuelvan un valor (pero no solo para ese propósito) se utiliza la
instrucción return (regresar o retornar).
Esta palabra nos da una idea completa de sus capacidades. Nota: es una palabra reservada de
Python.
31
Nota: si una función no está destinada a producir un resultado, emplear la instrucción return
no es obligatorio, se ejecutará implícitamente al final de la función.
De cualquier manera, se puede emplear para terminar las actividades de una función, antes de que
el control llegue a la última línea de la función.
print("Tres ...")
print("Dos ...")
print("Uno ...")
if not deseos:
return
felizAñoNuevo()
Tres ...
Dos...
Uno...
felizAñoNuevo(False)
Tres ...
Dos...
32
Uno ...
funcion():
return expresión
def funcion_aburrida():
return 123
x = funcion_aburrida()
Vamos a investigarlo.
33
La instrucción return , enriquecida con la expresión (la expresión es muy simple aquí),
"transporta" el valor de la expresión al lugar donde se ha invocado la función.
El resultado se puede usar libremente aquí, por ejemplo, para ser asignado a una variable.
Ten en cuenta que no estamos siendo muy educados aquí: la función devuelve un valor y lo
ignoramos (no lo usamos de ninguna manera):
def funcion_aburrida():
return 123
funcion_aburrida()
34
La única desventaja es que el resultado se ha perdido irremediablemente.
No olvides:
Espera un segundo, ¿Significa esto que también hay resultados inútiles? Sí, en cierto sentido.
print(None + 2)
Solo hay dos tipos de circunstancias en las que None se puede usar de manera segura:
valor = None
if valor == None:
No olvides esto: si una función no devuelve un cierto valor utilizando una cláusula de
expresión return , se asume que devuelve implícitamente None .
35
Vamos a probarlo.
Ejemplo:
valor = None
if valor == None:
print("Lo siento, no tienes ningún valor")
Console
Lo siento, no tienes ningún valor
print(strangeFunction(2))
print(strangeFunction(1))
True
None
No te sorprendas la próxima vez que veas None como el resultado de la función, puede
ser el síntoma de un error sutil dentro de la función.
Ejemplo:
def strangeFunction(n):
if(n % 2 == 0):
return True
print(strangeFunction(2))
print(strangeFunction(1))
Console
True
None
36
4.1.3.4 Regresando el resultado de una función
El primero es: ¿Se puede enviar una lista a una función como un argumento?
¡Por supuesto que se puede! Cualquier entidad reconocible por Python puede desempeñar
el papel de un argumento de función, aunque debes asegurarte de que la función sea
capaz de hacer uso de él.
Entonces, si pasas una lista a una función, la función tiene que manejarla como una lista.
def sumaDeLista(lst):
sum = 0
return sum
y se invoca así:
print(sumaDeLista([5, 4, 3]))
Ejemplo:
def sumaDeLista(lst):
sum = 0
return sum
print(sumaDeLista([5, 4, 3]))
Console
12
37
print(sumaDeLista(5))
Ejemplo:
def sumaDeLista(lst):
sum = 0
return sum
print(sumaDeLista(5))
Console
Traceback (most recent call last):
File "main.py", line 9, in <module>
print(sumaDeLista(5))
File "main.py", line 4, in sumaDeLista
for elem in lst:
TypeError: 'int' object is not iterable
Esto se debe al hecho de que el bucle for no puede iterar un solo valor entero.
¡Si, por supuesto! Cualquier entidad reconocible por Python puede ser un resultado de
función.
[4, 3, 2, 1, 0]
Vamos a profundizar un poco más en los problemas relacionados con las variables en las
funciones. Esto es esencial para crear funciones efectivas y seguras.
38
Ejemplo:
def strangeListFunction(n):
strangeList = []
return strangeList
print(strangeListFunction(5))
Console
[4, 3, 2, 1, 0]
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
39
Ejemplo:
def isYearLeap(year):
for i in range(len(testData)):
yr = testData[i]
print(yr,"->",end="")
result = isYearLeap(yr)
if result == testResults[i]:
print("OK")
else:
print("Error")
Console
File "main.py", line 6
testData = [1900, 2000, 2016, 1987]
^
IndentationError: expected an indented block
Nota: también hemos preparado un breve código de prueba, que puedes utilizar para
probar tu función.
El código utiliza dos listas: una con los datos de prueba y la otra con los resultados
esperados. El código te dirá si alguno de tus resultados no es válido.
40
Respuesta:
def isYearLeap(year):
return True
else:
return False
print(isYearLeap(1900))
print(isYearLeap(2016))
for i in range(len(testData)):
yr = testData[i]
print(yr,"->",end="")
result = isYearLeap(yr)
if result == testResults[i]:
print("OK")
else:
print("Error")
Console
False
41
True
1900 ->OK
2000 ->OK
2016 ->OK
1987 ->OK
Tiempo estimado
15-20 minutos
Nivel de dificultad
Medio
Requisitos previos
LABORATORIO 4.1.3.6
Objetivos
Familiarizar al estudiante con:
La parte inicial de la función está lista. Ahora, haz que la función devuelva None si los
argumentos no tienen sentido.
42
Ejemplo:
def isYearLeap(year):
for i in range(len(testYears)):
yr = testYears[i]
mo = testMonths[i]
if result == testResults[i]:
print("OK")
else:
print("Error")
Console
File "main.py", line 6
def daysInMonth(year, month):
^
43
IndentationError: expected an indented block
Por supuesto, puedes (y debes) utilizar la función previamente escrita y probada (LAB
4.1.3.6). Puede ser muy útil. Te recomendamos que utilices una lista con los meses.
Puede crearla dentro de la función; este truco acortará significativamente el código.
Hemos preparado un código de prueba. Amplíalo para incluir más casos de prueba.
Respuesta:
def isYearLeap(year):
return True
else:
return False
print(isYearLeap(1900))
if year == 2000:
return True
else:
return False
print(isYearLeap(1900))
44
if year == 2000 or year == 2016:
LeapMonthList = [0,31,29,31,30,31,30,31,31,30,31,30,31]
return datemonth
LeapMonthList = [0,31,29,31,30,31,30,31,31,30,31,30,31]
return datemonth
else:
pass
print(daysInMonth (2000,2))
for i in range(len(testYears)):
yr = testYears[i]
mo = testMonths[i]
if result == testResults[i]:
print("OK")
else:
print("Error")
Console
45
29
1900 2 ->Error
2000 2 ->OK
2016 1 ->OK
1987 11 ->OK
Tiempo estimado
20-30 minutos
Nivel de dificultad
Medio
Requisitos previos
LAB 4.1.3.6
LAB 4.1.3.7
Objetivos
Familiarizar al estudiante con:
Debes utilizar las funciones previamente escritas y probadas. Agrega algunos casos de
prueba al código. Esta prueba es solo el comienzo.
46
Ejemplo:
def isYearLeap(year):
#
# tu código del LAB 4.1.3.6
#
Console
File "main.py", line 6
def daysInMonth(year, month):
^
IndentationError: expected an indented block
Respuesta:
def isYearLeap(year):
if year % 4 != 0:
return False
elif year % 100 != 0:
return True
elif year % 400 != 0:
return False
else:
return True
Console
366
Tiempo estimado
15-20 minutos
Nivel de dificultad
Medio
Objetivos
Familiarizar al estudiante con nociones y algoritmos clásicos.
Mejorar las habilidades del estudiante para definir y usar funciones.
Escenario
Un número natural es primo si es mayor que 1 y no tiene divisores más que 1 y si mismo.
Por otra parte, 7 es un número primo, ya que no podemos encontrar ningún divisor para el.
48
Tu tarea es escribir una función que verifique si un número es primo o no.
La función:
Se llama isPrime .
Toma un argumento (el valor a verificar).
Devuelve True si el argumento es un número primo, y False de lo contrario.
Sugerencia: intenta dividir el argumento por todos los valores posteriores (comenzando
desde 2) y verifica el resto: si es cero, tu número no puede ser un número primo; analiza
cuidadosamente cuándo deberías detener el proceso.
Ejemplo:
def isPrime(num):
if isPrime(i + 1):
print()
Console
File "main.py", line 6
for i in range(1, 20):
^
IndentationError: expected an indented block
Datos de prueba
Salida esperada:
2 3 5 7 11 13 17 19
49
Respuesta:
def isPrime(num):
divisor = 2
while divisor < num:
if num % divisor == 0:
return False
divisor += 1 #same as divisor = divisor + 1
return True
Console
2 3 5 7 11 13 17 19
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Mejorar las habilidades del estudiante para definir, utilizar y probar funciones.
Escenario
El consumo de combustible de un automóvil se puede expresar de muchas maneras
diferentes. Por ejemplo, en Europa, se muestra como la cantidad de combustible
consumido por cada 100 kilómetros.
En los EE. UU., se muestra como la cantidad de millas recorridas por un automóvil con un
galón de combustible.
Tu tarea es escribir un par de funciones que conviertan l/100km a mpg(milas por galón), y
viceversa.
Las funciones:
50
Toman un argumento (el valor correspondiente a sus nombres).
Ejemplo:
def l100kmtompg(liters):
def mpgtol100km(miles):
print(l100kmtompg(3.9))
print(l100kmtompg(7.5))
print(l100kmtompg(10.))
print(mpgtol100km(60.3))
print(mpgtol100km(31.4))
print(mpgtol100km(23.5))
Console
File "main.py", line 6
def mpgtol100km(miles):
^
IndentationError: expected an indented block
51
Datos de prueba
Salida esperada:
60.31143162393162
31.36194444444444
23.52145833333333
3.9007393587617467
7.490910297239916
10.009131205673757
Respuesta:
def l100kmtompg(litros):
galones = litros / 3.785411784
millas = 100 * 1000 / 1609.344
return millas / galones
def mpgtol100km(millas):
km100 = millas * 1609.344 / 1000 / 100
litros = 3.785411784
return litros / km100
print(l100kmtompg(3.9))
print(l100kmtompg(7.5))
print(l100kmtompg(10.))
print(mpgtol100km(60.3))
print(mpgtol100km(31.4))
print(mpgtol100km(23.5))
Console
60.31143162393162
31.36194444444444
23.52145833333333
3.9007393587617467
7.490910297239916
10.009131205673757
Puntos clave
52
1. Puedes emplear la palabra clave return para decirle a una función que devuelva algún valor. La
instrucción return termina la función, por ejemplo:
return a * b
return
2. El resultado de una función se puede asignar fácilmente a una variable, por ejemplo:
def deseos():
d = deseos()
# Ejemplo 1
def deseos():
print("Mis deseos")
# Ejemplo 2
53
def deseos():
print("Mis Deseos")
# ¡Feliz Cumpleaños!
3. Puedes usar una lista como argumento de una función, por ejemplo:
def HolaaTodos(myList):
print("Hola,", nombre)
def createList(n):
myList = []
for i in range(n):
myList.append(i)
return myList
print(createList(5))
Ejercicio 1
def hola():
return
print("¡Hola!")
54
hola()
Revisar
Ejercicio 2
def isInt(data):
if type(data) == int:
return True
return False
print(isInt(5))
print(isInt(5.0))
print(isInt("5"))
Revisar
True
False
None
Ejercicio 3
def evenNumLst(ran):
lst = []
if num % 2 == 0:
lst.append(num)
return lst
55
print(evenNumLst(11))
Revisar
[0, 2, 4, 6, 8, 10]
Ejercicio 4
def listUpdater(lst):
updList = []
elem **= 2
updList.append(elem)
return updList
l = [1, 2, 3, 4, 5]
print(listUpdater(l))
Revisar
El alcance de un nombre (por ejemplo, el nombre de una variable) es la parte del código
donde el nombre es reconocido correctamente.
56
Vamos a revisarlo. Observa el código en el editor. ¿Que ocurrirá cuando se ejecute?
def scopeTest():
x = 123
scopeTest()
print(x)
Console
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(x)
NameError: name 'x' is not defined
Vamos a conducir algunos experimentos para mostrar como es que Python define los
alcances y como los puedes utilizar para tu beneficio.
def miFuncion():
var = 1
miFuncion()
print(var)
57
El resultado de la prueba es positivo, el código da como salida:
¿Conozco a la variable? 1
La respuesta es: una variable que existe fuera de una función tiene alcance dentro del
cuerpo de la función.
def miFuncion():
var = 2
var = 1
miFuncion()
print(var)
El resultado ha cambiado también el código arroja una salida con una ligera diferencia:
¿Conozco a la variable? 2
Una variable que existe fuera de una función tiene un alcance dentro del cuerpo de
la función, excluyendo a aquellas que tienen el mismo nombre.
También significa que el alcance de una variable existente fuera de una función solo
se puede implementar dentro de una función cuando su valor es leído. El asignar un
valor hace que la función cree su propia variable.
58
4.1.4.3 Alcances (Scopes) en Python | La palabra reservada: global
Existe un método especial en Python el cual puede extender el alcance de una variable
incluyendo el cuerpo de las funciones para poder no solo leer los valores de las
variables sino también modificarlos.
global name
global name1, name2, ...
El utilizar la palabra reservada dentro de una función con el nombre o nombres de las
variables separados por comas, obliga a Python a abstenerse de crear una nueva variable
dentro de la función; se empleará la que se puede acceder desde el exterior.
def miFuncion():
global var
var = 2
var = 1
miFuncion()
print(var)
59
Se ha agregado la palabra global a la función.
El código en editor nos enseña algo. Como puedes observar, la función cambia el valor de
su parámetro. ¿Este cambio afecta el argumento?
def miFuncion(n):
print("Yo obtuve", n)
n += 1
var = 1
miFuncion(var)
print(var)
Yo obtuve 1
Yo ahora tengo 2
60
Esto también significa que una función recibe el valor del argumento, no el argumento en
sí. Esto es cierto para los valores escalares.
Vale la pena revisar cómo funciona esto con las listas (¿Recuerdas las peculiaridades de
asignar rodajas de listas en lugar de asignar la lista entera?)
def miFuncion(miLista1):
print(miLista1)
miLista1 = [0, 1]
miLista2 = [2, 3]
miFuncion(miLista2)
print(miLista2)
[2, 3]
[2, 3]
def miFuncion(miLista1):
print(miLista1)
del miLista1[0]
miLista2 = [2, 3]
miFuncion(miLista2)
print(miLista2)
61
El resultado puede ser sorprendente. Ejecuta el código y verifícalo:
[2, 3]
[3]
Intentémoslo:
Puntos Clave
1. Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función.
(Ejemplo 1) al menos que la función defina una variable con el mismo nombre. (Ejemplo 2, y
Ejemplo 3), por ejemplo:
Ejemplo 1:
var = 2
def multByVar(x):
return x * var
print(multByVar(7)) # salida: 14
Ejemplo 2:
def mult(x):
var = 5
return x * var
print(mult(7)) # salida: 35
Ejemplo 3:
62
def multip(x):
var = 7
return x * var
var = 3
print(multip(7)) # salida: 49
2. Una variable que existe dentro de una función tiene un alcance solo dentro del cuerpo de la
función (Ejemplo 4), por ejemplo:
Ejemplo 4:
def sum(x):
var = 7
return x + var
print(sum(4)) # salida: 11
print(var) # NameError
3. Se puede emplear la palabra reservada global seguida por el nombre de una variable para que el
alcance de la variable sea global, por ejemplo:
var = 2
print(var) # salida: 2
def retVar():
global var
var = 5
return var
print(retVar()) # salida: 5
print(var) # salida: 5
Ejercicio 1
def message():
alt = 1
print("Hola, mundo!")
print(alt)
Revisar
63
Ejercicio 2
a = 1
def fun():
a = 2
print(a)
fun()
print(a)
Revisar
Ejercicio 3
a = 1
def fun():
global a
a = 2
print(a)
fun()
a = 3
print(a)
Revisar
Ejercicio 4
a = 1
64
def fun():
global a
a = 2
print(a)
a = 3
fun()
print(a)
Revisar
La nueva función tendrá dos parámetros. Su nombre será imc , pero si prefieres utilizar
otro nombre, adelante.
Codifiquemos la función.
65
La función esta completa aquí abajo (y en la ventana de editor):
print(imc(52.5, 1.65))
19.283746556473833
La función hace lo que deseamos, pero es un poco sencilla - asume que los valores de
ambos parámetros son significativos. Se debe comprobar que son confiables.
return None
print(imc(352.5, 1.65))
Primero, se asegura que los datos que sean ingresados sean correctos, de lo contrario la
salida será:
None
66
Segundo, observa como el símbolo de diagonal invertida ( \ ) es empleado. Si se termina
una línea de código con el, Python entenderá que la línea continua en la siguiente.
Esto puede ser útil cuando se tienen largas líneas de código y se desea que sean mas
legibles.
Sin embargo, hay algo que omitimos: las medias en sistema inglés. La función no es útil
para personas que utilicen libras, pies y pulgadas.
Escribimos dos funciones sencillas para convertir unidades del sistema inglés al
sistema métrico. Comencemos con las pulgadas.
def lbakg(lb):
return lb * 0.45359237
print(lbakg(1))
0.45359237
Haremos lo mismo ahora con los pies y pulgadas: 1 pie = 0.3048 m , y 1 pulgada =
2.54 cm = 0.0254 m .
print(piepulgam(1, 1))
0.3302
67
print(piespulgam(6, 0))
Sería:
print(piepulgam(6, 0))
Esta es la salida:
1.8288000000000002
Es muy posible que en ocasiones se desee utilizar solo pies sin pulgadas. ¿Python nos
ayudará? Por supuesto que si.
print(piepulgam(6))
1.8288000000000002
def lbsakg(lb):
return lb * 0.45359237
68
print(imc(peso = lbsakg(176), altura = piespulgam(5, 7)))
La respuesta es:
27.565214082533313
En la escuela aprendimos que la suma arbitraria de dos lados tiene que ser mayor que la
longitud del tercer lado.
No será algo difícil. La función tendrá tres parámetros - uno para cada lado.
Regresará True si todos los lados pueden formar un triángulo, y False de lo contrario. En
este caso, esUnTringulo es un buen nombre para dicha función.
69
def esUnTriangulo(a, b, c):
if a + b <= c:
return False
if b + c <= a:
return False
if c + a <= b:
return False
return True
True
False
print(esUnTriangulo(1, 1, 1))
print(esUnTriangulo(1, 1, 3))
Console
True
False
70
Por supuesto, observa:
Console
True
False
if esUnTriangulo(a, b, c):
71
else:
Console
Ingresa la longitud del primer lado: 1
Ingresa la longitud del segundo lado: 1
Ingresa la longitud del tercer lado: 1
Felicidades, puede ser un triángulo.
c2 = a2 + b2
return False
return c ** 2 == a ** 2 + b ** 2
return a ** 2 == b ** 2 + c ** 2
print(esUnTrianguloRectangulo(5, 3, 4))
print(esUnTrianguloRectangulo(1, 3, 4))
Console
72
True
False
Observa como se establece la relación entre la hipotenusa y los dos catetos. Se eligió el lado mas
largo y se aplico el Teorema de Pitágoras para verificar que todo estuviese en orden. Esto requiere
tres revisiones en total.
73
Este es el código resultante:
0.49999999999999983
No, no lo es. Son solo los cálculos de valores punto flotantes. Pronto se discutirá el
tema.
0! = 1 (¡Si!, es verdad.)
1! = 1
2! = 1 * 2
3! = 1 * 2 * 3
4! = 1 * 2 * 3 * 4
:
74
:
n! = 1 * 2 ** 3 * 4 * ... * n-1 * n
Escribamos el código. Creemos una función con el nombre factorialFun . Aquí esta el
código:
def factorialFun(n):
if n < 0:
return None
if n < 2:
return 1
producto = 1
for i in range(2, n + 1):
producto *= i
return producto
1 1
2 2
3 6
4 24
5 120
Son una secuencia de números enteros los cuales siguen una regla sencilla:
75
fib1 = 1
fib2 = 1
fib3 = 1 + 1 = 2
fib4 = 1 + 2 = 3
fib5 = 2 + 3 = 5
fib6 = 3 + 5 = 8
fib7 = 5 + 8 = 13
def fib(n):
if n < 1:
return None
if n < 3:
return 1
elem1 = elem2 = 1
sum = 0
return sum
Analiza el codigo del bucle for cuidadosamente, descifra como se mueven las
variables elem1 y elem2 a través de los números subsecuentes de la serie
Fibonacci.
1 -> 1
76
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 8
7 -> 13
8 -> 21
9 -> 34
Este termino puede describir muchos conceptos distintos, pero uno de ellos, hace
referencia a la programación computacional.
Tanto el factorial como la serie Fibonacci, son las mejores opciones para ilustrar este
fenómeno.
El número ith se refiere al número i-1, y así sucesivamente hasta llegar a los primeros dos.
¿Puede ser empleado en el código? Por supuesto que puede. Puede hacer el código mas
corto y claro.
def fib(n):
if n < 1:
return None
if n < 3:
return 1
return fib(n - 1) + fib(n - 2)
77
¿Pero es realmente seguro?, ¿Implica algún riesgo?
Si, existe algo de riesgo. Si no se considera una condición que detenga las
invocaciones recursivas, el programa puede entrar en un bucle infinito. Se debe ser
cuidadoso.
n! = 1 × 2 × 3 × ... × n-1 × n
Es obvio que:
n! = (n-1)! × n
Aquí esta:
def factorialFun(n):
if n < 0:
return None
if n < 2:
78
return 1
return n * factorialFun(n - 1)
Nuestro viaje funcional esta por terminar. La siguiente sección abordara dos tipos de datos
en Python: tuplas y diccionarios.
Puntos Clave
1. Una función puede invocar otras funciones o incluso a sí misma. Cuando una función se invoca a
si misma, se le conoce como recursividad, y la función que se invoca a si misma y contiene una
condición de terminación (la cual le dice a la función que ya no siga invocándose a si misma) es
llamada una función recursiva.
2. Se pueden emplear funciones recursivas en Python para crear funciones limpias, elegantes, y
dividir el código en trozos más pequeños. Sin embargo, se debe tener mucho cuidado ya que
es muy fácil cometer un error y crear una función la cual nunca termine. También se debe
considerar que las funciones recursivas consumen mucha memoria, y por lo tanto pueden ser en
ocasiones ineficientes.
Al emplear la recursividad, se deben de tomar en cuenta tanto sus ventajas como desventajas.
79
def factorial(n):
if n == 1: # la condición de terminación
return 1
else:
return n * factorial(n - 1)
print(factorial(4)) # 4 * 3 * 2 * 1 = 24
Ejercicio 1
def factorial(n):
return n * factorial(n - 1)
print(factorial(4))
Revisar
La función no tiene una condición de terminación, por lo tanto Python arrojara una excepción
( RecursionError: maximum recursion depth exceeded )
Ejercicio 2
def fun(a):
if a > 30:
return 3
else:
return a + fun(a + 3)
print(fun(25))
Revisar
56
80
4.1.6.1 Tuplas y diccionarios
Debido a que el bucle for es una herramienta especialmente diseñada para iterar a través de las
secuencias, podemos definirlas de la siguiente manera: una secuencia es un tipo de dato que puede
ser escaneado por el bucle for .
Hasta ahora, has trabajado con una secuencia en Python, la lista. La lista es un clásico ejemplo de
una secuencia de Python. Aunque existen otras secuencias dignas de mencionar, las cuales se
presentaran a continuación.
La segunda noción - la mutabilidad - es una propiedad de cualquier tipo de dato en Python que
describe su disponibilidad para poder cambiar libremente durante la ejecución de un programa.
Existen dos tipos de datos en Python: mutables e inmutables.
Los datos mutables pueden ser actualizados libremente en cualquier momento, a esta operación
se le denomina "in situ".
In situ es una expresión en Latín que se traduce literalmente como en posición, en el lugar o
momento. Por ejemplo, la siguiente instrucción modifica los datos "in situ":
list.append(1)
Imagina que una lista solo puede ser asignada y leída. No podrías adjuntar ni remover un elemento
de la lista. Si se agrega un elemento al final de la lista provocaría que la lista se cree desde cero.
Se tendría que crear una lista completamente nueva, la cual contenga los elementos ya existentes
mas el nuevo elemento.
El tipo de datos que se desea tratar ahora se llama tupla. Una tupla es una secuencia inmutable. Se
puede comportar como una lista pero no puede ser modificada en el momento.
81
¿Qué es una tupla?
Lo primero que distingue una lista de una tupla es la sintaxis empleada para crearlas. Las tuplas
utilizan paréntesis, mientras que las listas usan corchetes, aunque también es posible crear una
tupla tan solo separando los valores por comas.
Observa el ejemplo:
tupla1 = (1, 2, 4, 8)
print(tupla1)
print(tupla2)
(1, 2, 4, 8)
Nota: cada elemento de una tupla puede ser de distinto tipo (punto flotante, entero, cadena, etc.).
tuplaVacia = ()
Si se desea crear una tupla de un solo elemento, se debe de considerar el hecho de que, debido a la
sintaxis (una tupla debe de poder distinguirse de un valor entero ordinario), se debe de colocar una
coma al final:
tuplaUnElemento1 = (1, )
tuplaUnElemento2 = 1.,
El quitar las comas no arruinará el programa en el sentido sintáctico, pero serán variables no tuplas.
82
¿Cómo utilizar un tupla?
Si deseas leer los elementos de una tupla, lo puedes hacer de la misma manera que se
hace con las listas.
print(miTupla[0])
print(miTupla[-1])
print(miTupla[1:])
print(miTupla[:-2])
print(elem)
1
1000
(10, 100, 1000)
(1, 10)
1
10
100
1000
miTupla.append(10000)
del miTupla[0]
miTupla[1] = -10
83
4.1.6.3 Tuplas y diccionarios
t2 = miTupla * 3
print(len(t2))
print(t1)
print(t2)
print(10 in miTupla)
La salida es la siguiente:
True
True
Una de las propiedades de las tuplas mas útiles es que pueden aparecer en el lado
izquierdo del operador de asignación. Este fenómeno ya se vio con anterioridad,
cuando fue necesario encontrar una manera de intercambiar los valores entre dos
variables.
84
Observa el siguiente fragmento de código:
var = 123
t1 = (1, )
t2 = (2, )
t3 = (3, var)
Console
(2,) (3, 123) (1,)
Muestra tres tuplas interactuando en efecto, los valores almacenados en ellas "circulan"
entre ellas. t1 se convierte en t2 , t2 se convierte en t3 , y t3 se convierte en t1 .
Nota: el ejemplo presenta un importante hecho mas: los elementos de una tupla pueden
ser variables, no solo literales. Además, pueden ser expresiones si se encuentran en el
lado derecho del operador de asignación.
¿Qué es un diccionario?
El diccionario es otro tipo de estructura de datos de Python. No es una secuencia (pero puede
adaptarse fácilmente a un procesamiento secuencial) y además es mutable.
Para explicar lo que es un diccionario en Python, es importante comprender de manera literal lo que
es un diccionario.
Un diccionario en Python funciona de la misma manera que un diccionario bilingüe. Por ejemplo,
se tiene la palabra en español "gato" y se necesita su equivalente en francés. Lo que se haría es
buscar en el diccionario para encontrar la palabra "gato". Eventualmente la encontrarás, y sabrás que
la palabra equivalente en francés es "chat".
85
En el mundo de Python, la palabra que se esta buscando se denomina clave(key) . La palabra que
se obtiene del diccionario es denominada valor .
Cada clave debe de ser única. No es posible tener una clave duplicada.
Una clave puede ser un tipo de dato de cualquier tipo: puede ser un número (entero o
flotante), o incluso una cadena.
Un diccionario no es una lista. Una lista contiene un conjunto de valores numerados,
mientras que un diccionario almacena pares de valores.
La función len() aplica también para los diccionarios, regresa la cantidad de pares (clave-
valor) en el diccionario.
Un diccionario es una herramienta de un solo sentido. Si fuese un diccionario español-
francés, podríamos buscar en español para encontrar su contraparte en francés mas no
viceversa.
diccionarioVacio = {}
print(dict)
print(numerosTelefono)
86
print(diccionarioVacio)
En este primer ejemplo, el diccionario emplea claves y valores las cuales ambas son cadenas. En el
segundo, las claves con cadenas pero los valores son enteros. El orden inverso (claves → números,
valores → cadenas) también es posible, así como la combinación número a número.
La lista de todos los pares es encerrada con llaves, mientras que los pares son separados por
comas, y las claves y valores por dos puntos.
Los diccionarios vacíos son construidos por un par vacío de llaves - nada inusual.
El diccionario entero se puede imprimir con una invocación a la función print() . El fragmento de
código puede producir la siguiente salida:
{}
¿Has notado que el orden de los pares impresos es diferente a la asignación inicial?, ¿Qué significa
esto?
Primeramente, recordemos que los diccionarios no son listas - no guardan el orden de sus datos, el
orden no tiene significado (a diferencia de los diccionarios reales). El orden en que un
diccionario almacena sus datos esta fuera de nuestro control. Esto es normal. (*)
NOTA
(*) En Python 3.6x los diccionarios se han convertido en colecciones ordenadas de manera
predeterminada. Tu resultado puede variar dependiendo en la versión de Python que se este
utilizando.
print(dict['gato'])
print(numerosTelefono['Suzy'])
87
El obtener el valor de un diccionario es semejante a la indexación, gracias a los corchetes
alrededor del valor de la clave.
Nota:
Si una clave es una cadena, se tiene que especificar como una cadena.
Las claves son sensibles a las mayúsculas y minúsculas: 'Suzy' sería
diferente a 'suzy' .
Código:
print(dict['gato'])
print(numerosTelefono['Suzy'])
chat
5557654321
Ahora algo muy importante: No se puede utilizar una clave que no exista. Hacer algo
como lo siguiente:
print(numerosTelefono['presidente'])
if word in dict:
else:
88
print(word, "no está en el diccionario")
No y si.
No, porque un diccionario no es un tipo de dato secuencial - el bucle for no es útil aquí.
Si, porque hay herramientas simples y muy efectivas que pueden adaptar cualquier
diccionario a los requerimientos del bucle for (en otras palabras, se construye un
enlace intermedio entre el diccionario y una entidad secuencial temporal).
89
La función sorted()
¿Deseas que la salida este ordenada? Solo hay que agregar al bucle for lo siguiente:
Nota la manera en que la tupla ha sido utilizada como una variable del bucle for .
90
También existe un método denominado values() , funciona de manera muy similar al
de keys() , pero regresa una lista de valores.
cheval
chien
chat
Observa:
dict['gato'] = 'minou'
print(dict)
La salida es:
91
Nota: este es un comportamiento muy diferente comparado a las listas, las cuales no
permiten asignar valores a índices no existentes.
dict['cisne'] = 'cygne'
print(dict)
EXTRA
dict.update({"pato" : "canard"})
print(dict)
Console
{'gato': 'chat', 'perro': 'chien', 'caballo': 'cheval', 'pato':
'canard'}
Eliminado claves
¿Puedes deducir como eliminar una clave de un diccionario?
92
A continuación un ejemplo:
del dict['perro']
print(dict)
EXTRA
dict.popitem()
Salida:
{'gato': 'chat', 'perro': 'chien'}
93
Una lista con todos los nombre y el promedio de cada alumno debe ser mostrada
al final.
Línea 1: crea un diccionario vacío para ingresar los datos: el nombre del alumno es
empleado como clave, mientras que todas las calificaciones asociadas son
almacenadas en una tupla (la tupla puede ser el valor de un diccionario, esto no es
un problema).
Línea 3: se ingresa a un bucle "infinito" (no te preocupes, saldrémos de el en el
momento indicado).
Línea 4: se lee el nombre del alumno.
Línea 5-6: si el nombre es exit , nos salimos del bucle.
Línea 8: se pide la calificación del alumno (un valor entero en el rango del 1-10).
Línea 10-11: si el nombre del estudiante ya se encuentra en el diccionario, se
alarga la tupla asociada con la nueva calificación (observa el operador +=).
Línea 12-13: si el estudiante es nuevo (desconocido para el diccionario), se crea
una entrada nueva, su valor es una tupla de un solo elemento la cual contiene la
calificación ingresada.
Línea 15: se itera a través de los nombres ordenados de los estudiantes.
Línea 16-17: inicializa los datos necesarios para calcular el promedio (sumador y
contador).
Línea 18-20: Se itera a través de la tupla, tomado todas las calificaciones
subsecuentes y actualizando la suma junto con el contador.
Línea 21: se calcula e imprime el promedio del alumno junto con su nombre.
Código:
grupo = {}
while True:
if nombre == 'exit':
break
if nombre in grupo:
grupo[nombre] += (calif,)
94
else:
grupo[nombre] = (calif,)
sum = 0
contador = 0
sum += calif
contador += 1
Salida:
Andy : 5.333333333333333
Bob : 6.0
95
4.1.6.10 RESUMEN SECCIÓN (1/3)
1. Las Tuplas son colecciones de datos ordenadas e inmutables. Se puede pensar en ellas como listas
inmutables. Se definen con paréntesis:
miTupla = (1, 2, True, "una cadena", (3, 4), [5, 6], None)
print(miTupla)
miLista = [1, 2, True, "una cadena", (3, 4), [5, 6], None]
print(miLista)
Cada elemento de la tupla puede ser de un tipo de dato diferente (por ejemplo, enteros, cadenas,
boleanos, etc.). Las tuplas pueden contener otras tuplas o listas (y viceversa).
tuplaVacia = ()
print(type(tuplaVacia)) # salida: <class 'tuple'>
miTup1 = 1,
print(type(miTup1)) # salida: <class 'tuple'>
miTup2 = 1
print(type(miTup2)) # salida: <class 'int'>
5. Las tuplas son inmutables, lo que significa que no se puede agregar, modificar, cambiar o quitar
elementos. El siguiente fragmento de código provocará una excepción:
96
miTupla[2] = "guitarra" # se levanta una excepción TypeError
miTupla = 1, 2, 3,
del miTupla
6. Puedes navegar a través de los elementos de una tupla con un bucle (Ejemplo 1), verificar si un
elemento o no esta presente en la tupla (Ejemplo 2), emplear la función len() para verificar
cuantos elementos existen en la tupla (Ejemplo 3), o incluso unir o multiplicar tuplas (Ejemplo 4):
# Ejemplo 1
t1 = (1, 2, 3)
for elem in t1:
print(elem)
# Ejemplo 2
t2 = (1, 2, 3, 4)
print(5 in t2)
print(5 not in t2)
# Ejemplo 3
t3 = (1, 2, 3, 5)
print(len(t3))
# Ejemplo 4
t4 = t1 + t2
t5 = t3 * 2
print(t4)
print(t5)
EXTRA
También se puede crear una tupla utilizando la función integrada de Python tuple() . Esto es
particularmente útil cuando se desea convertir un iterable (por ejemplo, una lista, rango, cadena,
etcétera) en una tupla:
lst = [2, 4, 6]
print(lst) # salida: [2, 4, 6]
97
print(type(lst)) # salida: <class 'list'>
tup = tuple(lst)
print(tup) # outputs: (2, 4, 6)
print(type(tup)) # salida: <class 'tuple'>
De la misma manera, cuando se desea convertir un iterable en una liste, se puede emplear la función
integrada de Python denominada list() :
tup = 1, 2, 3,
lst = list(tup)
print(type(lst)) # outputs: <class 'list'>
1. Los diccionarios son *colecciones indexadas de datos, mutables y desordenadas. (*En Python
3.6x los diccionarios están ordenados de manera predeterminada.
Cada diccionario es un par de clave : valor. Se puede crear empleado la siguiente sintaxis:
miDictionario = {
clave1 : valor1,
clave2 : valor2,
clave3 : valor3,
}
2. Si se desea acceder a un elemento del diccionario, se puede hacer haciendo referencia a su clave
colocándola dentro de corchetes (ejemplo 1) o utilizando el método get() (ejemplo 2):
polEspDict = {
"kwiat" : "flor",
"woda" : "agua",
"gleba" : "tierra"
}
elemento2 = polEspDict.get("woda")
print(elemento2) # salida: agua
3. Si se desea cambiar el valor asociado a una clave especifica, se puede hacer haciendo referencia a
la clave del elemento, a continuación se muestra un ejemplo:
98
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
polEspDict["zamek"] = "cerradura"
item = polEspDict["zamek"] # salida: cerradura
4. Para agregar o eliminar una clave (junto con su valor asociado), emplea la siguiente sintaxis:
polEspDict.popitem()
print(polEspDict) # outputs: {'kwiat' : 'flor'}
5. Se puede emplear el bucle for para iterar a través del diccionario, por ejemplo:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
99
6. Si deseas examinar los elementos (claves y valores) del diccionario, puedes emplear el
método items() por ejemplo:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
7. Para comprobar si una clave existe en un diccionario, se puede emplear la palabra reservada in :
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
if "zamek" in polEspDict:
print("SI")
else:
print("NO")
8. Se puede emplear la palabra reservada del para eliminar un elemento, o un diccionario entero.
Para eliminar todos los elementos de un diccionario se debe emplear el método clear() :
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
print(len(polEspDict)) # salida: 3
del polEspDict["zamek"] # elimina un elemento
print(len(polEspDict)) # salida: 2
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
100
}
copyDict = polEspDict.copy()
Ejercicio 1
miTup = (1, 2, 3)
print(miTup[2])
Revisar
Ejercicio 2
tup = 1, 2, 3
a, b, c = tup
print(a * b * c)
Revisar
El programa imprimirá 6 en pantalla. Los elementos de la tupla tup han sido "desempaquetados"
en las variables a , b , y c .
Ejercicio 3
Completa el código para emplear correctamente el método count() para encontrar la cantidad
de 2 duplicados en la tupla siguiente.
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
101
duplicados = # tu código
print(duplicados) # salida: 4
Revisar
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
duplicates = tup.count(2)
print(duplicado) # salida: 4
Ejercicio 4
Escribe un programa que "una" los dos diccionarios ( d1 y d2 ) para crear uno nuevo ( d3 ).
d3 = {}
# tu código
print(d3)
Revisar
Solución Muestra:
d1 = {'Adam Smith':'A', 'Judy Paxton':'B+'}
d3 = {}
d3.update(elemento)
102
print(d3)
Ejercicio 5
t = # tu código
print(t)
Revisar
Solución muestra:
l = ["carro", "Ford", "flor", "Tulipán"]
t = tuple(l)
print(t)
Ejercicio 6
# tu código
print(colDict)
Revisar
Solución Muestra:
colores = (("verde", "#008000"), ("azul", "#0000FF"))
colDict = dict(colores)
103
print(colDict)
Ejercicio 7
copyMiDict = myDict.copy()
miDict.clear()
print(copyMiDict)
Revisar
Ejercicio 8
colores = {
Revisar
rojo : (255, 0, 0)
104
4.1.6.13 PROYECTO: TIC-TAC-TOE
PROYECTO
Tiempo estimado
30-60 minutos
Nivel de dificultad
Medio/difícil
Objetivos
Perfeccionar las habilidades del estudiante al emplear Python para resolver
problemas complejos.
La integración de técnicas de programación en un solo programa consistente de
varias partes.
Escenario
Tu tarea es escribir un simple programa que simule jugar a tic-tac-toe (nombre en
inglés) con el usuario. Para hacerlo más fácil, Hemos decidido simplificar el juego. Aquí
están nuestras reglas:
+-------+-------+-------+
| | | |
| 1 | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
105
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
Ingresa tu movimiento: 1
+-------+-------+-------+
| | | |
| O | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
106
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
Ingresa tu movimiento: 8
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
Ingresa tu movimiento: 4
107
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
Ingresa tu movimiento: 7
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
108
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| O | O | 9 |
| | | |
+-------+-------+-------+
¡Has Ganado!
Requerimientos
Implementa las siguientes características:
El tablero debe ser almacenado como una lista de tres elementos, mientras que
cada elemento es otra lista de tres elementos (la lista interna representa las filas)
de manera que todos los cuadros puedas ser accedidos empleado la siguiente
sintaxis:
board[fila][columna]
Cada uno de los elementos internos de la lista puede contener 'O' , 'X' , o un
digito representando el número del cuadro (dicho cuadro se considera como libre).
La apariencia de tablero debe de ser igual a la presentada en el ejemplo.
Implementa las funciones definidas para ti en el editor.
Para obtener un valor numérico aleatorio se puede emplear una función integrada de
Python denominada randrange() . El siguiente ejemplo muestra como utilizarla (El
programa imprime 10 números aleatorios del 1 al 8).
for i in range(10):
print(randrange(8))
109
Código ejemplo sin terminar:
def DisplayBoard(board):
#
# la función acepta un parámetro el cual contiene el estado actual del tablero
# y lo muestra en la consola
#
def EnterMove(board):
#
# la función acepta el estado actual del tablero y pregunta al usuario acerca de
su movimiento,
# verifica la entrada y actualiza el tablero acorde a la decisión del usuario
#
def MakeListOfFreeFields(board):
#
# la función examina el tablero y construye una lista de todos los cuadros
vacíos
# la lista esta compuesta por tuplas, cada tupla es un par de números que
indican la fila y columna
#
def DrawMove(board):
#
# la función dibuja el movimiento de la maquina y actualiza el tablero
#
Console
File "main.py", line 7
def EnterMove(board):
^
IndentationError: expected an indented block
110
Respuesta:
def DisplayBoard(board):
print("+-------" * 3,"+",sep="")
for row in range(3):
print("| " * 3,"|",sep="")
for col in range(3):
print("| " + str(board[row][col]) + " ",end="")
print("|")
print("| " * 3,"|",sep="")
print("+-------" * 3,"+",sep="")
def EnterMove(board):
ok = False # assu fake mption - Lo necesitamos para entrar en bucle
while not ok:
move = input("Pon tu movimiento bro: ")
ok = len(move) == 1 and move >= '1' and move <= '9' # Es valida?
if not ok:
print("Jajaja mal movimiento - repite tu entrada!") # no lo es
- haz la entrada nuevamente
continue
move = int(move) - 1 # numero de celda de 0 a 8
row = move // 3 # fila de celda
col = move % 3 # columna de celdas
sign = board[row][col] # verifica el cuadrado seleccionado
ok = sign not in ['O','X']
if not ok: # está ocupado - a la entrada nuevamente
print("Repite tu tiro!")
continue
board[row][col] = 'O' # poner '0' en el cuadrado seleccionado
def MakeListOfFreeFields(board):
free = [] # la lista está vacía inicialmente
for row in range(3): # atraves de las filas
for col in range(3): # atraves de las columnas
if board[row][col] not in ['O','X']: # la fila esta libre?
free.append((row,col)) # yes, it is - agregar nueva
tupla a la lista
return free
def VictoryFor(board,sgn):
if sgn == "X": # Estamos buscando x?
who = 'me' # si es del lado dela computadora
elif sgn == "O": # o para "O"?
who = 'you' # si - es de nuestro lado
else:
who = None # no debemos caer aquí
cross1 = cross2 = True # para diagonales
for rc in range(3):
111
if board[rc][0] == sgn and board[rc][1] == sgn and board[rc][2] ==
sgn: # check row rc
return who
if board[0][rc] == sgn and board[1][rc] == sgn and board[2][rc] ==
sgn: # check column rc
return who
if board[rc][rc] != sgn: # checar 1ra lista diagonal
cross1 = False
if board[2 - rc][2 - rc] != sgn: # checar 2da diagonal
cross2 = False
if cross1 or cross2:
return who
return None
import random
def DrawMove(board):
free = MakeListOfFreeFields(board) # crear lista de campos libres
cnt = (len(free))
if cnt > 0: # si la lista no está vacía, elija un lugar para 'X' y configurelo
this = random.randrange(cnt)
row, col = free[this]
board[row][col] = 'X'
DisplayBoard(board)
if victor == 'you':
print("Ganaste!")
elif victor == 'me':
print("Gane")
else:
print("Jajaja!")
112
Console
+-------+-------+-------+
| | | |
| 1 | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
Pon tu movimiento bro: 9
+-------+-------+-------+
| | | |
| 1 | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | O |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| 1 | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | O |
| | | |
+-------+-------+-------+
Pon tu movimiento bro: 6
+-------+-------+-------+
| | | |
| 1 | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | O |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | O |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
113
| 1 | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | O |
| | | |
+-------+-------+-------+
| | | |
| X | 8 | O |
| | | |
+-------+-------+-------+
Pon tu movimiento bro: 3
+-------+-------+-------+
| | | |
| 1 | X | O |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | O |
| | | |
+-------+-------+-------+
| | | |
| X | 8 | O |
| | | |
+-------+-------+-------+
Ganaste!
¡Bien hecho! Has llegado al final del Módulo 4 y también has terminado una parte importante de tu
educación sobre programación en Python. A continuación se presenta un corto resumen de los
objetivos cubiertos en el módulo:
Ahora estas listo para tomar el quiz del módulo e intentar el desafío final: Examen del Módulo 4, el
cual te ayudará a determinar que tanto has aprendido hasta ahora.
114
115
QUIZ MODULO 04:
116
117
118