Ir al contenido principal

Entradas

Mostrando las entradas etiquetadas como técnica para programar mejor

Capítulo 6

Iteración 6.1. Asignación múltiple Es posible que haya descubierto que es posible hacer mas de una asignación a una misma variable. El efecto de la nueva asignación es redirigir la variable de manera que deje de remitir al valor antiguo y empiece a remitir al valor nuevo. 1: bruno = 5 2: print bruno, 3: bruno = 7 4: print bruno La salida del programa es 5 7, ya que la primera vez que imprimimos Bruno su valor es 5, y la segunda vez su valor es 7. La coma al final de la primera sentencia print impide que se imprima una nueva l³nea en ese punto, por eso ambos valores aparecen en la misma línea. He aquí el aspecto de una asignacion multiple en un diagrama de estado: Cuando hay asignaciones multiples a una variable, es especialmente importante distinguir entre una sentencia de asignacion y una sentencia de igualdad. Puesto que Python usa el s³mbolo = para la asignacion, es tentador interpretar una sentencia como a = b como sentencia de igualdad. Pero no lo es. Para e...

6.5. Encapsulado y generalización

Por “ encapsulado ” generalmente se entiende tomar una pieza de código y envolverla en una función, permitiéndole obtener las ventajas de todo aquello para lo que valen las funciones. Hemos visto dos ejemplos de encapsulado, cuando escribimos imprimeParidad en la Sección 4.5 y esDivisible en la Sección 5.4. Por “ generalización ” entendemos tomar algo específico, como imprimir los múltiplos de 2, y hacerlo mas general, como imprimir los múltiplos de cualquier entero. He aquí una función que encapsula el bucle de la sección anterior y la generaliza para imprimir múltiplos de n. def imprimeMultiplos(n): 1: i = 1 2: while i <= 6: 3: print n*i, '\t' , 4: i = i + 1 5: print Para encapsular , todo lo que hubimos de hacer fue añadir la primera línea, que declara el nombre de la función y la lista de parametros. Para generalizar , todo lo que tuvimos que hacer fue sustituir el valor 2 por el parametro n . Si llamamos a esta funcion con el argument...

6.6. Más encapsulación

Para dar mas ejemplos de encapsulación , tomaremos el código del final de la Sección 6.5 y lo envolveremos en una función: 1: def imprimeTablaMult(): 2: i = 1 3: while i <= 6: 4: imprimeMultiplos(i) 5: i = i + 1 6: El proceso que mostramos aquí es un plan de desarrollo habitual. Se desarrolla gradualmente el codigo añadiendo líneas fuera de cualquier funcion o en el interprete. Cuando conseguimos que funcionen, se extraen y se envuelven en una funcion. Este plan de desarrollo es especialmente si, al comenzar a escribir, no sabe como dividir el programa en funciones. Este enfoque le permite diseñarlo sobre la marcha.

Cadenas

