Capítulo 1. La programación como forma de pensar

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

El primer objetivo de este libro es enseñarte a programar en Python. Pero aprender a programar significa aprender una nueva forma de pensar, así que el segundo objetivo de este libro es ayudarte a pensar como un informático. Esta forma de pensar combina algunas de las mejores características de las matemáticas, la ingeniería y las ciencias naturales. Al igual que los matemáticos, los informáticos utilizan lenguajes formales para denotar ideas, concretamente cálculos. Como los ingenieros, diseñan cosas, ensamblando componentes en sistemas y evaluando las compensaciones entre alternativas. Como los científicos, observan el comportamiento de sistemas complejos, formulan hipótesis y comprueban predicciones.

Empezaremos con los elementos más básicos de la programación e iremos avanzando. En este capítulo, veremos cómo Python representa números, letras y palabras. Y aprenderás a realizar operaciones aritméticas.

También empezarás a aprender el vocabulario de la programación, incluyendo términos como operador, expresión, valor y tipo. Este vocabulario es importante: lo necesitarás para entender el resto del libro, para comunicarte con otros programadores y para utilizar y comprender los asistentes virtuales.

Operadores aritméticos

Un operador aritmético es un símbolo que representa un cálculo aritmético . Por ejemplo, el signo más, +, realiza una suma:

30 + 12
       
42
       

El signo menos, , es el operador que realiza la resta:

43 - 1
       
42
       

El asterisco, *, realiza la multiplicación :

6 * 7
       
42
       

Y la barra diagonal, /, realiza la división:

84 / 2
       
42.0
       

Observa que el resultado de la división es 42.0 en lugar de 42. Esto se debe a que en Python hay dos tipos de números:

  • enteros, que representan números enteros, y

  • números en coma flotante, que representan números con punto decimal.

Si sumas, restas o multiplicas dos números enteros, el resultado es un número entero. Pero si divides dos enteros, el resultado es un número en coma flotante. Python proporciona otro operador, //, que realiza la división de enteros. El resultado de la división de enteros es siempre un número entero:

84 // 2
       
42
       

La división de enteros también se llama "división por el suelo" porque siempre redondea hacia abajo (hacia el "suelo"):

85 // 2
       
42
       

Por último, el operador ** realiza una exponenciación; es decir, eleva un número a una potencia:

7 ** 2
       
49
       

En otros lenguajes, el signo de intercalación, ^, se utiliza para exponenciar, pero en Python es un operador a nivel de bits llamado XOR. Si no estás familiarizado con los operadores a nivel de bits, el resultado puede ser inesperado:

7 ^ 2
       
5
       

No trataré los operadores bit a bit en este libro, pero puedes leer sobre ellos en http://wiki.python.org/moin/BitwiseOperators.

Expresiones

Una colección de operadores y números se llama expresión. Una expresión puede contener cualquier número de operadores y números. Por ejemplo, aquí tienes una expresión que contiene dos operadores:

6 + 6 ** 2
       
42
       

Observa que la exponenciación tiene lugar antes que la suma. Python sigue el orden de las operaciones que podrías haber aprendido en una clase de matemáticas: la exponenciación ocurre antes que la multiplicación y la división, que ocurren antes que la suma y la resta.

En el siguiente ejemplo, la multiplicación se produce antes que la suma:

12 + 5 * 6
        
42
        

Si quieres que la suma ocurra primero, puedes utilizar paréntesis:

(12 + 5) * 6
        
102
        

Cada expresión tiene un valor. Por ejemplo, la expresión 6 * 7 tiene el valor 42.

Funciones aritméticas

Además de los operadores aritméticos, Python proporciona algunas funciones que trabajan con números. Por ejemplo, la función round toma un número en coma flotante y lo redondea al número entero más próximo:

round(42.4)
        
42
        
round(42.6)
        
43
        

La función abs calcula el valor absoluto de un número. Para un número positivo, el valor absoluto es el propio número:

abs(42)
        
42
        

Para un número negativo , el valor absoluto es positivo:

abs(-42)
        
42
        

Cuando utilizamos una función de este modo, decimos que estamos llamando a la función. Una expresión que llama a una función es una llamada a una función.

Cuando llamas a una función, los paréntesis son obligatorios. Si los omites, recibirás un mensaje de error:

abs 42
        
  Cell In[18], line 1
    abs 42
        ^
