Unidade 1 · o recado

Recado e crachá

Primeiro você fala. Depois guarda o que a pessoa disse. print, arquivo .py, input, f-string, números. A receita que você inventa (def) espera a unidade 4 — quando a fila já cansou a mão.

Nesta unidade Terminal, print, variável, teclado, contas. O índice à esquerda lista cada bloco. Função com def: unidade 4, depois da via e da fila.

Um arquivo que termina em .py

Crie uma pasta qualquer. Dentro dela, um arquivo chamado recado.py. A extensão .py é um recado para você e para as ferramentas: “isto é Python”, não um e-mail.

Escreva código num editor de texto puro. Word, Google Docs e Excel guardam formatação escondida; o interpretador quer caracteres, não negrito. VS Code, Cursor, Vim ou o Bloco de Notas servem.

  1. Abra o editor. Arquivo novo. Salve como recado.py.
  2. Escreva uma linha de Python (vamos chegar no print já já).
  3. Abra o terminal nessa pasta e chame o interpretador, passando o nome do arquivo.
$ python recado.py

O $ (ou > no Windows) só marca “pode escrever”. Não é dinheiro. Você não “abre o recado”. Você chama o interpretador e passa o nome do arquivo.

O que o computador realmente executa

O processador não entende print. Ele entende instruções bem mais baixas — na prática, padrões de zeros e uns. Você não escreve isso na mão. O interpretador (o programa chamado python) lê o seu arquivo, traduz, e manda a máquina trabalhar.

Por isso o comando tem duas partes: à esquerda, quem traduz; à direita, o texto a traduzir. Sem o Python instalado, o comando nem existe. Com ele instalado, o arquivo continua sendo só texto — até alguém pedir para lê-lo.

Editores sérios pintam o código (palavra-chave numa cor, texto noutra). Isso se chama syntax highlighting. É maquiagem útil: ajuda o olho humano. O interpretador ignora cor; ele só lê caracteres.

1.A · o que a CPU vê

O arquivo recado.py contém, para o processador, o quê?

Você abre o .py no Bloco de Notas e lê palavras. A CPU não lê palavras.
Há um programa no meio: o interpretador.
Solução: o arquivo é texto; o interpretador traduz.

Duas portas: terminal e janela

CLI (interface de linha de comando) é o terminal: você digita, o programa responde em texto. GUI (interface gráfica) é janela, botão, ícone — o WhatsApp no celular, o navegador.

Os dois existem. Programas prontos quase sempre usam GUI. Para aprender o fluxo linha a linha, o terminal ganha: cada comando é visível, cada erro aparece escrito, não há clique mágico escondendo o que aconteceu.

Neste curso, o fluxo padrão é: editor + terminal. Mais tarde você pode colocar uma janela na frente. A lógica por baixo continua a mesma.

1.B · CLI

Neste curso, por que começamos pelo terminal e não por uma janela com botão “Rodar”?

WhatsApp (ícones) versus a faixa onde você digita python arquivo.py.
Não é que GUI seja proibida. É que ela esconde o interpretador.
Solução: o terminal torna o fluxo visível.
1.C · quem executa

O comando python recado.py faz o quê?

Há dois nomes no comando: o programa da esquerda e o arquivo da direita.
python é o interpretador. O .py é a receita que ele vai ler.
Solução: o interpretador lê e executa recado.py.

A primeira ferramenta: print

Função é uma ferramenta com nome. print escreve na tela. Entre parênteses vai o argumento — o ingrediente da vez. Aspas marcam um pedaço de texto (string).

print("Café na máquina.")
$ python recado.py
Café na máquina.

O que aparece no terminal é um efeito: algo visível. Mais adiante você vai conhecer funções que, além disso (ou em vez disso), devolvem um valor para guardar.

Aspas simples ou duplas valem, desde que abram e fechem iguais. Muita gente escolhe duplas e fica nisso o curso inteiro — consistência ajuda a ler.

Se o texto precisa de aspas por dentro, você troca o tipo por fora: print('ele disse "oi"'). Ou escapa: print("ele disse \"oi\""). A barra invertida avisa: o próximo caractere não fecha a string; faz parte dela.

