2 Variables, operadores y expresiones
En Python podemos representar datos mediante variables y operar con ellos utilizando distintos tipos de operadores. Estas herramientas constituyen la base para traducir relaciones matemáticas y condiciones lógicas a código.
En este capítulo estudiaremos variables, tipos de datos, conversiones, operadores aritméticos, relacionales y lógicos, y la construcción de expresiones. Finalmente, integraremos estos conceptos en algunos problemas sencillos de ingeniería.
2.1Variables¶
Cuando escribimos un programa necesitamos una forma de identificar los valores con los que vamos a trabajar. Por ejemplo, en un cálculo de ingeniería podríamos necesitar representar una masa, una velocidad o una temperatura. Para ello podemos utilizar variables.
En Python, una variable es un nombre que hace referencia a un objeto. La asociación entre un nombre y un objeto se realiza mediante una asignación, utilizando el operador =:
masa = 25
velocidad = 10.0
nombre = "Catalina"En estas instrucciones, los nombres masa, velocidad y nombre quedan asociados con los valores 25, 10.0 y "Catalina", respectivamente.
Una forma útil de visualizar este proceso consiste en pensar que el nombre de una variable actúa como una etiqueta asociada a un objeto:
En este sentido, la instrucción
masa = 25puede interpretarse como: asocia el nombre masa con el objeto que representa el valor 25.
2.1.1Reasignación de variables¶
Una variable puede asociarse posteriormente con otro objeto mediante una nueva asignación:
masa = 25
masa = 30Después de ejecutar la segunda instrucción, el nombre masa hace referencia al valor 30.
Esto pone de manifiesto una diferencia importante entre la asignación en programación y la igualdad matemática. En Python, el símbolo = no establece una igualdad, sino que realiza una asignación.
Por ejemplo:
x = 5
x = x + 1En matemáticas, una expresión como
no puede cumplirse. Sin embargo, en Python la segunda instrucción tiene otro significado: primero se evalúa la expresión situada a la derecha, x + 1, y después el resultado se vuelve a asociar con el nombre x.
Así, después de ejecutar las instrucciones anteriores, x queda asociado con el valor 6.
2.1.2Varios nombres y asignación múltiple¶
Considera ahora el siguiente ejemplo:
m = 7
n = mPrimero se asocia el nombre m con el valor 7. Después, mediante la asignación n = m, el nombre n queda asociado con el mismo objeto al que hace referencia m.
Por ahora basta con comprender que una variable es un nombre asociado con un objeto. Más adelante veremos que esta característica tiene consecuencias importantes cuando trabajamos con estructuras de datos y otros tipos de objetos.
Python también permite realizar varias asignaciones en una sola instrucción:
masa, velocidad = 25, 10En este caso, masa queda asociado con 25 y velocidad con 10. Para este caso, la instrucción anterior es equivalente a escribir:
masa = 25
velocidad = 102.1.3Reglas para nombrar variables¶
Los nombres de variables deben cumplir algunas reglas sintácticas.
Los nombres pueden contener letras, números y guiones bajos (_):
esfuerzo_axial = 150e6
diametro_01 = 30e-3
nombre = "Ximena"Un nombre puede comenzar con una letra o con un guion bajo, pero no con un número. Por ejemplo:
temperatura = 35
deformacion_unitaria = 300e-6son nombres válidos, mientras que:
30_presion = 30e3 Cell In[84], line 1
30_presion = 30e3
^
SyntaxError: invalid decimal literal
produce un error de sintaxis.
Los espacios tampoco están permitidos en los nombres de variables. Por ejemplo:
modulo de elasticidad = 70e9 Cell In[87], line 1
modulo de elasticidad = 70e9
^
SyntaxError: invalid syntax
no es válido. Si queremos utilizar un nombre formado por varias palabras, podemos separarlas mediante guiones bajos:
modulo_de_elasticidad = 70e9Python también distingue entre letras mayúsculas y minúsculas. Por tanto:
nombre = "Ana"
Nombre = "Paola"
NOMBRE = "Ximena"define tres variables diferentes.
Esta característica suele expresarse diciendo que Python es un lenguaje case sensitive.
2.1.4Palabras clave¶
Algunas palabras forman parte de la sintaxis del lenguaje y no pueden utilizarse como nombres de variables. Estas palabras se conocen como palabras clave o keywords.
Por ejemplo:
lambda = 1500 Cell In[98], line 1
lambda = 1500
^
SyntaxError: invalid syntax
produce un SyntaxError, ya que lambda es una palabra clave de Python.
La lista de palabras clave disponibles en la versión de Python que se esté utilizando puede consultarse mediante el módulo keyword:
import keyword
print(keyword.kwlist)Entre ellas se encuentran palabras como if, else, for, while, def, class, True, False y None.
2.1.5Buenas prácticas para nombrar variables¶
Además de cumplir las reglas sintácticas, es recomendable elegir nombres que hagan que el código sea fácil de leer y comprender.
En general, conviene utilizar nombres descriptivos. Por ejemplo:
diametro = 0.03suele ser más informativo que:
d = 0.03aunque los nombres cortos pueden resultar adecuados cuando tienen un significado claro en el contexto, como ocurre frecuentemente con variables matemáticas.
En Python es habitual utilizar la convención denominada snake_case, que consiste en escribir las palabras en minúsculas y separarlas mediante guiones bajos:
velocidad_angular = 10
temperatura_ambiente = 25
modulo_de_elasticidad = 70e9Esta convención facilita la lectura de nombres formados por varias palabras y es la recomendada habitualmente para variables y funciones en Python.
También conviene evitar utilizar nombres que Python ya proporciona para funciones o tipos incorporados. Por ejemplo:
sum = 10es una instrucción válida, pero hace que el nombre sum deje de referirse a la función incorporada que permite sumar elementos.
Por esta razón, suele ser conveniente evitar nombres como:
sum
print
list
int
float
typecuando su uso pueda ocultar las funciones o tipos correspondientes.
Puedes encontrar recomendaciones adicionales sobre el estilo de los nombres en la guía oficial PEP 8 – Style Guide for Python Code.
Hasta ahora hemos utilizado valores enteros, decimales y cadenas de caracteres sin detenernos en las diferencias entre ellos. En la siguiente sección estudiaremos los tipos de datos básicos disponibles en Python.
2.2Tipos de datos básicos¶
En la sección anterior vimos que una variable es un nombre asociado con un objeto. Dependiendo de la información que representen, los objetos pueden ser de distintos tipos: números enteros, números de punto flotante, valores lógicos, texto, entre otros.
El tipo de dato indica qué clase de valor representa un objeto y qué operaciones pueden realizarse con él.
Podemos consultar el tipo de un objeto mediante la función type:
masa = 25
temperatura = 24.5
nombre = "motor"type(masa)inttype(temperatura)floattype(nombre)strEn estos casos, Python identifica los tipos int, float y str, respectivamente.
A continuación veremos algunos de los tipos básicos que utilizaremos con frecuencia a lo largo de estos apuntes.
2.2.1Números enteros: int¶
Los números enteros se representan mediante el tipo int. Este tipo permite trabajar con valores positivos, negativos o iguales a cero, siempre que no tengan parte decimal.
Por ejemplo:
numero_dientes = 24
muestras = 1000
indice = -1Podemos comprobar el tipo de uno de estos valores mediante type:
type(numero_dientes)intLos valores de tipo int son adecuados para representar cantidades discretas, como el número de elementos de un sistema, la cantidad de muestras adquiridas o el número de iteraciones de un procedimiento.
2.2.2Números de punto flotante: float¶
Los números que incluyen una parte decimal se representan habitualmente mediante el tipo float.
Por ejemplo:
temperatura = 23.5
longitud = 0.125
densidad = 7850.0También es posible escribir números de punto flotante mediante notación científica:
modulo_de_elasticidad = 70e9
deformacion = 250e-6Las expresiones anteriores corresponden a
y
respectivamente.
Este tipo de notación resulta especialmente útil en ingeniería, donde es frecuente trabajar con magnitudes muy grandes o muy pequeñas. Conviene notar que un valor como 70e9 es de tipo float, aunque no incluya explícitamente un punto decimal.
type(modulo_de_elasticidad)float2.2.3Números complejos: complex¶
Python también permite trabajar directamente con números complejos mediante el tipo complex.
Un número complejo puede escribirse utilizando j para representar la unidad imaginaria:
z = 3 + 4j
type(z)complexEn matemáticas es frecuente utilizar para representar la unidad imaginaria. En Python se utiliza j, una notación habitual también en áreas como la ingeniería eléctrica.
Por ejemplo, una impedancia eléctrica podría representarse mediante:
impedancia = 10 + 5jPor ahora basta con reconocer la forma de escritura de este tipo de valores.
2.2.4Valores booleanos: bool¶
El tipo bool representa valores lógicos y sólo puede tomar dos valores:
True
FalsePor ejemplo:
motor_encendido = True
alarma_activa = Falsetype(motor_encendido)booltype(alarma_activa)boolLos valores booleanos serán especialmente importantes cuando trabajemos con comparaciones y condiciones. Más adelante veremos que expresiones como las comparaciones producen precisamente resultados de tipo bool.
Es importante escribir True y False con la primera letra en mayúscula, ya que estas palabras forman parte del lenguaje Python.
2.2.5Cadenas de caracteres: str¶
Python utiliza el tipo str para representar texto. Una cadena de caracteres puede escribirse delimitando su contenido mediante comillas simples o dobles:
material = "acero"
unidad = 'MPa'Por el momento únicamente necesitamos reconocer str como uno de los tipos básicos disponibles en Python. En un capítulo posterior estudiaremos con mayor detalle cómo crear, manipular y procesar cadenas de caracteres.
2.2.6Una variable puede referirse a objetos de distintos tipos¶
Una variable no queda asociada permanentemente con un único tipo de dato.
Considera el siguiente ejemplo:
dato = 10
type(dato)intInicialmente, dato hace referencia a un objeto de tipo int. Podemos realizar una nueva asignación:
dato = 10.5
type(dato)floatAhora el mismo nombre hace referencia a un objeto de tipo float.
También podríamos escribir:
dato = "temperatura"
type(dato)stry dato pasaría a hacer referencia a una cadena de caracteres.
Este comportamiento suele describirse diciendo que Python utiliza tipado dinámico: el nombre de una variable no queda fijado a un único tipo, sino que puede referirse a objetos de distintos tipos a lo largo de la ejecución de un programa.
En ocasiones necesitaremos transformar un valor de un tipo a otro. Por ejemplo, convertir un número entero en uno de punto flotante o transformar una cadena que contiene dígitos en un valor numérico. Este será el tema de la siguiente sección.
Un resumen de los tipos de datos
Los tipos presentados en esta sección pueden resumirse de la siguiente manera:
| Tipo | Ejemplo | Representa |
|---|---|---|
int | 25 | números enteros |
float | 3.14 | números de punto flotante |
complex | 2 + 3j | números complejos |
bool | True | valores lógicos |
str | "motor" | texto |
Estos no son los únicos tipos de datos disponibles en Python, pero son suficientes para comenzar a construir expresiones y resolver problemas sencillos.
2.3Conversión de tipos¶
En algunas situaciones necesitamos transformar un valor de un tipo de dato a otro. Por ejemplo, podemos convertir un número entero en uno de punto flotante, transformar una cadena que contiene un número en un valor numérico o convertir un valor en texto.
Python proporciona varias funciones incorporadas para realizar estas conversiones de manera explícita:
| Función | Conversión |
|---|---|
int(x) | convierte x a un número entero |
float(x) | convierte x a un número de punto flotante |
complex(x) | convierte x a un número complejo |
bool(x) | convierte x a un valor booleano |
str(x) | convierte x a una cadena de caracteres |
No todas las conversiones son posibles y, en algunos casos, una conversión puede provocar pérdida de información.
2.3.1Conversión a números enteros¶
La función int permite convertir valores compatibles al tipo int. Por ejemplo:
int(3.8)3Al convertir un número de punto flotante a entero, Python elimina la parte decimal:
int(7.9)7De manera similar:
int(-2.8)-2Por tanto, int no realiza un redondeo, sino que elimina la parte fraccionaria y conserva únicamente la parte entera.
También es posible convertir una cadena de caracteres si su contenido representa correctamente un número entero:
int("25")25En este caso, el resultado es el número entero 25.
Sin embargo, una cadena como:
int("25.5")---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[261], line 1
----> 1 int("25.5")
ValueError: invalid literal for int() with base 10: '25.5'no puede convertirse directamente a int, ya que "25.5" representa un número con parte decimal.
2.3.2Conversión a números de punto flotante¶
La función float permite convertir valores compatibles al tipo float.
Por ejemplo:
float(5)5.0float("3.14")3.14float("1.5e3")1500.0La conversión desde cadenas resulta especialmente útil cuando los datos numéricos provienen de texto, por ejemplo, de una entrada proporcionada por un usuario o de un archivo.
2.3.3Conversión a números complejos¶
La función complex permite crear números complejos a partir de valores compatibles. Por ejemplo:
complex(5)(5+0j)También podemos especificar directamente la parte real y la parte imaginaria:
complex(3, 4)(3+4j)O a partir de un string:
complex("-4+2j")(-4+2j)2.3.4Conversión a valores booleanos¶
La función bool permite convertir otros valores al tipo bool. Para valores numéricos, el comportamiento básico es sencillo:
bool(0)Falsebool(1)Truebool(-3)Truebool(2.5)TrueEl número cero se convierte en False, mientras que cualquier valor numérico distinto de cero se convierte en True. Más adelante veremos que otros tipos de objetos también pueden interpretarse como verdaderos o falsos cuando se utilizan en condiciones.
2.3.5Conversión a cadenas de caracteres¶
La función str permite obtener una representación textual de un valor. Por ejemplo:
str(25)'25'str(3.14)'3.14'str(True)'True'Es importante distinguir entre un valor numérico y una cadena que contiene los mismos caracteres. Por ejemplo:
25y:
"25"no representan el mismo tipo de dato. Podemos comprobarlo mediante type:
type(25)inttype("25")strEl primero es un objeto de tipo int, mientras que el segundo es un objeto de tipo str.
2.3.6Conversiones que pueden perder información¶
Una conversión no siempre conserva toda la información del valor original. Por ejemplo:
temperatura = 23.8
temperatura_entera = int(temperatura)Después de la conversión:
temperatura_entera23La parte decimal se ha perdido.
Además, una conversión puede fallar si el valor no es compatible con el tipo de destino. Por ejemplo:
float("temperatura")---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[356], line 1
----> 1 float("temperatura")
ValueError: could not convert string to float: 'temperatura'produce un error porque la cadena "temperatura" no contiene una representación válida de un número.
2.3.7Operaciones entre distintos tipos numéricos¶
No siempre es necesario realizar una conversión explícita antes de combinar valores numéricos de distintos tipos.
Por ejemplo:
2 + 3.55.5combina un valor de tipo int con uno de tipo float. El resultado es de tipo float:
type(2 + 3.5)floatCuando una operación combina ciertos tipos numéricos compatibles, Python determina automáticamente un tipo adecuado para representar el resultado.
Esto no significa que los objetos originales cambien de tipo. En el ejemplo anterior, 2 continúa siendo un valor de tipo int; simplemente el resultado de la operación se representa mediante un float.
Algo similar ocurre al combinar números reales con números complejos:
2 + 3j(2+3j)En este caso, el resultado es de tipo complex.
2.4Operadores aritméticos¶
Los operadores aritméticos permiten realizar operaciones matemáticas con valores numéricos. En Python podemos utilizarlos directamente con números o con variables que hagan referencia a valores numéricos.
Por ejemplo:
masa = 25
velocidad = 10
masa * velocidad250En este caso, el operador * realiza una multiplicación entre los valores asociados con masa y velocidad. Los principales operadores aritméticos disponibles en Python son:
| Operador | Operación | Ejemplo |
|---|---|---|
+ | suma | a + b |
- | resta | a - b |
* | multiplicación | a * b |
/ | división | a / b |
// | división entera | a // b |
% | residuo | a % b |
** | potencia | a ** b |
2.4.1Suma, resta y multiplicación¶
Los operadores +, - y * representan las operaciones aritméticas habituales de suma, resta y multiplicación.
Por ejemplo:
a = 12
b = 5a + b17a - b7a * b60También pueden utilizarse para representar relaciones matemáticas sencillas. Por ejemplo, si una fuerza se calcula mediante
podemos escribir:
masa = 10
aceleracion = 9.81
fuerza = masa * aceleracionDe manera similar, el área de una superficie rectangular puede calcularse mediante:
base = 3.5
altura = 2.0
area = base * altura2.4.2División, división entera y residuo¶
Python dispone de tres operadores relacionados con la división: /, // y %.
El operador / realiza una división ordinaria:
10 / 42.5El operador / produce un resultado de tipo float, incluso cuando la división es exacta:
10 / 25.0El operador // realiza una división entera o floor division:
23 // 54y el operador % devuelve el residuo de la división:
23 % 53En este caso, el primer resultado es 4 y el segundo es 3. Esto significa que 23 contiene 4 grupos completos de 5, con 3 unidades restantes.
2.4.3Potenciación¶
El operador ** se utiliza para elevar un número a una potencia:
2 ** 416En expresiones de ingeniería es frecuente encontrar potencias. Por ejemplo, la energía cinética de una partícula está dada por:
En Python podemos escribir:
masa = 10
velocidad = 5
energia_cinetica = 0.5 * masa * velocidad**22.4.4Operadores unarios¶
Los símbolos + y - también pueden actuar sobre un único valor. En este caso se denominan operadores unarios.
Por ejemplo:
x = 5+x5-x-5El operador - cambia el signo del valor, mientras que + conserva su signo.
Estos operadores permiten representar directamente cantidades positivas o negativas:
velocidad = -12.5
aceleracion = 9.812.4.5Uso de paréntesis¶
Los paréntesis permiten agrupar operaciones y hacer explícito el orden en que queremos evaluarlas.
Por ejemplo:
a = 2
b = 3
c = 4
(a + b) * c20no produce el mismo resultado que:
a + b * c32Python sigue reglas de precedencia de operadores para determinar el orden de evaluación de una expresión. Estudiaremos estas reglas con mayor detalle en una sección posterior.
Mientras tanto, los paréntesis pueden utilizarse siempre que ayuden a expresar con claridad la operación que queremos realizar.
2.4.6Operadores de asignación aumentada¶
En algunas situaciones necesitamos actualizar el valor asociado con una variable utilizando su valor actual.
Por ejemplo:
contador = 10
contador = contador + 1Python permite escribir esta operación de manera más compacta:
contador = 10
contador += 1La instrucción:
contador += 1es una forma abreviada de:
contador = contador + 1Existen formas similares para otras operaciones frecuentes:
x = 5x += 1
x6x -= 1
x5x *= 2
x10x /= 2
x5.0También existen asignaciones aumentadas asociadas con otros operadores aritméticos, como //=, %= y **=. Estas formas serán especialmente útiles más adelante, cuando trabajemos con estructuras de control y algoritmos que actualizan repetidamente el valor de una variable.
Los operadores aritméticos nos permiten construir expresiones numéricas a partir de valores y variables. En la siguiente sección veremos operadores que permiten comparar valores y obtener resultados booleanos.
2.5Operadores relacionales¶
Los operadores relacionales permiten comparar valores. Una comparación es una expresión cuyo resultado es un valor booleano, es decir, True o False. Los principales operadores relacionales disponibles en Python son:
| Operador | Significado | Ejemplo |
|---|---|---|
== | igual a | a == b |
!= | diferente de | a != b |
< | menor que | a < b |
> | mayor que | a > b |
<= | menor o igual que | a <= b |
>= | mayor o igual que | a >= b |
Por ejemplo:
temperatura = 32
temperatura > 30TrueLa expresión anterior produce True, ya que el valor asociado con temperatura es mayor que 30.
Podemos comprobar el tipo del resultado:
type(temperatura > 30)bool2.5.1Igualdad y diferencia¶
El operador == permite comprobar si dos valores son iguales:
velocidad = 0 # creamos la variable velocidad y le asignamos un valor 0
velocidad == 0 # hacemos la comparación usando el operador ==TruePor otro lado, el operador != permite comprobar si dos valores son diferentes:
velocidad != 0False2.5.2Comparaciones de orden¶
Los operadores <, >, <= y >= permiten comparar el orden relativo entre valores.
Por ejemplo:
temperatura = 28
temperatura < 30Truetemperatura >= 25TrueEstas comparaciones resultan útiles para representar límites físicos u operativos.
Por ejemplo:
presion = 450
presion_maxima = 500
presion <= presion_maximaTrueLa expresión anterior comprueba si la presión se encuentra por debajo o exactamente en el límite máximo establecido.
2.5.3Comparaciones encadenadas¶
Python permite escribir varias comparaciones dentro de una misma expresión. Por ejemplo, para comprobar si una temperatura se encuentra entre 20 y 30 podemos escribir:
temperatura = 25
20 < temperatura < 30TrueEsta forma se corresponde de manera natural con la notación matemática:
La expresión produce True únicamente cuando la temperatura es mayor que 20 y menor que 30.
También es posible incluir los valores límite:
20 <= temperatura <= 30TrueEn este caso, la expresión también será verdadera cuando temperatura sea exactamente 20 o 30.
2.5.4Comparaciones como expresiones booleanas¶
El resultado de una comparación puede almacenarse en una variable.
Por ejemplo:
temperatura = 85
temperatura_segura = temperatura <= 90Ahora temperatura_segura hace referencia a un valor booleano:
temperatura_seguraTruePodemos comprobar su tipo:
type(temperatura_segura)boolEste tipo de expresiones será especialmente importante más adelante, ya que permiten representar condiciones como:
una temperatura dentro de un intervalo;
una presión por debajo de un límite;
una velocidad igual a cero;
una magnitud mayor o menor que cierto valor de referencia.
En la siguiente sección veremos cómo combinar varias expresiones booleanas mediante los operadores lógicos and, or y not.
2.6Operadores lógicos¶
Los operadores lógicos permiten combinar o negar expresiones booleanas. En Python, los principales operadores lógicos son:
| Operador | Significado |
|---|---|
and | produce True si ambas expresiones son verdaderas |
or | produce True si al menos una expresión es verdadera |
not | niega el valor lógico de una expresión |
Estos operadores resultan especialmente útiles cuando una condición depende de más de una comparación.
2.6.1Operador and¶
El operador and produce True únicamente cuando las dos expresiones que combina son verdaderas.
Por ejemplo:
presion = 450
temperatura = 80
presion < 500 and temperatura < 90TrueLa expresión anterior produce True porque ambas condiciones se cumplen.
También podríamos escribir:
temperatura = 25
temperatura > 20 and temperatura < 30Trueaunque, para expresar intervalos, suele ser más clara una comparación encadenada:
20 < temperatura < 30True2.6.2Operador or¶
El operador or produce True cuando al menos una de las expresiones que combina es verdadera.
Por ejemplo:
presion = 520
temperatura = 85
presion > 500 or temperatura > 90TrueEn este caso, la expresión produce True porque la primera condición se cumple.
El resultado también sería True si ambas condiciones fueran verdaderas.
Este tipo de expresión resulta útil cuando basta con que se cumpla una de varias condiciones para considerar que una situación requiere atención.
activo = True
not activoFalseDe manera similar:
alarma_activa = False
not alarma_activaTrueEl operador not también puede aplicarse al resultado de una comparación:
temperatura = 25
not (temperatura > 30)TruePrimero se evalúa la comparación temperatura > 30 y después se niega su resultado.
2.6.4Combinación de operadores lógicos¶
Los operadores lógicos pueden combinarse para construir expresiones más complejas.
Por ejemplo, supongamos que queremos comprobar si un sistema está activo y, además, si alguna de dos magnitudes supera su límite:
sistema_activo = True
temperatura = 95
presion = 450
sistema_activo and (temperatura > 90 or presion > 500)TrueEn este caso, los paréntesis agrupan las condiciones relacionadas con la temperatura y la presión.
Cuando una expresión combina varios operadores lógicos, los paréntesis ayudan a hacer explícita la intención y a mejorar la legibilidad del código.
Python dispone de reglas de precedencia para determinar el orden de evaluación de los operadores. Estudiaremos estas reglas con mayor detalle en la siguiente sección.
2.6.5Expresiones lógicas y resultados booleanos¶
Al igual que las comparaciones, una expresión lógica produce un valor de tipo bool.
Por ejemplo:
temperatura = 25
presion = 400
condicion_segura = temperatura < 90 and presion < 500Ahora condicion_segura hace referencia a True porque ambas condiciones se cumplen.
Este tipo de expresiones será fundamental en el siguiente capítulo, donde utilizaremos valores booleanos para decidir qué instrucciones se ejecutan y cuántas veces se repiten determinadas operaciones.
En la siguiente sección integraremos variables, valores y operadores para estudiar con mayor detalle cómo se construyen y evalúan las expresiones en Python.
2.7Expresiones¶
Una expresión es una porción de código que Python evalúa para producir un valor.
Las expresiones pueden ser muy sencillas:
2 + 35o pueden combinar variables, valores y varios operadores:
masa = 10
velocidad = 5
0.5 * masa * velocidad**2125.0También pueden producir distintos tipos de resultados. Por ejemplo:
temperatura = 25
temperatura > 30FalseAquí se produce un valor de tipo de tipo booleano.
2.7.1Evaluación de expresiones y precedencia de operadores¶
Cuando Python encuentra una expresión, evalúa sus componentes siguiendo determinadas reglas hasta obtener un resultado.
Por ejemplo:
a = 4
b = 3
a + 2 * b10En este caso, Python evalúa primero la multiplicación y después la suma, por lo que el resultado es 10.
Esto ocurre porque los operadores tienen distintos niveles de precedencia. La precedencia determina qué operaciones se evalúan primero dentro de una expresión.
Para los operadores estudiados hasta ahora, podemos considerar de manera simplificada el siguiente orden:
| Precedencia | Operadores |
|---|---|
| mayor | paréntesis |
** | |
+x, -x | |
*, /, //, % | |
+, - | |
<, <=, >, >=, ==, != | |
not | |
and | |
| menor | or |
Por ejemplo:
2 * 3 + 410no produce el mismo resultado que:
(2 + 3) * 420En la primera expresión se evalúa primero la multiplicación, mientras que en la segunda los paréntesis fuerzan a evaluar primero la suma.
2.7.2Traducción de expresiones matemáticas a Python¶
Una necesidad frecuente en ingeniería consiste en traducir relaciones matemáticas a expresiones válidas de Python. Por ejemplo, para un movimiento rectilíneo uniformemente acelerado sabemos que la posición está dada por:
La expresión anterior puede escribirse en Python como:
x0 = 0
v0 = 2
a = 0.8
t = 1.5
x = x0 + v0 * t + 0.5 * a * t**2
x3.9V = 12
R = 1000
I = V / R
I0.0122.7.3Legibilidad de las expresiones¶
Una expresión puede ser correcta y, al mismo tiempo, difícil de leer.
Por ejemplo:
ec=0.5*m*v**2puede producir el resultado esperado, pero:
energia_cinetica = 0.5 * masa * velocidad**2hace más evidente el significado de las cantidades involucradas.
En cálculos de ingeniería, utilizar nombres descriptivos ayuda a conservar la interpretación física de las expresiones y facilita detectar errores.
Esto no significa que los nombres cortos deban evitarse siempre. En contextos matemáticos donde su significado es claro, nombres como x, y, t o v pueden resultar completamente adecuados.
Los espacios alrededor de los operadores también contribuyen a mejorar la lectura:
fuerza = masa * aceleracionsuele ser más legible que:
fuerza=masa*aceleracion2.7.4Consideraciones sobre números de punto flotante¶
Como mencionamos anteriormente, los valores de tipo float tienen precisión finita.
Considera el siguiente ejemplo:
0.1 + 0.20.30000000000000004Observa que el resultado no es exactamente 0.3. Esto ocurre porque muchos números decimales no pueden representarse exactamente mediante la representación binaria utilizada internamente.
Por esta razón:
0.1 + 0.2 == 0.3FalseEste comportamiento no implica que Python esté realizando incorrectamente la operación, sino que es una consecuencia de la precisión finita de los números de punto flotante.
Por ahora basta con recordar que muchos valores de tipo float representan aproximaciones de números reales.
2.7.5Magnitudes físicas y unidades¶
Cuando utilizamos Python para resolver problemas de ingeniería, las variables suelen representar magnitudes físicas.
Por ejemplo:
masa = 10 # kg
velocidad = 5 # m/s
energia_cinetica = 0.5 * masa * velocidad**2En este caso, podemos interpretar el resultado como una energía expresada en joules.
Sin embargo, Python únicamente conoce los valores numéricos involucrados. No sabe que masa está expresada en kilogramos ni que velocidad está expresada en metros por segundo.
Por ejemplo:
longitud = 5 # m
tiempo = 2 # s
longitud + tiempo7es una expresión válida para Python porque ambas variables hacen referencia a valores numéricos, aunque sumar una longitud y un tiempo no tenga sentido físico.
Por esta razón, al realizar cálculos de ingeniería es responsabilidad de quien escribe el programa mantener la consistencia entre las magnitudes y las unidades utilizadas.
En la siguiente sección utilizaremos variables, tipos de datos y operadores de manera conjunta para resolver algunos problemas sencillos de ingeniería.
2.8Problemas resueltos¶
En esta sección integraremos los conceptos desarrollados a lo largo del capítulo mediante algunos problemas sencillos de ingeniería. En cada caso seguiremos una idea general:
Identificar los datos disponibles
Representarlos mediante variables
Plantear las relaciones matemáticas necesarias
Traducirlas a expresiones de Python
Interpretar los resultados obtenidos
En algunos problemas más simples nos centraremos únicamente en traducir una expresión matemática a una expresión de Python.
2.8.1Movimiento uniformemente acelerado¶
Una partícula parte de una posición inicial de 2 m, con una velocidad inicial de 3 m/s y una aceleración constante de 1.5 m/s². Determina su posición después de 4 s.
La posición de una partícula con aceleración constante puede calcularse mediante:
Definimos los datos del problema:
x0 = 2.0 # m
v0 = 3.0 # m/s
a = 1.5 # m/s^2
t = 4.0 # sLa expresión correspondiente en Python es:
x = x0 + v0 * t + 0.5 * a * t**2
x26.0Se obtiene una posición final de 26 m.
Este ejemplo muestra cómo una expresión matemática con sumas, multiplicaciones y potencias puede traducirse directamente a Python utilizando los operadores correspondientes.
2.8.2Energía mecánica¶
Una masa de 4 kg se encuentra a una altura de 6 m y se mueve con una velocidad de 3 m/s. Calcula su energía cinética, su energía potencial gravitatoria y su energía mecánica total.
La energía cinética está dada por:
mientras que la energía potencial gravitatoria puede calcularse mediante:
La energía mecánica total es:
Utilizando:
definimos los datos:
m = 4.0 # kg
h = 6.0 # m
v = 3.0 # m/s
g = 9.81 # m/s^2Podemos calcular primero cada contribución de manera independiente:
K = 1/2 * m * v ** 2
U = m * g * hy posteriormente calcular la energía total:
E = K + U Consultamos los resultados:
E # energía total253.44K # energía cinética18.0U # energía potencial235.442.8.3Circuito eléctrico y límites de operación¶
Una resistencia de 8 Ω se conecta a una fuente de 24 V. Determina la corriente y la potencia eléctrica. Después, comprueba si la corriente supera un límite de 2.5 A o si la potencia supera un límite de 60 W.
De acuerdo con la ley de Ohm:
y la potencia eléctrica puede calcularse mediante:
Definimos los valores:
voltaje = 24.0 # V
resistencia = 8.0 # ohm
limite_corriente = 2.5 # A
limite_potencia = 60.0 # WCalculamos la corriente y la potencia eléctrica:
corriente = voltaje / resistencia
potencia = voltaje * corrienteAhora podemos comprobar cada límite por separado:
corriente > limite_corrienteTruepotencia > limite_potenciaTrueSi queremos determinar si al menos una de las dos magnitudes supera su límite, podemos utilizar el operador or:
fuera_de_limites = (
corriente > limite_corriente
or potencia > limite_potencia
)
fuera_de_limitesTrueEl resultado es True, lo que indica que el circuito no cumple con los límites establecidos.
Este ejemplo combina expresiones aritméticas, comparaciones y operadores lógicos dentro de un mismo problema.
2.8.4Condiciones de operación de un sistema¶
En cierto proceso, la presión debe mantenerse como máximo en 500 kPa y la temperatura como máximo en 90 °C.
Para un estado determinado se tienen:
presion = 470.0 # kPa
temperatura = 82.0 # °C
presion_maxima = 500.0 # kPa
temperatura_maxima = 90.0 # °CPodemos comprobar cada condición por separado:
presion <= presion_maxima
temperatura <= temperatura_maximaTruePara considerar que el sistema se encuentra dentro de condiciones seguras, ambas expresiones deben ser verdaderas. Por tanto, podemos escribir:
condicion_segura = (
presion <= presion_maxima
and temperatura <= temperatura_maxima
)
condicion_seguraTruePodemos representar también la condición opuesta mediante:
requiere_atencion = not condicion_segura
requiere_atencionFalseque en este caso produce False.
Ahora supongamos que la temperatura aumenta en 10 grados:
temperatura += 10Si evaluamos nuevamente:
condicion_segura = (
presion <= presion_maxima
and temperatura <= temperatura_maxima
)
condicion_seguraFalseel resultado será False, porque ya no se cumplen simultáneamente las dos condiciones.
Este tipo de expresiones booleanas será especialmente importante en el siguiente capítulo, cuando utilicemos estructuras de control para ejecutar diferentes acciones dependiendo del estado de un sistema.
2.8.5Aproximando ¶
La siguiente expresión nos permite aproximar el valor de hasta las millonésimas:
Escribe la expresión correspondiente en Python.
En Python podemos escribir dicha expresión como:
pi = 3 + (8/60) + (29/60**2) + (44/60**3)
pi3.1415925925925925Es importante tener en cuenta que en este caso los paréntesis no son realmente necesarios, observa:
pi = 3 + 8/60 + 29/60**2 + 44/60**3
pi3.1415925925925925Sin embargo el uso de estos suele aportar una mayor legibilidad a las expresiones matemáticas que estamos escribiendo. Hay que tener mucho cuidado con los paréntesis y la precedencia de los operadores, veamos el ejemplo siguiente:
pi = 3 + (8/60) + (29/60)**2 + (44/60)**3
pi3.7613148148148148Observa que la expresión colocada ya no corresponde con la aproximación de descrita con anterioridad, sino más bien correspondería a:
2.8.6Una estrategia general para resolver problemas sencillos¶
Los ejemplos anteriores muestran una forma de trabajo que puede aplicarse a muchos problemas básicos de ingeniería. Primero se identifican las cantidades conocidas y las incógnitas. Después, esas cantidades se representan mediante variables con nombres que ayuden a conservar su significado físico. A continuación se plantean las relaciones matemáticas necesarias y se traducen a expresiones de Python utilizando los operadores apropiados. Finalmente, los resultados deben interpretarse dentro del contexto del problema. Obtener un número no suele ser suficiente: es necesario preguntarse qué representa, en qué unidades está expresado y si su valor tiene sentido desde el punto de vista físico.
A medida que incorporemos nuevas herramientas del lenguaje podremos automatizar procedimientos más complejos. Sin embargo, este mismo proceso de traducir datos, relaciones y condiciones a código seguirá siendo una parte fundamental de la resolución de problemas con Python.
2.9Ejercicios¶
Los siguientes ejercicios tienen como propósito reforzar los conceptos desarrollados a lo largo del capítulo. Algunos están orientados a comprobar la comprensión de la sintaxis y del comportamiento de Python, mientras que otros requieren traducir relaciones matemáticas sencillas a expresiones de código.
Siempre que sea posible, intenta resolver primero los ejercicios sin ejecutar el código. Después puedes utilizar Python para comprobar tus resultados.
Indica cuáles de los siguientes nombres de variables son válidos en Python:
temperatura
2velocidad
esfuerzo_axial
modulo elasticidad
_indice
masa2
lambdaDetermina el tipo de dato correspondiente a cada uno de los siguientes valores:
25
3.14
2 + 5j
False
"acero"
1e6Considera las siguientes instrucciones:
dato = 10
dato = 3.5
dato = "presion"¿Cuál es el tipo del objeto al que hace referencia dato después de cada asignación?
Predice el resultado de las siguientes conversiones:
int(8.9)
int(-3.7)
float(12)
float("4.5")
str(250)
bool(0)
bool(-2)¿Cuáles de las siguientes conversiones producen un error?
int("42")
int("4.2")
float("4.2")
float("temperatura")Observa el siguiente código:
a = 10
b = 20
c = 5
a = b + c
c = b + a
b = a + c
print(a, b, c)¿Qué valores tendrán a, b y c al mostrarlos?
Determina el resultado de las siguientes expresiones:
8 + 3 * 2
(8 + 3) * 2
2**3 + 4
20 / 4
20 // 6
20 % 6Explica la diferencia entre las siguientes instrucciones:
temperatura = 30y:
temperatura == 30Determina el resultado de las siguientes comparaciones:
10 > 5
10 == 5
7 != 3
20 <= 20
5 < 8 < 12Considera:
temperatura = 75
presion = 420Predice el resultado de:
temperatura < 90 and presion < 500
temperatura > 90 or presion > 400
not (temperatura > 80)Explica por qué la siguiente comparación puede producir False:
0.1 + 0.2 == 0.3¿Qué característica de los números de tipo float está involucrada?
Una partícula se mueve con velocidad constante. Su posición inicial es de 5 m, su velocidad es de 4.2 m/s y transcurren 6 s.
Utiliza la relación:
para calcular la posición final mediante Python.
Una partícula tiene una velocidad inicial de 8 m/s, una aceleración constante de 2.5 m/s² y se estudia su movimiento durante 4 s.
Calcula la velocidad final utilizando:
Una fuerza de 3500 N actúa sobre una superficie de 0.025 m².
Calcula el esfuerzo normal:
Expresa el resultado primero en pascales y después en megapascales. Recuerda que:
Una resistencia de se conecta a una fuente de .
Calcula:
la corriente eléctrica;
la potencia eléctrica.
Utiliza:
y:
Un eje circular tiene un diámetro de 30 mm.
Calcula el área de su sección transversal mediante:
Para este ejercicio utiliza:
pi = 3.1416Convierte primero el diámetro a metros y expresa el área en metros cuadrados.
Una temperatura de 95 °F debe convertirse a grados Celsius utilizando:
Construye la expresión correspondiente en Python y calcula el resultado.
Un motor gira a 1800 rpm. Calcula su velocidad angular en radianes por segundo utilizando:
Utiliza:
pi = 3.1416