Como lembramos, temos listas compostas (que contém vários valores), como as tuplas e a listas, que são exibidos pelo número do índice, por exemplo:
dados = list()
dados.append("Sérgio")
dados.append(25)
print(dados[0])
print(dados[1])
Mas os dicionários, apesar de semelhantes, permitem o uso de nomes literais para os índices, por exemplo, o código acima, poderia ter os índices nome e idade. Os dicionários são declarados usando chaves, assim:
dados = {"nome": "Sérgio", "idade": 25}
print(dados["nome"])
print(dados["idade"])
Ou assim:
dados = dict()
# Também pode ser assim: dados = {}
dados["nome"] = "Sérgio"
dados["idade"] = 25
print(dados["nome"])
print(dados["idade"])
PS: Os dicionários não aceitam append, para criar um novo índice, fazemos a adição de forma literal, com o novo índice e valor, assim:
dados["sexo"] = "M"
Para excluir podemos usar normalmente o del, assim:
del dados["idade"]
Podemos fazer também assim:
filme = {"titulo": "Star Wars",
"ano": 1977,
"diretor": "George Lucas"}
print(filme.values())
print(filme.keys())
print(filme.items())
Como visto acima, o values() é usado para pegar os valores armazenados no dicionário, o key para pegar os índices e o items para pegar tudo.
E da mesma forma, podemos usar num for assim:
filme = {"titulo": "Star Wars",
"ano": 1977,
"diretor": "George Lucas"}
for k, v in filme.items():
print(f"O {k} é {v}.")
Também podemos juntar listas, tuplas e dicionários, por exemplo:
locadora = [{"titulo": "Star Wars", "ano": 1977, "diretor": "George Lucas"},
{"titulo": "Avengers", "ano": 2012, "diretor": "Joss Whedon"},
{"titulo": "Matrix", "ano": 1999, "diretor": "Wachowski"}]
print(locadora[0]["ano"])
print(locadora[2]["titulo"])
Basicamente, os dicionários mostramos assim:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
print(pessoas)
Podemos também mostrar o índice, com nomes literais:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
# Isso dá erro: print(pessoas[0])
print(pessoas["nome"])
Veja um exemplo de melhor exibição:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
print(f"O {pessoas['nome']} tem {pessoas['idade']} anos.")
Outro exemplo:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
print(pessoas.keys())
print(pessoas.values())
print(pessoas.items())
Com for:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
for k in pessoas.values():
print(k)
Com for e enumerate:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
for k, v in pessoas.items():
print(f"{k} = {v}.")
Podemos também alterar os valores do dicionário:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
pessoas["nome"] = "Sérgio"
for k, v in pessoas.items():
print(f"{k} = {v}.")
Como adicionar e remover índices:
pessoas = {"nome": "Gustavo", "sexo": "M", "idade": 22}
pessoas["peso"] = 98.5
del pessoas["sexo"]
for k, v in pessoas.items():
print(f"{k} = {v}.")
Com dicionários dentro de uma lista:
brasil = list()
estado1 = {"UF": "Rio de Janeiro", "Sigla": "RJ"}
estado2 = {"UF": "São Paulo", "Sigla": "SP"}
brasil.append(estado1)
brasil.append(estado2)
print(brasil)
Podemos exibir dessas formas:
brasil = list()
estado1 = {"UF": "Rio de Janeiro", "Sigla": "RJ"}
estado2 = {"UF": "São Paulo", "Sigla": "SP"}
brasil.append(estado1)
brasil.append(estado2)
print(brasil[0])
print(brasil[0]["UF"])
Só que tem um problema, se adicionarmos os dicionários com um append na lista, ele vai dar um problema, que é aquele de copiar os dados:
estado = dict()
brasil = list()
for c in range(0, 3):
estado["UF"] = str(input("Unidade Federativa: "))
estado["Sigla"] = str(input("Sigla do Estado: "))
brasil.append(estado)
print(brasil)
No caso acima, não dá certo usando o fatiamento no dicionário ([:]), então colocamos o método copy() do dicionário, assim:
estado = dict()
brasil = list()
for c in range(0, 3):
estado["UF"] = str(input("Unidade Federativa: "))
estado["Sigla"] = str(input("Sigla do Estado: "))
brasil.append(estado.copy())
print(brasil)
Melhorando a exibição:
estado = dict()
brasil = list()
for c in range(0, 3):
estado["UF"] = str(input("Unidade Federativa: "))
estado["Sigla"] = str(input("Sigla do Estado: "))
brasil.append(estado.copy())
for e in brasil:
print(e)
Com for aninhado:
estado = dict()
brasil = list()
for c in range(0, 3):
estado["UF"] = str(input("Unidade Federativa: "))
estado["Sigla"] = str(input("Sigla do Estado: "))
brasil.append(estado.copy())
for e in brasil:
for k, v in e.items():
print(f"O campo {k} tem valor {v}.")
A exibição também pode ser feita assim:
for e in brasil:
for v in e.values():
print(v, end=" ")
PS: Os dicionários não devem ser confundido com os sets.
Um objeto do tipo set habilita operações matemáticas de conjuntos, tais como: União, intersecção, diferença, etc. Esse tipo de estrutura pode ser usado em testes de associação e remoção de valores duplicados de uma sequência.
Em Python, uma das maneiras de se criar um objeto do tipo set é colocando os valores entre chaves, conforme código a seguir:
vogais = {"A", "E", "I", "O", "U"}
Lembrando que o set não considera valores repetidos.
Basicamente, as funções na linguagem de programação são chamadas de rotinas (assim como temos a nossa rotina, de sair, dormir, ir pra escola, etc.).
Até agora, usamos funções internas do Python nos programas, como o print(), o len(), o int() e vários outros.
Podemos criar uma função como a de mostrar uma linha, por exemplo, igual a usada em vários programas até agora.
Veja um exemplo disso:
def mostraLinha():
print("-=" * 30)
mostraLinha()
print("SISTEMA DE ALUNOS")
mostraLinha()
Observe que para definir uma rotina, usamos a palavra def antes dela, e no final ela tem parênteses, e não podemos esquecer da tabulação.
Essa rotina permite nós exibirmos essa linha em partes especificadas no nosso programa. Sempre que ela for chamada, será executada, o def não é executado automaticamente.
Isso permite nos facilitar muito, ao não repetirmos códigos iguais, por exemplo:
def mostraLinha():
print("-=" * 30)
mostraLinha()
print("SISTEMA DE ALUNOS")
mostraLinha()
print("CURSO EM VÍDEO")
mostraLinha()
print("APRENDA PYTHON")
mostraLinha()
Podemos também passar parâmetros dentro dos parêntese da def, por exemplo:
def mostraLinha(msg):
print("-=" * 30)
print(msg)
print("-=" * 30)
mostraLinha("SISTEMA DE ALUNOS")
mostraLinha("CURSO EM VÍDEO")
mostraLinha("APRENDA PYTHON")
Isso deixou o programa menor ainda.
As funções são úteis para não escrevermos código longos várias vezes.
Usualmente, faríamos assim para fazer um programa:
a = 4
b = 5
s = a + b
print(s)
a = 8
b = 9
s = a + b
print(s)
a = 2
b = 1
s = a + b
print(s)
Facilitando o código com uma função com parâmetros:
def soma(a, b):
s = a + b
print(s)
soma(4, 5)
soma(8, 9)
soma(2, 1)
Podemos também especificar as posições, mesmo em ordem diferente, dessa forma:
def soma(a, b):
s = a + b
print(f"A = {a}, B = {b}")
print(f"A + B = {s}")
soma(b = 4, a = 1)
PS: Lembrando que se definirmos dois parâmetros, devemos passar sempre dois, se definirmos um passaremos sempre um, se não definirmos nenhum não passamos nada, etc.
Podemos também desempacotar parâmetros, usando o asterisco, que indica que pode passar quantidades variaveis de parâmetros, assim:
def contador(* num):
tam = len(num)
print(f"Recebi os valores {num} e são ao todo {tam} números!")
contador(2, 1, 7)
contador(8, 0)
contador(4, 5, 7, 6, 2)
Pode ver que ele colocou os valores numa tupla (que não é alterável).
Podemos também trabalhar diretamente com listas, passando ela por um parâmetro, por exemplo:
def dobra(lst):
pos = 0
while pos < len(lst):
lst[pos] *= 2
pos += 1
valores = [7, 2, 5, 0, 4]
dobra(valores)
print(valores)
Dessa forma, estaremos alterando diretamente a lista, sem usar o desempacotamento.