Capítulo 3 — Programação I
Mapa da aula
Aula 03 publicada. Mapa, exemplo, EX007.
flowchart TD
N0["3.1 Contar registros"]
N1["3.2 Listas e dicionários"]
N2["Laboratório — Contagem de reportes por unidade"]
N3["3.3 Testar com entradas conhecidas"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX007"]
Desenho lógico
flowchart LR
N0["3.1 Contar registros"]
N1["3.2 Listas e dicionários"]
N2["Laboratório — Contagem de reportes por unidade"]
N3["3.3 Testar com entradas conhecidas"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX007"]
[3.1 Contar registros]
|
v
[3.2 Listas e dicionários]
|
v
[Laboratório — Contagem de reportes por unidade]
|
v
[3.3 Testar com entradas conhecidas]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX007]
Objetivos de aprendizagem
Você vai (1) escrever Python simples para contar e resumir registros; (2) usar listas e dicionários para dados de comportamento; (3) testar um script com entradas conhecidas.
3.1 Contar registros
Nadia escreve seu primeiro script em Python para contar os reportes de e-mails suspeitos por unidade. Cada registro é uma linha com data, unidade e veredito. O script lê as linhas, divide cada uma em campos e soma um ao contador da unidade. O dicionário do Python é ideal para isso, porque associa o nome de cada unidade à sua contagem. Ela imprime os totais em ordem. Até uma contagem simples é útil: mostra que duas unidades com computadores públicos reportam muito mais e-mails do que as outras, o que levanta uma pergunta que vale a pena investigar.
3.2 Listas e dicionários
Uma lista guarda itens em ordem, como todas as datas de reporte, enquanto um dicionário guarda pares, como unidade e contagem. Nadia usa uma lista de dicionários, um por reporte, para que cada reporte mantenha seus campos juntos. Em seguida, filtra a lista para encontrar os reportes maliciosos e os agrupa por unidade. Ela aprende a manter os dados sintéticos e sem nomes de pessoas, já que até código de prática deve respeitar a privacidade. Bons hábitos aprendidos em scripts pequenos se levam para projetos maiores mais adiante no curso.
Laboratório — Contagem de reportes por unidade
# Count synthetic suspicious-email reports by branch.
rows = ["2026-01-03,Central,malicious", "2026-01-04,Riverside,harmless"] + \
[f"2026-{2 + d // 28:02d}-{1 + d % 28:02d},{b},{v}" for d, (b, v) in enumerate(
[("Central", "harmless")] * 13 + [("Riverside", "malicious")] * 9 + [("Hill", "harmless")] * 6 +
[("Market", "harmless")] * 5 + [("Oakfield", "malicious")] * 4 + [("Mill", "harmless")] * 3 +
[("Quay", "harmless")] * 3 + [("Elm", "harmless")] * 2 + [("Abbey", "malicious")] * 1, start=1) if True]
counts = {}
for r in rows:
parts = r.split(",")
if len(parts) != 3: print("skip", r); continue
counts[parts[1]] = counts.get(parts[1], 0) + 1
for b, c in sorted(counts.items(), key=lambda x: -x[1]): print(b, c)
print("total", sum(counts.values()))
Execute com python3 lab_count.py. Saída verificada:
Central 14
Riverside 10
Hill 6
Market 5
Oakfield 4
Mill 3
Quay 3
Elm 2
Abbey 1
total 48
3.3 Testar com entradas conhecidas
Nadia testa o script criando um arquivo minúsculo com cinco reportes cujos totais ela conhece. Se a saída do script coincide com sua contagem manual, ela ganha confiança. Ela também testa um arquivo vazio e uma linha com um campo faltando, e acrescenta uma verificação que pula linhas quebradas com um aviso. Testar com entradas conhecidas é uma disciplina básica da programação, e importa no trabalho de segurança porque contagens erradas podem levar a decisões erradas sobre onde investir esforço ou treinamento.
Exemplo resolvido
Nadia conta reportes sintéticos por unidade com um dicionário, agrupa os reportes maliciosos e testa o script com entradas conhecidas.
Caso sintético. Os dados são sintéticos.
Erros e limites
Linhas quebradas podem esconder problemas reais. Testes pequenos não provam a correção.
Exercícios
- EX007 — Uso do dicionário. Por que um dicionário é adequado para contar por unidade? Rubrica: 3 = associa cada unidade à sua contagem;; 2 = associação;; 1 = ordem da lista;; 0 = nenhuma.
- EX008 — Unidade no topo. Que unidade mais reportou no laboratório? Rubrica: 3 = Central, com 14;; 2 = Central;; 1 = vago;; 0 = nenhuma.
- EX009 — Linhas quebradas. Como o script trata uma linha com um campo faltando? Rubrica: 3 = pula a linha com um aviso;; 2 = pula;; 1 = trava;; 0 = nenhuma.
Síntese
Scripts simples e testados transformam registros em contagens que levantam perguntas úteis.
Continue estudando — aula 03 (capítulo 03 de 40)
← Capítulo 02 · Índice das aulas · Capítulo 04 →
Continue para a próxima aula já escrita.