Siguiente Subir Anterior Aprende a pensar como un informático Índice

Capítulo 2:

Comentarios

Variables, expresiones y sentencias

2.1 Valores y tipos

Un valor es una de las cosas fundamentales     como una letra o un número     que maneja un programa. Los valores que hemos visto hasta ahora son el 2 (resultado de la suma 1 + 1), y "¡Hola, Mundo!".

Estos valores son de distinto tipo: 2 es un número entero, y "¡Hola, Mundo!" es una cadena, que se denomina de este modo porque contiene una "cadena" de letras. El intérprete y tú podéis identificar las cadenas porque van entre comillas.

La sentencia de impresión también funciona con números enteros.

>>> print 4
4

Si no estás seguro del tipo al que pertenece un valor, el intérprete te lo puede decir.

>>> type("¡Hola, Mundo!")
<type 'string'>
>>> type(17)
<type 'int'>

Como era de suponer, las cadenas pertenecen al tipo string (cadena) y los números enteros pertenecen al tipo int (entero). De manera menos obvia, los números decimales pertenecen a un tipo que se denomina float, ya que estos números se representan mediante un formato denominado coma flotante.

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

¿Y qué sucede con valores como "17" y "3.2"? Parecen números y, sin embargo, van entre comillas, como las cadenas.

>>> type("17")
<type 'string'>
>>> type("3.2")
<type 'string'>

Luego son cadenas.

Si tecleas un número entero grande, tal vez sientas la tentación de utilizar comas entre grupos de tres dígitos, como en 1,000,000. No es un número entero típico de Python, pero es válido:

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

El resultado no se corresponde en absoluto con lo que nos esperábamos. Python interpreta 1,000,000 como una lista de tres objetos a imprimir. Por lo tanto, recuerda que no debes poner comas en los números enteros. Comentarios

2.2 Variables

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

La sentencia de asignación crea nuevas variables y les da valores:

>>> mensaje = "¿Qué pasa, tío?"
>>> n = 17
>>> pi = 3.14159

Este ejemplo produce tres asignaciones. La primera asigna la cadena "¿Qué pasa, tío?" a una nueva variable denominada mensaje. La segunda le da al número entero 17 una n , y la tercera asigna el número de coma flotante 3.14159 a pi.

Una forma habitual de representar variables en papel consiste en escribir su nombre con una flecha que señale el valor de la variable. Este tipo de figura se denomina diagrama de estado, ya que muestra en qué estado se encuentra cada una de las variables (considéralo como el estado mental de la variable). Este diagrama muestra el resultado de las sentencias de asignación:

La sentencia de impresión también funciona con variables.

>>> print mensaje
¿Qué pasa, tío?
>>> print n
17
>>> print pi
3.14159

En cada caso, el resultado es el valor de la variable. Las variables también tienen tipos; una vez más, podemos preguntarle al intérprete qué son.

>>> type(mensaje)
<type 'string'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>

El tipo de una variable es el tipo del valor al que hace referencia. Comentarios

2.3 Nombres de variables y palabras clave

Por lo común, los programadores escogen nombres justificados para sus variables: dan cuenta del uso que se hace de la variable.

Los nombres de variables pueden ser arbitrariamente grandes, y contener tanto letras como números; no obstante, tienen que empezar por una letra. Aunque es válido utilizar letras mayúsculas, por convención no lo hacemos. Si lo haces, recuerda que el programa es sensible a ellas. Pedro y pedro son variables distintas.

El carácter guión bajo (_) puede aparecer en un nombre. Se utiliza a menudo en nombres que presentan múltiples palabras, como mi_nombre o precio_del_te_en_china.

Si no le das un nombre válido a una variable, te sale un error sintáctico:

>>> 76trombones = "gran desfile"
SyntaxError: invalid syntax
>>> menos$ = 1000000
SyntaxError: invalid syntax
>>> class = "Informatica 101"
SyntaxError: invalid syntax

76trombones no es válido porque no empieza por una letra. menos$ no es válido porque contiene el signo del dólar, un carácter que tampoco es válido. Sin embargo, ¿qué es lo que sucede con class?

Resulta que class es una de las palabras clave de Python. Las palabras clave definen las reglas y estructura del lenguaje, y no pueden utilizarse como nombres de variables.

Python tiene veintiocho palabras clave:

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

Es probable que quieras mantener esta lista a mano: si el intérprete rechaza uno de los nombres de tus variables y no sabes la razón, comprueba si el nombre se encuentra en esta lista. Comentarios

2.4 Sentencias

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

