Herramientas Informaticas

Categoría: Sin categoría Página 32 de 51

2.6. Operadores y expresiones

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

Las siguientes expresiones son legales en Python y su significado es mas o menos claro:

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

Los símbolos +, -, /, y el uso de los parentesis para el agrupamiento, se usan todos de la misma forma que en matematicas. El asterisco (*) es el signo de multiplicación y ** el s³mbolo para exponenciacion.

Cuando aparece el nombre de una variable en el lugar de un operando, se sustituye con su valor antes de realizar la operacion.

La suma, resta, multiplicacion y exponenciacion hacen lo esperado, pero la división le puede sorprender. La operacion que sigue tiene un resultado inesperado:

   1: >>> minuto = 59

   2: >>> minuto/60

   3: 0

El valor de la variable minuto es 59, y 59 dividido entre 60 es 0.98333 y no 0. El motivo de la discrepancia reside en que Python esta llevando a cabo una división de enteros.

Cuando ambos operandos son enteros, el resultado ha de ser tambien un entero; por convencion, la division de enterios simpre se redondea a la baja, incluso en casos como estos en los que el siguiente entero esta muy proximo.

Una alternativa posible en este caso es el calculo de un porcentaje y no el de una fracción:

   1: >>> minuto*100/60

   2: 98

De nuevo se redondea el resultado a la baja, pero al menos ahora la respuesta es aproximadamente correcta. Otra alternativa es la division de coma flotante, que veremos en el Capítulo 3.

2.7. El orden de las operaciones

Cuando aparece mas de un operador en una expresión, el orden de evaluación depende de las reglas de precedencia. Python sigue las mismas reglas de precedencia que los propios matemáticos para sus operaciones matemáticas.

  • Los ingleses usan el acrónimo PEMDAS como regla parea recordar el orden de las operaciones:
  • Paréntesis: tienen la precedencia mas alta y pueden usarse para forzar que una expresión se evalué en el orden que queramos nosotros.
  • Puesto que las expresiones entre paréntesis se evalúan primero, 2 * (3-1) es igual a 4, y (1+1)**(5-2) es igual a 8. También puede usar paréntesis para que una expresión sea mas legible; por ejemplo (minuto * 100) / 60, aunque el resultado no cambie de todas formas.
  • Exponenciación tiene la siguiente precedencia mas alta; as³ pues 2**1+1 es igual a 3 y no a 4, y 3*1**3 es igual a 3 y no a 27.
  • La Multiplicación y la División tienen la misma precedencia, que es mas alta que la de la Adición y la Sustracción, que tienen también la misma precedencia. Por tanto 2*3-1 devuelve 5 y no 4, y 2/3-1 da -1, y no 1 (recuerde que en la división de enteros 2/3 da 0).
    Los operadores que tienen la misma precedencia se evalúan de izquierda a derecha. As³, en la expresión minuto*100/60, tiene lugar primero la
    multiplicación, devolviendo tt 5900/60, que a su vez da como resultado 98.

Si las operaciones se hubiesen realizado de derecha a izquierda, el resultado habría sido 59/1 que da 59, y que es incorrecto.

2.8. Las operaciones sobre cadenas

En general no es posible realizar operaciones matemáticas con cadenas, incluso si las cadenas parecen números. Las siguientes sentencias son ilegales (suponiendo que mensaje sea de tipo string)

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

Es curioso que el operador + funcione con cadenas, aunque no haga exactamente lo que usted esperar³a. Para cadenas, el operador + representa la concatenación, lo que significa que se unen los dos operandos uniéndolos extremo con
extremo. Por ejemplo:

   1: fruta = "platano"

   2: bizcochoBueno = " pan de leche"

   3: print fruta + 

   4: bizcochoBueno

La salida del programa es platano pan de leche. El espacio delante de pan es parte de la cadena, y es necesario para introducir el espacio que separa las cadenas concatenadas.

El operador * tambien funciona con cadenas; lleva a cabo la repeticion. Por ejemplo ‘Chiste’*3 es ‘ChisteChisteChiste’. Uno de los operandos ha de ser una cadena, el otro ha de ser un entero.

Por un lado, esta interpretacion de + y * cobra sentido por analogía con la suma y la multimplicacion. Igual que 4*3 es equivalente a 4+4+4, esperamos que ‘Chiste’*3 sea lo mismo que ‘Chiste’+’Chiste’+’Chiste’, y así es. Por otro lado, la concatenacion y la repeticion son de alguna manera muy diferentes de la adicion y la multiplicacion de enteros.

¿Puede encontrar una propiedad que