SyntaxError: invalid syntax
        

Puedes ignorar la primera línea de este mensaje; no contiene ninguna información que necesitemos comprender en este momento. La segunda línea es el código que contiene el error, con un signo de intercalación (^) debajo para indicar dónde se descubrió el error.

La última línea indica que se trata de un error de sintaxis, lo que significa que hay algo mal en la estructura de la expresión. En este ejemplo, el problema es que una llamada a una función requiere paréntesis.

Veamos qué ocurre si omites los paréntesis y el valor:

abs
        
<function abs(x, /)>
        

Un nombre de función por sí solo es una expresión legal que tiene un valor. Cuando se muestra, el valor indica que abs es una función, e incluye alguna información adicional que explicaré más adelante.

Cuerdas

Además de los números, Python también puede representar en secuencias de letras, que se llaman cadenas porque las letras están ensartadas como las cuentas de un collar. Para escribir una cadena, podemos poner una secuencia de letras entre comillas rectas:

'Hello'
        
'Hello'
        

También es legal utilizar comillas dobles:

"world"
        
'world'
        

Las comillas dobles facilitan la escritura de una cadena que contenga un apóstrofo, que es el mismo símbolo que las comillas rectas:

"it's a small "
        
"it's a small "
        

Las cadenas también pueden contener espacios, signos de puntuación y dígitos:

'Well, '
        
'Well, '
        

El operador + funciona con cadenas; une dos cadenas en una sola, lo que se denominaconcatenación:

'Well, ' + "it's a small " + 'world.'
        
"Well, it's a small world."
        

El operador * también funciona con cadenas; hace varias copias de una cadena y las concatena:

'Spam, ' * 4
        
'Spam, Spam, Spam, Spam, '
        

Los demás operadores aritméticos no funcionan con cadenas.

Python proporciona una función llamada len que calcula la longitud de una cadena:

len('Spam')
        
4
        

Observa que len cuenta las letras entre comillas, pero no las comillas.

Cuando crees una cadena, asegúrate de utilizar comillas rectas. El entrecomillado, también conocido como comilla, provoca un error de sintaxis:

        `Hello`
        
  Cell In[49], line 1
    `Hello`
    ^
SyntaxError: invalid syntax
        

Las comillas inteligentes, también conocidas como comillas rizadas, también son ilegales.

Valores y tipos

Hasta ahora hemos visto tres tipos de valores:

  • 2 es un número entero,

  • 42.0 es un número en coma flotante, y

  • 'Hello' es una cadena.

Una clase de valor se denomina tipo. Cada valor de tiene un tipo, o a veces decimos que "pertenece" a un tipo.

Python proporciona una función llamada type que te indica el tipo de cualquier valor. El tipo de un número entero es int:

type(2)
        
int
        

El tipo de un número de coma flotante es float:

type(42.0)
        
float
        

Y el tipo de una cadena es str:

type('Hello, World!')
        
str
        

Los tipos int, float, y str pueden utilizarse como funciones. Por ejemplo, int puede tomar un número en coma flotante y convertirlo en un entero (redondeando siempre hacia abajo):

int(42.9)
        
42
        

Y float puede convertir un número entero en un valor de coma flotante:

float(42)
        
42.0
        

Aquí hay algo que puede resultar confuso. ¿Qué obtienes si pones una secuencia de dígitos entre comillas?

'126'
        
'126'
        

Parece un número, pero en realidad es una cadena:

type('126')
        
str
        

Si intentas utilizarlo como un número, es posible que obtenga un error:

'126' / 3
        
TypeError: unsupported operand type(s) for /: 'str' and 'int'
        

Este ejemplo genera un TypeError, lo que significa que los valores de la expresión, que se llaman operandos, tienen un tipo incorrecto. El mensaje de error indica que el operador / no admite los tipos de estos valores, que son str y int.

Si tienes una cadena que contiene dígitos, puedes utilizar int para convertirla en un número entero:

int('126') / 3
        
42.0
        

Si tienes una cadena que contiene dígitos y un punto decimal, puedes utilizar float para convertirla en un número de coma flotante:

float('12.6')
        
12.6
        

Cuando escribes un número entero grande, puedes tener la tentación de utilizar comas entre grupos de dígitos, como en 1,000,000. Ésta es una expresión legal en Python, pero el resultado no es un número entero:

1,000,000
        
