Buscar

Conteúdo Interativo 7

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 1/19
Programação RAD
Aula 7: Tuplas e dicionários
INTRODUÇÃO
Como vimos nas aulas anteriores, o paradigma da orientação a objetos é muito usado em diversas linguagens. Em
Python, não é diferente. Tudo o que estudamos até agora é uma derivação dos conceitos de classes e de objetos. 
Aqui, vamos dar continuidade a esse estudo, retomando as aulas de listas e estruturas de dados, a �m de aprender a
usar as tuplas e os dicionários, que são aplicados em várias situações do dia a dia. 
Se você �zer uma busca na internet, encontrará vários temas relacionados à linguagem Python, tais como
desenvolvimento para desktop e web. Por exemplo, o Django é um framework muito usado para web e �ask. 
LEMBRE-SE: muitas aplicações com Python são feitas em linha de comando ou em aplicações para console. Nosso
objeto de estudo serve para essas aplicações. Então, aproveite!
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 2/19
OBJETIVOS
Criar programas em Python com tuplas e dicionários.
Manipular esses programas.
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 3/19
Tuplas
As tuplas nada mais são do que listas. Já aprendemos que é possível realizar vários comandos a partir das listas, tais
como inserir e remover dados a todo momento, embaralhar e classi�car elementos etc.
No caso das tuplas, há um detalhe importante: elas são imutáveis. 
E existem aplicações para isso.
Para entender melhor a questão, é necessário explicar como as tuplas funcionam. 
Neste exemplo, vamos criar tuplas e acessar seus elementos:
>>> minha_tupla = ('t','u','p','l','a')
>>> minha_tupla
('t', 'u', 'p', 'l', 'a')
Aqui, há uma diferença com relação às listas: enquanto estas são rodeadas por colchetes “[“ e “]”, as tuplas são
rodeadas por parênteses “(“ e “)”.
Agora, vamos mudar o primeiro elemento de “t” para “s”:
>>> minha_tupla[0]='s'
Traceback (most recent call last):
 File "< pyshell#151 >", line 1, in <
module >
 minha_tupla[0]='s'
TypeError: 'tuple' object does not support
item assignment
Você percebeu como a tupla é imutável? 
Não podemos alterar seus elementos, mas é possível acessá-los, assim como �zemos com as listas. Observe:
>>> minha_tupla[0]
't'
>>> minha_tupla[4]
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 4/19
'a'
>>> minha_tupla[10]
Traceback (most recent call last): ← Epa! Assim como as
listas, temos que respeitar os índices
 File "", line 1, in ← Não existe elemento
na posição 10
 minha_tupla[10]
IndexError: tuple index out of range
Existe uma forma de acessar os elementos de uma lista que também serve para as tuplas, chamada de slice. Veja
como funciona:
>>> minha_tupla
('t', 'u', 'p', 'l', 'a')
>>> minha_tupla[1:3]
('u', 'p')
O slice nos permite fatiar uma tupla (ou lista) e retornar seus elementos por meio de outra tupla (ou lista), mas sem
retirá-los de lá. A fatia é representada pelos colchetes, que se referem aos índices da tupla.
Índices não existentes geram a exceção costumeira de “out of range”.
Há outras formas de slice, como mostra o código a seguir:
>>> minha_tupla
('t', 'u', 'p', 'l', 'a')
>>> minha_tupla[2:] ← pega os elementos
a partir da posição 2
('p', 'l', 'a')
>>> minha_tupla[:3] ← pega os n
primeiros elementos, neste caso os 3 prim.
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 5/19
('t', 'u', 'p')
>>> minha_tupla[:] ← pega a tupla toda
('t', 'u', 'p', 'l', 'a')
Saiba Mais
, 
Também existem outras maneiras de fatiar uma tupla (ou lista), mas as que apresentamos já são su�cientes para o objetivo desta
aula.
EXERCÍCIO
Analise o código a seguir: 
my_tuple = (1, 2, 3, 4) 
my_tuple.append( (5, 6, 7) ) 
print(len(my_tuple)) 
O que será impresso nele?
a) 1
b) 2
c) 5
d) 7
e) Erro! Ocorrerá uma exceção.
Justi�cativa
Aplicação de métodos nas tuplas
Algumas ações realizadas nas listas também podem ser feitas nas tuplas a partir dos mesmos métodos. São elas:
1. Veri�car quantos elementos existem na tupla
Para isto, usamos o método len():
>>> len(minha_tupla)
5
>>> len(("Olá","mundo","do","Python"))
4
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 6/19
2. Concatenar tuplas
Para isto, usamos o operador “+”:
>>> parte1=("Ouviram","do","Ipiranga")
>>> parte2=("as","margens","plácidas")
>>> verso1 = parte1+parte2
>>> verso1
('Ouviram', 'do', 'Ipiranga', 'as',
'margens', 'plácidas')
3. Repetir elementos
Para isto, usamos o operador “*”:
>>> mi=('mi',) ← Note o detalhe da
vírgula!
>>> mi*10
('mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi',
'mi', 'mi', 'mi')
Quando de�nimos uma tupla com um único elemento, devemos inserir a vírgula, como
�zemos aqui. Se apenas criarmos uma tupla com um único elemento – como, por exemplo,
mi2 = (‘mi’) –, a linguagem Python entenderá que se trata de uma string entre parênteses.
Neste código, repetimos o elemento da tupla 10 vezes, mas sem modi�car a original.
4. Veri�car se um elemento pertence à tupla
O que vale para as listas ocorre com as tuplas:
>>> minha_tupla
('t', 'u', 'p', 'l', 'a')
>>> 'u' in minha_tupla
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 7/19
True
>>> 'f' in minha_tupla
False
5. Iterar nos elementos
Agora, vamos aplicar nas tuplas um conceito que estudamos na aula 3: a iteração a partir do
comando for. 
Sabemos que esse comando é usado em muitas linguagens de programação para repetir
determinado trecho de código. Mas ele também pode ser utilizado para iterar sobre listas,
arrays e tuplas. Quando isso ocorre, o comando for também é conhecido como foreach. 
Veja o exemplo:
>>> minha_tupla
('t', 'u', 'p', 'l', 'a')
>>> for i in minha_tupla:
 print(i)