Si tecleas una sentencia en la línea de órdenes, Python la ejecuta y muestra el resultado, si es que lo hay. El resultado de una sentencia de impresión es un valor. Las sentencias de asignación no producen ningún resultado.

Por lo general, un guión contiene una secuencia de sentencias. Cuando hay más de una sentencia, los resultados aparecen de uno en uno a medida que las sentencias se ejecutan.

Por ejemplo, el guión

print 1
x = 2
print x

produce la salida

1
2

Una vez más, la sentencia de asignación no produce ninguna salida. Comentarios

2.5 Evaluación de expresiones

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

>>> 1 + 1
2

Un valor, al igual que una variable, se considera por sí una expresión.

>>> 17
17
>>> x
2

Por extraño que parezca, la evaluación de una expresión no es exactamente lo mismo que la impresión de un valor.

>>> mensaje = "¿Qué pasa, tío?"
>>> mensaje =
"¿Qué pasa, tío?"
>>> print mensaje
¿Qué pasa, tío?

Cuando Python muestra el valor de una expresión, utiliza el mismo formato que utilizarías tú para introducir un valor. En el caso de las cadenas, esto supone que incluye las comillas. Sin embargo, la sentencia de impresión imprime el valor de la expresión que, en este caso, son los contenidos de la cadena.

En un guión, una expresión es de por sí una sentencia válida, pero no tiene ninguna función. El guión

17
3.2
"¡Hola, Mundo!"
1 + 1

no produce salida alguna. ¿Cómo cambiarías el guión para mostrar los valores de estas cuatro expresiones? Comentarios

2.6 Operadores y operandos

Los operadores son símbolos especiales que representan cómputos, como la suma y la multiplicación. Los valores que utiliza el operador se denominan operandos.

Todo lo que aparece a continuación son expresiones válidas de Python cuyo significado es más o menos claro:

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

Los símbolos +, -, /, y el uso del paréntesis para agrupar operaciones representan en Python lo que representan en Matemáticas. El asterisco (*) es el símbolo de la multiplicación, y ** es el símbolo de la exponenciación.

Cuando un nombre de variable ocupa la posición de un operando, se reemplaza con su valor antes de que se realice la operación.

La suma, resta, multiplicación y exponenciación hacen lo que sería de esperar; sin embargo, es probable que la división te sorprenda. La siguiente operación tiene un resultado inesperado:

>>> minuto = 59
>>> minuto/60
0

El valor de minuto es 59, y 59 dividido entre 60 es 0.98333, no 0. La razón de esta discrepancia es que Python está haciendo una división entera.

Si los dos operandos son números enteros, el resultado también debería ser un número entero; sin embargo, por convención, la división entera siempre se redondea por lo bajo, incluso en casos como éste, en los que el siguiente número entero está muy cercano.

Una posible solución para este problema consiste en calcular un porcentaje en vez de una fracción.

>>> minuto*100/60
98

Una vez más, se redondea el resultado por lo bajo, pero ahora al menos la respuesta es aproximadamente correcta. Otra alternativa es usar la división de coma flotante, a la que llegaremos en el Capítulo 3. Comentarios

2.7 Orden de operaciones

Cuando aparece más de un operador en una expresión, la orden de evaluación depende de las reglas de prioridad. Python sigue las mismas reglas de prioridad que las Matemáticas para sus operadores. El acrónimo PEMDSR es práctico para recordar el orden de las operaciones:

Comentarios

2.8 Operaciones con cadenas

Por lo general, no se pueden realizar operaciones matemáticas con cadenas, ni siquiera cuando parecen números. Lo que aparece a continuación no es válido (en el supuesto de que mensaje sea del tipo cadena):

mensaje-1   "Hola"/123   mensaje*"Hola"   "15"+2

Curiosamente, el operador + sí funciona con cadenas, pero no hace exactamente lo que sería de esperar. En las cadenas, el operador + representa una concatenación, que implica una unión de los dos operandos a través del enlace de sus extremos. Por ejemplo:

fruta = "ciruela"
horneado= " pan bizcochado"
print fruta + pan bizcochado

La salida de este programa es ciruela pan bizcochado. El espacio entre la palabra bizcochado forma parte de la cadena, y es necesario dejar ese espacio entre cadenas concatenadas.

El operador * también funciona con cadenas: realiza repeticiones. Por ejemplo, 'Bien'*3 es 'BienBienBien'. Uno de los operandos tiene que ser una cadena; el otro, un número entero.