¿tienen la suma y la multiplicacion de enteros y que no tengan la concatenación y la repeticion de cadenas?

2.9. Composición

Hasta ahora hemos examinado los elementos de un programa (variables, expresiones y sentencias) por separado, sin hablar de como combinarlos.

Una de las características mas útiles de los lenguajes de programación es su capacidad de tomar peque~nos bloques de construcción y ensamblarlos. Por ejemplo, sabemos como sumar números y como imprimirlos; resulta que podemos hacer las dos cosas a un tiempo:

   1: >>> print 17 + 3

   2: 20

En realidad, no debemos decir “al mismo tiempo”, puesto que en realidad la suma tiene que realizarse antes de la impresion, pero la cuestion es que cualquier expresión relacionada con numeros, cadenas y variables puede usarse dentro de una sentencia print. Ya hemos visto un ejemplo de ello:

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

2.10. Los comentarios

Conforme los programas van creciendo de tamaño y complicándose, se vuelven mas complicados de leer. Los lenguajes formales son densos y con frecuencia es difícil observar un trozo de código y averiguar lo que hace, o por que lo hace.

Por ello es una buena idea a~nadir notas a su programa que expliquen, en un lenguaje natural, que hace el programa. Estas notas se llaman comentarios y se marcan con el símbolo #:

   1: # calcula el porcentaje de la hora que ha pasado ya porcentaje = (minuto * 100) / 60

En este caso, el comentario aparece en una línea propia. También puede poner comentarios al final de otras líneas:

   1: porcentaje = (minuto * 100) / 60 # ojo: división de enteros

Todo lo que va del # al final de la línea se ignora (no tiene efecto sobre el programa). El mensaje esta destinado al programador, o a futuros programadores que podrían tener que usar el código. En este caso avisa al lector sobre el sorprendente comportamiento de la división de enteros.

2.11. Glosario

valor: un numero o cadena (o cualquier otra cosa que se especifique posteriormente) que puede almacenarse en una variable o calcularse en una expresión.

tipo: un conjunto de valores. El tipo de un valor determina como puede usarse en las expresiones. Hasta ahora, los tipos que hemos visto son enteros (tipo int), números de coma flotante (tipo float) y cadenas (tipo string).

coma flotante: un formato para representar números con decimales.

variable: nombre que hace referencia a un valor.

sentencia: es una porción de código que representa una orden o acción. Hasta ahora, las sentencias que hemos vistos son las asignaciones y las sentencias print.

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

diagrama de estado: representación grafica de un conjunto de variables y de los valores a los que se refiere.

palabra reservada: es una palabra clave que usa el compilador para analizar sintacticamente los programas. No pueden usarse palabras reservadas, por ejemplo if, def y while como nombres de variables.

operador: un símbolo especial que representa un calculo sencillo, 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. Dicha combinación representa un único valor como resultado.

evaluar: simplificar una expresión ejecutando las operaciones para entregar un valor único.

división de enteros: es una operación que divide un entero entre otro y devuelve un entero. La división de enteros devuelve solo el numero entero de veces que el numerador es divisible por en denominador, y descarta el resto.

reglas de precedencia: la serie de reglas que especifican el orden en el que las expresiones con mutiles operadores han de evaluarse.

concatenar: unir dos operandos extremo con extremo.

composición: la capacidad de combinar expresiones sencillas y sentencias hasta crear sentencias y expresiones compuestas, con el fin de representar cálculos complejos de forma concisa.

comentario: un segmento de información en un programa, destinado a otros programadores (o cualquiera que lea el código fuente) y que no tiene efecto sobre la ejecución del programa.

Capítulo 3

Funciones

3.1. Llamadas a funciones

Ya hemos visto un ejemplo de una llamada a una función:

   1: >>> type("32")

   2: <type 'string'>

El nombre de la funcion es type, y muestra el tipo de un valor o de una variable.

El valor o variable, llamado el argumento de la función, ha de estar encerrado entre parentesis. Es habitual decir que una función “toma” un argumento y ”devuelve” un resultado. El resultado se llama valor de retorno.

En lugar de imprimir el valor de retorno, podemos asignarselo a una variable.

   1: >>> nereida = type("32")

   2: >>> print nereida

   3: <type 

   4: 'string'>

Otro ejemplo mas: la funcion id toma como argumento un valor o una variable y devuelve un entero que actua como identificador unico de ese valor.

   1: >>> id(3)

   2: 134882108

   3: >>> yanira = 3

   4: >>> 

   5: id(yanira)

   6: 134882108