1.D · primeira linha

Escreva a linha que imprime exatamente Café na máquina.

O nome da ferramenta é print. Depois vêm parênteses.
O recado vai entre aspas, dentro dos parênteses. Inclua o ponto final.
Solução: print("Café na máquina.")

Quando o computador recusa

Esqueça o ) no fim. Para um humano é typo. Para o Python é frase pela metade. Ele responde com SyntaxError e não executa. Mensagens às vezes são claras (“nunca fechou o parêntese”); às vezes chutam errado. Com prática você lê o que importa: a linha apontada e o tipo do erro.

print("Café na máquina."
SyntaxError: '(' was never closed

Isso não é fracasso pessoal. É o contrato da linguagem: ou a gramática fecha, ou não roda. Conserte, rode de novo. No terminal, seta para cima recupera o último comando; Tab completa nomes de arquivo.

Há outra família de problema: o arquivo roda, mas faz a coisa errada. Isso é bug de lógica, não de sintaxe. O interpretador não reclama — porque a gramática está ok. Quem reclama é você, olhando a tela. Os dois consertos são diferentes: um é pontuação; o outro é o pensamento.

1.E · parêntese

Se faltar o ) em print("Café na máquina.", o que acontece?

O interpretador analisa o arquivo inteiro antes de começar a “fazer” as linhas.
Gramática incompleta = SyntaxError. Não há impressão parcial.
Solução: SyntaxError, execução recusada.

Notas para humano, não para a tela

Linha que começa com # é comentário. O interpretador ignora. Serve para você daqui a uma semana, não para “explicar o óbvio” em programa de duas linhas.

# recado da manhã — aparece só no arquivo, não no terminal
print("Café na máquina.")

Bloco maior: três aspas seguidas (""" ou ''') abrem e fecham um texto de várias linhas. Usado como docstring no topo de função (módulo 04) ou, à moda antiga, como comentário comprido. Não é print: não vai para o terminal sozinho.

Rascunho em português (às vezes chamado de pseudocódigo) vale antes de digitar Python: “perguntar o nome; limpar espaços; imprimir o crachá”. Depois você troca cada frase por uma linha de verdade. Não precisa de formato oficial. Precisa de clareza.

print com vários argumentos

print aceita zero, um ou muitos valores, separados por vírgula fora das aspas. Por padrão, coloca um espaço entre eles e, no fim, pula de linha. Isso está documentado assim: argumentos posicionais (a ordem importa) e parâmetros nomeados (você chama pelo nome).

sep troca o separador. end troca o que vem no fim (o padrão é \n, “nova linha”).

print("SP", "Brasil", sep="-")
# SP-Brasil
print("item", end="")
print("seguido")
# itemseguido   — o segundo print continua na mesma linha

end="" é string vazia: não pula linha. Útil quando você monta a linha em pedaços (volta no módulo 06). print() sem argumento só emite o \n padrão — uma linha em branco.

Posicional: print("a", "b") — a ordem é a da vírgula. Nomeado: sep="-" — o nome sep, um =, o valor. Você não escreve o traço “solto” e espera que o Python adivinhe.

1.F · sep

Imprima RJ e Brasil na mesma linha, separados por /, usando sep.

Dois argumentos de texto, vírgula entre eles, depois sep= com o caractere escolhido.
sep é nomeado: você escreve sep="/", não só a barra solta.
Exemplo: print("RJ", "Brasil", sep="/")
1.G · end

Dois prints na mesma linha: o primeiro deve usar end para não pular sozinho.

O parâmetro se chama end. O valor costuma ser "" (nada) ou um espaço.
print("a", end="") cola o próximo print na mesma linha.
Exemplo: print("item", end="")

Onde está escrito o contrato do print

A linguagem tem dono da especificação: a documentação em docs.python.org — print. Lá aparece a assinatura completa: vários objetos, sep, end, e outros detalhes que ainda não precisamos.

Vale o hábito de abrir, mesmo quando a página parecer densa. Este curso traduz o essencial; a docs é a fonte se um dia o material e o interpretador discordarem.

Oficina · cartão no terminal

Problema da unidade Monte um “cartão de visita” com pelo menos três linhas: seu nome (ou um nome inventado), o que você faz, e um contato falso. Só print. Salve como cartao.py e rode no terminal. Aqui na página, cole o código para conferir se há três prints.
Oficina 1 · cartão

Cole um programa com no mínimo três print.

Uma informação por print já resolve. Depois você aprende a juntar tudo numa linha só.
Três chamadas: nome, função, contato. Pode usar sep se quiser enfeitar.
Modelo:
print("Nícolas")
print("engenharia de software")
print("n@empresa.exemplo")

Perguntar e receber

input mostra um convite e espera Enter. O que a pessoa digitou volta para o programa — um valor de retorno. Funções de print só faziam efeito na tela; esta entrega um objeto para você usar.

input("Apelido: ")

Se você não guardar o retorno, ele some. É como alguém falar o nome no balcão e ninguém anotar no crachá.

Perguntar, receber, etiquetar

Variável é uma gaveta com etiqueta. O = não pergunta se os dois lados são iguais. Ele copia da direita para a esquerda: o retorno de input entra na gaveta apelido.

apelido = input("Apelido: ")

Nomes descritivos batem nomes de uma letra: o teclado está aí para isso. Letras, números e _; não começa com número; não use palavra reservada (if, print como nome de variável atrapalha).

Depois de guardar, print(apelido) — sem aspas — mostra o conteúdo. Com aspas, mostra a palavra.

Armadilha das aspas print("Olá, apelido") imprime a palavra apelido. Aspas = texto cru. A gaveta só é lida sem aspas — ou dentro de uma f-string, no próximo bloco.
1.H · aspas

apelido = "Bia" e em seguida print("Oi, apelido"). O que aparece?

Tudo entre aspas é copiado para a tela como está.
Não há mágica que procure uma variável no meio da string — a menos que seja f-string.
Solução: imprime literalmente Oi, apelido.

Notas no arquivo de texto

Linha que começa com #: o interpretador ignora. Serve para você daqui a uma semana. Várias linhas? Vários #.

# ficha da recepção
apelido = input("Apelido: ")

Três aspas ("""...""") viram um bloco de texto. No topo de uma função isso vira documentação (docstring). Solto no meio do arquivo, o Python cria a string e descarta — não imprime. Quem imprime é o print.

1.I · o que aparece

Um arquivo tem # fila da manhã e, abaixo, print("senha 12"). O terminal mostra o quê?

# é nota para humano. O interpretador pula.
Só print manda texto para o terminal.
Solução: só senha 12.

f-string: o jeito padrão daqui

Um f colado antes das aspas liga a substituição. Chaves no meio do texto puxam o valor da gaveta:

apelido = input("Apelido: ")
print(f"Crachá: {apelido}")

Há outros jeitos (concatenar com +, vários argumentos no print). Eles existem e às vezes são úteis. Neste curso, se a frase mistura texto fixo e variável, comece pela f-string. Menos vírgula no lugar errado, menos espaço duplicado.

1.J · f-string

apelido já existe. Imprima uma frase que inclua o valor, com f-string.

f fica colado na primeira aspas: f"..."
Dentro do texto, {apelido} — sem aspas nas chaves.
Exemplo: print(f"Crachá: {apelido}")

Colar texto sem f-string

+ entre duas strings cola. "Bem-vindo, " + apelido exige você lembrar do espaço na mão. print("Bem-vindo,", apelido) ganha um espaço automático — e um espaço a mais se você já pôs um nas aspas.

Misturar número com + e string dá TypeError. Aí ou você usa f-string, ou str(n). No módulo 03 o número entra de verdade; aqui o recado é: o + de string não é o + da calculadora.

A pessoa não digita “bonito”

Espaço no começo, tudo minúsculo, enter nervoso. String traz ferramentas chamadas métodos: nome da gaveta, ponto, nome da ferramenta, parênteses.

apelido = apelido.strip().title()

strip tira espaços das pontas (não do meio). title põe maiúscula em cada palavra — melhor para “ana souza” do que capitalize, que só mexe na primeira letra da string inteira. O resultado precisa voltar para a gaveta com =; senão você limpou e jogou fora.

Dá para encadear no input:

apelido = input("Apelido: ").strip().title()

Linha longa demais? Quebre em duas atribuições. Legível ganha de “cabe numa linha”.

1.K · strip + title

Atualize apelido: sem espaços nas pontas e com cada palavra capitalizada.

Método usa ponto: apelido.strip()
Encadeie .title() no resultado e atribua de volta para apelido.
Solução: apelido = apelido.strip().title()

Só a esquerda, só a direita, contar

lstrip limpa a esquerda; rstrip a direita; strip os dois. Nenhum deles apaga espaço no meio da frase. Para isso entra replace ou, mais tarde, outras ferramentas.

fila = "  12  "
print(fila.lstrip())  # "12  "
print(fila.rstrip())  # "  12"

count conta quantas vezes um trecho aparece. "banana".count("na") vale 2: o par na no meio e no fim — não é a letra a sozinha (essa aparece três vezes).

1.L · um lado só

Escreva uma linha que tire espaços só da esquerda de fila (método lstrip ou só da direita com rstrip).

Ponto, nome do método, parênteses vazios.
fila.lstrip() ou fila.rstrip()
Exemplo: fila = fila.lstrip()
1.M · count

Quanto vale "banana".count("na")?

count procura o trecho inteiro, não cada letra.
ba-na-na: o par na aparece duas vezes.
Solução: 2

Outras ferramentas de texto

FerramentaUso típico
len(s)Quantos caracteres (função, não método)
s.lower() / s.upper()Caixa baixa / alta — comparar sem se importar com maiúscula
s.replace("a", "b")Trocar trecho
s.startswith(".py")Teste de prefixo (volta na unidade 1)

len é função: vai na frente, entre parênteses. Os outros são métodos: vão depois do ponto. Espaço conta. len("Ana ") com dois espaços no fim é 5.

1.N · len

Quanto vale len("Ana ")? (dois espaços no fim)

len não ignora espaço. Cada caractere conta.
Três letras e dois espaços.
Solução: 5

Quebrar um nome composto

split fatia a string num separador. Com um espaço, “Ana Souza” vira dois pedaços. Python deixa desempacotar:

primeiro, ultimo = "Ana Souza".split(" ")
print(f"Na lista: {primeiro}")

Se a pessoa digitar três nomes, essa linha quebra: há mais pedaços do que gavetas. A oficina pede só nome e sobrenome simples. Mais tarde você trata o resto.

1.O · split

primeiro, ultimo = "Ana Souza".split(" "). Qual o valor de primeiro?

split corta no espaço. Esquerda do espaço é o primeiro pedaço.
A primeira variável recebe o primeiro pedaço.
Solução: Ana

Oficina · crachá da portaria

Problema da unidade Peça o nome completo da pessoa, tire espaços extras das pontas, deixe em título, e imprima Crachá: … com f-string. Arquivo sugerido: cracha.py.
Oficina 1 · crachá

Cole o programa do crachá (input + strip + f-string).

Uma variável, um input com pergunta clara. Encadeie strip (e title, se quiser).
O print final é f-string com a variável entre chaves.
Modelo:
nome = input("Nome completo: ").strip().title()
print(f"Crachá: {nome}")

O teclado não manda int

Arquivo cafe.py: preço do café vezes a quantidade. Ingênuo:

preco = input("Preço unitário: ")
qtd = input("Quantos: ")
print(preco * qtd)  # TypeError: não multiplica str assim

Troque * por + e o clássico aparece: "12" + "3" vira 123. Concatenação, não soma. int e float são tipos e também funções conversoras.

1.P · cola

Por que "12" + "3" resulta em 123?

input devolve o mesmo tipo que aspas: texto.
O símbolo + é sobrecarregado: texto cola, número soma.
Solução: concatenação de strings.

Converter de verdade

Centavos pedem float. Quantidade inteira pede int. Aninhar é válido: o de dentro roda primeiro.

preco = float(input("Preço unitário: "))
qtd = int(input("Quantos: "))
total = preco * qtd
print(f"Total: {total:.2f}")

Se a pessoa digitar bolo, float explode — isso se resolve com decisão no unidade 1. Hoje assumimos cooperação, mas você já sabe onde o programa é frágil.

str(n) faz o caminho inverso quando você precisa colar número no meio de texto sem f-string.

1.Q · float

Uma linha: leia o preço (com centavos) e grave em preco.

input no centro, float por volta, = à esquerda com o nome preco.
Pergunta entre aspas, espaço no fim se quiser o cursor separado.
Exemplo: preco = float(input("Preço unitário: "))

Conversar com o interpretador

No terminal, python sem nome de arquivo abre o prompt >>>. Cada linha executa na hora. Útil para testar type(x), uma conta, um round. Não substitui o arquivo: feche com exit() ou Ctrl+Z no Windows (Ctrl+D no Unix) e volte ao .py quando o trecho prestar para guardar.

>>> type(3)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("12")
<class 'str'>
1.R · >>>

Como entrar no modo em que cada linha roda na hora, sem arquivo?

O mesmo programa python, mas sem o nome do arquivo à direita.
O prompt muda para três sinais de maior.
Solução: python sozinho, prompt >>>.

Contas que o Python já sabe

+* /
soma, menos, vezes, divisão (esta última já devolve float)
// e %
quociente inteiro e resto
**
potência · pow(2, 3) é o mesmo que 8

abs(-8) tira o sinal. min(4, 9, 1) e max(...) escolhem extremos. Inteiros em Python 3 não têm teto prático; float tem precisão finita — 0,1 + 0,2 às vezes não é o 0,3 da caderneta. Para dinheiro, arredonde na hora de mostrar.

1.S · resto

Quanto vale 10 % 3?

% não é “por cento”. É o que sobra depois de caber o máximo de 3 em 10.
3 + 3 + 3 = 9. Sobra 1.
Solução: 1
1.T · divisão inteira

Quanto vale 10 // 3?

Duas barras descartam a fração. Não é 3.333.
Cabe 3 vezes o 3 dentro de 10.
Solução: 3

Duas casas na tela e na gaveta

round(total, 2) arredonda o valor. A f-string {total:.2f} só controla a aparência na tela — o número na gaveta pode continuar com mais casas. Escolha: arredondar de verdade (round) ou só formatar (f-string). Em recibo, os dois juntos são comuns.

por_pessoa = total / pessoas
print(f"{round(por_pessoa, 2):.2f}")

O resto % volta no unidade 1 para fila par/ímpar. Aqui ele já existe: 10 % 3 == 1.

1.U · round

Arredonde a variável total para duas casas decimais (uma chamada a round).

round recebe o número e, opcional, quantas casas.
Duas casas: segundo argumento 2.
Exemplo: round(total, 2) ou total = round(total, 2)

Números grandes na f-string

Na f-string, {n:,} pede separador de milhar no estilo da documentação da linguagem (vírgula: 1,000). No Brasil o olho espera ponto: 1.000. Dá para trocar o locale depois; a sintaxe nativa é essa vírgula dentro das chaves. Não é o sep do print — é formatação do próprio número.

vendas = 12500
print(f"Hoje: {vendas:,}")
# Hoje: 12,500
1.V · milhar

Uma f-string que imprima a variável n com separador de milhar (:,).

f"..." com a variável entre chaves.
Dentro das chaves: n:, — dois-pontos e vírgula.
Exemplo: print(f"{n:,}")

Oficina · a mesa paga

Problema da unidade Leia o valor da conta (float) e o número de pessoas (int). Some 10% de serviço. Divida igualmente. Imprima quanto cada um paga, com duas casas. Arquivo: mesa.py.
Oficina 1 · mesa

Cole o programa da mesa (float, divisão, print).

conta = float(input(...)); pessoas = int(input(...))
com_servico = conta * 1.10 (ou conta + conta * 0.10). Depois divida por pessoas.
print com f-string e :.2f, ou round(..., 2).
Modelo:
conta = float(input("Conta: "))
pessoas = int(input("Pessoas: "))
cada = (conta * 1.10) / pessoas
print(f"Cada um: {cada:.2f}")