Por un lado, esta interpretación de + y * resulta comprensible por analogía con la suma y la multiplicación. Del mismo modo que 4*3 equivale a 4+4+4, se espera que "Bien"*3 sea lo mismo que "Bien"+"Bien"+"Bien" y, de hecho, lo es. Por otro lado, es significativo el modo en que difieren la repetición y concatenación de cadenas de la suma de números enteros y la multiplicación. ¿Se te ocurre alguna propiedad que puedan tener la suma y la multiplicación de la que carezcan la repetición y la concatenación de cadenas? Comentarios

2.9 Composición

Hasta ahora, hemos visto por separado los elementos que tiene un programa     variables, expresiones y sentencias    , pero sin mencionar cómo combinarlos.

Una de las características más útiles que tienen los lenguajes de programación es la capacidad de tomar bloques pequeños y componerlos. Por ejemplo, sabemos añadir números e imprimirlos; sin embargo, resulta que podemos hacer las dos cosas al mismo tiempo:

>>>  print 17 + 3
20

A decir verdad, se tiene que hacer la suma antes de la impresión, así que en realidad no suceden al mismo tiempo. La cuestión es que cualquier expresión que implique números, cadenas y variables se puede utilizar en una sentencia de impresión. Ya has visto un ejemplo:

print "Numero de minutos desde medianoche: ", hora*60+minuto

También puedes poner expresiones arbitrarias a la derecha de una sentencia de asignación:

porcentaje = (minuto * 100) / 60

Puede que esta capacidad no resulte impactante ahora, pero ya verás otros ejemplos en los que la composición posibilita la expresión de cómputos complejos de una manera clara y concisa.

Advertencia: Existen límites relativos a la posición de ciertas expresiones. Por ejemplo, el lado izquierdo de una sentencia de asignación tiene que corresponder a un nombre de variable, y no a una expresión. Por lo tanto, lo que aparece a continuación no es válido: minuto+1 = hora. Comentarios

2.10 Comentarios

A medida que los programas se alargan y complican, resultan más difíciles de leer. Los lenguajes formales son densos; a menudo, cuando vemos un trozo de código, nos cuesta deducir lo que hace o el por qué.

Por este motivo, es una buena idea añadir a tus programas notas que expliquen en un lenguaje natural lo que hace el programa. Estas notas se denominan comentarios, y se señalan con el símbolo #:

# calcula el porcentaje de la hora que ha transcurrido
porcentaje = (minuto * 100) / 60

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

porcentaje = (minuto * 100) / 60     # cuidado: división entera

Se ignora todo lo que aparece desde # hasta el final de la línea: no produce ningún efecto en el programa. El mensaje va dirigido al programador o futuros programadores que puedan utilizar ese código. En este caso, se le recuerda al lector el curioso funcionamiento de la división entera. Comentarios

2.11 Glosario

valor
Un número o cadena (o bien otra cosa que reciba posteriormente una denominación) que puede almacenarse en una variable o calcularse en una expresión.
tipo
Un conjunto de valores. El tipo de valor determina el modo en que se utiliza en las expresiones. Hasta ahora, los tipos que has visto son los números enteros (tipo int), los números de coma flotante (tipo float), y las cadenas (tipo string).
coma flotante
Un formato que representa números con partes fraccionarias.
variable
Un nombre que hace referencia a un valor.
sentencia
Una parte del código que representa una orden o acción. Hasta ahora, las sentencias que has visto son las asignaciones y las sentencias de impresión.
asignación
Una sentencia 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 hacen referencia.
palabra clave
Una palabra reservada que utiliza el compilador para analizar el programa; no puedes utilizar como nombres de variables palabras como if, def y while.
operador
Un símbolo especial que representa un cómputo simple como la suma, la multiplicación o la concatenación de cadenas.
operando
Uno de los valores sobre los que actúa un operador.
expresión
Una combinación de variables, operadores y valores que representa un único valor como resultado.
evaluar
Simplificar una expresión realizando las operaciones para conseguir un valor único.
división entera
Una operación que divide un número entero entre otro, y de la que se obtiene un entero. La división entera sólo da como resultado el número total de veces que el numerador es divisible por el denominador, y elimina cualquier resto.
reglas de prioridad
El conjunto de reglas que rige el orden en que se evalúan expresiones que implican múltiples operadores y operandos.
concatenar
Unir dos operandos a través de sus extremos.
composición
La capacidad de combinar expresiones y sentencias simples con expresiones y sentencias compuestas, para así representar de manera concisa cómputos complejos.
comentario
Información contenida en un programa, que está destinada a otros programadores (o a cualquiera que lea el código fuente) y que no produce ningún efecto en la ejecución del programa.


Siguiente Subir Anterior Aprende a pensar como un informático Índice