7.1. Un tipo de datos compuesto Hasta el momento hemos visto tres tipos: int , float , y string . Las cadenas son cuantitativamente diferentes de los otros dos porque están hechas de piezas menores: caracteres. Los tipos que comprenden piezas menores se llaman tipos de datos compuestos. Dependiendo de que estemos haciendo, podemos querer tratar un tipo compuesto como una única cosa o acceder a sus partes. Esta ambigüedad es útil. El operador corchete selecciona un carácter suelto de una cadena. 1: >>> fruta = "banana" 2: >>> letra = fruta[1] 3: >>> 4: print letra La expresion fruta[1] selecciona el caracter numero 1 de fruta . La variable letra apunta al resultado. Cuando mostramos letra, nos encontramos con una sorpresa: a La primera letra de " banana " no es a . A no ser que usted sea un programador. Por perversas razones, los científicos de la computacion siempre empiezan a contar desde cero. La 0-sima letra (“cero...

7.4. Porciones de cadenas

Llamamos porción a un segmento de una cadena. La selección de una porción es similar a la selección de un carácter: 1: >>> s = "Pedro, Pablo, y María" 2: >>> print 3: s[0:5] 4: Pedro 5: >>> print s[7:12] 6: Pablo 7: >>> print 8: s[15:20] 9: María El operador [n:m] devuelve la parte de la cadena desde el enésimo carácter hasta el “enésimo”, incluyendo el primero pero excluyendo el ultimo. Este comportamiento contradice a nuestra intuicion; tiene mas sentido si imagina los índices se~nalando entre los caracteres, como en el siguiente diagrama: Si omite el primer índice (antes de los dos puntos), la porcion comienza al principio de la cadena. Si omite el segundo índice, la porcion llega al final de la cadena. Así: 1: >>> fruta = "banana" 2: >>> fruta[:3] 3: 'ban' 4: >>> 5: fruta[3:] 6: 'ana' ¿Que cree usted que significa s [:]?...

7.5. Comparación de cadenas

Los operadores de comparación trabajan sobre cadenas. Para ver si dos cadenas son iguales: 1: if palabra == "banana" : 2: print "S³, no tenemos bananas!" Otras operaciones de comparacion son utiles para poner palabras en orden alfabético: 1: if palabra < "banana" : 2: print "Tu palabra," + palabra + ", va antes de banana." 3: elif palabra > "banana" : 4: print "Tu palabra," + palabra + ", va despues de banana." 5: else : 6: print "Sí, no tenemos bananas!" Sin embargo, deber³a usted ser consciente de que Python no maneja las mayúsculas y minusculas como lo hace la gente. Todas las mayusuculas van antes de la minúsculas. Como resultado de ello: Tu palabra, Zapato, va antes de banana. Una forma comun de abordar este problema es convertir las cadenas a un formato estandar, como pueden ser las minusculas, antes de realizar la comparacion. Un prob...

7.6. Las cadenas son inmutables

Es tentador usar el operador [] en el lado izquierdo de una asignación, con la intención de cambiar un carácter en una cadena. Por ejemplo: 1: saludo = "Hola, mundo" 2: saludo[0] = 'M' # ERROR! 3: print saludo En lugar de presentar la salida Mola, mundo, este codigo presenta el siguiente error en tiempo de ejecucion TypeError : object doesn't 1: support item 2: assignment. Las cadenas son inmutables, lo que signi¯ca que no puede cambiar una cadena existente. Lo mas que puede hacer es crear una nueva cadena que sea una variacion de la original: 1: saludo = "Hola, mundo" 2: nuevoSaludo = 'M' + saludo[1:] 3: print nuevoSaludo Aquí la solución es concatenar una nueva primera letra a una porción de saludo. Esta operación no tiene efectos sobre la cadena original.

7.9. El módulo “string”

El modulo string contiene funciones útiles para manipular cadenas. Como es habitual, tenemos que importar el modulo antes de poder usarlo: 1: >>> import string El modulo string incluye una funcion llamada find que hace lo mismo que la función encuentra que escribimos. Para llamarla debemos especificar el nombre del modulo y el nombre de la funcion por medio de la notacion de punto. 1: >>> fruta = "banana" 2: >>> indice = string.find(fruta, 3: "a" ) 4: >>> print indice 5: 1 Este ejemplo demuestra uno de los beneficios de los modulos: ayudan a evitar las colisiones entre los nombres de las funciones predefinidas y las definidas por el usuario. Al usar la notacion de punto podríamos especificar que version de find queremos en caso de haberle daddo un nombre en ingles a nuestra funcion. En realidad, string.find es mas general que nuestra version. Para empezar, puede encontrar subcadenas, no solo caractere...

7.10. Clasificación de caracteres

A menudo viene bien examinar un carácter y comprobar si es una letra mayúscula o minúscula, o si es un carácter o un dígito. El modulo string proporciona varias constantes que son útiles para estos menesteres. La cadena string.lowercase contiene todas las letras que el sistema considera como minúsculas. De forma similar, string.uppercase contiene todas las mayúsculas. Pruebe lo que sigue y vea que obtiene: 1: >>> print string.lowercase 2: >>> print 3: string.uppercase 4: >>> print string.digits Podemos usar estas constantes y find para clasificar caracteres. Por ejemplo, si find(lowercase, c) devuelve un valor que no sea -1 , entonces c es una minúscula: 1: def esMinuscula(c): 2: return find(string.lowercase, c) != -1 Alternativamente, podemos aprovecharnos del operador in , que determina si un carácter aparece en una cadena: 1: def esMinuscula(c): 2: return c in string.lowercase Como una alternativa mas, podemo...

Capítulo 8

Listas Una lista es un conjunto ordenado de valores, en el cual cada valor va identificado por un índice. Los valores que constituyen una lista son sus elementos. Las listas son similares a las cadenas de texto ( strings ), que son conjuntos ordenados de caracteres, excepto en que los elementos de una lista pueden ser de cualquier tipo. Las listas y las cadenas , y otras cosas que se comportan como conjuntos ordenados, se llaman secuencias .

8.1. Valores de una lista

Hay varias maneras de crear una nueva lista; la mas sencilla es encerrar sus elementos entre corchetes: 1: [10, 20, 30, 40] 2: [ "spam" , "elastico" , "golondrina" ] El primer ejemplo es una lista de cuatro enteros. El segundo es una lista de tres cadenas de texto. Los elementos de una lista no tienen por que ser del mismo tipo. La siguiente lista contiene una cadena, un numero con decimales y un entero, y, maravilla de las maravillas, otra lista: 1: [ "hola" , 2.0, 5, [10, 20]] Se dice que una lista dentro de otra lista esta anidada. Las listas que contienen numeros enteros consecutivos son comunes, de manera que Python proporciona una manera sencilla de crearlas: 1: >>> range(1,5) 2: [1, 2, 3, 4] La funcion range toma dos argumentos y devuelve una lista que contiene todos los enteros entre el primero y el segundo, ¡incluyendo el primero pero no el segundo! Hay dos formas alternativas para range. Con un solo argum...