Capítulo 3 — Fundamentos de programação
Mapa da aula
Aula 03 publicada. Mapa, exemplo, EX007.
flowchart TD
N0["3.1 Por que tecnólogos escrevem scripts"]
N1["3.2 Dicionários para consultas"]
N2["3.3 Dado ausente é um resultado"]
N3["3.4 Saída legível"]
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 Por que tecnólogos escrevem scripts"]
N1["3.2 Dicionários para consultas"]
N2["3.3 Dado ausente é um resultado"]
N3["3.4 Saída legível"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX007"]
[3.1 Por que tecnólogos escrevem scripts]
|
v
[3.2 Dicionários para consultas]
|
v
[3.3 Dado ausente é um resultado]
|
v
[3.4 Saída legível]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX007]
Objetivos de aprendizagem
Você vai (1) escrever programas curtos em Python usando apenas a biblioteca padrão; (2) usar listas, dicionários e laços para processar registros; (3) tratar dados ausentes de forma explícita; e (4) manter os scripts legíveis para colegas que não são programadores.
3.1 Por que tecnólogos escrevem scripts
Boa parte do trabalho de segurança de TO é comparar listas: ativos na documentação versus ativos vistos na rede, fluxos aprovados versus fluxos observados, datas de certificados versus a data de hoje. Fazer isso a olho, em centenas de linhas, é lento e sujeito a erros. Um script de vinte linhas faz isso sempre do mesmo jeito, e a sua saída pode ser anexada a um chamado. O primeiro script desse tipo de Priya comparou a documentação da empresa contratada com uma observação passiva e produziu a saída de cinco linhas do Capítulo 11: duas correspondências, uma câmera presente só na rede, a HMI-C presente só nos documentos e o conflito de versão do PLC-R2.
3.2 Dicionários para consultas
Um dicionário Python mapeia uma chave (nome do dispositivo) para um valor (versão de firmware). Verificar "este dispositivo está documentado?" vira name in docs, que é rápido e legível. Conjuntos (sets) dão união e diferença diretamente: set(a) - set(b) lista o que está em a mas não em b. O script de inventário de Priya mantém um dicionário vindo dos documentos da empresa contratada e outro vindo da observação passiva, cada um mapeando um nome de dispositivo para a sua string de firmware. A união dos dois conjuntos de chaves é a lista completa de dispositivos a reportar; as diferenças são os dois grupos interessantes, a CAM-DOCK só na rede e a HMI-C só nos documentos.
3.3 Dado ausente é um resultado
Quando um valor está ausente, diga isso na saída. dict.get(key) devolve None em vez de quebrar, e o script pode imprimir "-" e um estado como "only-in-docs". Pular silenciosamente as linhas com dados ausentes é como as lacunas desaparecem dos relatórios. O primeiro rascunho de Priya fez exatamente isso: percorria só as correspondências, de modo que a CAM-DOCK, ausente dos documentos, nunca aparecia. Um colega perguntou onde estava a câmera. A correção dela foi uma linha, percorrendo sorted(set(docs) | set(seen)), de modo que todo dispositivo é impresso com um estado e o ausente diz isso. A saída do Capítulo 11 agora mostra docs=- para a CAM-DOCK em vez de omiti-la.
3.4 Saída legível
Alinhe as colunas com larguras de f-string (f"{name:9}") e coloque a decisão no fim de cada linha. Um revisor pode então percorrer a última coluna em busca de qualquer coisa que não seja "match". Na saída do Capítulo 11, a última coluna diz only-on-network, match, only-in-docs, match e VERSION-CONFLICT, de modo que um gerente de instalações encontra as três linhas que pedem ação sem ler as strings de firmware. Os nomes dos dispositivos são preenchidos até nove caracteres, o que mantém alinhadas as colunas de documentação e de rede mesmo para a CAM-DOCK. Um revisor que veja um estado fora dos cinco valores documentados sabe que o script encontrou uma entrada que não entende.
Exemplo resolvido (NCS sintética)
Priya escreve um laço sobre dois dicionários, um vindo da documentação da empresa de refrigeração e outro de uma observação passiva da rede. O primeiro rascunho imprimia só as correspondências; um colega perguntou onde estava a CAM-DOCK. Ela o reescreveu para percorrer a união das chaves, de modo que todo dispositivo aparece com um estado. A versão completa é o laboratório do Capítulo 11.
Caso sintético — Northgate Cold Storage. Os dados são inventados.
Erros e limites
Scripts que leem dispositivos ativos precisam de uma permissão de trabalho e de limites de taxa cuidadosos; os scripts deste curso leem apenas arquivos. Dê às variáveis nomes que digam o que elas guardam, e não x e y.
Exercícios
- EX007 — Diferença de conjuntos. Dados
docs = {"A", "B", "C"}eseen = {"B", "C", "D"}, o que devolvemdocs - seeneseen - docs? Rubrica: 3 = {"A"} e {"D"}, com o significado; 2 = só os valores; 1 = um; 0 = nada. - EX008 — Tratando uma chave ausente. O que devolve
{"PLC-R1": "2.4"}.get("PLC-R9"), e o que o script deve imprimir? Rubrica: 3 = None; imprimir "-" mais um estado; 2 = só o valor; 1 = diz KeyError; 0 = nada. - EX009 — Corrigindo o erro de só-correspondências. Escreva a mudança de uma linha que faz o laço de Priya mostrar todos os dispositivos. Rubrica: 3 = percorrer
sorted(set(docs) | set(seen)); 2 = ideia certa; 1 = vago; 0 = nada.
Síntese
Scripts pequenos e legíveis que reportam todas as linhas — inclusive as ausentes — transformam a comparação de listas em evidência repetível.
Continue estudando — capítulo 03 de 30
← Capítulo 02 · Índice de capítulos do curso · Capítulo 04 →
Siga para a próxima lição escrita.