Herramientas Informaticas

Categoría: Tecnicas para programar mejor Página 2 de 5

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

8.5. Listas y bucles for

El bucle for que vimos en la Sección 7.3 también funciona con las listas. La sintaxis generalizada de un bucle for es:

   1: for VARIABLE in LISTA:

   2: CUERPO

Esta sentencia es equivalente a:

   1: i = 0

   2: while i < len(LISTA):

   3: VARIABLE = LISTA[i]

   4: CUERPO

   5: i = i + 

   6: 1

El bucle for es mas conciso porque podemos eliminar la variable de bucle, i.

Aquí tenemos el bucle anterior con un bucle for:

   1: for jinete in jinetes:

   2: print jinete

Mas aun, casi se lee igual que en español, “Para (cada) jinete en (la lista de) jinetes, imprime (el nombre del) jinete”.

Se puede usar cualquier expresion de lista en un bucle for:

   1: for numero in range(20):

   2: if numero % 2 == 0:

   3: print numero

   4: for fruta in 

   5: ["platano", "manzana", "membrillo"]:

   6: print "Me gusta comer " + fruta + 

   7: "s!"

El primer ejemplo imprime todos los numeros pares entre el 0 y el 19. El segundo ejemplo expresa su entusiasmo por diferentes frutas.

8.6. Operaciones con listas

El operador + concatena listas:

   1: >>> a = [1, 2, 3]

   2: >>> b = [4, 5, 6]

   3: >>> c = a + b

   4: >>> print c

   5: [1, 2, 3, 4, 5, 6]

De forma similar, el operador * repite una lista un número dado de veces:

   1: >>> [0] * 4

   2: [0, 0, 0, 0]

   3: >>> [1, 2, 3] * 3

   4: [1, 2, 3, 1, 2, 3, 1, 2, 3]

En el primer ejemplo la lista [0] contiene un solo elemento que es repetido cuatro veces. En el segundo ejemplo, la lista [1, 2, 3] se repite tres veces.

8.7. Porciones (slices)

Las operaciones de porciones que vimos en la Sección 7.4 también funcionan en sobre las listas:

   1: >>> lista = ['a', 'b', 'c', 'd', 'e', 'f']

   2: >>> lista[1:3]

   3: ['b', 'c']

   4: >>> lista[:4]

   5: ['a', 'b', 'c', 'd']

   6: >>> lista[3:]

   7: ['d', 'e', 'f']

   8: >>> lista[:]

   9: ['a', 'b', 'c', 'd', 'e', 'f']

8.8. Las listas son mutables

A diferencia de las cadenas, las listas son mutables, lo que significa que podemos cambiar sus elementos. Podemos modificar uno de sus elementos usando el operador corchetes en el lado izquierdo de una asignación:

   1: >>> fruta = ["pl¶atano", "manzana", "membrillo"]

   2: >>> fruta[0] = "pera"

   3: >>> fruta[-1] = "naranja"

   4: >>> print fruta

   5: ['pera', 'manzana', 'naranja']

Con el operador de porción podemos reemplazar varios elementos a la vez:

   1: >>> lista = ['a', 'b', 'c', 'd', 'e', 'f']

   2: >>> lista[1:3] = ['x', 'y']

   3: >>> print lista

   4: ['a', 'x', 'y', 'd', 'e', 'f']

Además, puede eliminar elementos de una lista asignándoles la lista vacía:

   1: >>> lista = ['a', 'b', 'c', 'd', 'e', 'f']

   2: >>> lista[1:3] = []

   3: >>> lista

   4: ['a', 'd', 'e', 'f']

Y puede añadir elementos a la lista embutiéndolos en una porción vacía en la posición deseada:

   1: >>> lista = ['a', 'd', 'f']

   2: >>> lista[1:1] = ['b', 'c']

   3: >>> print lista

   4: ['a', 'b', 'c', 'd', 'f']

   5: >>> lista[4:4] = ['e']

   6: >>> print lista

   7: ['a', 'b', 'c', 'd', 'e', 'f']

8.10. Objetos y valores

Si ejecutamos estas sentencias de asignación:

   1: a = "banana"

   2: b = "banana"

Esta claro que a y b apuntan ambos a cadenas con las letras “banana“. Pero no podemos saber si están apuntando a la misma cadena.

Hay dos posibles estados:

Sin título

En un caso, a y b se refieren a dos cosas diferentes que tienen el mismo valor.

En el segundo caso, se refieren a la misma cosa. Estas “cosas” tienen nombres; se les denomina objetos. Un objeto es una cosa a la que se puede referir una variable.

Cada objeto tiene un identificador único, que podemos obtener por medio de la función id. Imprimiendo los identificadores de a y b podemos saber si apuntan al mismo objeto.

   1: >>> id(a)

   2: 135044008

   3: >>> id(b)

   4: 135044008

 

Curiosamente, las listas se comportan de otra manera. Cuando crea dos listas, obtiene dos objetos:

   1: >>> a = [1, 2, 3]

   2: >>> b = [1, 2, 3]

   3: >>> id(a)

   4: 135045528

   5: >>> id(b)

   6: 135041704

De manera que el diagrama de estado sería tal como este:

Sin título1

a y b tienen el mismo valor, pero no se refieren al mismo objeto.

8.11. Alias (poner sobrenombres)

Como las variables apuntan a objetos, si asigna una variable a otra, ambas variables se refieren al mismo objeto:

   1: >>> a = [1, 2, 3]

   2: >>> b = a

En este caso, el diagrama de estados sería como este:

Sin título

Como la misma lista tiene dos nombres diferentes, a y b, podemos decir que se le ha puesto un alias. Los cambios hechos a un alias afectan al otro:

   1: >>> b[0] = 5

   2: >>> print a

   3: [5, 2, 3]

Aunque este comportamiento puede ser útil, a veces es inesperado o indeseable.
En general, es mas seguro evitar los alias cuando trabajemos con objetos mutables. Por supuesto, no hay problema con los objetos inmutables. Por ello Python se toma la libertad de poner alias a las cadenas cuando ve una oportunidad de economizar.

Página 2 de 5

Creado con WordPress & Tema de Anders Norén