(1, 0, 0)
        

Python interpreta 1,000,000 como una secuencia de enteros separados por comas. Más adelante aprenderemos más sobre este tipo de secuencia.

Puedes utilizar guiones bajos para que los números grandes sean más fáciles de leer:

1_000_000
        
1000000
        

Lenguajes formales y naturales

Las lenguas naturales son las que habla la gente, como el inglés, el español y el francés. No fueron diseñadas por las personas; evolucionaron de forma natural.

Los lenguajes formales son lenguajes diseñados por personas para aplicaciones concretas. Por ejemplo, la notación que utilizan los matemáticos es un lenguaje formal especialmente bueno para denotar relaciones entre números y símbolos. Del mismo modo, los lenguajes de programación son lenguajes formales diseñados para expresar cálculos.

Aunque las lenguas formales y las naturales tienen algunas características en común, existen importantes diferencias:

Ambigüedad

Las lenguas naturales están llenas de ambigüedad, que la gente resuelve utilizando pistas contextuales y otra información. Los lenguajes formales están diseñados para ser casi o totalmente inequívocos, lo que significa que cualquier programa tiene exactamente un significado, independientemente del contexto.

Redundancia

Para compensar la ambigüedad y reducir los malentendidos, las lenguas naturales utilizan la redundancia. Como resultado, suelen ser verbosas. Las lenguas formales son menos redundantes y más concisas.

Literalidad

Las lenguas naturales están llenas de modismos y metáforas. Las lenguas formales significan exactamente lo que dicen.

Como todos crecemos hablando lenguas naturales, a veces es difícil adaptarse a las lenguas formales. Los lenguajes formales son más densos que los naturales, por lo que se tarda más en leerlos. Además, la estructura es importante, por lo que no siempre es mejor leer de arriba abajo, de izquierda a derecha. Por último, los detalles importan. Los pequeños errores de ortografía y puntuación, que se pueden pasar por alto en las lenguas naturales, pueden suponer una gran diferencia en una lengua formal.

Depurando

Los programadores cometen errores. Por razones caprichosas, los errores de programación se llaman bugs y el proceso de localizarlos se llama depuración.

La programación, y especialmente la depuración, a veces hace aflorar emociones fuertes. Si estás luchando con un fallo difícil, puedes sentirte enfadado, triste o avergonzado.

Prepararte para estas reacciones puede ayudarte a afrontarlas. Un enfoque consiste en pensar en el ordenador como un empleado con ciertos puntos fuertes, como la velocidad y la precisión, y debilidades particulares, como la falta de empatía y la incapacidad para comprender el panorama general.

Tu trabajo consiste en ser un buen gestor: encuentra formas de aprovechar los puntos fuertes y mitigar los débiles. Y encuentra formas de utilizar tus emociones para comprometerte con el problema, sin dejar que tus reacciones interfieran en tu capacidad de trabajar eficazmente.

Aprender a depurar puede ser frustrante, pero es una valiosa habilidad útil para muchas actividades más allá de la programación. Al final de cada capítulo hay una sección, como ésta, con mis sugerencias para depurar. ¡Espero que te sirvan de ayuda!

Glosario

operador aritmético: Un símbolo, como + y *, que denota una operación aritmética como la suma o la multiplicación.

entero: Tipo que representa números enteros.

coma flotante: Tipo que representa números con partes fraccionarias.

división entera: Un operador, //, que divide dos números y redondea a un entero.

expresión: Una combinación de variables, valores y operadores.

valor: Un número entero, un número de coma flotante o una cadena, o uno de los otros tipos de valores que veremos más adelante.

función: Una secuencia nombrada de declaraciones que realiza alguna operación útil. Las funciones pueden o no tomar argumentos y pueden o no producir un resultado.

llamada a función: Una expresión -o parte de una expresión- que ejecuta una función. Consiste en el nombre de la función seguido de una lista de argumentos entre paréntesis.

error de sintaxis: Un error en un programa que lo hace imposible de analizar y, por tanto, de ejecutar.

cadena: Tipo que representa secuencias de caracteres.

concatenación: Unir dos cadenas extremo con extremo.

tipo: Una categoría de valores. Los tipos que hemos visto hasta ahora son enteros (tipo int), números en coma flotante (tipo float) y cadenas (tipo str).

operando: Uno de los valores de sobre el que opera un operador.

