Python Cisco
Python Cisco
Imagina que quieres saber la velocidad promedio que has alcanzado durante un
largo viaje. Sabes la distancia, sabes el tiempo, necesitas la velocidad.
Otro lenguaje que empleas cada día es tu lengua materna, que utilizas para
manifestar tu voluntad y para pensar en la realidad. Las computadoras también
tienen su propio lenguaje, llamado lenguaje máquina, el cual es muy
rudimentario.
Los comandos que reconoce son muy simples. Podemos imaginar que la
computadora responde a órdenes como "Toma ese número, divídelo por otro y
guarda el resultado".
Cada día se crean nuevas palabras y desaparecen las viejas. Estos lenguajes se
llaman lenguajes naturales.
¿Qué hace a un lenguaje?
Podemos decir que cada idioma (máquina o natural, no importa) consta de los
siguientes elementos:
ALFABETO
LÉXICO
SINTAXIS
SEMÁNTICA
Un conjunto de reglas que determinan si una frase tiene sentido (por ejemplo,
"Me comí una dona" tiene sentido, pero "Una dona me comió" no lo tiene).
La IL es, de hecho, el alfabeto de un lenguaje máquina. Este es el conjunto
de símbolos más simple y principal que podemos usar para dar comandos a una
computadora. Es la lengua materna de la computadora.
Desafortunadamente, esta lengua está muy lejos de ser una lengua materna
humana. Todos (tanto las computadoras como los humanos) necesitamos algo
más, un lenguaje común para las computadoras y los seres humanos, o un
puente entre los dos mundos diferentes.
Por supuesto, tal composición tiene que ser correcta en muchos sentidos, tales
como:
COMPILACIÓN - El programa fuente se traduce una vez (sin embargo, esta ley
debe repetirse cada vez que se modifique el código fuente) obteniendo un
archivo (por ejemplo, un archivo .exe si el código está diseñado para ejecutarse
en MS Windows) que contiene el código de la máquina; ahora puedes distribuir
el archivo en todo el mundo; el programa que realiza esta traducción se llama
compilador o traductor.
Hay muy pocos idiomas que se pueden compilar e interpretar. Por lo general,
un lenguaje de programación se proyecta con este factor en la mente de sus
constructores: ¿Se compilará o interpretará?
También es posible que una parte significativa del código se ejecute con éxito
antes de que el intérprete encuentre un error. Este es el comportamiento
normal en este modelo de ejecución.
Compilación vs.
Interpretación - Ventajas y Desventajas
COMPILACIÓN INTERPRETACIÓN
La compilación en sí misma
puede llevar mucho tiempo; No esperes que la interpretación
es posible que no puedas incremente tu código a alta
ejecutar tu código velocidad: tu código compartirá la
inmediatamente después de potencia de la computadora con el
DESVENTAJA
cualquier modificación. intérprete, por lo que no puede ser
S
Tienes que tener tantos realmente rápido.
compiladores como Tanto tú como el usuario final deben
plataformas de hardware en tener el intérprete para ejecutar su
los que deseas que se ejecute código.
su código.
Debido a razones históricas, los lenguajes diseñados para ser utilizados en la manera
de interpretación a menudo se llaman lenguajes de programación, mientras que los
programas fuente codificados que los usan se llaman scripts.
¿Qué es Python?
Python es un lenguaje de programación de alto nivel, interpretado, orientado a
objetos y de uso generalizado con semántica dinámica, que se utiliza para la
programación de propósito general.
Y aunque puede que conozcas a la pitón como una gran serpiente, el nombre
del lenguaje de programación Python proviene de una vieja serie de comedia de
la BBC llamada Monty Python's Flying Circus.
Unos 20 años después, está claro que todas estas intenciones se han cumplido.
Algunas fuentes dicen que Python es el lenguaje de programación más popular
del mundo, mientras que otros afirman que es el tercero o el quinto.
En contraste, este último es más innovador y está más lleno de ideas nuevas.
Python se encuentra en algún lugar entre estas dos creaciones.
Estas dos versiones de Python no son compatibles entre sí. Las secuencias de
comandos de Python 2 no se ejecutarán en un entorno de Python 3 y viceversa,
por lo que si deseas que un intérprete de Python 3 ejecute el código Python 2
anterior, la única solución posible es volver a escribirlo, no desde cero, por
supuesto. Como grandes partes del código pueden permanecer intactas, pero
tienes que revisar todo el código para encontrar todas las incompatibilidades
posibles. Desafortunadamente, este proceso no puede ser completamente
automatizado.
NOTA
Todos los ejemplos de código que encontrarás durante el curso se han probado
con Python 3.4, Python 3.6 y Python 3.7.
Cython
Otro miembro de la familia
Python es Cython.
Jython
Otra versión de Python se llama Jython.
Esto es útil porque si deseas probar cualquier característica nueva que pueda
ser o no introducida en la implementación de Python, es más fácil verificarla
con PyPy que con CPython. Esta es la razón por la que PyPy es más una
herramienta para las personas que desarrollan Python que para el resto de los
usuarios.
Esto no hace que PyPy sea menos importante o menos serio que CPython.
python3
>>>
Todos los usuarios que no sean Linux pueden descargar una copia
en https://www.python.org/downloads/.
Este será un procedimiento muy simple, pero debería ser suficiente para
convencerte de que el entorno de Python es completo y funcional.
Navega por los menús de tu sistema operativo, encuentra IDLE en algún lugar
debajo de Python 3.x y ejecútalo. Esto es lo que deberías ver:
La ventana del editor actualmente no tiene título, pero es una buena práctica
comenzar a trabajar nombrando el archivo de origen.
Haz clic en File (en la nueva ventana), luego haz clic en Save as ... , selecciona
una carpeta para el nuevo archivo (el escritorio es un buen lugar para tus
primeros intentos de programación) y elige un nombre para el nuevo archivo.
print("Hisssssss...")
Echa un vistazo más de cerca a las comillas. Estas son la forma más simple de
comillas (neutral, recta, etc.) que se usan comúnmente en los archivos de
origen. No intentes utilizar citas tipográficas (curvadas, rizadas, etc.), utilizadas
por los procesadores de texto avanzados, ya que Python no las acepta.
Aparece una nueva ventana: dice que el intérprete ha encontrado un EOF (fin
de archivo).
print("Hisssssss...")
Vamos a arruinar el código una vez más. Elimina una letra de la palabra print.
Ejecuta el código presionando F5. Como puedes ver, Python no puede
reconocer el error.
¿Cómo estropear y arreglar tu código?
Es posible que hayas notado que el mensaje de error generado para el error
anterior es bastante diferente del primero.
Es una herramienta
integrada dentro del curso,
que se puede usar como
un Sandbox de Python
basado en el
navegador que te permite
probar el código discutido a
lo largo del curso, así
como un intérprete que te
permite iniciar, realizar y
probar los ejercicios de
laboratorio diseñados
específicamente para este
curso.
print("Hola!")
print("¡Bienvenido a Fundamentos de Programación en Python!")
print("ESTO ES EL MODO SANDBOX.")
... luego da clic en el botón Sandbox para ingresar al Modo Sandbox, pega el
código en la ventana del editor y haz clic en el botón Ejecutar para ver que
sucede.
Para volver a nuestro curso, haz clic en Back to course en la esquina superior
derecha de la interfaz de Sandbox.
Interfaz de práctica
Este curso contiene cuatro tipos diferentes de interfaces.
Hasta ahora, haz visto la Interfaz de estudio (una o dos ventanas con texto e
imágenes/animación) y la Interfaz de Sandbox, que puedes usar para probar tu
propio código (haz clic en Sandbox para cambiar a la Interfaz de Sandbox).
Lo que ves ahora es la Interfaz de práctica, que te permite estudiar cosas nuevas y
realizar tareas de codificación al mismo tiempo. Utilizarás este tipo de interfaz la
mayor parte del tiempo durante el curso.
Ejecuta el código en la ventana del editor a la derecha. Si todo sale bien, veras la línea
de texto en la ventana de consola.
Como alternativa, inicia IDLE, crea un nuevo archivo fuente de Python, coloca este
código, nombra el archivo y guárdalo. Ahora ejecútalo. Si todo sale bien, verás una
línea en la ventana de la consola IDLE. El código que has ejecutado debería parecerte
familiar. Viste algo muy similar cuando te guiamos a través de la configuración del
entorno IDLE.
Ahora dedicaremos un poco de tiempo para mostrarte y explicarte lo que estás viendo
y por que se ve así.
La palabra print .
Un paréntesis de apertura.
Una comilla.
Una línea de texto: ¡Hola, Mundo! .
Otra comilla.
Un paréntesis de cierre.
Cada uno de los elementos anteriores juega un papel muy importante en el código.
La función print()
Mira la línea de código a continuación:
print("¡Hola, Mundo!")
La palabra print que puedes ver aquí es el nombre de una función. Eso no significa
que dondequiera que aparezca esta palabra, será siempre el nombre de una función.
El significado de la palabra proviene del contexto en el cual se haya utilizado la
palabra.
Probablemente hayas encontrado el término función muchas veces antes, durante las
clases de matemáticas. Probablemente también puedes recordar varios nombres de
funciones matemáticas, como seno o logaritmo.
Las funciones de Python, sin embargo, son más flexibles y pueden contener más
contenido que sus parientes matemáticos.
Una función (en este contexto) es una parte separada del código de computadora el
cual es capaz de:
Además, muchas de las funciones de Python pueden hacer las dos cosas anteriores
juntas.
La función print()
Como se dijo anteriormente, una función puede tener:
Un efecto.
Un resultado.
Las funciones matemáticas usualmente toman un argumento, por ejemplo, sen (x)
toma una x, que es la medida de un ángulo.
Las funciones de Python, por otro lado, son más versátiles. Dependiendo de las
necesidades individuales, pueden aceptar cualquier número de argumentos, tantos
como sea necesario para realizar sus tareas. Nota: algunas funciones de Python no
necesitan ningún argumento.
print("¡Hola, Mundo!")
A pesar del número de argumentos necesarios o proporcionados, las funciones de
Python demandan fuertemente la presencia de un par de paréntesis - el de apertura
y de cierre, respectivamente.
Nota: para distinguir las palabras comunes de los nombres de funciones, coloca
un par de paréntesis vacíos después de sus nombres, incluso si la función
correspondiente requiere uno o más argumentos. Esta es una medida estándar.
La función print()
El único argumento entregado a la función print() en este ejemplo es
una cadena:
print("¡Hola, Mundo!")
Como se puede ver, la cadena está delimitada por comillas - de hecho, las
comillas forman la cadena, recortan una parte del código y le asignan un
significado diferente.
Podemos imaginar que las comillas significan algo así: el texto entre nosotros
no es un código. No está diseñado para ser ejecutado, y se debe tomar tal como
está.
Casi cualquier cosa que ponga dentro de las comillas se tomará de manera
literal, no como código, sino como datos. Intenta jugar con esta cadena en
particular - puedes modificarla. Ingresa contenido nuevo o borra parte del
contenido existente.
Existe más de una forma de como especificar una cadena dentro del código de
Python, pero por ahora, esta será suficiente.
Hasta ahora, has aprendido acerca de dos partes importantes del código- la
función y la cadena. Hemos hablado de ellos en términos de sintaxis, pero
ahora es el momento de discutirlos en términos de semántica.
La función print()
El nombre de la función (print en este caso) junto con los paréntesis y los
argumentos, forman la invocación de la función.
print("¡Hola, Mundo!")
¿Qué sucede cuando Python encuentra una invocación como la que está a
continuación?
nombreFunción(argumento)
Veamos:
La función print() - instrucciones
A estas alturas ya sabes que este programa contiene una invocación de función. A su
vez, la invocación de función es uno de los posibles tipos de instrucciones de Python.
Por lo tanto, este programa consiste de una sola instrucción.
Una línea puede estar vacía (por ejemplo, puede no contener ninguna instrucción)
pero no debe contener dos, tres o más instrucciones. Esto está estrictamente
prohibido.
Nota: Python hace una excepción a esta regla: permite que una instrucción se extienda
por más de una línea (lo que puede ser útil cuando el código contiene construcciones
complejas).
Vamos a expandir el código un poco, puedes verlo en el editor. Ejecutalo y nota lo que
ves en la consola.
El programa invoca la función print() dos veces, como puedes ver hay dos
líneas separadas en la consola: esto significa que print() comienza su salida
desde una nueva línea cada vez que comienza su ejecución. Puedes cambiar
este comportamiento, pero también puedes usarlo a tu favor.
Cada invocación de print() contiene una cadena diferente, como su
argumento y el contenido de la consola lo reflejan- esto significa que las
instrucciones en el código se ejecutan en el mismo orden en que se
colocaron en el archivo de origen; no se ejecuta la siguiente instrucción hasta
que se complete la anterior (hay algunas excepciones a esta regla, pero puedes
ignorarlas por ahora).
La función print() - instrucciones
Hemos cambiado un poco el ejemplo: hemos agregado una invocación vacía de la
función print() . La llamamos vacía porque no hemos agregado ningún argumento a
la función.
¿Qué ocurre?
Como puedes ver, la invocación de print() vacía no esta tan vacía como se esperaba
- genera una línea vacía (esta interpretación también es correcta) su salida es solo una
nueva línea.
La función print() - instrucciones
Hemos cambiado un poco el ejemplo: hemos agregado una invocación vacía de la
función print() . La llamamos vacía porque no hemos agregado ningún argumento a
la función.
¿Qué ocurre?
Como puedes ver, la invocación de print() vacía no esta tan vacía como se esperaba
- genera una línea vacía (esta interpretación también es correcta) su salida es solo una
nueva línea.
Hay dos cambios muy sutiles: hemos insertado un par extraño de caracteres dentro
del texto. Se ven así: \n .
La barra invertida ( \ ) tiene un significado muy especial cuando se usa dentro de las
cadenas, es llamado el carácter de escape.
En otras palabras, la barra invertida no significa nada, sino que es solo un tipo de
anuncio, de que el siguiente carácter después de la barra invertida también tiene un
significado diferente.
subió a su telaraña.
Vino la lluvia
y se la llevó.
Como se puede observar, aparecen dos nuevas líneas en la canción infantil, en los
lugares donde se ha utilizado \n .
En este caso, las comas que separan los argumentos desempeñan un papel
completamente diferente a la coma dentro de la cadena. El primero es una parte de la
sintaxis de Python, el segundo está destinado a mostrarse en la consola.
Si vuelves a mirar el código, verás que no hay espacios dentro de las cadenas.
Los espacios, removidos de las cadenas, han vuelto a aparecer. ¿Puedes explicar
porque?
La forma en que pasamos los argumentos a la función print() es la más común en
Python, y se denomina manera posicional (este nombre proviene del hecho de que el
significado del argumento está dictado por su posición, por ejemplo, el segundo
argumento se emitirá después del primero, y no al revés).
La función print() tiene dos argumentos de palabras clave que se pueden utilizar
para estos propósitos. El primero de ellos se llama end .
En la ventana del editor se puede ver un ejemplo muy simple de como utilizar un
argumento de palabra clave.
Como puedes ver, el argumento de palabra clave end determina los caracteres que la
función print() envía a la salida una vez que llega al final de sus argumentos
posicionales.
Mi-nombre-es-Monty-Python.
La función print() ahora utiliza un guión, en lugar de un espacio, para separar los
argumentos generados.
Nota: el valor del argumento sep también puede ser una cadena vacía. Pruébalo tu
mismo.
Ahora que comprendes la función print() , estás listo para considerar aprender
cómo almacenar y procesar datos en Python.
123
¿Puedes adivinar qué valor representa? claro que puedes - es ciento veintitrés.
¿Representa algún valor? Tal vez. Puede ser el símbolo de la velocidad de la luz,
por ejemplo. También puede representar la constante de integración. Incluso la
longitud de una hipotenusa en el Teorema de Pitágoras. Existen muchas
posibilidades.
No se puede elegir el valor correcto sin algo de conocimiento adicional.
La primera línea luce familiar. La segunda parece ser errónea debido a la falta
visible de comillas.
Intenta ejecutarlo.
Enteros
Quizá ya sepas un poco acerca de como las computadoras hacen cálculos con
números. Tal vez has escuchado del sistema binario, y como es que ese es el
sistema que las computadoras utilizan para almacenar números y como es que
pueden realizar cualquier tipo de operaciones con ellos.
Tomemos por ejemplo, el número once millones ciento once mil ciento once. Si
tomaras ahorita un lápiz en tu mano, escribirías el siguiente
numero: 11,111,111 , o así: 11.111.111 , incluso de esta manera: 11 111 111 .
Es claro que la separación hace que sea más fácil de leer, especialmente
cuando el número tiene demasiados dígitos. Sin embargo, Python no acepta
estas cosas. Esta prohibido. ¿Qué es lo que Python permite? El uso de guion
bajo en los literales numéricos.*
Si un numero entero esta precedido por un código 0O o 0o (cero-o), el numero será
tratado como un valor octal. Esto significa que el número debe contener dígitos en el
rango del [0..7] únicamente.
print(0x123)
Flotantes
Ahora es tiempo de hablar acerca de otro tipo, el cual esta designado para
representar y almacenar los números que (como lo diría un matemático) tienen
una parte decimal no vacía.
Son números que tienen (o pueden tener) una parte fraccionaria después del
punto decimal, y aunque esta definición es muy pobre, es suficiente para lo que
se desea discutir.
2.5
-0.4
Si se quiere utilizar solo el valor de dos punto cinco, se debe escribir como se
mostró anteriormente. Nota que hay un punto entre el 2 y el 5 - no una coma.
0.4
Pero no hay que olvidar esta sencilla regla, se puede omitir el cero cuando es el
único dígito antes del punto decimal.
.4
Por ejemplo: el valor de 4.0 puede ser escrito como:
4.
4
4.0
Se puede pensar que son idénticos, pero Python los ve de una manera
completamente distinta.
Por otro lado, no solo el punto hace que un número sea flotante. Se puede
utilizar la letra e .
Cuando se desea utilizar números que son muy pequeños o muy grandes, se
puede implementar la notación científica.
Para evitar escribir tantos ceros, los libros de texto emplean la forma abreviada,
la cual probablemente hayas visto: 3 x 108 .
En Python, el mismo efecto puede ser logrado de una manera similar, observa
lo siguiente:
3E8
Nota:
6.62607E-34
0.0000000000000000000001
print(0.0000000000000000000001)
Este es el resultado:
1e-22
salida
Python siempre elige la presentación más corta del número, y esto se debe
de tomar en consideración al crear literales.
Cadenas
Las cadenas se emplean cuando se requiere procesar texto (como nombres de
cualquier tipo, direcciones, novelas, etc.), no números.
¿Cómo se puede hacer esto sin generar un error? Existen dos posibles
soluciones.
Nota: ¿Existen dos comillas con escape en la cadena, puedes observar ambas?
Si se delimita una cadena con una comilla, se debe cerrar con una comilla.
Codificando cadenas
Ahora, la siguiente pregunta es: ¿Cómo se puede insertar un apóstrofe en una cadena
la cual está limitada por dos apóstrofes?
Revisar
Ya se ha mostrado, pero se desea hacer énfasis en este fenómeno una vez mas - una
cadena puede estar vacía - puede no contener caracter alguno.
''
""
Valores Booleanos
Para concluir con los literales de Python, existen dos más.
No son tan obvios como los anteriores y se emplean para representar un valor
muy abstracto - la veracidad.
Cada vez que se le pregunta a Python si un número es más grande que otro, el
resultado es la creación de un tipo de dato muy específico - un valor booleano.
True
False
Puntos Clave
1. Literales son notaciones para representar valores fijos en el código. Python
tiene varios tipos de literales, es decir, un literal puede ser un número por
ejemplo, 123 ), o una cadena (por ejemplo, "Yo soy un literal.").
2. El Sistema Binario es un sistema numérico que emplea 2 como su base. Por
lo tanto, un número binario está compuesto por 0s y 1s únicamente, por
ejemplo, 1010 es 10 en decimal.
3. Los Enteros (o simplemente int) son uno de los tipos numéricos que soporta
Python. Son números que no tienen una parte fraccionaria, por ejemplo, 256 ,
o -1 (enteros negativos).
EXTRA
Existe un literal especial más utilizado en Python: el literal None . Este literal es
llamado un objeto de NonType (ningún tipo), y puede ser utilizado para
representar la ausencia de un valor. Pronto se hablará más acerca de ello.
Ejercicio 1
"Hola", "007"
Revisar
Ejercicio 2
Ejercicio 3
¿Cuál es el valor en decimal del siguiente numero en binario?
1011
Revisar
print(2+2)
Sin tomar esto con mucha seriedad, has descubierto que Python puede ser utilizado
como una calculadora. No una muy útil, y definitivamente no una de bolsillo, pero una
calculadora sin duda alguna.
Por ejemplo, como en la aritmética, el signo de + (mas) es un operador el cual es capaz
de sumar dos numeros, dando el resultado de la suma.
Sin embargo, no todos los operadores de Python son tan simples como el signo de
mas, veamos algunos de los operadores disponibles en Python, las reglas que se
deben seguir para emplearlos, y como interpretar las reglas que realizan.
Se comenzará con los operadores que están asociados con las operaciones aritméticas
más conocidas:
+ , - , * , / , // , % , **
Recuerda: Es posible formular las siguientes reglas con base en los resultados:
print(2 * 3)
print(2 * 3.)
print(2. * 3)
print(2. * 3.)
print(6 / 3)
print(6 / 3.)
print(6. / 3)
print(6. / 3.)
print(6 // 3)
print(6 // 3.)
print(6. // 3)
print(6. // 3.)
print(6 // 4)
print(6. // 4)
Imagina que se utilizó / en lugar de // - ¿Podrías predecir los resultados?
print(-6 // 4)
print(6. // -4)
Nota: Algunos de los valores son negativos. Esto obviamente afectara el resultado.
¿Pero cómo?
El resultado es un par de dos negativos. El resultado real (no redondeado) es -1.5 en
ambo casos. Sin embargo, los resultados se redondean. El redondeo se hace hacia el
valor inferior entero, dicho valor es -2 , por lo tanto los resultados son: -2 y -2.0 .
NOTA
Piensa en el como una diagonal (operador de división) acompañado por dos pequeños
círculos.
En otras palabras, es el valor que sobra después de dividir un valor entre otro para
producir un resultado entero.
print(14 % 4)
print(12 % 4.5)
¿Cuál es el resultado?
Revisar
3.0 - no 3 pero 3.0 (la regla aun funciona: 12 // 4.5 da 2.0 ; 2.0 * 4.5 da 9.0 ; 12
- 9.0 da 3.0 )
No intentes:
No intentes:
Operadores: suma
El símbolo del operador de suma es el + (signo de más), el cual esta completamente
alineado a los estándares matemáticos.
print(-4 + 4)
print(-4. + 8)
Esta es una gran oportunidad para mencionar una distinción muy importante entre
operadores unarios y binarios.
Por esta razón, el operador de resta es considerado uno de los operadores binarios,
así como los demás operadores de suma, multiplicación y división.
Pero el operador negativo puede ser utilizado de una forma diferente, observa la
ultima línea de código del siguiente fragmento:
print(-4 - 4)
print(4. - 8)
print(-1.1)
print(+2)
2 + 3 * 5
El fenómeno que causa que algunos operadores actúen antes que otros es
conocido como la jerarquía de prioridades.
Python define la jerarquía de todos los operadores, y asume que los operadores
de mayor jerarquía deben realizar sus operaciones antes que los de menor
jerarquía.
Entonces, si se sabe que la * tiene una mayor prioridad que la + , el resultado
final debe de ser obvio.
print(9 % 6 % 2)
print(2 ** 2 ** 3)
2 ** 2 → 4 ; 4 ** 3 → 64
2 ** 3 → 8 ; 2 ** 8 → 256
Prioridad Operador
1 + , - unario
2 **
3 * , / , %
4 + , - binario
Nota: se han enumerado los operadores en orden de la mas alta (1) a la mas
baja (4) prioridad.
Revisar
Operadores y paréntesis
Por supuesto, se permite hacer uso de paréntesis, lo cual cambiará el orden
natural del cálculo de la operación.
Revisar
10.0
Puntos Clave
1. Una expresión es una combinación de valores (o variables, operadores,
llamadas a funciones, aprenderás de ello pronto) las cuales son evaluadas y
dan como resultado un valor, por ejemplo, 1+2 .
2. Los operadores son símbolos especiales o palabras clave que son capaces
de operar en los valores y realizar operaciones matemáticas, por ejemplo,
el * multiplica dos valores: x*y .
3. Los operadores aritméticos en
Python: + (suma), - (resta), * (multiplicación), / (división clásica: regresan un
flotante si uno de los valores es de este tipo), % (módulo: divide el operando
izquierdo entre el operando derecho y regresa el residuo de la operación, por
ejemplo, 5%2=1 ), ** (exponenciación: el operando izquierdo se eleva a la
potencia del operando derecho, por ejemplo, 2**3=2*2*2=8 ), // (división
entera: retorna el numero resultado de la división, pero redondeado al numero
entero inferior más cercano, por ejemplo, 3//2.0=1.0 ).
4. Un operador unario es un operador con solo un operando, por ejemplo, -1 ,
o +3 .
5. Un operador binario es un operador con dos operados, por ejemplo, 4+5 ,
o 12%5 .
6. Algunos operadores actúan antes que otros, a esto se le llama - jerarquía
de prioridades:
Unario + y - tienen la prioridad más alta.
Después: ** , después: * , / , y % , y después la prioridad más baja:
binaria + y - .
7. Las sub-expresiones dentro de paréntesis siempre se calculan primero, por
ejemplo, 15-1*(5*(1+2))=0 .
8. Los operadores de exponenciación utilizan enlazado hacia la derecha,
por ejemplo, 2**2**3=256 .
Ejercicio 1
Ejercicio 2
Ejercicio 3
Python ayudará con ello. Python ofrece "cajas" (contenedores) especiales para
este propósito, estas cajas son llamadas variables - el nombre mismo sugiere
que el contenido de estos contenedores puede variar en casi cualquier forma.
Un nombre.
Un valor (el contenido del contenedor).
Además, Python permite utilizar no solo las letras latinas, sino caracteres
específicos de otros idiomas que utilizan otros alfabetos.
10t (no comienza con una letra), Tasa Cambio (contiene un espacio).
Palabras Clave
Observa las palabras que juegan un papel muy importante en cada programa
de Python.
import
No se puede tener una variable con ese nombre, esta prohibido, pero se puede
hacer lo siguiente:
Import
Creando variables
¿Qué se puede poner dentro de una variable?
Cualquier cosa. Se puede utilizar una variable para almacenar cualquier tipo de
los valores que ya se han mencionado, y muchos mas de los cuales aun no se
han explicado. El valor de la variable en lo que se ha puesto dentro de ella.
Puede variar tanto como se necesite o requiera. El valor puede ser entero,
después flotante, y eventualmente ser una cadena. Hablemos de dos cosas
importantes - como son creadas las variables, y como poner valores
dentro de ellas (o mejor dicho, como dar o pasarles valores).
RECUERDA
var = 1
print(var)
Nota: print() tiene una función más â“ puede manejar variables también.
¿Puedes predecir cual será la salida (resultado) del có digo?
Revisar
Utilizando variables
Se tiene permitido utilizar cuantas declaraciones de variables sean necesarias
para lograr el objetivo del programa, por ejemplo:
var = 1
balance_cuenta = 1000.0
print(var)
Sin embargo, no se permite utilizar una variable que no exista, (en otras
palabras, una variable a la cual no se le a dado un valor).
var = 1
print(Var)
RECUERDA
Se puede utilizar print() para combinar texto con variables utilizando el
operador + para mostrar cadenas con variables, por ejemplo:
var = "3.7.1"
Revisar
var = 1
print(var)
var = var + 1
print(var)
var = 100
print(var)
Revisar
500 - ¿Porque? Bueno, primero, la variable var es creada y se le asigna el valor
de 100. Después, a la misma variable se le asigna un nuevo valor: el resultado
de sumarle 200 a 300, lo cual es 500.
El siguiente código evalúa la longitud de la hipotenusa (es decir, el lado más largo de
un triangulo rectángulo, el opuesto al ángulo recto) utilizando el Teorema de Pitágoras:
a = 3.0
b = 4.0
c = (a ** 2 + b ** 2) ** 0.5
print("c =", c)
Nota: se necesita hacer uso del operador ** para evaluar la raíz cuadrada:
√ (x) = x(½)
y
c = √ a2 + b2
¿Puedes predecir la salida del código?
Revisar
c = 5.0
Operadores Abreviados
Es tiempo de explicar el siguiente conjunto de operadores que harán la vida del
programador/desarrollador mas fácil.
x = x * 2
oveja = oveja + 1
Python ofrece una manera mas corta de escribir operaciones como estas, lo
cual se puede codificar de la siguiente manera:
x *= 2
oveja+= 1
A continuación se intenta presentar una descripción general para este tipo de
operaciones.
Si op es un operador de dos argumentos (esta es una condición muy imporante)
y el operador es utilizado en el siguiente contexto:
i = i + 2 * j ⇒ i += 2 * j
x = x ** 2 ⇒ x **= 2
Puntos Clave
1. Una variable es una ubicación nombrada reservada para almacenar valores
en la memoria. Una variable es creada o inicializada automáticamente cuando
se le asigna un valor por primera vez.
print(var)
var = 3
print(var)
var += 1
print(var)
var = "007"
Ejercicio 1
var = 2
var = 3
print(var)
Revisar
Ejercicio 2
my_var
m
101
averylongvariablename
m101
m 101
Del
Del
Revisar
my_var
m
101 # incorrecto (comienza con un digito)
averylongvariablename
m101
m 101 # incorrecto (contiene un espacio)
Del
del # incorrecto (es una palabra clave)
Ejercicio 3
a = '1'
b = "1"
print(a + b)
Revisar
11
Ejercicio 4
a = 6
b = 3
a /= 2 * b
print(a)
Revisar
1.0
2*b=6
a = 6 → 6 / 6 = 1.0
Por ejemplo, si una variable determinada esta diseñada para almacenar el área
de un cuadrado, el nombre areaCuadrado será muchísimo mejor que tiaJuana .
Puntos Clave
1. Los comentarios pueden ser utilizados para colocar información adicional en
el código. Son omitidos al momento de la ejecución. Dicha información es para
los lectores que están manipulando el código. En Python, un comentario es un
fragmento de texto que comienza con un # . El comentario se extiende hasta el
final de la línea.
2. Si deseas colocar un comentario que abarque varias líneas, es necesario
colocar un # al inicio de cada línea. Además, se puede utilizar un comentario
para marcar un fragmento de código que no es necesaria en el momento y no
se desea ejecutar. (observa la ultima línea de código del siguiente fragmento),
por ejemplo:
# Este programa imprime
# un saludo en pantalla
print("Hola!") # Se invoca la función print() function
# print("Soy Python.")
Ejercicio 1
# print("Cadena #1")
print("Cadena #2")
Revisar
Cadena #2
Ejercicio 2
# Esto es
un comentario
en varias líneas #
print("Hola!")
Revisar
La función input()
Ahora se introducirá una nueva función, la cual pareciese ser un reflejo de la
función print() .
La función input() es capaz de leer datos que fueron introducidos por el
usuario y pasar esos datos al programa en ejecución.
El programa entonces puede manipular los datos, haciendo que el código sea
verdaderamente interactivo.
Observa el ejemplo:
print("Dime algo...")
algo = input()
print("Mmm...", algo, "...¿en serio?")
Nota:
La función input() con un argumento
La función input() puede hacer algo más: puede mostrar un mensaje al
usuario sin la ayuda de la función print() .
Se ha modificado el ejemplo un poco, observa el código:
Nota:
El resultado de la función input()
Se ha dicho antes, pero hay que decirlo sin ambigüedades una vez más:
el resultado de la función input() es una cadena.
Una cadena que contiene todos los caracteres que el usuario introduce desde el
teclado. No es un entero ni un flotante.
La última línea lo explica todo, se intentó aplicar el operador ** a 'str' (una cadena)
acompañado por un 'float' (valor flotante).
Esto debe de ser obvio â“ ¿Puedes predecir el valor de "ser o no ser" elevado a
la 2 potencia?
¿Habremos llegado a un punto muerto? ¿Existirá alguna solución? Claro que la hay.
Esto es muy simple y muy efectivo. Sin embargo, estas funciones se pueden invocar
directamente pasando el resultado de la función input() directamente. No hay
necesidad de emplear variables como almacenamiento intermedio.
Eventualmente serás capaz de escribir programas completos, los cuales acepten datos
en forma de números, los cuales serán procesados y se mostrarán los resultados.
Por supuesto, estos programas serán muy primitivos y no muy utilizables, debido a
que no pueden tomar decisiones, y consecuentemente no son capaces de reaccionar
acorde a cada situación.
Este programa le preguntó al usuario los dos catetos, calcula la hipotenusa e imprime
el resultado.
Concatenación
El sigo de + (más), al ser aplicado a dos cadenas, se convierte en un operador de
concatenación:
string + string
print("Gracias.")
cadena * número
número * cadena
Por ejemplo:
RECUERDA
Este sencillo programa "dibuja" un rectángulo, haciendo uso del operador ( + ), pero en
un nuevo rol:
¡Intenta practicar para crear otras figuras o tus propias obras de arte!
Conversión de tipos de datos: str()
A estas alturas ya sabes como emplear las funciones int() y float() para convertir
una cadena a un número.
str(número)
Sinceramente, puede hacer mucho más que transformar números en cadenas, eso lo
veremos después.
Se ha modificado un poco para mostrar cómo es que la función str() trabaja. Gracias
a esto, podemos pasar el resultado entero a la función print() como una sola
cadena, sin utilizar las comas.
NOTA
Ejercicio 1
print(x * "5")
Revisar
55
Ejercicio 2
print(type(x))
Revisar
<class 'str'>
Preguntas y respuestas
Un programador escribe un programa y el programa hace preguntas. Una
computadora ejecuta el programa y proporciona las respuestas. El programa
debe ser capaz de reaccionar de acuerdo con las respuestas recibidas.
Afortunadamente, las computadoras solo conocen dos tipos de respuestas:
Ejercicios
Ahora vamos a hacer algunas preguntas. Intenta adivinar las respuestas.
var == 0
Ten en cuenta que no podemos encontrar la respuesta si no sabemos qué valor está
almacenado actualmente en la variable (var) . Si la variable se ha cambiado muchas
veces durante la ejecución del programa, o si se ingresa su valor inicial desde la
consola, Python solo puede responder a esta pregunta en el tiempo de ejecución del
programa. Ahora imagina a un programador que sufre de insomnio, y tiene que contar
las ovejas negras y blancas por separado siempre y cuando haya exactamente el doble
de ovejas negras que de las blancas.
ovejasNegras == 2 * ovejasBlancas
ovejasNegras == (2 * ovejaBlancas)
Si deseas saber si hay más ovejas negras que blancas, puedes escribirlo de la
siguiente manera:
Si queremos saber si tenemos que usar un gorro o no, nos hacemos la siguiente
pregunta:
Prioridad Operador
1 + , - unario
2 **
3 * , / , %
4 + , - binario
6 == , !=
Condiciones y ejecución condicional
Ya sabes como hacer preguntas a Python, pero aún no sabes como hacer un
uso razonable de las respuestas. Se debe tener un mecanismo que le permita
hacer algo si se cumple una condición, y no hacerlo si no se cumple. Es
como en la vida real: haces ciertas cosas o no cuando se cumple una condición
específica, por ejemplo, sales a caminar si el clima es bueno, o te quedas en
casa si está húmedo y frío. Para tomar tales decisiones, Python ofrece una
instrucción especial. Debido a su naturaleza y su aplicación, se
denomina instrucción condicional (o declaración condicional). Existen varias
variantes de la misma. Comenzaremos con la más simple, aumentando la
dificultad lentamente. La primera forma de una declaración condicional, que
puede ver a continuación, está escrita de manera muy informal pero figurada:
if cierto_o_no:
hacer_esto_si_cierto
La palabra clave if .
Uno o más espacios en blanco.
Una expresión (una pregunta o una respuesta) cuyo valor se interpretar
únicamente en términos de True (cuando su valor no sea cero)
y False (cuando sea igual a cero).
Unos dos puntos seguido de una nueva línea.
Una instrucción con sangría o un conjunto de instrucciones (se requiere
absolutamente al menos una instrucción); la sangría se puede lograr de
dos maneras: insertando un número particular de espacios (la
recomendación es usar cuatro espacios de sangría), o usando
el tabulador; nota: si hay mas de una instrucción en la parte con sangría,
la sangría debe ser la misma en todas las líneas; aunque puede parecer
lo mismo si se mezclan tabuladores con espacios, es importante que
todas las sangrías sean exactamente iguales Python 3 no permite
mezclar espacios y tabuladores para la sangría.
¿Cómo funciona esta declaración?
después, almorzaremos
if ClimaEsBueno:
irAcaminar()
almorzar()
Puedes leerlo como sigue: si contadorOvejas es mayor o igual que 120 ,
entonces duerme y sueña (es decir, ejecuta la función duermeSueña .)
Nota: no hay una palabra sobre lo que suceder· si el clima es malo. Solo
sabemos que no saldremos al aire libre, pero no sabemos que podríamos hacer.
Es posible que también queramos planificar algo en caso de mal tiempo.
Python nos permite expresar dichos planes alternativos. Esto se hace con una
segunda forma, ligeramente mas compleja, de la declaración condicional, la
declaración if-else :
if condición_true_or_false:
ejecuta_si_condición_true
else:
ejecuta_si_condición_false
Por lo tanto, hay una nueva palabra: else - esta es una palabra reservada.
La parte del código que comienza con else dice que hacer si no se cumple la
condición especificada por el if (observa los dos puntos después de la
palabra).
if climaEsBueno:
irACaminar()
else:
irAlCine()
almorzar()
Todo lo que hemos dicho sobre la sangría funciona de la misma manera dentro
de la rama else :
if climaEsBueno:
irACaminar()
Diviertirse()
else:
irAlCine()
disfrutaLaPelicula()
almorzar()
Declaraciones if-else anidadas
Ahora, analicemos dos casos especiales de la declaración condicional.
Lee lo que hemos planeado para este domingo. Si hay buen clima, saldremos a
caminar. Si encontramos un buen restaurante, almorzaremos allí. De lo
contrario, vamos a comer un sandwich. Si hay mal clima, iremos al cine. Si no
hay boletos, iremos de compras al centro comercial más cercano.
if climaEsBueno:
if encontramosBuenRestaurante:
almorzar()
else:
comerSandwich()
else:
if hayBoletosDisponibles:
irAlCine()
else:
irDeCompras()
La declaración elif
El segundo caso especial presenta otra nueva palabra clave de Python: elif.
Como probablemente sospechas, es una forma más corta de else-if.
if climaBueno:
iraCaminar()
elif hayBoletosDisponibles:
IralCine()
elif mesasLibres:
almorzar()
else:
jugarAjedrezEnCasa()
Esto puede sonar un poco desconcertante, pero ojalá que algunos ejemplos
simples ayuden a comprenderlo mejor.
Ejemplo 1:
#imprimir el resultado
print("El número más grande es:", nmasGrande)
El fragmento de código anterior debe estar claro: lee dos valores enteros, los compara
y encuentra cuál es el más grande.
Ejemplo 2:
#imprimir el resultado
print("El número más grande es: ", nmasGrande)
Nota: si alguna de las ramas de if-elif-else contiene una sola instrucción, puedes
codificarla de forma más completa (no es necesario que aparezca una línea con
sangría después de la palabra clave), pero solo continúa la línea después de los dos
puntos).
Sin embargo, este estilo puede ser engañoso, y no lo vamos a usar en nuestros
programas futuros, pero definitivamente vale la pena saber si quieres leer y entender
los programas de otra persona.
Ejemplo 3:
#imprimir el resultado
print("El número más grande es:", nmasGrande)
Este método es significativamente más simple que tratar de encontrar el número más
grande comparando todos los pares de números posibles (es decir, el primero con el
segundo, el segundo con el tercero y el tercero con el primero). Intenta reconstruir el
código por ti mismo.
Hacemos un trato con el usuario: cuando se ingresa el valor -1 , será una señal
de que no hay más datos y que el programa debe finalizar su trabajo.
Las líneas 02 a 08 forman un bucle. Los pasaremos tantas veces como sea
necesario para revisar todos los valores ingresados.
Información Adicional
Python a menudo viene con muchas funciones integradas que harán el trabajo
por ti. Por ejemplo, para encontrar el número más grande de todos, puede usar
una función incorporada de Python llamada max() . Puedes usarlo con múltiples
argumentos. Analiza el código de abajo:
numeroMayor = max(numero1,numero2,numero3)
# imprimir el resultado
print("El número más grande es:", numeroMayor)
Vamos a hablar sobre estas (y muchas otras) funciones pronto. Por el momento,
nuestro enfoque se centrará en la ejecución condicional y los bucles para
permitirte ganar más confianza en la programación y enseñarte las habilidades
que te permitirán comprender y aplicar los dos conceptos en tu codigo.
Entonces, por ahora, no estamos tomando atajos.
Puntos clave
1. Los operadores de comparación (o también denominados relacionales) se
utilizan para comparar valores. La siguiente tabla ilustra cómo funcionan los
operadores de comparación, asumiendo que x=0 , y=1 y z=0 :
Operador Descripción Ejemplo
x = 10
if x == 10: # condición
x = 10
x = 10
else:
x = 10
if x > 5: # Verdadero
if x > 8: # Verdadero
else:
Cada if se prueba por separado. El cuerpo de else se ejecuta si el
último if es False .
x = 10
if x == 10: # Verdadero
print("x == 10")
else:
x = 10
if x > 5: # Verdadero
if x == 6: # Falso
print("anidado: x == 6")
print("anidado: x == 10")
else:
print("anidado: else")
else:
print("else")
print(x > y)
print(y > z)
Revisar
False
True
Ejercicio 2
x, y, z = 5, 10, 8
print(x > z)
print((y - 5) == x)
Revisar
False
True
Ejercicio 3
x, y, z = 5, 10, 8
x, y, z = z, y, x
print(x > z)
print((y - 5) == x)
Revisar
True
False
Ejercicio 4
x = 10
if x == 10:
print(x == 10)
if x > 5:
print(x > 5)
if x < 10:
print(x < 10)
else:
print("else")
Revisar
True
True
else
Ejercicio 5
x = "1"
if x == 1:
print("uno")
elif x == "1":
if int (x)> 1:
print("dos")
elif int (x) < 1:
print("tres")
else:
print("cuatro")
if int (x) == 1:
print("cinco")
else:
print("seis")
Revisar
cuatro
cinco
Ejercicio 6
x = 1
y = 1.0
z = "1"
if x == y:
print("uno")
if y == int (z):
print("dos")
elif x == y:
print("tres")
else:
print("cuatro")
Revisar
uno
dos
while expresión_condicional:
instrucción
while expresión_condicional:
instrucción_uno
instruccion_dos
instrucción_tres
:
:
instrucción_n
numerosImpares = 0
numerosPares = 0
# imprimir resultados
print ("Números impares: ", numerosImpares)
print ("Números pares: ", numerosPares)
contador = 5
while contador != 0:
print("Dentro del ciclo: ", contador)
contador -= 1
print ("Fuera del ciclo", contador)
Este código está destinado a imprimir la cadena "Dentro del ciclo" y el valor
almacenado en la variable contador durante un ciclo dado exactamente cinco veces.
Una vez que la condición se haya cumplido (la variable contador ha alcanzado 0 ), se
sale del ciclo y aparece el mensaje "Fuera del ciclo". así como el valor
almacenado en contador se imprime.
Pero hay una cosa que se puede escribir de forma más compacta: la condición del
ciclo while .
contador =5
while contador:
print("Dentro del ciclo.", contador)
contador - = 1
print ("Fuera del ciclo", contador)
¿Es más compacto que antes? Un poco. ¿Es más legible? Eso es discutible.
RECUERDA
No te sientas obligado a codificar tus programas de una manera que siempre sea la
más corta y la más compacta. La legibilidad puede ser un factor más importante.
Manten tu código listo para un nuevo programador.
Ciclos(bucles) en el código con for
Otro tipo de ciclo disponible en Python proviene de la observación de que a
veces es más importante contar los "giros o vueltas" del ciclo que verificar
las condiciones. Imagina que el cuerpo de un ciclo debe ejecutarse
exactamente cien veces. Si deseas utilizar el ciclo while para hacerlo, puede
tener este aspecto:
i = 0
while i < 100:
# hacer_algo()
i += 1
Sería bueno si alguien pudiera hacer esta cuenta aburrida por ti. ¿Es eso
posible?
Por supuesto que lo es, hay un ciclo especial para este tipo de tareas, y se
llama for .
for i in range(10):
print("El valor de i es actualmente", i)
Nota:
El primer valor mostrado es 2 (tomado del primer argumento de range() ).
El valor de i es actualmente 2
El valor de i es actualmente 5
¿Sabes por qué? El primer argumento pasado a la función range() nos dice cual es el
número de inicio de la secuencia (por lo tanto, 2 en la salida). El segundo argumento
le dice a la función dónde detener la secuencia (la función genera números hasta el
número indicado por el segundo argumento, pero no lo incluye). Finalmente, el tercer
argumento indica el paso, que en realidad significa la diferencia entre cada número en
la secuencia de números generados por la función.
Nota: si el conjunto generado por la función range() está vacío, el ciclo no ejecutará
su cuerpo en absoluto.
pow = 1
for exp in range(16):
print ("2 a la potencia de", exp, "es", pow)
pow * = 2
La variable exp se utiliza como una variable de control para el ciclo e indica el valor
actual del exponente. La propia exponenciación se sustituye multiplicando por dos.
Dado que 2 0 es igual a 1, después 2 × 1 es igual a 21, 2 × 21 es igual a 22, y así
sucesivamente. ¿Cuál es el máximo exponente para el cual nuestro programa aún
imprime el resultado?
Ahora te mostraremos dos ejemplos simples para ilustrar como funcionan las dos
instrucciones. Mira el código en el editor. Ejecuta el programa y analiza la salida.
Modifica el código y experimenta.
El while y la opción else
Ambos ciclos, while y for , tienen una característica interesante (y rara vez se usa).
Te mostraremos cómo funciona: intenta juzgar por ti mismo si es utilizable.
En otras palabras, trata de convencerte si la función es valiosa y útil, o solo es azúcar
sintáctica.
Echa un vistazo al fragmento en el editor. Hay algo extraño al final: la palabra
clave else .
Como pudiste haber sospechado, los ciclos también pueden tener la rama else ,
como los if .
La rama else del ciclo siempre se ejecuta una vez, independientemente de si el
ciclo ha entrado o no en su cuerpo .
¿Puedes adivinar la salida? Ejecuta el programa para comprobar si tenías razón.
Modifica el fragmento un poco para que el ciclo no tenga oportunidad de ejecutar su
cuerpo ni una sola vez:
i = 5
while i < 5:
print(i)
i += 1
else:
print("else:", i)
El ciclo for y la rama else
Los ciclos for se comportan de manera un poco diferente: echa un vistazo al
fragmento en el editor y ejecútalo.
La salida puede ser un poco sorprendente.
i = 111
for i in range(2, 1):
print(i)
else:
print("else:", i)
Cuando el cuerpo del ciclo no se ejecuta, la variable de control conserva el valor que
tenía antes del ciclo.
Ahora vamos a informarte sobre otros tipos de variables. Nuestras variables actuales
solo pueden almacenar un valor a la vez, pero hay variables que pueden hacer
mucho más; pueden almacenar tantos valores como desees.
Puntos clave
1. Hay dos tipos de ciclos en Python: while y for :
El ciclo while ejecuta una sentencia o un conjunto de declaraciones
siempre que una condición booleana especificada sea verdadera, por
ejemplo:
# Ejemplo 1
while True:
print("Atascado en un ciclo infinito")
# Ejemplo 2
contador = 5
while contador > 2:
print(contador)
contador -= 1
# Ejemplo 1
palabra = "Python"
for letter in palabra:
print(letter, fin = "*")
# Ejemplo 2
for i in range(1, 10):
if i % 2 == 0:
print(i)
2. Puedes usar las sentencias break y continue para cambiar el flujo de un
ciclo:
text = "pyxpyxpyx"
for letter in text:
if letter == "x":
continue
print(letter, end= "")
3. Los ciclos while y for también pueden tener una cláusula else en Python.
La cláusula else se ejecuta después de que el ciclo finalice su ejecución
siempre y cuando no haya terminado con break , por ejemplo:
n = 0
while n != 3:
print(n)
n += 1
else:
print(n, "else")
print()
Código de ejemplo:
for i in range(3):
print(i, end=" ") # salidas: 0 1 2
Ejercicio 2
x = 1
while x < 11:
# line of code
# line of code
# line of code
Revisar
Solución de muestra:
x = 1
while x < 11:
if x % 2 != 0:
print(x)
x += 1
Ejercicio 3
Crea un programa con un bucle for y una declaración break . El programa debe
iterar sobre los caracteres en una dirección de correo electrónico, salir del bucle
cuando llegue al símbolo @ e imprimir la parte antes de @ en una línea. Usa el
esqueleto de abajo:
for ch in "[email protected]":
if ch == "@":
# línea de código
# línea de código
Revisar
Solución de muestra:
for ch in "[email protected]":
if ch == "@":
break
print(ch, end="")
Ejercicio 4
Ejercicio 5
n = 3
while n > 0:
print(n + 1)
n -= 1
else:
print(n)
Revisar
4
3
2
0
Ejercicio 6
n = range(4)
for num in n:
print(num - 1)
else:
print(num)
Revisar
-1
0
Ejercicio 7
print(i)
Revisar
3
Lógica de computadora
¿Te has dado cuenta de que las condiciones que hemos usado hasta ahora han
sido muy simples, por no decir, bastante primitivas? Las condiciones que
utilizamos en la vida real son mucho más complejas. Veamos esta oración:
Hemos utilizado la conjunción and (y) , lo que significa que salir a caminar
depende del cumplimiento simultáneo de estas dos condiciones. En el lenguaje
de la lógica, tal conexión de condiciones se denomina conjunción. Y ahora otro
ejemplo:
Está claro que Python debe tener operadores para construir conjunciones y
disyunciones. Sin ellos, el poder expresivo del lenguaje se debilitaría
sustancialmente. Se llaman operadores lógicos.
and
Un operador de conjunción lógica en Python es la palabra y. Es un operador
binario con una prioridad inferior a la expresada por los operadores de
comparación. Nos permite codificar condiciones complejas sin el uso de
paréntesis como este:
Argumento A Argumento B A y B
or
Un operador de disyunción es la palabra or . Es un operador binario con una
prioridad más baja que and (al igual que + en comparación con * ). Su tabla
de verdad es la siguiente:
Argumento A Argumento B A or B
not
Además, hay otro operador que se puede aplicar para condiciones de
construcción. Es un operador unario que realiza una negación lógica. Su
funcionamiento es simple: convierte la verdad en falso y lo falso en verdad.
False True
True False
Expresiones lógicas
Creemos una variable llamada var y asignémosle 1 . Las siguientes condiciones
son equivalentes a pares:
print(var > 0)
print(not (var <= 0))
print(var != 0)
print(not (var == 0))
Observa como se han utilizado los paréntesis para codificar las expresiones: las
colocamos allí para mejorar la legibilidad.
El resultado de sus operaciones es uno de estos valores: False o True . Esto
significa que este fragmento de código asignará el valor True a la
variable j si i no es cero; de lo contrario, será False .
i = 1
j = not not i
Operadores bitwise
Sin embargo, hay cuatro operadores que le permiten manipular bits de datos
individuales. Se denominan operadores bitwise.
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
0 1
1 0
Los operadores bitwise son más estrictos: tratan con cada bit por separado.
Si asumimos que la variable entera ocupa 64 bits (lo que es común en los
sistemas informáticos modernos), puede imaginar la operación a nivel de bits
como una evaluación de 64 veces del operador lógico para cada par de bits de
los argumentos. Su analogía es obviamente imperfecta, ya que en el mundo
real todas estas 64 operaciones se realizan al mismo tiempo
(simultáneamente).
i = 15
j = 22
Se ejecuta la asignación:
og = i and j
Estamos tratando con una conjunción lógica aquí. Vamos a trazar el curso de
los cálculos. Ambas variables i y j no son ceros, por lo que se considerará que
representan a True . Al consultar la tabla de verdad para el operador and ,
podemos ver que el resultado será True . No se realizan otras operaciones.
log: True
bit = i & j
El operador & operará con cada par de bits correspondientes por separado,
produciendo los valores de los bits relevantes del resultado. Por lo tanto, el
resultado será el siguiente:
i 000000000000000000000000000 01111
j 000000000000000000000000000 10110
bit = i & j 000000000000000000000000000 00110
La variable logneg se establecerá en False : no es necesario hacer nada más.
bitneg = ~i
Puede ser un poco sorprendente: el valor de la variable bitneg es -16 . Esto
puede parecer extraño, pero no lo es en absoluto. Si deseas obtener más
información, debes consultar el sistema de números binarios y las reglas que
rigen los números de complemento de dos.
i 0000000000000000000000000000 1111
x = x & y x &= y
x = x | y x |= y
x = x ^ y x ^= y
¿Cómo tratamos los bits individuales?
Ahora te mostraremos para que puedes usar los operadores de bitwise. Imagina
que eres un desarrollador obligado a escribir una pieza importante de un
sistema operativo. Se te ha dicho que puedes usar una variable asignada de la
siguiente forma:
flagRegister = 0x1234
flagRegister = 000000000000000000000000000000x000
x & 1 = x
x & 0 = 0
00000000000000000000000000001000
(observa el 1 en la posición de tu bit) como resultado, obtendrás una de las
siguientes cadenas de bits:
Dicha secuencia de ceros y unos, cuya tarea es tomar el valor o cambiar los bits
seleccionados, se denomina máscara de bits. Construyamos una máscara de
bits para detectar el estado de tus bits. Debería apuntar a el tercer bit. Ese bit
tiene el peso de 23=8 . Se podría crear una máscara adecuada mediante la
siguiente declaración:
theMask = 8
2. Reinicia tu bit: asigna un cero al bit, mientras que todos los otros bits
deben permanecer sin cambios; usemos la misma propiedad de la conjunción
que antes, pero usemos una máscara ligeramente diferente, exactamente como
se muestra a continuación:
11111111111111111111111111110111
3. Establece tu bit : asigna un 1 a tu bit, mientras que todos los bits restantes
deben permanecer sin cambios; usa la siguiente propiedad de disyunción:
x | 1 = 1
x | 0 = x
Ya estás listo para configurar su bit con una de las siguientes instrucciones:
flagRegister |= theMask
4. Niega tu bit: reemplaza un 1 con un 0 y un 0 con un 1 . Puedes utilizar una
propiedad interesante del operador ~x :
x ^ 1 = ~x
x ^ 0 = x
Niega tu bit con las siguientes instrucciones:
flagRegister ^= theMask
12345 × 10 = 123450
12340 ÷ 10 = 1234
Dividir entre diez no es más que desplazar los dígitos a la derecha. La computadora
realiza el mismo tipo de operación, pero con una diferencia: como dos es la base para
los números binarios (no 10), desplazar un valor un bit a la izquierda corresponde
a multiplicarlo por dos ; respectivamente, desplazar un bit a la derecha es como
dividir entre dos (observe que se pierde el bit más a la derecha).
Los operadores de cambio en Python son un par de dígrafos: < < y > > , sugiriendo
claramente en qué dirección actuará el cambio.
17 68 8
Nota:
Y aquí está la tabla de prioridades actualizada , que contiene todos los operadores
presentados hasta ahora:
Prioridad Operador
1 ! ~ (tipo) ++ -- + - unario
2 **
3 * / %
4 + - binario
5 << >>
6 <<=>> =
7 == !=
8 &
9 |
10 &&
11 ||
12 = += -= *= /= %= &= ^= |= >>= <<=
Puntos clave
1. Python es compatible con los siguientes operadores lógicos:
2. Puedes utilizar operadores bit a bit para manipular bits de datos individuales.
Los siguientes datos de muestra:
& hace un bit a bit and (y), por ejemplo, x & y = 0 , el cual es 0000
0000 en binario.
| hace un bit a bit or (o), por ejemplo, x | y = 31 , el cual es 0001
1111 en binario.
˜ hace un bit a bit not (no), por ejemplo, ˜ x = 240 , el cual es 1111
0000 en binario.
^ hace un bit a bit xor, por ejemplo, x ^ y = 31 , el cual es 0001 1111 en
binario.
>> hace un desplazamiento bit a bit a la derecha, por ejemplo, y >> 1 =
8 , el cual es 0000 1000 en binario.
<< hace un desplazamiento bit a bit a la izquierda, por ejemplo, y << 3 =
, el cual es 1000 0000 en binario.
Ejercicio 1
x = 1
y = 0
z = ((x == y) and (x == y)) or not(x == y)
print(not(z))
Revisar
False
Ejercicio 2
x = 4
y = 1
a = x & y
b = x | y
c = ~ x
d = x ^ 5
e = x >> 2
f = x << 2
print(a, b, c, d, e, f)
Revisar
0 5 -5 1 1 16
¿Por qué necesitamos listas?
Puede suceder que tengas que leer, almacenar, procesar y, finalmente,
imprimir docenas, quizás cientos, tal vez incluso miles de números. ¿Entonces
que? ¿Necesitas crear una variable separada para cada valor? ¿Tendrás que
pasar largas horas escribiendo declaraciones como la que se muestra a
continuación?
var1 = int(input())
var2 = int(input())
var3 = int(input())
:
:
Si no crees que esta sea una tarea complicada, toma un papel y escribe un
programa que:
numeros = [ 10, 5, 7, 2, 1]
Digamos lo mismo utilizando una terminología adecuada: numeros es una lista
que consta de cinco valores, todos ellos números. También podemos
decir que esta declaración crea una lista de longitud igual a cinco (ya que
contiene cinco elementos). Los elementos dentro de una lista pueden tener
diferentes tipos . Algunos de ellos pueden ser enteros, otros son flotantes y
otros pueden ser listas. Python ha adoptado una convención que indica que los
elementos de una lista están siempre numerados desde cero. Esto significa
que el elemento almacenado al principio de la lista tendrá el número cero.
Como hay cinco elementos en nuestra lista, al último de ellos se le asigna el
número cuatro. No olvides esto. Pronto te acostumbrarás y se convertirá en
algo natural.
Listas de indexación
¿Cómo cambias el valor de un elemento elegido en la lista?
Vamos a asignar un nuevo valor de 111 al primer elemento en la lista. Lo hacemos
de esta manera:
numeros = [10, 5, 7, 2, 1]
numeros[0] = 111
numeros = [10, 5, 7, 2, 1]
numeros[0] = 111
print("\nPrevio contenido de la lista:", numeros) # imprimiendo
contenido de la lista anterior.
Vamos a utilizar la función print() para imprimir el contenido de la lista cada vez que
realicemos los cambios. Esto nos ayudará a seguir cada paso con más cuidado y ver
que sucede después de una modificación de la lista en particular.
Nota: todos los índices utilizados hasta ahora son literales. Sus valores se fijan en el
tiempo de ejecución, pero cualquier expresión también puede ser un índice. Esto
abre muchas posibilidades.
Suponiendo que todas las operaciones anteriores se hayan completado con éxito, el
fragmento enviará 111 a la consola.
Como puedes ver en el editor, la lista también puede imprimirse como un todo, como
aquí:
Como probablemente hayas notado antes, Python decora la salida de una manera que
sugiere que todos los valores presentados forman una lista. La salida del fragmento de
ejemplo anterior se ve así:
[111, 1, 7, 2, 1]
La función len()
La longitud de una lista puede variar durante la ejecución. Se pueden agregar nuevos
elementos a la lista, mientras que otros pueden eliminarse de ella. Esto significa que la
lista es una entidad muy dinámica. Si deseas verificar la longitud actual de la lista,
puedes usar una función llamada len() (su nombre proviene de length - longitud).
del numeros[1]
print(len(numeros))
print(numeros)
print(numeros[4])
numeros[4] = 1
Agrega el fragmento de código anterior después de la última línea de código en el
editor, ejecute el programa y verifique que sucede.
Nota: hemos eliminado uno de los elementos de la lista; ahora solo hay cuatro
elementos en la lista. Esto significa que el elemento número cuatro no existe.
print(numeros[-1])
Del mismo modo, el elemento con un índice igual a -2 es el anterior al último en la
lista.
print(numeros[-2])
El último elemento accesible en nuestra lista es numeros[-4] (el primero). ¡No
intentes ir más lejos!
Funciones vs. métodos
Un método es un tipo específico de función: se comporta como una función
y se parece a una función, pero difiere en la forma en que actúa y en su estilo
de invocación.
Una función no pertenece a ningún dato: obtiene datos, puede crear nuevos
datos y (generalmente) produce un resultado.
resultado = funcion(argumento)
La función toma un argumento, hace algo y devuelve un resultado.
resultado = data.method(arg)
Nota: el nombre del método está precedido por el nombre de los datos que
posee el método. A continuación, se agrega un punto, seguido del nombre del
método y un par de paréntesis que encierran los argumentos.
El método se comportará como una función, pero puede hacer algo más:
puede cambiar el estado interno de los datos a partir de los cuales se ha
invocado.
lista.append(valor)
lista.insert(ubicación,valor)
Observa el código en el editor. Ve como usamos los métodos append() e insert() .
Presta atención a lo que sucede después de usar insert() : el primer elemento
anterior ahora es el segundo, el segundo el tercero, y así sucesivamente.
numeros.insert(1,333)
: continuación
Puedes iniciar la vida de una lista creándola vacía (esto se hace con un par de
corchetes vacíos) y luego agregar nuevos elementos según sea necesario. Echa un
vistazo al fragmento en el editor. Intenta adivinar su salida después de la ejecución del
bucle for . Ejecuta el programa para comprobar si tenías razón.
for i in range(5):
miLista.insert(0, i + 1)
print(miLista)
¿Qué pasará ahora? Ejecuta el programa y comprueba si esta vez también tenías
razón.
miLista = [10, 1, 8, 3, 5]
suma = 0
for i in miLista:
suma += i
print(suma)
variable2 = variable1
variable1 = variable2
variable1 = 1
variable2 = 2
auxiliar = variable1
variable1 = variable2
variable2 = auxiliar
Python ofrece una forma más conveniente de hacer el intercambio, echa un vistazo:
variable1 = 1
variable2 = 2
Listas en acción
Ahora puedes intercambiar fácilmente los elementos de la lista para revertir su
orden:
miLista = [10, 1, 8, 3, 5]
miLista [0], miLista [4] = miLista [4], miLista [0]
miLista [1], miLista [3] = miLista [3], miLista [1]
print(miLista)
¿Seguirá siendo aceptable con una lista que contenga 100 elementos? No, no lo hará.
miLista = [10, 1, 8, 3, 5]
longitud = len(miLista)
print(miLista)
Nota:
Puntos clave
1. La lista es un tipo de dato en Python que se utiliza para almacenar
múltiples objetos. Es una colección ordenada y mutable de elementos
separados por comas entre corchetes, por ejemplo:
miLista = [1, 2, 3, 4]
del miLista[2]
print(miLista) # salida: [1, 2, 4]
del miLista # borra toda la lista
5.Las listas pueden ser iteradas mediante el uso del bucle for , por ejemplo:
Ejercicio 1
lst = [1, 2, 3, 4, 5]
lst.insert(1, 6)
del lst[0]
lst.append(1)
print(lst)
Revisar
[6, 2, 3, 4, 5, 1]
Ejercicio 2
lst = [1, 2, 3, 4, 5]
lst2 = []
agregar = 0
print(lst2)
Revisar
[1, 3, 6, 10, 15]
Ejercicio 3
lst = []
del lst
print(lst)
Revisar
NameError: el nombre 'lst' no está definido
Ejercicio 4
Ordenamiento Burbuja
Ahora que puedes hacer malabarismos con los elementos de las listas, es hora
de aprender como ordenarlos. Se han inventado muchos algoritmos de
clasificación, que difieren mucho en velocidad, así como en complejidad. Vamos
a mostrar un algoritmo muy simple, fácil de entender, pero
desafortunadamente, tampoco es muy eficiente. Se usa muy raramente, y
ciertamente no para listas extensas.
Digamos que una lista se puede ordenar de dos maneras:
8 10 6 2 4
8 6 10 2 4
Vamos más allá y observemos los elementos tercero y cuarto. Una vez más,
esto no es lo que se supone que es. Tenemos que intercambiarlos:
8 6 2 10 4
Ahora comprobemos los elementos cuarto y quinto. Si, ellos también están en
las posiciones equivocadas. Ocurre otro intercambio:
8 6 2 4 10
Observa - El 10 está en la parte superior. Podríamos decir que flotó desde el
fondo hasta la superficie, al igual que las burbujas en una copa de champán.
El método de clasificación deriva su nombre de la misma observación: se
denomina ordenamiento de burbuja.
6 8 2 4 10
Puntos clave
1. Puedes usar el método sort() para ordenar los elementos de una lista, por
ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst)
lst.sort ()
print(lst) # salida: [1, 2, 3, 4, 5]
2.También hay un método de lista llamado reverse() , que puedes usar para
invertir la lista, por ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst)
lst.reverse()
print (lst) # salida: [4, 2, 1, 3, 5]
Ejercicio 1
Ejercicio 3
a = "A"
b = "B"
c = "C"
d = ""
lst = [a, b, c, d]
lst.reverse ()
print(lst)
Revisar
Queremos que lo memorices, ya que puede afectar tus programas futuros y causar
graves problemas si se olvida o se pasa por alto.
El programa:
Lee estas dos líneas una vez más, la diferencia es esencial para comprender de que
vamos a hablar a continuación.
Rodajas Poderosas
Afortunadamente, la solución está al alcance de su mano: su nombre es rodaja. Una
rodaja es un elemento de la sintaxis de Python que permite hacer una copia nueva
de una lista, o partes de una lista. En realidad, copia el contenido de la lista, no el
nombre de la lista. Esto es exactamente lo que necesitas. Echa un vistazo al fragmento
de código a continuación:
lista1 = [1]
lista2 = lista1[:]
lista1[0] = 2
print(lista2)
Esta parte no visible del código descrito como [:] puede producir una lista
completamente nueva. Una de las formas más generales de la rodaja es la siguiente:
miLista[inicio:fin]
Como puedes ver, se asemeja a la indexación, pero los dos puntos en el interior hacen
una gran diferencia.
Una rodaja de este tipo crea una nueva lista (de destino), tomando elementos de
la lista de origen: los elementos de los índices desde el principio hasta el fin-1 .
Nota: no hasta el fin , sino hasta fin-1 . Un elemento con un índice igual a fin es el
primer elemento el cual no participa en la segmentación. Es posible utilizar valores
negativos tanto para el inicio como para el fin(al igual que en la indexación). Echa un
vistazo al fragmento:
miLista = [10, 8, 6, 4, 2]
nuevaLista = miLista [1:3]
print(nuevaLista)
La lista nuevaLista contendrá inicio-fin (3-1=2) elementos, los que tienen índices
iguales a 1 y 2 (pero no 3 )
miLista[inicio:fin]
Para repetir:
miLista = [10, 8, 6, 4, 2]
nuevaLista = miLista [1:-1]
print(nuevaLista)
miLista = [10, 8, 6, 4, 2]
nuevaLista = miLista [-1:1]
print(nuevaLista)
Rodajas: continuación
Si omites inicio en tu rodaja, se supone que deseas obtener un segmento que
comienza en el elemento con índice 0 .
miLista[:fin]
miLista[0:fin]
miLista = [10, 8, 6, 4, 2]
nuevaLista = miLista [:3]
print(nuevaLista)
Del mismo modo, si omites el fin en tu rodaja, se supone que deseas que el
segmento termine en el elemento con el índice len(miLista) .
miLista[inicio:]
miLista[inicio:len(miLista)]
miLista = [10, 8, 6, 4, 2]
nuevaLista = miLista[3:]
print(nuevaLista)
Rodajas: continuación
Como hemos dicho antes, el omitir inicio y fin hace una copia de toda la lista:
miLista = [10, 8, 6, 4, 2]
nuevLista = miLista [:]
print(nuevLista)
miLista = [10, 8, 6, 4, 2]
del miLista[1:3]
print(miLista)
miLista = [10, 8, 6, 4, 2]
del miLista[:]
print(miLista)
Echa un vistazo:
miLista = [10, 8, 6, 4, 2]
del miLista
print(miLista)
La función print() de la última línea del código provocará un error de ejecución.
Los operadores in y not
Python ofrece dos operadores muy poderosos, capaces de revisar la lista para
verificar si un valor específico está almacenado dentro de la lista o no.
elem in miLista
elem not in miLista
Puntos clave
1. Si tienes una lista l1 , la siguiente asignación: l2 = l1 no hace una copia de
la lista l1 , pero hace que las variables l1 y l2 apunten a la misma lista en
la memoria . Por ejemplo:
vehiculosDos = vehiculosUno
del vehiculosUno[0] # borra 'carro'
print(vehiculosDos) # salida: ['bicicleta', 'moto']
2. Si deseas copiar una lista o parte de la lista, puede hacerlo haciendo uso
de rodajas(slicing):
miLista = [1, 2, 3, 4, 5]
rodajaUno = miLista [2:]
rodajaDos = miLista [:2]
rodajaTres = miLista [-2:]
del miLista[:]
print(miLista) # elimina el contenido de la lista, genera: []
Ejercicio 1
del l1[0]
del l2[0]
print(l3)
Revisar
['C']
Ejercicio 2
del l1[0]
del l2
print(l3)
Revisar
['B', 'C']
Ejercicio 3
del l1[0]
del l2[:]
print(l3)
Revisar
[]
Ejercicio 4
del l1[0]
del l2[0]
print(l3)
Revisar
Ejercicio 5
Inserte in o not in en lugar de ??? para que el código genere el resultado
esperado.
Un tablero de ajedrez está compuesto de filas y columnas. Hay ocho filas y ocho
columnas. Cada columna está marcada con las letras de la A a la H. Cada línea está
marcada con un número del uno al ocho.
La ubicación de cada campo se identifica por pares de letras y dígitos. Por lo tanto,
sabemos que la esquina inferior derecha del tablero (la que tiene la torre blanca) es
A1, mientras que la esquina opuesta es H8.
fila = []
for i in range(8):
row.append(PEON_BLANCO)
Crea una lista que contiene ocho elementos que representan la segunda fila del
tablero de ajedrez: la que está llena de peones (supon que PEON_BLANCO es
un símbolo predefinido que representa un peón blanco).
Una comprensión de lista es en realidad una lista, pero se creó sobre la marcha
durante la ejecución del programa, y no se describe de forma estática.
Ejemplo # 1:
El fragmento de código genera una lista de diez elementos y rellena con cuadrados de
diez números enteros que comienzan desde cero (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
Ejemplo # 2:
El fragmento crea un arreglo de ocho elementos que contiene las primeras ocho
potencias del numero dos (1, 2, 4, 8, 16, 32, 64, 128)
Ejemplo # 3:
El fragmento hace una lista con solo los elementos impares de la lista cuadrados .
Entonces, si queremos crear una lista de listas que representan todo el tablero de
ajedrez, se puede hacer de la siguiente manera:
tablero = []
for i in range(8):
fila = [EMPTY for i in range(8)]
tablero.append(fila)
Nota:
La parte interior del bucle crea una fila que consta de ocho elementos(cada
uno de ellos es igual a EMPTY ) y lo agrega a la lista del tablero .
La parte exterior se repite ocho veces.
En total, la lista tablero consta de 64 elementos (todos iguales a EMPTY ).
Este modelo imita perfectamente el tablero de ajedrez real, que en realidad es una
lista de elementos de ocho elementos, todos ellos en filas individuales. Resumamos
nuestras observaciones:
Los elementos de las filas son campos, ocho de ellos por fila.
Los elementos del tablero de ajedrez son filas, ocho de ellos por tablero de
ajedrez.
Como las listas de comprensión puede ser anidadas, podemos acortar la creación del
tablero de la siguiente manera:
tablero = [[EMPTY for i in range(8)] for j in range(8)]
La parte interna crea una fila, y la parte externa crea una lista de filas.
Arreglos tridimensionales
Python no limita la profundidad de la inclusión lista en lista. Aquí puedes ver un
ejemplo de un arreglo tridimensional:
Imagina un hotel. Es un hotel enorme que consta de tres edificios, de 15 pisos cada
uno. Hay 20 habitaciones en cada piso. Para esto, necesitas un arreglo que pueda
recopilar y procesar información sobre las habitaciones ocupadas/libres.
Primer paso: El tipo de elementos del arreglo. En este caso, sería un valor booleano
( True / False ).
El primer índice ( 0 a 2 ) selecciona uno de los edificios; el segundo( 0 a 14 ) selecciona el
piso, el tercero ( 0 a 19 ) selecciona el número de habitación. Todas las habitaciones
están inicialmente desocupadas. Ahora ya puedes reservar una habitación para dos
recién casados: en el segundo edificio, en el décimo piso, habitación 14:
habitaciones[1][9][13] = True
habitaciones[0][4][1] = False
vacante = 0
if not habitaciones[2][14][numeroHabitacion]:
vacante += 1
La variable vacante contiene 0 si todas las habitaciones están ocupadas, o en dado
caso el número de habitaciones disponibles.
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.
El mensaje enviado a la consola por la función print() es siempre el mismo. El código
es funcional y no contiene errores, sin embargo imagina tendrías que hacer si tu jefe
pidiera cambiar el mensaje para que fuese mas cortés, por ejemplo, que comience con
la frase "Por favor," .
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.
Para que esto funcione, dicho código debe ser invocado cada vez que se requiera.
def nombreFuncion():
cuerpoFuncion
def mensaje():
print("Ingresa un valor: ")
def mensaje():
print("Ingresa un valor: ")
Se comienza aquí.
Se termina aquí.
def mensaje():
print("Ingresa un valor: ")
Se comienza aquí.
Ingresa un valor:
Se termina aquí.
def mensaje():
print("Ingresa un valor: ")
def mensaje():
print("Ingresa un valor: ")
mensaje = 1
def mensaje():
print("Ingresa un valor: ")
mensaje()
def mensaje():
print("Ingresa un valor: ")
mensaje()
a = int(input())
mensaje()
b = int(input())
mensaje()
c = int(input())
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.
# el cuerpo de la función
Se puede definir una función sin que haga uso de argumentos, por ejemplo:
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
def hola():
print("hola")
hola(5)
Revisar
Se genera una excepción (la excepción TypeError ) - la función hola() no toma
argumentos.
Recuerda que:
Existe una clara división entre estos dos mundos. Enriquezcamos la función
anterior agregándole un parámetro, se utilizará para mostrar al usuario el valor
de un número que la función pide. Se tendrá que modificar la definición def de
la función, así es como se ve ahora:
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):
print("Ingresa el número:", numero)
Esto significa que se esta invocando la función pero esta faltando el argumento.
def mensaje(numero):
print("Ingresa un número:", numero)
mensaje(1)
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 .
numero = 1234
mensaje(1)
print(numero)
Ingresa un número: 1
1234
Aquí esta:
Ejecuta el código, modifícalo, agrega mas parámetros y ve como esto afecta la salida.
miFuncion(1, 2, 3)
presentar("Luke", "Skywalker")
presentar("Jesse", "Quick")
presentar("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")
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 = .
suma(1, 2, 3)
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)
2 + 3 + 1 = 6
suma(3, c = 1, b = 2)
Vamos a analizarla:
3 + 2 + 1 = 6
suma(3, a = 1, b = 2)
suma(4, 3, c = 2)
Todo es correcto, pero el dejar solo un argumento con palabras clave es algo extraño -
¿Qué es lo que opinas?
Funciones con parámetros: mas detalles
En ocasiones ocurre que algunos valores de ciertos argumentos son mas utilizados
que otros. Dichos argumentos tienen valores predefinidos los cuales pueden ser
considerados cuando los argumentos correspondientes han sido omitidos. Uno de los
apellidos más comunes en Latinoamérica es González. Tomémoslo para el ejemplo.
Solo se tiene que colocar el nombre del parámetro seguido del signo de = y el valor
por default. Invoquemos la función de manera normal:
presentar("Jorge", "Pérez")
¿Puedes predecir la salida del programa? Ejecútalo y revisa si era lo esperado. ¿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")
no habrá errores, ambas invocaciones funcionarán, la consola mostrará los siguientes
resultados:
Pruébalo.
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 ()
presentar(segundoNombre="Rodríguez")
La salida es:
Pruébalo.
def hola(nombre):
print("Hola,", nombre)
hola("Greg")
holaTodos("Sebastián", "Felipe")
c = input("Calle: ")
cp = input("Código Postal: ")
cd = input("Ciudad: ")
resta(5, 2) # salida: 3
resta(2, 5) # salida: -3
Ejemplo 2
def resta(a, b):
print(a - b)
Ex. 3
def resta(a, b):
print(a - b)
Ejercicio 1
intro()
Revisar
Ejercicio 2
intro(b="Sergio López")
Revisar
Ejercicio 3
intro("Susan")
Revisar
suma(a=1, c=3)
Revisar
felizAñoNuevo()
Tres ...
Dos...
Uno...
¡Feliz año nuevo!
felizAñoNuevo(False)
Tres ...
Dos...
Uno ...
funcion():
return expresión
def funcion_aburrida():
return 123
x = funcion_aburrida()
Vamos a investigarlo.
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()
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:
print("Lo siento, no tienes ningún valor")
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 .
print(strangeFunction(2))
print(strangeFunction(1))
True
None
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
for elem in lst:
sum += elem
return sum
y se invoca así:
print(sumaDeLista([5, 4, 3]))
print(sumaDeLista(5))
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.
Puntos clave
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:
d = deseos()
# Ejemplo 1
def deseos():
print("Mis deseos")
return "¡Felíz Cumpleaños!"
# Ejemplo 2
def deseos():
print("Mis Deseos")
return "¡Feliz Cumpleaños!"
3. Puedes usar una lista como argumento de una función, por ejemplo:
def HolaaTodos(myList):
for nombre in 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!")
hola()
Revisar
Ejercicio 2
def isInt(data):
if type(data) == int:
return True
elif type(data) == float:
return False
print(isInt(5))
print(isInt(5.0))
print(isInt("5"))
Revisar
True
False
None
Ejercicio 3
def evenNumLst(ran):
lst = []
for num in range(ran):
if num % 2 == 0:
lst.append(num)
return lst
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
Vamos a conducir algunos experimentos para mostrar como es que Python define los
alcances y como los puedes utilizar para tu beneficio.
¿Conozco a la variable? 1
1
La respuesta es: una variable que existe fuera de una función tiene alcance
dentro del cuerpo de la función.Esta regla tiene una excepción muy importante.
Intentemos encontrarla. Hagamos un pequeño cambio al código:
def miFuncion():
var = 2
print("¿Conozco a la variable?", var)
var = 1
miFuncion()
print(var)
El resultado ha cambiado tambiénm el código arroja una salida con una ligera
diferencia:
¿Conozco a la variable? 2
1
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.
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?
La conclusión es obvia - al cambiar el valor del parámetro este no se propaga fuera
de la función (más específicamente, no cuando la variable es un valor escalar, como
en el ejemplo).
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)
[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:
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
var = 2
print(var) # salida: 2
def retVar():
global var
var = 5
return var
print(retVar()) # salida: 5
print(var) # salida: 5
Ejercicio 1
print(alt)
Revisar
Se arrojará una excepción NameError ( NameError: name 'alt' is not defined )
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
def fun():
global a
a = 2
print(a)
a = 3
fun()
print(a)
Revisar
Codifiquemos la función.
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.
Vamos a comprobar ambos y regresar None si cualquiera de los dos es incorrecto.
None
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.
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 .
0.3302
print(piespulgam(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
return lb * 0.45359237
return None
La respuesta es:
27.565214082533313
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.
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
Ejercicio 2
def fun(a):
if a > 30:
return 3
else:
return a + fun(a + 3)
print(fun(25))
Revisar
56
Tipos de secuencias y mutabilidad
Antes de comenzar a hablar acerca de tuplas y diccionarios, se deben
introducir dos conceptos importantes: tipos de secuencia y mutabilidad.
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.
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.
tupla1 = (1, 2, 4, 8)
print(tupla1)
print(tupla2)
(1, 2, 4, 8)
tuplaVacia = ()
tuplaUnElemento1 = (1, )
tuplaUnElemento2 = 1.,
1
1000
(10, 100, 1000)
(1, 10)
1
10
100
1000
miTupla.append(10000)
del miTupla[0]
miTupla[1] = -10
La salida es la siguiente:
9
(1, 10, 100, 1000, 10000)
(1, 10, 100, 1, 10, 100, 1, 10, 100)
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.
var = 123
t1 = (1, )
t2 = (2, )
t3 = (3, var)
print(dict)
print(numerosTelefono)
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.
{}
NOTA
print(dict['gato'])
print(numerosTelefono['Suzy'])
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' .
chat
5557654321
Ahora algo muy importante: No se puede utilizar una clave que no exista. Hacer
algo como lo siguiente:
print(numerosTelefono['presidente'])
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). El primero
de ellos es un método denominado keys() , el cual es parte de todo diccionario. El
método retorna o regresa una lista de todas las claves dentro del diccionario. Al
tener una lista de claves se puede acceder a todo el diccionario de una manera fácil y
útil.
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 .
cheval
chien
chat
Observa:
dict['gato'] = 'minou'
print(dict)
La salida es:
Nota: este es un comportamiento muy diferente comparado a las listas, las cuales no
permiten asignar valores a índices no existentes. A continuación se agrega un par
nuevo al diccionario, un poco extraño pero valido:
dict['cisne'] = 'cygne'
print(dict)
El ejemplo muestra como salida:
EXTRA
dict.update({"pato" : "canard"})
print(dict)
Eliminado claves
¿Puedes deducir como eliminar una clave de un diccionario?
A continuación un ejemplo:
EXTRA
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 = ()
miTup1 = 1,
print(type(miTup1)) # salida: <class 'tuple'>
miTup2 = 1
print(type(miTup2)) # salida: <class 'int'>
miTupla = 1, 2, 3,
del miTupla
print(miTupla) # NameError: name 'miTupla' is not defined
# 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
lst = [2, 4, 6]
print(lst) # salida: [2, 4, 6]
print(type(lst)) # salida: <class 'list'>
tup = tuple(lst)
print(tup) # outputs: (2, 4, 6)
print(type(tup)) # salida: <class 'tuple'>
tup = 1, 2, 3,
lst = list(tup)
miDictionario = {
clave1 : valor1,
clave2 : valor2,
clave3 : valor3,
}
polEspDict = {
"kwiat" : "flor",
"woda" : "agua",
"gleba" : "tierra"
}
elemento2 = polEspDict.get("woda")
print(elemento2) # salida: agua
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"
}
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
if "zamek" in polEspDict:
print("SI")
else:
print("NO")
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"
}
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
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
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 = {}
print(d3)
Revisar
Solución Muestra:
d1 = {'Adam Smith':'A', 'Judy Paxton':'B+'}
d3 = {}
d3.update(elemento)
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)
print(colDict)
Ejercicio 7
copyMiDict = myDict.copy()
miDict.clear()
print(copyMiDict)
Revisar
Ejercicio 8
¿Cuál es la salida del siguiente programa?
colores = {
Revisar
rojo : (255, 0, 0)