Herramientas Informaticas

Autor: juliocesar20200413 Página 112 de 141

Desarrollador web apasionado y gusto por la buena musica

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.

8.3. Longitud (tamaño) de una lista

La función len toma una lista y devuelve su tamaño. Es una buena idea usar este valor como límite superior de un bucle, en lugar de una constante. De esta manera, si el tamaño de la lista cambia, no habrá que estar haciendo cambios en todos los bucles; funcionaran correctamente con cualquier tamaño de lista.

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

   2: i = 0

   3: while i < 

   4: len(jinetes):

   5: print jinetes[i]

   6: i = i + 1

La ultima vez que se ejecuta el cuerpo del bucle, i es len(jinetes) – 1, que es el índice del ultimo elemento. Cuando i se iguala a len(jinetes), la condición falla y no se ejecuta el cuerpo, lo que es una cosa buena, ya que len(jinetes)
no es un índice legal.

Aunque una lista puede contener otra lista como elemento, la lista anidada cuenta como un elemento sencillo. El tamaño de esta lista es 4:

   1: ['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]

Como ejercicio, escriba un bucle que recorra la lista anterior e imprima la longitud de cada elemento. }¿que ocurre si envía un entero a len?

8.4. Pertenencia a una lista

in es un operador booleano que comprueba la pertenencia a una secuencia. Lo usamos en la Sección 7.10 con las cadenas, pero también funciona con las listas y otras secuencias:

   1: >>> jinetes = ['guerra', 'hambre', 'peste', 'muerte']

   2: >>> 

   3: 'peste' in jinetes

   4: 1

   5: >>> 'libertinaje' in jinetes

   6: 0

Como “peste” es un miembro de la lista jinetes, el operador in devuelve verdadero. Como “libertinaje” no esta en la lista, in devuelve falso.

Podemos usar not en combinacion con in para comprobar si un elemento no es miembro de una lista:

   1: >>> 'libertinaje' not in jinetes

   2: 1

Página 112 de 141

Creado con WordPress & Tema de Anders Norén