Listas de números enteros: el tipo range()

Aunque más adelante se dedica una lección a las listas en general, en esta lección se introducen los conceptos básicos de listas y en particular las listas de números enteros:

Listas

En Python, una lista es un conjunto ordenado de elementos del mismo o diferente tipo. Se representan escribiendo los elementos entre corchetes y separados por comas.

Una variable puede almacenar una lista completa y la variable hace referencia a la lista completa.

>>> lista = [1, "a", 45]
>>> lista
[1, 'a', 45]

Una lista que no contiene ningún elemento se denomina lista vacía:

>>> lista = [ ]
>>> lista
[ ]

Al definir una lista se puede hacer referencia a otras variables.

>>> nombre = "Pepe"
>>> edad = 25
>>> lista = [nombre, edad]
>>> lista
['Pepe', 25]

Como siempre, hay que tener cuidado al modificar una variable que se ha utilizado para definir otras variables, porque esto puede afectar al resto de variables:

Nota: Este punto se trata en la lección Variables 2.


Una lista puede contener listas (que a su vez pueden contener listas, que a su vez etc.):

>>> persona1 = ["Ana", 25]
>>> persona2 = ["Benito", 23]
>>> lista = [persona1, persona2]
>>> lista
[['Ana', 25], ['Benito', 23]]

Se puede acceder a cualquier elemento de una lista escribiendo el nombre de la lista y entre corchetes el número de orden en la lista. El primer elemento de la lista es el número 0.

>>> lista = [10, 20, 30, 40]
>>> lista[2]
30
>>> lista[0]
10

Se pueden concatenar dos listas utilizando la operación suma.

>>> lista1 = [10, 20, 30, 40]
>>> lista2 = [30, 20]
>>> lista = lista1 + lista2 + lista1
>>> lista
[10, 20, 30, 40, 30, 20, 10, 20, 30, 40]

El tipo range()

El tipo range() crea una lista inmutable de números enteros en sucesión aritmética. El tipo range() puede tener uno, dos o tres argumentos numéricos enteros.

Nota: En Python 2, range() se consideraba una función, pero en Python 3 no se considera una función, sino como un tipo de datos (concretamente, una lista de enteros inmutable), aunque se utiliza como si fuera una función.


El tipo range() con un único argumento se escribe range(n) y crea una lista creciente de n términos enteros que empieza en 0 y acaba antes de llegar a n (los términos aumentan de uno en uno). Es decir, range(n) = range(0, n) = [0, 1, ... , n-1].

Para ver los valores de la lista creada con range(), es necesario convertirla a lista mediante la función list().

>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Si n no es positivo, se crea una lista vacía.

>>> list(range(-2))
[]
>>> range(0)
[]

El tipo range() con dos argumentos se escribe range(m, n) y crea una lista creciente de términos enteros que empieza en m y acaba antes de llegar a n (los términos aumentan de uno en uno). Es decir, range(m, n) = [m, m+1, ... , n-1]

>>> list(range(5, 10))
[5, 6, 7, 8, 9]
>>> list(range(-5, 1))
[-5, -4, -3, -2, -1, 0]

Si n es menor o igual que m, se crea una lista vacía.

>>> list(range(5, 1))
[]
>>> list(range(3, 3))
[]

El tipo range con tres argumentos se escribe range(m, n, p) y crea una lista que empieza en m y acaba antes de llegar a n, avanzando de p en p. El valor de p puede ser positivo o negativo. Es decir, range(m, n, p) = [m, m+p, ... , x] siendo x tal que n - px < n (si p es negativo, n - px > n)

>>> list(range(5, 21, 3))
[5, 8, 11, 14, 17, 20]
>>> list(range(10, 0, -2))
[10, 8, 6, 4, 2]

El valor de p no puede ser cero:

>>> range(4,18,0)
Traceback (most recent call last):/span>
  File "<pyshell#0>", line 1, in <module>
    range(4,18,0)
ValueError: range() arg 3 must not be zero

Si p es positivo y n menor o igual que m, o si p es negativo y n mayor o igual que m, range(m, n, p) devolverá una lista vacía:

>>> list(range(25, 20, 2))
[]
>>> list(range(20, 25, -2))
[]

En resumen, los tres argumentos del tipo range(m, n, p) son:

Si se escriben sólo dos argumentos, Python le asigna a p el valor 1. Es decir range(m, n) es lo mismo que range(m, n, 1)

Si se escribe sólo un argumento, Python, le asigna a m el valor 0 y a p el valor 1. Es decir range(n) es lo mismo que range(0, n, 1)


El tipo range() sólo admite argumentos enteros. Si se utilizan argumentos decimales, se produce un errror:

>>> range(3.5, 10, 2)
Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> range(3.5, 10, 2) TypeError: range() integer start argument expected, got float.

Nota: En versiones muy antiguas de Python se podían utilizar argumentos decimales, que Python truncaba a enteros.

Concatenar range()

No se pueden concatenar directamente tipos range() (posiblemente porque si se pudieran concatenar el resultado no se podría expresar con un tipo range()).

>>> range(3) + range(5)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    range(3) + range(5)
TypeError: unsupported operand type(s) for +: 'range' and 'range'

Se pueden concatenar tipos range() con el operador + si se convierten previamente a listas. El resultado es lógicamente una lista, que no se puede convertir a tipo range().

>>> list(range(3)) + list(range(5))
[0, 1, 2, 0, 1, 2, 3, 4]

La función len()

La función len() devuelve la longitud de una cadena de caracteres o el número de elementos de una lista. El argumento de la función len() es la lista o cadena que queremos "medir".

>>> len("mensaje secreto")
15
>>> len(["a","b","c"])
3
>>> len(range(1, 100, 7))
15

El valor devuelto por la función len() se puede usar como parámetro de la función range().

>>> list(range(len("mensaje secreto")))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> list(range(len(["a","b","c"])))
[0, 1, 2]
>>> list(range(len(range(1, 100, 7))))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]