Program Arcade Games
With Python And Pygame

Chapter 7: Introdução a Listas

7.1 Tipos de Dados

Video: Introdução a Listas

Até agora este livro mostrou quatro tipos de dados:

O Python pode mostrar que tipo de dado tem um determinado valor com a função type.

A função type não tem funcionalidade para os programas deste livro, mas apenas para demonstrar como são os tipos de dados que foram introduzidos até aqui. Digite o seguinte num prompt da IDLE. (Não crie uma nova janela para um programa, so funciona no shell interativo da IDLE.)

type(3)
type(3.145)
type("Ei, olá")
type(True)
Output:
>>> type(3)
<class 'int'>

>>> type(3.145)
<class 'float'>

>>> type("Ei, olá")
<class 'str'>

>>> type(True)
<class 'bool'>

Também é possível usar a função type com uma variável para saber com que tipo de dado ela foi incializada.

x = 3
type(x)
Mais de uma moeda para a coleção? Use uma lista!

Iremos introduzir mais dois tipos de dados nesse capítulo, que são Listas e Tuplas. Tente rodar o seguinte comando num prompt do Python e veja o que vai ser exibido:

type(  (2, 3, 4, 5) )
type(  [2, 3, 4, 5] )

7.2 Trabalhando com listas

Você já criou listas de compras, listas de tarefas, listas de flores, mas como criar uma lista no computador?

fig.grocery_list
Figure 7.1: Even computers use lists

Tente estes exemplos numa linha de comando da IDLE. Para criar e imprimir uma lista, tente o seguinte:

>>> x = [1,2]
>>> print(x)
[1, 2]

Para imprimir um elemento individual de um array:

>>> print(x[0])
1

Esta localização desse número é chamado de Índice index. Note que a localizção da lista inicia em zero. Assim uma lista com 10 elementos não vai ter 10 elementos. Mas irá de [0] a [9]. Isso pode ser muito confuso ao criar um array de 10 itens sem ele conter 10 itens, mas muitas linguagens de computadores iniciam em 0 em vez de 1.

Pense numa lista como uma bendeja de cubos de gelo com números, como é mostrado na figura 7.2. Os valores estão armazenados dentro de cada espaço e os números são escritos em cada um dos espaços começando em zero e identificando a localização em ordem crescente de cada espaço.

Don't mix the index and the value!

Lembre-se, existem duas sequencias de numeros ha serem consideradas quando formos trabalhar com listas de números: sua posição e o seu valor. A posição, também conhecisa como índice, refere-se a aonde um valor está. O valor é o número que está declarado nessa posição. Quando trablhando com arrays, tenha certeza de pensar se você precisa de uma posição ou de um valor.

É fácil de retornar um valor tendo a sua localização, mas é difícil de retornar a localizção sabendo-se o valor. O capítulo 16 é dedicado a responder isso, ou seja, como saber uma localização dado um determinado valor.

fig.ice_cube_tray
Figure 7.2: Lists are like ice cube trays

Um programa pode atribuir novos valores a um elemento dentro de uma lista. No caso mostrado abaixo, oa primeiro elemento, posição zero, não um, foi atribuido o valor 22.

>>> x[0] = 22
>>> print(x)
[22, 2]

Um programa também pode criar uma “tupla.” Este tipo de dado trabalha exatamente igual a uma lista, mas com duas difereças. Primeiro, uma tupla é criada com parenteses ao em vez de colchetes. Segundo, é impossível mudar os valores em uma tupla depois que ela foi criada. veja abaixo:

>>> x = (1, 2)
>>> print(x)
(1, 2)
>>> print(x[0])
1
>>> x[0] = 22
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    x[0] = 22
TypeError: 'tuple' object does not support item assignment
>>>

Como podemos ver na saída ao rodar o código acima, não se pode atribuir um novo valor para um item de uma tupla. Para que precisamos dessa limitação? Primeiro, o computador pode executar mais rápido se ele souber que os valores não podem ser modificados. Segundo, algumas listas não precisam ser mudadas, tais como, uma lista de cores RGB para a cor vermelha. a cor vermelha não precisa nunca ser modificada, nesse caso, uma tupla imutável é a melhor escolha.