t
u
p
l
a
Como você percebeu, a sintaxe é muito parecida com o comando for aplicado nas listas,
mas, agora, o elemento de repetição é uma tupla. 
A linguagem já entende o número de repetições que serão efetuadas. Enquanto houver
elemento na estrutura, o código de�nido será repetido. 
No exemplo, realizamos uma operação muito simples: apenas escrevemos o elemento da
posição atual da repetição. Em aplicações maiores, blocos de repetição muito mais
complexos poderiam ser feitos.
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 8/19
EXERCÍCIO
Analise o código a seguir: 
seila = {}
seila[1] = 1 
seila['1'] = 2 
seila[1] += 1 
soma = 0 
for k in seila: 
 soma += seila [k] 
print(soma) 
O que será impresso nele?
a) 1
b) 2
c) 3
d) 4
e) 5
Justi�cativa
DICIONÁRIOS
Em Python, dicionário é um tipo de estrutura de dados em que há mapeamento entre uma chave (key) e um valor
(value). 
Em outros lugares, até mesmo diferentes dessa linguagem, aplicamos o conceito par-valor, relacionado,
principalmente, a bancos de dados que não usam o modelo relacional. 
Um dicionário pode ser representado da seguinte forma:
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A36… 9/19
Suas chaves funcionam como um índice para os valores, que podem ser constituídos de qualquer tipo de conteúdo –
inclusive dicionário. Imagine o que podemosfazer com essa estrutura!
Para entender melhor o assunto, vamos analisar um exemplo: uma lista de contatos.
Trata-se de uma lista de nomes, geralmente em ordem alfabética, cada qual com alguns campos, tais como:
Para facilitar a compreensão, suponha que essa lista guarde apenas números de telefones com nomes como “Felix”,
“Brito”, “Piazza”, “Carlos Alberto”, “Clodoaldo” – cada um com um ou mais números.
A lista em questão pode ser representada assim:
Antes de começar a desenvolver o código, é importante que o programador pense na arquitetura das estruturas de
dados. 
Em uma lista de telefones, é evidente por onde vamos acessar os dados (as chaves) e qual é o conteúdo (telefones).
Entretanto, em situações mais complexas, recomendamos planejar, adequadamente, o que será desenvolvido.
Como já �zemos isso anteriormente, vamos ao código, seguindo estes passos:
1. Criar o dicionário
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 10/19
Vamos chamá-lo de “contatos”:
>>> contatos={}
>>> contatos
{}
Criamos as listas com colchetes “[“ e “]” e as tuplas com parênteses “(“ e “)”. Os dicionários
são criados com chaves “{“ e “}”.
2. Inserir dados no dicionário
Agora, vamos começar a popular nosso dicionário, inserindo um par chave-valor:
>>> contatos["Felix"]=["1111-
2222"] → criando um par chave-valor
>>> contatos
{'Felix': ['1111-
2222']} → conteúdo do
dicionário
Também podemos fazer isso usando uma lista como valor:
>>> tel_brito = ["2221-3321","3322-3333"]
>>> contatos["Brito"]=tel_brito
>>> contatos
{'Felix': ['1111-2222'], 'Brito': ['2221-
3321', '3322-3333']}
Aqui, criamos uma lista chamada tel_brito e atribuímos os valores a ela (dois telefones).
Inserimos a lista na chave “Brito” e mostramos o dicionário em seguida. 
Vamos continuar inserindo para igualar à �gura inicial:
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 11/19
>>> contatos["Piazza"]=["4444-4441"]
>>> contatos[“Carlos Alberto”] = [“4444-
5541”,”7777-4545”]
>>> tel_clodoaldo = ["3333-9999","8888-
3333","8888-3434"]
>>> contatos["Clodoaldo"]=tel_clodoaldo
>>> contatos
{'Felix': ['1111-2222'], 'Brito': ['2221-
3321', '3322-3333'], 'Piazza':
['4444-4441'], 'Carlos Alberto': ['4444-
5541', '7777-4545'], 'Clodoaldo':
['3333-9999', '8888-3333', '8888-3434']}
Assim, nossa lista está completa, idêntica à �gura que usamos em nosso pequeno
planejamento. Observe que cada par chave-valor tem um formato padrão, em que há a chave
entre aspas, dois pontos (“:”) e, em seguida, seu valor (no caso, uma lista de telefones).
3. Acessar dados no dicionário
Agora, vamos fazer algumas operações no dicionário, sempre pela chave:
>>>
contatos["Felix"] →
modo mais simples de acesso
['1111-2222']
>>> tel_capitao = contatos["Carlos
Alberto"] → criamos uma variável para
receber
>>>
tel_capitao →
o conteúdo de uma chave
['4444-5541', '7777-4545']
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 12/19
4. Alterar o conteúdo de alguma chave no dicionário
Agora, vamos fazer algumas operações no dicionário, sempre pela chave:
>>> contatos["Felix"]
['1111-2222']
>>> contatos["Felix"] = ["9999-1010"]
>>> contatos["Felix"]
['9999-1010']
5. Ordenar o dicionário
Para isto, não existe um método sort() como nas listas. A�nal, não faz muito sentido guardar
os dados do dicionário de maneira ordenada. Para �carem armazenados ordenadamente,
precisamos inseri-los dessa forma. Você pode fazer isso em um programa, mas não é
necessário guardá-los na ordem. 
Por trás do dicionário, há o conceito de hash table: uma estrutura de dados muito poderosa,
cuja ordem dos elementos não é essencial, e sim proposital. 
Uma alternativa é ordenar uma lista com as chaves e acessar os valores na ordem dessa
lista. Vejamos alguns métodos para isso.
MÉTODOS PARA ORDENAR DICIONÁRIOS
     
Método keys()
Permite identi�car as chaves de um dicionário:
>>> contatos.keys()
dict_keys(['Felix', 'Brito', 'Piazza', 'Carlos
Alberto', 'Clodoaldo'])
     
Método values()
Permite visualizar os valores armazenados:
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 13/19
dict_values([['9999-1010'], ['2221-3321',
'3322-3333'], ['4444-4441'], ['4444-5541',
'7777-4545'],
['3333-9999', '8888-3333', '8888-3434']])
Tanto no método keys() quanto no values(), duas listas são retornadas, e podemos usá-las em nossos programas.
     
Método get()
Permite obter o conteúdo associado à chave. Se a chave não existir, o valor associado retornará. Mas, se o valor não
for passado, as chamadas do get para chaves inexistentes retornarão um valor denominado None (“nada”). 
Veja um exemplo:
>>> contatos
{'Felix': ['9999-1010'], 'Brito': ['2221-
3321', '3322-3333'], 'Piazza': ['4444-4441'],
'Carlos Alberto':
['4444-5541', '7777-4545'], 'Clodoaldo':
['3333-9999', '8888-3333', '8888-3434']}
>>> contatos.get('Brito')
['2221-3321', '3322-3333'] → mostrou os
contatos da chave ‘Brito’
>>> contatos.get('Pele')
None → não há
valor armazenado para a chave ‘Pele’
>>> contatos.get('Rivelino')
None
>>> contatos.get('Piazza')
['4444-4441']
>>>
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 14/19
     
Método in
Permite veri�car se uma chave pertence a um dicionário:
>>> "Piazza" in contatos
True → A chave “Piazza” existe no
dicionário
>>> "Pelé" in contatos
False → A chave “Pelé” não existe no
dicionário
     
Método items()
Permite retornar os elementos na forma de tuplas:
>>> contatos.items()
dict_items([('Felix', ['9999-1010']),
('Brito', ['2221-3321', '3322-3333']),
('Piazza', ['4444-4441']),
('Carlos Alberto', ['4444-5541', '7777-
4545']), ('Clodoaldo', ['3333-9999', '8888-
3333', '8888-3434'])])
     
| Método copy()
Permite copiar um dicionário:
>>> contatos
{'Felix': ['9999-1010'], 'Brito': ['2221-
3321', '3322-3333'], 'Piazza': ['4444-4441'],
'Carlos Alberto':
['4444-5541', '7777-4545'], 'Clodoaldo':
['3333-9999', '8888-3333', '8888-3434']}
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 15/19
>>> jogadores = contatos.copy()
>>> jogadores
{'Felix': ['9999-1010'], 'Brito': ['2221-
3321', '3322-3333'], 'Piazza': ['4444-4441'],
'Carlos Alberto':
['4444-5541', '7777-4545'], 'Clodoaldo':
['3333-9999', '8888-3333', '8888-3434']}
Agora, há um dicionário chamado de “jogadores” com o mesmo conteúdo de “contatos”.
     
| Método clear()
Permite apagar todos os elementos do dicionário:
>>> contatos.clear()
>>> contatos
{}
EXERCÍCIO
Analise o código a seguir: 
init_tuple = () 
print (init_tuple.__len__()) 
O que será impresso nele?
a) None
b) 1
c) 0
d) -1
e) Erro! Ocorrerá uma exceção.
Justi�cativa
OUTRAS FORMAS DE CRIAR DICIONÁRIOS
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 16/19
Também podemos criar um dicionário de outras formas. Uma delas é pelo método dict(), que pode receber dois
parâmetros:
Listas de tuplas
Cada uma contém uma chave e um valor. 
Sequência de itens
No formato chave-valor. 
Veja como funciona na prática:
>>> camisas = dict([(7,"Jairzinho"),
(9,"Tostao"),(10,"Pele"),(11,"Rivelino")])
>>> camisas[7]
'Jairzinho'
>>> camisas[10]
'Pele'
Aqui, criamos quatro tuplas: (7,"Jairzinho"), (9,"Tostao"), (10,"Pele"), (11,"Rivelino").Cada uma contém um par chave-valor:
Chave
Número da camisa do jogador. 
Valor
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 17/19
Nome do jogador. 
Nesse caso, usamos tuplas, mas poderíamos ter feito o mesmo processo com listas.
Usando o método fromkeys(lista,valor), é possível criar um dicionário, cujas chaves são os elementos de uma lista, e
cujos valores são todos iguais a determinado valor. Se o valor não for especi�cado, o default é None.
     
| Exemplo 1
>>> {}.fromkeys([16,4,2,3])
{16: None, 4: None, 2: None, 3: None}
Aqui, criamos um dicionário com as chaves 16,4,2,3 pertencentes a uma lista. Não de�nimos nenhum valor a elas.
Logo, seu conteúdo será None, conforme a especi�cação.
     
| Exemplo 2
Agora, vamos melhorar o exemplo anterior:
>>> {}.fromkeys([16,4,2,3],"defesa")
{1: 'defesa', 4: 'defesa', 2: 'defesa', 3:
'defesa'}
Aqui, criamos um dicionário com as chaves 1,4,2,3 com o valor “defesa”. Seria interessante atribuir esse dicionário a
uma variável e usá-la em um programa ou script.
Atenção
, 
A linguagem Python possui formas diferentes de combinar esses recursos para criar programas mais poderosos.
ATIVIDADES
1. Nosso DNA é composto de nucleotídeos que contêm as bases nitrogenadas, representados por quatro letras: 
A = adenina; 
C = citosina; 
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 18/19
T = timina; 
G = guanina. 
Considere a sequência de DNA demonstrado por uma tupla: 
“AATCGGGTTAATGCAATTCG” 
DNA = (‘a’,’a’,’t’, ’c’, ’g’, ’g’, ’g’, ’t’, ’t’, ’a’, ’a’, ’t’, ’g’, ’c’, ’a’, ’a’, ’t’, ’t’, ’c’, ’g’) 
Agora, faça um programa ou script em Python para identi�car a quantidade de timinas (T) que existem nessa
sequência.
Resposta Correta
2. Usando a mesma sequência de DNA, faça um programa ou script para contar cada base.
Resposta Correta
Glossário
HASH TABLE
06/12/2021 19:29 Disciplina Portal
https://estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D213C2740B0F19DC3C17D0E7D5F6153FE93CC57DDA5ED2325A3… 19/19
Também chamada de tabela de espelhamento, esta estrutura de dados contém pares chave-valor. Seu objetivo é fazer uma busca
rápida e obter logo o valor desejado.

Outros materiais