Já andámos a ver várias funções, de conversão ou matemáticas. Mas agora vamos abordar algumas funções que afetam listas. Comecemos por algumas bastante simples e diretas:
>>> max([1,5,3,7,8,2])
8
>>> min([1,5,3,7,8,2])
1
>>> sum([1,5,3,7,8,2])
26 |
Claro que estas funções apenas resultam se as listas contiverem apenas números. Como seria de esperar, a função
max() apresenta o maior número na lista, a função
min() apresenta o menor, e a função
sum() apresenta a soma de todos os números na lista. As funções
max() e
min() também podem usar como argumento números ou variáveis separados por vírgulas:
>>> max(1,5,3,7,8,2)
8
>>> min(1,5,3,7,8,2)
1 |
Também temos um outro operador que funciona tanto em listas como em cadeias de caracteres, o operador
in, que testa se algo se encontra numa lista (ou numa cadeia de caracteres) e responde com um booleano:
>>> 4 in [1,2,3,4]
True
>>> 0 in [4,8,7,4,9]
False
>>> 'a' in 'antonio'
True
>>> 'b' in 'antonio'
False |
De notar que é a segunda vez que aparece o operador
in, pois também é usado de modo diferente nos ciclos
for.
E agora vamos ver outra função que é muito comum em várias linguagens:
len(). Sendo a abreviatura de
length (comprimento), resulta no comprimento de várias estruturas:
>>> len('batata')
6
>>> len([4,8,7,4,9])
5 |
Aplicado a cadeias de caracteres, diz-nos quantos tem, e em listas, indica o número de elementos da lista mais externa (sim, as listas podem ter listas como elementos).
Ora então chegamos finalmente a
range(). No
Python 2.x, era uma função que produzia uma lista, mas na versão
3.x produz uma sequência imutável. Antes de mais, o que faz isto? Em
Python 2.x, fazia:
>>> range(3)
[0, 1, 2]
>>> range(3,6)
[3, 4, 5]
>>> range(1,11,2)
[1, 3, 5, 7, 9] |
Em suma, quando só tem um argumento,
range produzia uma lista de zero até esse argumento excluindo-o. Com dois argumentos, indica qual o número de onde começa e até onde vai, excluindo o final. Com 3 argumentos, é como com 2 mas o último argumento indica quanto se soma em cada iteração. Em
Python 3.x, é quase a mesma coisa, mas se em
2.x se produzia uma lista que se podia depois modificar, em
3.x produz-se uma "lista-usa-e-deita-fora". Os exemplos acima em
Python 3.x vão dar:
>>> range(3)
range(0, 3)
>>> range(3,6)
range(3, 6)
>>> range(1,11,2)
range(1, 11, 2) |
Parece confuso, mas na realidade a diferença é subtil.
range() é muito usado em conjunto com o comando
for, como no programa abaixo:
for i in range(0,15,3):
print(i) |
que vai resultar em:
Este resultado seria o mesmo em
Python 2.x. Mais tarde voltaremos a estas sequências imutáveis...
Falando ainda destas sequências, temos mais uma função que resulta numa destas, a função
reversed(). Como o próprio nome indica, esta função inverte a sequência de uma lista que lhe seja fornecida como argumento, e resulta num iterável que corresponde à sequência invertida. Aqui já não há diferença de versões. Para aceder ao resultado, temos de iterar cada um dos elementos, como por exemplo:
for i in reversed([6,4,2,7,9]):
print(i) |
dá o seguinte:
Se experimentar:
>>> reversed([6,4,2,7,9])
<list_reverseiterator object at 0x02AEFA30> |
O que não dá muito jeito... Mas felizmente, temos outra função que trata disto:
list(). Esta converte o seu argumento numa lista, o que já dá muito jeito!
>>> list(reversed([6,4,2,7,9]))
[9, 7, 2, 4, 6] |
Já agora, a função
list() tem outras aplicações, ilustradas a seguir:
>>> list('Python')
['P', 'y', 't', 'h', 'o', 'n']
>>> list(range(6))
[0, 1, 2, 3, 4, 5] |
Isto já permite umas coisas engraçadas, se puxar pela imaginação...
E vamos terminar com uma última função,
sorted(), que serve para ordenar uma lista. Os exemplos são bastante elucidativos:
>>> sorted([6,4,2,7,9])
[2, 4, 6, 7, 9]
>>> sorted([6,4,2,7,9], reverse=True)
[9, 7, 6, 4, 2] |
Como dá para perceber, podemos escolher a ordem, ascendente ou descendente, dependendo do valor que atribuímos ao argumento opcional
reverse. E por hoje é tudo!