Um array é uma lista de objetos, Ele é um tipo de dado importante em ciência da computação. O tipo de dado “lista” em Python é muito similar a um array.

7.3 Interagindo com listas

Video: Interegindo dentro de uma lista

Se um programa precisa interagir entre cada item de uma lista, como, imprimir seus valores no console, etc, há dois tipos de laço for que pode fazer isso.

O primeiro método de interagir entre esses itens é usando um laço “for-each”. Este tipo de laço de repetição faz uma coletagem dos itens um de cada vez dentro do laço. Ele faz uma cópia de cada item e armazena ele em uma variável que pode ser processada.

Eis a sintaxe desse comando:
for item_variavel in nome_da_lista:

Aqui estão alguns exemplos:

my_list = [101, 20, 10, 50, 60]
for item in my_list:
    print(item)
Saída:
101
20
10
50
60

Programas também podem armazenar caracteres e textos em listas:

my_list = ["Spoon", "Fork", "Knife"]
for item in my_list:
    print(item)
Saída:
Spoon
Knife
Fork

Listas podem eventualmente conter outras listas. Isto intereage dentro de cada item da lista principal, mas não nas sublistas.

my_list = [ [2,3], [4,3], [6,7] ]
for item in my_list:
    print(item)
Saída:
[2,3]
[4,3]
[6,7]

Uma outra forma de interagir com os itens de uma lista é usar uma variável de índice e acessar diretamente a lista em vez de copiar cada item em uma variável. Para usar uma variável de índice o programa tem de contar de 0 até o número de itens da lista. Se ela tiver dez elementos, o laço deve interegir de 0 a 9, que perfaz um total de 10 elementos.

O número de elementos (tamanho) de uma lista pode ser acessado usando-se a função len. Combinando ela com a função range o programa percorre a lista inteira através do laço.

my_list = [101, 20, 10, 50, 60]
for i in range(len(my_list)):
    print(my_list[i])
Saída:
101
20
10
50
60

Este método é mais complexo, mas é também mais poderoso. Porque nós podemos trabalhar diretamente com os elementos da lista, em vez de uma cópia e a lista pode ser modificada. O laço for-each não permite fazer modificações na lista original.

7.4 Adicionando a uma lista

novos itens podem ser adicionados a uma lista (mas não a uma tupla) valendo-se do comando append. Por exemplo:

my_list = [2, 4, 5, 6]
print(my_list)
my_list.append(9)
print(my_list)
Saída:
[2, 4, 5, 6]
[2, 4, 5, 6, 9]
Video: Adicionando a uma lista

Nota: Se demender de performance ao adicionar um item a lista, é importante enteder bem como as listas são implementadas. Por exemplo, se uma lista for implementada como um array, então, adicionar um novo item para essa lista é como adicionar um novo ovo para uma caixa cheia de ovos. Precisa ser construida uma nova caixa com 13 espaços, então, mover os 12 ovos para as novas posições, só assim o decimo terceiro ovo pode ser adicionado. Somente depois disso a caixa velha pode ser jogada fora. Como isso acontece nos bastidores, por assim dizer, os programadores podem despreocupar-se disso e deixar que o computador faça o seu trabalho. No caso, seria mais eficiente simplesmente dizer ao computador para criar uma caixa de ovos com espaços sificientes para começar. Infelizmente, o Python não implementa uma lista como um array. Mas é importante prestar atenção à estrutura dos dados do seu próximo semestre, para aprender como isso funciona.

Para criar uma lista a partir do zero, é necessário criar uma lista em branco e depois ir adicionando elementos a ela usando a funçao append. O exemplo cria uma lista baseada nas entradas do usuário:

my_list = [] # Empty list
for i in range(5):
    userInput = input( "Digite um número inteiro: ")
    userInput = int( userInput )
    my_list.append(userInput)
    print(my_list)
