Cibernetia > Manuales > Python
Búsqueda personalizada







Capítulo 2: Variables, expresiones y declaraciones

2.1 Valores y tipos

Un valor es una de las cosas básicas con las que trabaja un programa; pueden ser valores, por ejemplo, una letra o un número. Los valores que hemos visto hasta ahora son 1, 2, y '¡Hola, mundo!'.

Estos valores pertenecen a diferentes tipos: 2 es un entero, y '¡Hola, Mundo!' es una cadena, llamada así porque contiene una "cadena de letras". Tú y el intérprete de Python podéis identificar las cadenas porque se encierran entre comillas.

print también funciona con enteros.

>>> print 4
4

Si no estás seguro de cuál es el tipo de una variable, el intérprete te lo dirá.

>>> type('¡Hola, mundo!')
<type 'str'>
>>> type(17)
<type 'int'>

No es precisamente chocante que toda cadena (en inglés, string) pertenezca al tipo str y todo entero (en inglés, integer) pertenezca al tipo int. Pero quizá no sea tan obvio que los números con un decimal pertenezcan a un tipo llamado float. La razón es que estos números se representan mediante un formato llamado de coma flotante.

>>> type(3.2)
<type 'float'>

¿Qué pasa con valores como '17' y '3.2'? Parecen números, pero están entre comillas, como las cadenas.

>>> type('17')
<type 'str'>
>>> type('3.2')
<type 'str'>

Son cadenas.

Al escribir un gran número entero, puedes tener la tentación de utilizar comas entre grupos de tres dígitos (especialmente si piensas en inglés, ya que en español los grupos de tres dígitos no se separan mediante comas, sino mediante puntos), como en 1,000,000. Esto no representaría correctamente un entero en Python, pero, aun así, de algún modo, también sería correcto:

>>> print 1,000,000
1 0 0

¡Bueno, no es lo que esperábamos! Python interpreta 1,000,000 como una lista de enteros separada por comas, e imprime los enteros separados por un espacio.

Este es el primer ejemplo que hemos visto de un error semántico: el código se ejecuta sin producir ningún mensaje de error, pero no hace lo "correcto".

2.2 Variables

Una de las características más poderosas de un lenguaje de programación es la capacidad de manejar variables. Una variable es un nombre que hace referencia a un valor.

La instrucción de asignación crea nuevas variables y les asigna valores:

>>> message = 'Y ahora, algo totamente distinto'
>>> n = 17
>>> pi = 3.1415926535897931

Este ejemplo hace tres asignaciones. Primero asigna una cadena a una nueva variable llamada message, después asigna el entero 17 a n; finalmente, asigna el valor (aproximado) de π a la variable pi.

Una forma de representar las variables en papel es escribir el nombre con una flecha que apunta a el valor de la variable. Este tipo de figura, que se llama diagrama de estado, muestra el estado en que se encuentra cada variable (pensar en ello como en el estado de ánimo de la variable). Este diagrama muestra el resultado de las asignaciones de valor:

Podemos imprimir el valor de una variable:

>>> print n
17
>>> print pi
3.14159265359

El tipo de una variable es el tipo del valor al que se refiere.

>>> type(message)
<type 'str'>
>>> type(n )
<type 'int'>
>>> type(pi)
<type 'float'>

2,3 Nombre de variables y palabras clave

Normalmente los programadores ponen a las variables nombres con significado, es decir, el nombre mismo de la variable informa sobre el sentido de la variable.

Los nombres de las variables puede ser arbitrariamente largos. Pueden contener tanto letras como números, pero deben comenzar siempre con una letra. Aunque se pueden usar letras mayúsculas, normalmente no se hace. Si aun así decides hacerlo, recuerda que Python distingue entre maýusculas y minúsculas. Paquito y paquito son diferentes variables.

El caracter de subrayado (_) pueden aparecer en un nombre de variable. A menudo se utiliza nombres con varias palabras, como mi_variable o mi_variable_de_nombre_desconcertante.

Si das un nombre no permitido a una variable, obtendrás un error de sintaxis:

>>> 76trombones = 'big parade'
SyntaxError: invalid syntax
>>> more@ = 1000000
SyntaxError: invalid syntax
>>> class = 'Advanced Theoretical Herpetology'
SyntaxError: invalid syntax

76trombones es un nombre incorrecto porque no empieza con una letra. more@ es incorrecto debido a que contiene un caracter no permitido: @. ¿Pero qué pasa con la variable llamada class?

Resulta que la class es una de las palabras reservadas de Python. El intérprete utiliza palabras clave (reservadas) para reconocer la estructura del programa, y se pueden utilizar estas palabras como nombres de variables.

Python tiene 31 palabras reservadas:

and       del       from      not       while    
as        elif      global    or        with     
assert    else      if        pass      yield    
break     except    import    print              
class     exec      in        raise              
continue  finally   is        return             
def       for       lambda    try

Quizá quieras tener a mano esta lista. Si el intérprete se te queja del nombre de alguna variable y no sabes por qué, comprueba si está en la lista.

2.4 Declaraciones

Una declaración es una instrucción que el intérprete de Python puede ejecutar. Hemos visto dos tipos de declaraciones: de impresión y de asignación.

Cuando escribes una declaración en la línea de comandos, Python ejecuta y muestra el resultado, si lo hubiere.

Un script contiene por lo general una secuencia de declaraciones. Si hay más de una declaración, los resultados aparecerán de uno en uno, según se vayan ejecutando.

Por ejemplo, el script:

print 1
x = 2
print x

Da como resultado:

1
2

La declaración de asignación no produce ninguna salida.

2.5 Operadores y operandos

Los operadores son símbolos especiales que representan cálculos, como la adición y la multiplicación. Los valores que toma el operador se llaman operandos.

Los siguientes ejemplos muestran operadores aritméticos:

20 +32      hora - 1      hora * 60 + minuto      minute/60      5 ** 2      (5 +9) * (15-7)

Los símbolos +, -, y /, y el uso de paréntesis para agrupar, significan en Python lo mismo que en matemáticas. El asterisco (*) es el símbolo de la multiplicación, y ** es el símbolo de potencia.

Cuando un nombre de variable aparece en el lugar de un operando, es reemplazado por su valor antes de realizar la operación.

Suma, resta, multiplicación y potencia hacen lo que se supone que han de hacer, pero la división puede dar sorpresas. La siguiente operación tiene un resultado imprevisto:

>>> minute = 59
>>> minute/60
0

Cuidado: este comportamiento podría cambiar en futuras versiones de Python.

El valor de la variable minute 59, y en aritmética 59 dividido entre 60 es 0,98333, y no 0. La razón de esta diferencia es que Python está realizando una división entera (es decir, está descartando la parte decimal del cociente).

Cuando los dos operandos son enteros, el resultado debe ser un número entero; la división entera siempre elimina la parte fraccionaria, de modo que en el ejemplo el resultado se redondea a 0.

Si cualquiera de los operandos es un número de coma flotante, Python realiza la división de coma flotante, y el resultado es un número de flotante:

>>> minute/60.0
0.98333333333333328

2.6 Expresiones

Una expresión es una combinación de valores, variables y operadores. Si escribes una expresión en la línea de comandos, el intérprete la evalúa y muestra el resultado:

>>> 1 + 1
2

Aunque las expresiones pueden contener valores, variables y operadores, no todas las expresiones contiene todos estos elementos. Un valor por sí mismo, o una variable, se consideran expresiones.

>>> 17
17
>>> X
2

En un script, una expresión es en sí misma una declaración válida, pero no hace nada. El siguiente script no devuelve ningún resultado:

17
3,2
"¡Hola, Mundo!"
1 + 1

Si quiere que el script muestre los valores de estas expresiones, tienes que utilizar la instrucción de impresión.

2.7 Orden de las operaciones

