Herramientas Informaticas

Mes: agosto 2012 Página 7 de 22

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:

Sin título

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 problema mayor es hacer que el programa se de cuenta de que los zapatos no son frutas.

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.8. Bucles y conteo

El programa que sigue cuenta el numero de veces que la letra a aparece en una
cadena:

   1: fruta = "banana"

   2: cuenta = 0

   3: for car in fruta:

   4: if car == 'a':

   5: cuenta 

   6: = cuenta + 1

   7: print cuenta

Este programa muestra otro patron de computacion llamado contador. La variable cuenta se incializa a 0 y luego se incrementa cada vez que se encuentra una a. (Incrementar es aumentar en uno; es lo contario de decrementar, y sin relacion alguna con “excremento”, que es un nombre.) Al salir del bucle, cuenta contiene el resultado – el numero total de aes.

Como ejercicio, encapsule este codigo en una funcion llamada cuentaLetras, y generalícela de forma que acepte la cadena y la letra como parametros.

Como un segundo ejercicio, reescriba esta funcion para que en lugar de recorrer la cadena, use la version de tres parametros de encuentra del anterior.

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 caracteres:

   1: >>> string.find("banana", "na")

   2: 2

Además, acepta un argumento adicional que especifica el índice en el que debería comenzar:

   1: >>> string.find("banana", "na", 3)

   2: 4

O puede tomar dos argumentos adicionales que especifican un intervalo de índices:

   1: >>> string.find("sus", "s", 1, 2)

   2: -1

En este ejemplo, la busqueda falla porque la letra s no aparece en el intervalo de índices desde 1 hasta 2 (sin incluir 2).

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, podemos usar el operador de comparacion, aunque esta solucion solo sea practica para el alfabeto ingles:

   1: def esMinuscula(c):

   2:     return 'a' <= c <= 'z'

Si c esta entre a y z, tiene que ser una minuscula.

Como ejercicio, explique que versión de esMinuscula cree que es mas rápida. ¿Puede pensar en otras razones aparte de la velocidad para preferir una sobre la otra?

Otra constante definida en el modulo string puede sorprenderle cuando la imprima:

   1: >>> print string.whitespace

Los caracteres de whitespace mueven el cursor sin imprimir nada. Crean los espacios en blanco entre los caracteres visibles (al menos sobre papel blanco).

La constante string.whitespace contiene todos los caracteres de espacio en blanco, incluidos espacio, tabulador (t), y salto de línea (n).

Hay otras funciones útiles en el modulo string, pero este libro no pretende ser un manual de referencia. Por otra parte, la

Referencia de la Biblioteca de Python sí lo es. Junto con un montón mas de documentación, esta disponible en el sitio
web de Python, www.python.org

7.11. Glosario

tipo de datos compuesto: Un tipo de datos en el que los valores están hechos de componentes o elementos que son a su vez valores.

recorrer: Realizar de forma iterativa una operación similar sobre cada uno de los elementos de un conjunto.

índice: Una variable o valor usado para seleccionar un miembro de un conjunto ordenado, como puede ser un carácter de una cadena.

porción: Una parte de una cadena especificada por un intervalo de índices.

mutable: Un tipo de datos compuesto a cuyos elementos se les puede asignar nuevos valores.

contador: Una variable usada para contar algo, normalmente inicializado a cero e incrementado posteriormente.

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 argumento, crea una lista que empieza desde 0:

   1: >>> range(10)

   2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Si hay un tercer argumento, especificara el espacio entre dos valores sucesivos; a esto se le llama paso (step). Este ejemplo cuenta de 1 a 10 de dos en dos (con pasos de 2).

   1: >>> range(1, 10, 2)

   2: [1, 3, 5, 7, 9]

Para terminar, hay una lista especial que no contiene elementos. Se la llama lista vacía y se representa [].
Con todas estas maneras para crear listas, ser³a decepcionante que no pudiéramos asignar valores de listas a variables o pasar listas como parametros a funciones. Por supuesto que podemos.

   1: vocabulario = ["mejorar", "castigar", "defenestrar"]

   2: numeros = [17, 

   3: 123]

   4: vacio = []

   5: print vocabulario, numeros, vacio

   6: ['mejorar', 

   7: 'castigar', 'defenestrar'] [17, 123] []

8.2. Acceso a los elementos

La sintaxis para acceder a los elementos de una lista es la misma que para acceder a los caracteres de una cadena: el operador corchetes []. La expresión dentro de los corchetes especifica el índice. Recuerde que los índices siempre comienzan en cero:

   1: print numeros[0]

   2: numeros[1] = 5

El operador [] puede aparecer en cualquier parte de una expresion. Cuando aparece a la izquierda de una asignacion, cambia uno de los elementos de la lista, de manera que el “unesimo” elemento de numeros, que era 123, ahora es 5.

Se puede usar como índice cualquier expresion entera.

   1: >>> numeros[3-2]

   2: 5

   3: >>> numeros[1.0]

   4: TypeError: 

   5: sequence index must be integer

Si intenta acceder (leer o modificar) un elemento que no existe, obtendra un error en tiempo de ejecución:

   1: >>> numeros[2] = 5

   2: IndexError: list assignment index out of 

   3: range

Si se da un índice negativo, se cuenta hacia atras desde el final de la lista.

   1: >>> numeros[-1]

   2: 5

   3: >>> numeros[-2]

   4: 17

   5: >>> 

   6: numeros[-3]

   7: IndexError: list index out of range

   8: numeros[-1] es el ultimo 

   9: elemento de la lista, numeros[-2] es el penultimo, y

  10: numeros[-3] no 

  11: existe.

Es muy habitual usar una varible de bucle como índice para una lista:

   1: jinetes = ["guerra", "hambre", "peste", "muerte"]

   2: i = 0

   3: while i < 4:

   4: print jinetes[i]

   5: i = i + 1

Este bucle while cuenta desde 0 hasta 4. Cuando la variable de bucle vale 4, la condición falla y acaba el bucle. Por tanto, el cuerpo del bucle solo se ejecuta cuando i es 0, 1, 2 y 3.

Cada vez que recorremos el bucle, la variable i se usa como índice de la lista, imprimiendo el elemento i-esimo. Esta plantilla de computacion se llama recorrido de lista.

Página 7 de 22

Creado con WordPress & Tema de Anders Norén