Cada valor tiene un id, que es un valor unico relacionado con donde se almacena en la memoria del computador. El id de una variable es el id del valor al que hace referencia.

3.2. Conversión de tipos

Python proporciona una colección de funciones internas que convierten valores de un tipo a otro. La función int toma un valor y lo convierte a un entero, si es posible, o da un error si no es posible.

   1: >>> int("32")

   2: 32

   3: >>> int("Hola")

   4: ValueError: invalid 

   5: literal for int(): Hola

int tambien convierte valores de coma flotante a enteros, pero recuerde que siempre redondea hacia abajo:

   1: >>> int(3.99999)

   2: 3

La funcion float que convierte enteros y cadenas en numeros en coma flotante:

   1: >>> float(32)

   2: 32.0

   3: >>> float("3.14159")

   4: 3.14159

Finalmente, esta la funcion str, que convierte a tipo string:

   1: >>> str(32)

   2: '32'

   3: >>> str(3.14149)

   4: '3.14149'

Pudiera parecer extraño que Python distinga entre el valor entero 1 y el valor  de coma flotante 1.0. Tal vez representen el mismo numero, pero pertenecen a tipos distintos. El motivo es que se representan de forma distinta dentro del computador.

3.3. Coerción de tipos

Ahora que ya sabemos convertir entre tipos, tenemos otra forma de enfrentarnos a la división de enteros. Volviendo al ejemplo del capítulo anterior, suponga que queremos calcular que fracción de una hora había transcurrido. La expresión mas obvia, minuto / 60, realiza una división de enteros, por lo que el resultado es siempre 0, incluso 59 minutos después de la hora.

Una alternativa es convertir minuto a tipo float (coma flotante) y luego efectuar una división de coma flotante:

   1: >>> minuto = 59

   2: >>> float(minuto) / 60.0

   3: 0.983333333333

O bien podemos sacar provecho de las reglas de la conversion automatica de tipos, llamada coercion de tipos. Para los operadores matematicos, si uno de los operandos matematicos es tipo float, el otro se convierte automáticamente en float.

   1: >>> minuto = 59

   2: >>> minuto / 60.0

   3: 0.983333333333

Al usar un denomidador que es float, obligamos a Python a hacer division de coma flotante.

3.4. Funciones matemáticas

Es posible que ya haya visto usted en matemáticas funciones como sin (seno) y log, y que haya aprendido a evaluar expresiones como sin(pi/2) y log(1/x).

Primero evalúa la expresión entre paréntesis, (el argumento). Por ejemplo, pi/2 es aproximadamente 1.571, y 1/x es 0.1 (si x es igual a 10.0).

Luego evalúa la función en sí misma, bien mirándola en una tabla, bien llevando a cabo diversos cálculos. El sin (seno) de 1.571 es 1, y el log de 0.1 es –1 (suponiendo que log indique el logaritmo de base 10).

Este proceso puede aplicarse repetidamente para evaluar expresiones mas complicadas como log(1/sin(pi/2)). Primero evaluamos el argumento de la función mas interna, luego se evalúa la función, y así sucesivamente.

Python dispone de un modulo matemático que proporciona la mayor³a de las funciones matemáticas habituales. Un modulo es un archivo que contiene una colección de funciones agrupadas juntas.

Antes de poder usar las funciones de un modulo, tenemos que importarlo:

   1: >>>import math

Para llamar a una de las funciones, tenemos que especificar el nombre del modulo y el nombre de la funcion, separados por un punto. A esto se le llama notación de punto:

   1: decibelio = math.log10 (17.0)

   2: angulo = 1.5

   3: altura = math.sin(angulo)

La primera sentencia da a decibelio el valor del logaritmo de 17, en base 10.

Hay tambien una funcion llamada log que toma logaritmos en base e.

La tercera sentencia halla el seno del valor de la variable angulo. sin y las otras funciones trigonometricas (cos, tan, etc.) toman sus argumentos en radianes.

Para convertir de grados a radianes, puede dividir por 360 y multiplicar por 2*pi. Por ejemplo, para hallar el seno de 45 grados, calcule primero el ángulo en radianes y luego halle el seno:

   1: grados = 45

   2: angulo = grados * 2 * math.pi / 360.0

   3: math.sin(angulo)

La constante pi tambien es parte del modulo math. Si se sabe la geometría, puede verificar el resultado comparandolo con el de la raíz cuadrada de 2, dividida entre 2.

   1: >>> math.sqrt(2) / 2.0

   2: 0.707106781187

Página 32 de 51

Creado con WordPress & Tema de Anders Norén