"A Máquina Analítica não tem pretensões de originar nada. Ela pode fazer qualquer coisa que saibamos como ordenar que ela execute." (Ada Lovelace, Outubro, 1842)
Antes de poder escrever programas de criptografia, você precisa aprender alguns conceitos básicos de programação. Esses conceitos incluem valores, operadores, expressões e variáveis.
Operadores
Valores
Números inteiros e flutuantes
Expressões
Avaliando expressões
Armazenar valores em variáveis
Sobrescrever variáveis
Vamos começar explorando como fazer matemática simples na IDLE do Python. Desenvolver memória muscular a partir da digitação de programas ajudará você a lembrar como o código Python é construído.
Comece abrindo o IDLE. Você verá o shell interativo e o cursor piscando ao lado do prompt >>>. O shell interativo pode funcionar como uma calculadora. Digite 2 + 2 no shell e pressione ENTER no seu teclado. O computador deve responder exibindo o número 4.
No exemplo acima, o sinal + diz ao computador para somar os números 2 e 2, mas o Python também pode fazer outros cálculos, como subtrair números usando o sinal de menos (–), multiplicar números com um asterisco (*) ou dividir números com uma barra (/). Quando usados dessa forma, +, -, * e / são chamados operadores porque dizem ao computador para executar uma operação nos números ao redor deles. A Tabela 1 resume os operadores matemáticos do Python. Os 2s (ou outros números) são chamados valores.
Tabela 2: Operadores matemáticos em Python.
Por si só, 2 + 2 não é um programa; é apenas uma única instrução. Programas são feitos de muitas dessas instruções.
Em programação, números inteiros, como 4, 0 e 99, são chamados de inteiros. Números com pontos decimais (3,5, 42,1 e 5,0) são chamados de números de ponto flutuante. Em Python, o número 5 é um inteiro, mas se você o escrevesse como 5,0, seria um número de ponto flutuante.
Inteiros e pontos flutuantes são tipos de dados. O valor 42 é um valor do tipo de dados inteiro, ou int. O valor 7.5 é um valor do tipo de dados de ponto flutuante, ou float.
Cada valor tem um tipo de dado. Você aprenderá sobre alguns outros tipos de dados (como strings no Capítulo 3), mas por enquanto lembre-se de que sempre que falamos sobre um valor, esse valor é de um certo tipo de dado. Geralmente é fácil identificar o tipo de dado apenas observando como o valor é escrito. Ints são números sem pontos decimais. Floats são números com pontos decimais. Então 42 é um int, mas 42.0 é um float.
Você já viu o Python resolver um problema de matemática, mas o Python pode fazer muito mais. Tente digitar os seguintes problemas de matemática nas células abaixo, executando cada uma:
2 + 2 + 2 + 2 + 2 # 1
8 * 6
10 - 5 + 6 # 2
2 + 2 # 3
Esses problemas matemáticos são chamados de expressões. Os computadores podem resolver milhões desses problemas em segundos. As expressões são compostas de valores (os números) conectados por operadores (os sinais matemáticos). Você pode ter quantos números quiser em uma expressão (1), desde que eles sejam conectados por operadores; você pode até usar vários tipos de operadores em uma única expressão (2). Você também pode inserir qualquer número de espaços entre os inteiros e esses operadores (3). Mas certifique-se de sempre iniciar uma expressão no início da linha, sem espaços na frente, porque os espaços no início de uma linha mudam como o Python interpreta as instruções.
Você pode se lembrar da frase “ordem das operações” da sua aula de matemática. Por exemplo, a multiplicação é feita antes da adição. A expressão 2 + 4 * 3 é avaliada como 14 porque a multiplicação é feita primeiro para avaliar 4 * 3, e então 2 é adicionado. Parênteses podem fazer operadores diferentes irem primeiro. Na expressão (2 + 4) * 3, a adição é feita primeiro para avaliar (2 + 4), e então essa soma é multiplicada por 3. Os parênteses fazem a expressão ser avaliada como 18 em vez de 14. A ordem das operações (também chamada de precedência) dos operadores matemáticos do Python é semelhante à da matemática. As operações dentro dos parênteses são avaliadas primeiro; em seguida, os operadores * e / são avaliados da esquerda para a direita; e então os operadores + e - são avaliados da esquerda para a direita.
Quando um computador resolve a expressão 10 + 5 e obtém o valor 15, dizemos que ele avaliou a expressão. Avaliar uma expressão reduz a expressão a um único valor, assim como resolver um problema de matemática reduz o problema a um único número: a resposta.
As expressões 10 + 5 e 10 + 3 + 2 têm o mesmo valor, porque ambas são avaliadas como 15. Até mesmo valores únicos são considerados expressões: a expressão 15 é avaliada como o valor 15.
O Python continua avaliando uma expressão até que ela se torne um único valor, como no seguinte:
Figura 1: Exemplo de como o Python "avalia" uma expressão.
O Python avalia uma expressão começando com os parênteses mais internos e mais à esquerda. Mesmo quando os parênteses são aninhados uns nos outros, as partes das expressões dentro deles são avaliadas com as mesmas regras de qualquer outra expressão. Então, quando o Python encontra ((7 + 1) / (3 - 1)), ele primeiro resolve a expressão nos parênteses internos mais à esquerda, (7 + 1), e então resolve a expressão à direita, (3 - 1). Quando cada expressão nos parênteses internos é reduzida a um único valor, as expressões nos parênteses externos são então avaliadas. Observe que a divisão é avaliada como um valor de ponto flutuante. Finalmente, quando não há mais expressões entre parênteses, o Python executa quaisquer cálculos restantes na ordem das operações.
Em uma expressão, você pode ter dois ou mais valores conectados por operadores, ou pode ter apenas um valor, mas se você inserir um valor e um operador sem mais um valor após o operador, você receberá uma mensagem de erro:
5 +
Este erro acontece porque 5 + não é uma expressão. Expressões com múltiplos valores precisam de operadores para conectar esses valores e, na linguagem Python, o operador + espera conectar dois valores. Um erro de sintaxe significa que o computador não entende a instrução que você deu a ele porque você a digitou incorretamente. Isso pode não parecer importante, mas a programação de computadores não é apenas sobre dizer ao computador o que fazer — é também sobre saber a maneira correta de dar ao computador instruções que ele pode seguir.
Os programas geralmente precisam salvar valores para usar mais tarde no programa. Você pode armazenar valores em variáveis usando o sinal = (chamado de operador de atribuição). Por exemplo, para armazenar o valor 15 em uma variável chamada num:
num = 15
Você pode pensar na variável como uma caixa com o valor 15 dentro dela. O nome da variável num é o rótulo na caixa (para que possamos diferenciar uma variável da outra), e o valor armazenado nela é como uma nota dentro da caixa.
Ao executar a célula você não verá nada. A menos que veja uma mensagem de erro, você pode assumir que a instrução foi executada com sucesso.
Esta instrução com o operador de atribuição = (chamado de instrução de atribuição) cria a variável num e armazena o valor 15 nela. Diferentemente de expressões, declarações são instruções que não avaliam nenhum valor; em vez disso, elas apenas executam uma ação. É por isso que nenhum valor é exibido na saída.
Descobrir quais instruções são expressões e quais são declarações pode ser confuso. Apenas lembre-se de que se uma instrução Python for avaliada como um único valor, é uma expressão. Se não for, é uma declaração.
Uma declaração de atribuição é escrita como uma variável, seguida pelo operador =, seguido por uma expressão. O valor que a expressão avalia é armazenado dentro da variável.
Tenha em mente que variáveis armazenam valores únicos, não as expressões que são atribuídas a elas. Por exemplo, se você digitar a instrução num = 10 + 5, a expressão 10 + 5 é primeiro avaliada como 15 e então o valor 15 é armazenado na variável num:
num = 10 + 5
num
Como você pode ver, variáveis podem ser usadas em expressões da mesma forma que valores. Como o valor de num é 15, a expressão num + 5 é avaliada como a expressão 15 + 5, que então é avaliada como 20.
Você pode alterar o valor armazenado em uma variável inserindo outra instrução de atribuição. Por exemplo, insira o seguinte:
num = 15
num + 5 # 1
num = 3 # 2
num + 5 # 3
Na primeira vez que você insere num + 5 (1), a expressão é avaliada como 20 porque você armazenou o valor 15 dentro da variável num. Mas quando você insere num = 3 (2), o valor 15 é sobrescrito (isto é, substituído) pelo valor 3. Agora, quando você insere num + 5 (3), a expressão é avaliada como 8 porque num + 5 é avaliado como 3 + 5. O valor antigo em num é esquecido.
Você pode até usar o valor na variável num para atribuir um novo valor ao num:
num = 15
num = num + 5
num
A declaração de atribuição num = num + 5 diz ao computador que “o novo valor da variável num é o valor atual de num mais cinco”. A variável no lado esquerdo do sinal = recebe o valor da expressão no lado direito. Você pode continuar aumentando o valor em num em 5 várias vezes:
num = 15
num = num + 5
num = num + 5
num = num + 5
num
O valor em num é alterado cada vez que num = num + 5 é executado. O valor armazenado em num acaba sendo 30.
Embora o computador não se importe com o nome que você dá às suas variáveis, você deveria. Dar nomes às variáveis que reflitam o tipo de dados que elas contêm torna mais fácil entender o que um programa faz. Você pode dar nomes às suas variáveis como baleia_jubarte ou macaco mesmo que seu programa não tenha nada a ver com baleias jubartes ou macacos — o computador ainda executaria o programa (contanto que você usasse consistentemente baleia_jubarte ou macaco). Mas quando você retorna a um programa depois de não vê-lo por um longo tempo, você pode não se lembrar do que cada variável faz.
Um bom nome de variável descreve os dados que ele contém. Imagine que você se mudou para uma casa nova e rotulou todas as suas caixas de mudança como Coisas. Você nunca encontraria nada!
Nomes de variáveis (assim como tudo o mais em Python) são sensíveis a maiúsculas e minúsculas. Sensível a maiúsculas e minúsculas significa que o mesmo nome de variável em um caso diferente é considerado uma variável totalmente diferente. Por exemplo, num, NUM, Num e nuM são considerados quatro variáveis diferentes em Python. Cada uma delas pode conter seus próprios valores separados e não podem ser usadas de forma intercambiável.
Exercício 01: Qual operador é usado para divisão, / ou \?
Exercício 02: Qual dos seguintes é um valor inteiro e qual é um valor de ponto flutuante?
42
3.141592
Exercício 03: Quais das seguintes linhas não são expressões?
4 x 10 + 2
3 * 7 + 1
2 +
42
2 + 2
num = 42
Exercício 04: Se você inserir as seguintes linhas de código no shell interativo, o que as linhas 1 e 2 imprimem?
num = 20
num + 20 # 1
NUM = 30
num # 2
Então, quando vamos começar a fazer programas de criptografia? Em breve. Mas antes que você possa hackear cifras, você precisa aprender apenas mais alguns conceitos básicos de programação, então há mais um capítulo de programação que você precisa ler.
Neste capítulo, você aprendeu o básico sobre como escrever instruções Python na IDLE. O Python precisa que você diga a ele exatamente o que fazer de uma forma que ele espera, porque os computadores só entendem instruções muito simples. Você aprendeu que o Python pode avaliar expressões (ou seja, reduzir a expressão a um único valor) e que expressões são valores (como 2 ou 5) combinados com operadores (como + ou -). Você também aprendeu que pode armazenar valores dentro de variáveis para que seu programa possa se lembrar deles para usar mais tarde.
No Capítulo 3, você criará programas que contêm muitas instruções que são executadas em sequência em vez de uma de cada vez. Discutiremos alguns conceitos mais básicos e você escreverá seu primeiro programa!