Cuando en una expresión aparece más de una expresión, el orden en que se evalúan las expresiones depende de las llamadas "reglas de precedencia". Para los operadores matemáticos, Python sigue las reglas matemáticas. El acrónimo PEMDAS es una forma útil de recordarlas. Para recordar el acrónimo PEMDAS, puedes probar a recordar la frase "Pobres estúpidos; me dan asco. Sí". Si también tienes problemas para recordar la frase "Pobres estúpidos; me dan asco. Sí.", olvídate de trucos pnemotécnicos, e intenta memorizar las reglas de precedencia.

  • Los paréntesis tienen la precedencia más alta y se pueden usar para obligar al intérprete a evaluar las expresiones en el orden que prefieras. Dado que las expresiones entre paréntesis se evalúan en primer lugar, 2 * (3-1) es 4, y (1 +1) ** (5-2) es 8. También puedes utilizar los paréntesis para hacer una expresión más fácil de leer, como en (minutos * 100) / 60, a pesar de que no cambia el resultado con respecto a minutos * 100 / 60.
  • La exponenciación ("potencia" suena más natural, pero PEMDAS prefiere "exponenciación") tiene la segunda prioridad más alta, por lo que 2 ** 1 +1 es 3 y no 4, y 3 * 1 ** 3 es 3 y no 27.
  • La multiplicación y la división tienen la misma prioridad, que es superior a la adición y la resta, en el que también tienen la misma prioridad. Por lo tanto 2 * 3-1 es 5, no 4, y 6 +4 / 2 es 8, no 5.
  • Los operadores con la misma precedencia se evalúan de izquierda a derecha. Así que en la expresión grados / 2 * pi, primero se divide, y el resultado se multiplica por pi. Si querías dividir por 2 π, deberías haber utilizado paréntesis.

2.8 Operaciones con strings (cadenas)

En general, no es posible realizar operaciones matemáticas con cadenas, aunque sean cadenas de números. Los siguientes ejemplos representan operaciones incorrectas:

'2'-'1'    'eggs'/'easy'    'third'*'a charm'

El operador + sí funciona con cadenas, aunque quizá no haga exactamente lo que esperas que haga: concatena, es decir, une las cadenas. Por ejemplo:

primero = 'garganta'
segundo = 'warbler'
print primero + segundo

La salida de este programa es gargantawarbler.

El operador * también funciona con cadenas; ejecuta una repetición de cadenas. Por ejemplo, 'Spam' * 3 es 'SpamSpamSpam'. Si uno de los operandos es una cadena, el otro ha de ser un entero.

Por una parte, este uso de + y * tiene sentido por analogía con la adición y la multiplicación. Del mismo mode que 4 * 3 es equivalente a 4 + 4 + 4, esperamos 'Spam'* 3 sea lo mismo que 'Spam'+'Spam'+'Spam', y en efecto lo es. Por otra parte, existe una diferencia importante entre la concatenación y la repetición de cadenas y la adición y multiplicación de enteros. ¿Se te ocurre alguna propiedad de la adición y la multiplicación que no exista en el caso de la concatenación y repetición de cadenas?

2,9 Comentarios

Cuánto más largo y más complejo es un programa, más difícil de leer. Los lenguajes formales son densos, y con frecuencia es difícil leer una porción de código y entender qué está haciendo o por qué lo está haciendo.

Por esta razón, es muy aconsejable añadir notas a los programas para explicar en lenguaje natural lo que está haciendo el programa. Estas notas se llaman comentarios, y están señalizados con el signo #:

# computar la fracción de hora que ha transcurrido
percentage = (minute * 100) / 60

En este caso, el comentario aparece en una línea completa. También puedes poner comentarios al final de una línea:

percentage = (minute * 100) / 60     # fracción de hora

Todo, desde el # hasta el final de la línea se ignora, que no tiene ningún efecto sobre el programa.

Los comentarios son más útiles cuando el documento no evidentes características del código. Es razonable suponer que el lector puede adivinar lo que significa el código, es mucho más útil para explicar por qué.

El siguiente comentario, en cambio, es redundante e inútil:

v = 5 # asignar 5 a v

Sin embargo, este otro comentario contiene información útil que no está en el código:

v = 5 # velocidad en metros / segundo
.

Utilizar buenos nombres para las variables puede reducir la necesidad de comentarios (he aquí una ventaja), pero los nombres largos pueden generar expresiones complejas difícil de leer (aquí, una desventaja).

2.10 Depuración

Llegados a este punto, el error de sintaxis que tienes más probabilidades de cometer es el relacionado con nombres de variable incorrectos, como class o yield (que son palabras reservadas) o odd~job o us$, que contienen caracteres no admitidos.

Si colocas un espacio en el nombre de una variable, Python interpretará que se trata de dos operandos sin operador:

>>> mal nombre = 5

SyntaxError: invalid syntax

Para los errores de sintaxis, los mensajes de error no ayudan mucho. La mayoría de los mensajes son SyntaxError: invalid syntax y SyntaxError: invalid token, ninguno de los cuales es muy informativo.

El error en tiempo de ejecución que cometerás con mayor probabilidad es "uso antes de la definición;", es decir, tratar de utilizar una variable antes cuyo valor aún no ha sido asignado. Esto puede suceder si escribes mal el nombre de una variable:

>>> principal = 327.68
>>> interest = principol * rate
NameError: name 'principol' is not defined

Los nombres de las variables distinguen entre mayúsculas y minúsculas, así que Bob no es lo mismo que bob.

En este momento la causa más probable de cometer un error semántico es alterar el orden de las declaraciones. Por ejemplo, para evaluar 1/2π (uno dividido entre 2π), puedes tener la tentación de escribir:

>>> 1 / 2 * math.pi

Pero la división se realizará en primer lugar, por lo que obtendrías como resultado π/2, que no es lo mismo. Lamentablemente, el intérprete de Python no tiene forma de saber qué pretendías escribir, de modo que en este caso no recibirías ningún mensaje de error, sino una respuesta errónea.

Y todo esto nos lleva al Segundo Teorema de Depuración:

La única cosa peor que un mal mensaje de error es la ausencia de mensaje de error.

2.11 Glosario

valor: una de las unidades básicas de información, como un número o una cadena, que será manipulado por el programa.

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

entero: un tipo de dato que representa números enteros.

de coma flotante: un tipo que representa números con parte fraccionaria.

cadena: un tipo que representa secuencias de caracteres.

variable: un nombre que hace referencia a un valor.

declaración: una sección de código que representa una orden o acción. Hasta ahora, las declaraciones que hemos visto son las asignaciones y las instrucciones de impresión.

asignación: una declaración que asigna un valor a una variable.

diagrama de estado: una representación gráfica de un conjunto de variables y los valores a los que las variables se refieren.

palabra clave: una palabra reservada utilizada por el compilador para analizar un programa. No se pueden utilizar palabras clave como if, def y while como nombres de variables.

operador: un signo que representa un proceso computacional simple, como la adición, la multiplicación o la concatenación de cadenas.

operando: uno de los valores con los que opera un operador.

división entera: la operación que divide dos números y descarta la parte decimal.

expresión: una combinación de variables, operadores, y los valores que representa el resultado de un solo valor.

evaluar: simplificar una expresión mediante la realización de las operaciones, con el objeto de obtener un valor único.

reglas de precedencia: el conjunto de normas que rigen el orden en que se evalúan las expresiones que contienen varios operadores y operandos.

concatenar: unir dos operandos uno tras otro.

comentario: información contenida en un programa, destinada a otros programadores (o a quien lea el código fuente) y sin efecto en la ejecución del programa

2.12 Ejercicios

Prácticas utilizando el intérprete de Python como calculadora:

  • ¿Cuál es la circunferencia de un círculo con un radio de 5? ¿Cuál es el área?
  • Si corres 10 kilómetros en 45 minutos y 30 segundos, ¿cuál es tu velocidad media en millas por minuto? ¿Cuál es la velocidad media en millas por hora? Pista: hay 1,61 kilómetros en una milla.
Manuales | Tesis: Ordenadores, Circuitos integrados...
english
Cibernetia