lengua natural: Cualquiera de las lenguas que hablan las personas y que evolucionaron de forma natural.

lenguaje formal: Cualquiera de los lenguajes que la gente ha diseñado con fines específicos, como representar ideas matemáticas o programas informáticos. Todos los lenguajes de programación son lenguajes formales.

error: Un error en un programa.

depuración: El proceso de encontrar y corregir errores.

Ejercicios

Pregunta a una Asistente Virtual

Mientras trabajas en este libro, hay varias formas de utilizar un asistente virtual o chatbot para ayudarte a aprender:

  • Si quieres saber más sobre un tema del capítulo, o algo no está claro, puedes pedir una explicación.

  • Si tienes dificultades con alguno de los ejercicios, puedes pedir ayuda.

En cada capítulo, te sugeriré ejercicios que puedes hacer con un asistente virtual, pero te animo a que pruebes cosas por tu cuenta y veas qué te funciona.

Aquí tienes algunos temas sobre los que podrías preguntar a un asistente virtual:

  • Antes he mencionado los operadores bit a bit, pero no he explicado por qué el valor de 7 ^ 2 es 5. Prueba a preguntar "¿Qué son los operadores bit a bit en Python?" o "¿Cuál es el valor de 7 XOR 2?".

  • También he mencionado el orden de las operaciones. Para más detalles, pregunta "¿Qué es el orden de las operaciones en Python?".

  • La función round, que utilizamos para redondear un número en coma flotante al número entero más próximo, puede tomar un segundo argumento. Prueba a preguntar "¿Cuáles son los argumentos de la función redondear?" o "¿Cómo redondeo pi a tres decimales?".

  • Hay un operador aritmético más que no he mencionado; prueba a preguntar "¿Qué es el operador módulo en Python?".

La mayoría de los asistentes virtuales conocen Python, por lo que responden a preguntas como ésta con bastante fiabilidad. Pero recuerda que estas herramientas cometen errores. Si recibes código de un chatbot, ¡pruébalo!

Ejercicio

Te preguntarás qué hace round si un número acaba en 0.5. La respuesta es que a veces redondea hacia arriba y a veces hacia abajo. Prueba con estos ejemplos a ver si puedes averiguar qué regla sigue:

round(42.5)
        
42
        
round(43.5)
        
44
        

Si tienes curiosidad, pregunta a un asistente virtual: "Si un número acaba en 0,5, ¿Python redondea hacia arriba o hacia abajo?".

Ejercicio

Cuando conozcas una nueva función, debes probarla y cometer errores a propósito. Así aprenderás los mensajes de error y, cuando vuelvas a verlos, sabrás lo que significan. Es mejor cometer errores ahora y deliberadamente que más tarde y accidentalmente.

  1. Puedes utilizar un signo menos para formar un número negativo como -2. ¿Qué ocurre si antepones un signo más a un número? ¿Qué pasa con 2++2?

  2. ¿Qué ocurre si tienes dos valores sin operador entre ellos, como 4 2?

  3. Si llamas a una función como round(42.5), ¿qué ocurre si omites uno o los dos paréntesis?

Ejercicio

Recuerda que toda expresión tiene un valor, todo valor tiene un tipo, y podemos utilizar la función type para encontrar el tipo de cualquier valor.

¿Cuál es el tipo del valor de las siguientes expresiones? Haz tu mejor conjetura para cada una de ellas, y luego utiliza type para averiguarlo.

  • 765

  • 2.718

  • '2 pi'

  • abs(-7)

  • abs(-7.0)

  • abs

  • int

  • type

Ejercicio

Las siguientes preguntas te dan la oportunidad de practicar la escritura de expresiones aritméticas:

  1. ¿Cuántos segundos hay en 42 minutos 42 segundos?

  2. ¿Cuántas millas hay en 10 kilómetros? Pista: hay 1,61 kilómetros en una milla.

  3. Si corres una carrera de 10 kilómetros en 42 minutos 42 segundos, ¿cuál es tu ritmo medio en segundos por kilómetro?

  4. ¿Cuál es tu ritmo medio en minutos y segundos por milla?

  5. ¿Cuál es tu velocidad media en kilómetros por hora?

Si ya conoces las variables, puedes utilizarlas para este ejercicio. Si no, puedes hacer el ejercicio sin ellas, y luego las veremos en el próximo capítulo.

Get Piensa en Python, 3ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.