Saída:
Digite um número inteiro: 4
[4]
Digite um número inteiro: 5
[4, 5]
Enter an integer: 3
[4, 5, 3]
Digite um número inteiro: 1
[4, 5, 3, 1]
Digite um número inteiro: 8
[4, 5, 3, 1, 8]

Se um programa precisa criar um array com uma capacidade específica onde todos os seus elementos tenham os mesmos valores, uma simples forma de se fazer isso é usando o seguinte código:

# Cria um array com 100 zeros.
my_list = [0] * 100

7.5 Modificando e Somando uma lista

Video: Somando uma lista

Criar uma totalização de um array é uma operação muito usada. Aqui está como fazer isso:

# Array para ser totalizado
myArray = [5,76,8,5,3,3,56,5,23]

# Total ´e iniciado em zero
arrayTotal = 0

# Laço (loop) de 0 até o número de elementos do array:
for i in range(len(myArray)):
	# Adiciona ao totla o elemento 0, 1, 2, etc.
	arrayTotal += myArray[i]

# Imprime o resultado
print( arrayTotal )

A mesma coisa pode ser feita usando um laço for para percorrer o array, em vez de contar os itens usando range: The same thing can be done by using a for loop to iterate the array, rather than count through a range:

# Array para ser totalizado
myArray = [5, 76, 8, 5, 3, 3, 56, 5, 23]

# Total é iniciado com zero
arrayTotal = 0

# Laço (loop) através do array, copiando cada item em umas
# variável chamada item.
for item in myArray:
	# Adiciona cada item ao total
	arrayTotal += item

# Imprime o resultado
print(arrayTotal)

Números em um array também podem ser mudados usando um laço for:

# Array que vai ser modificado
myArray = [5, 76, 8, 5, 3, 3, 56, 5, 23]

# Laço (loop) de 0 até o número de elementos da matriz:
for i in range( len(myArray) ):
	# Modifica os elementos dobrando o seu valor
	myArray[i] = myArray[i] * 2

# Imprime o resultado
print(myArray)

Embora a versão 2 não funcione para dobrar os valores da matriz. Porque? porque item é uma cópia do elemento dentro da matriz. O código abaixo dobra a cópia do elemento da matriz, não o original.

# Copia da matriz a ser modificada
myArray = [5, 76, 8, 5, 3, 3, 56, 5, 23]

# Laço (loop) entre cada elemetno de myArray
for item in myArray:
	# Isto dobra a variavel item, mas não muda a matriz
	# porque item é uma simples cópia do elemento.
	item = item * 2

# Imprime o resultado
print(myArray)

7.6 Separando texto

Video: Dividindo Textos

Textos atualmente são listas de caracteres. Elas podem ser tratadas como listas onde cada letra é um item separado. Execute o seguinte código com duas veções da mesma variável x:

x = "Isto é um exemplo de texto"
#x = "0123456789"

print("x=", x)

# Acessando um simples caracter
print("x[0]=", x[0])
print("x[1]=", x[1])

# Acessando de traz para frente
print("x[-1]=", x[-1])

# Acessando de 0 a 5
print("x[:6]=", x[:6])
# Acessando de 6 em diante
print("x[6:]=", x[6:])
# Acessando de 6 a 8
print("x[6:9]=", x[6:9])

Textos em Python podem ser usados com alguns dos operadores metemáticos. Tente executar o seguinte código e veja se o Python aceita:

a = "Hi"
b = "There"
c = "!"
print(a + b)
print(a + b + c)
print(3 * a)
print(a * 3)
print((a * 2) + (b * 2))

É possível saber a capacidade de um texto. Isto é possível com uma matriz de qualquer tipo de dados.

a = "Hi There"
print(len(a))

b = [3, 4, 5, 6, 76, 4, 3, 3]
print(len(b))

Desde que uma matriz seja de texto, um programa pode interagir com cada caracter desse texto como um elemento dessa matriz:

for character in "This is a test.":
    print (character)

Exercício: Inicie com o seguinte código:

months = "JanFebMarAprMayJunJulAugSepOctNovDec"

n = int(input("Digite um número de um mês: "))

Imprima as tres letras abreviadas do mês cujo número o usuário forneceu. (Calcule a posição de início, então use a informaçaõ obtida para imprimir o correto sub-texto.)

7.7 Código Secreto

This code prints out every letter of a string individually:

plain_text = "Isto e um teste. ABC abc"

for c in plain_text:
    print (c, end=" ")
Video: Códigos Secreto Codes

Computadores atualmente não armazenam as letras de um texto na memória; os computadores armazenam uma serie de números. Cada número representa uma letra. O sistema que um computador usa para traduzir esses números em letras é chamado de Unicode. O nome para essa codificação de 8-bits é UTF-8 “Universal Character Set Transformation Format.”

Essa codificação, cobre o Alfabeto Ocidental usando os números de 0 a 127. Cada letra ocidental é representada por um byte na memória. Outros caracteres, como o Cirílico podem precisar de vários bytes para representar cada letra. Uma cópia parcial dessa tabela de codificação é mostrada abaixo:

ValueCharacterValueCharacterValueCharacterValueCharacter
40(61=82R103g
41)62>83S104h
42*63?84T105i
43+64@85U106j
44,65A86V107k
45-66B87W108l
46.67C88X109m
47/68D89Y110n
48069E90Z111o
49170F91[112p
50271G92\113q
51372H93]114r
52473I94^115s
53574J95_116t
54675K96`117u
55776L97a118v
56877M98b119w
57978N99c120x
58:79O100d121y
59;80P101e122z
60<81Q102f

Para maiores informações sobre a Tabela ASCII (que tem os mesmo valores para o alfabeto ocidental) veja:
http://en.wikipedia.org/wiki/ASCII

Para um vídeo que explica a beleza do Unicode, veja aqui:
http://hackaday.com/2013/09/27/utf-8-the-most-elegant-hack

Esta próxima sequencia de código converte cada letra do exemplo anteriri em seu valor ordinal usando UTF-8:

plain_text = "Isto é um teste. ABC abc"

for c in plain_text:
    print (ord(c), end=" ")

Este próximo programa pega cada valor UTF-8 e adiciona um a ele. Então imprime o novo valor UTF-8 e converte o valor de volta para uma letra.

plain_text = "Isto e um teste. ABC abc"

for c in plain_text:
    x = ord(c)
    x = x + 1
    c2 = chr(x)
    print (c2, end="")

O próximo código listado pega cada valor UTF-8 e adiciona um a ele depois converte seu valor de volta para uma letra.

fig.encryption
# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

plain_text = "This is a test. ABC abc"

encrypted_text = ""
for c in plain_text:
    x = ord(c)
    x = x + 1
    c2 = chr(x)
    encrypted_text = encrypted_text + c2
print(encrypted_text)

Finalmente, o último código pega cada valor UTF-8 e subtrai um dele, depois converte o valor de volta para uma letra. Alimentando esse programa, a saída dos programas anteriores, serve como um decodificador para os textos codificados nos exemplos anteriores.

fig.decryption
# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

encrypted_text = "Uijt!jt!b!uftu/!BCD!bcd"

plain_text = ""
for c in encrypted_text:
    x = ord(c)
    x = x - 1
    c2 = chr(x)
    plain_text = plain_text + c2
print(plain_text)

7.8 Associação de Matrizes(Arrays)

O Python não está limitado a usar números como índice de matrizes. Isto também é possível usando Associação de Matrizes. Uma associação de matrizes funciona como isso:

# Cria uma matriz associada vazia
# (Note as chaves.)
x = {}

# Adiciona algo a ela
x["fred"] = 2
x["scooby"] = 8
x["wilma"] = 1

# Acessa e imprime um item
print(x["fred"])

Você realmente não vai precisar de Associação de Matrizes nessa aula mas penso ser importante saber que elas são possíveis.

7.9 Revisão

7.9.1 Teste de Múltipla Escolha

Click here for a multiple-choice quiz.

7.9.2 Repostas Escritas

Click here for the chapter worksheet.

7.9.3 Lab

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.