PythonAula 1125/08/20261h38
Match-case e RPG de decisões
Retoma if/elif/else com input(), isdigit() e int() para validar número antes de converter. Troca aquela cadeia de dia == 0, dia == 1... por match/case para decidir por igualdade. Destrava case _ como saída para inválido, pass para bloco vazio e um mini RPG com ternário, random.randint() e match com guard.
O que foi falado
00:05:50isvs==e teste direto debool==compara valores,iscompara identidade na memória, então usarispara número ou texto pode falhar. Se a variável já éTrueouFalse, dá para escreverif vinhoem vez deif vinho == True. É a forma mais curta e evita comparação à toa. O resultado deisneste exemplo não deve ser usado como teste de igualdade de valores.a = 1000 b = 1000 print(a == b) print(a is b)Saída
True True
Validar
00:22:33input()com.isdigit()eint()input()sempre devolvestring, então"6"não é 6..isdigit()testa se o texto não vazio é formado só por dígitos. Nos exemplos da aula, com dígitos de 0 a 9, o teste vem antes deint(). Depois da conversão,0 <= dia <= 6confere o intervalo, comodia >= 0 and dia <= 6.texto = "6" print(texto.isdigit()) dia = int(texto) print(0 <= dia <= 6)Saída
True True
00:31:06passpara bloco vazio não quebrarPython não aceita
ifsem nada dentro e acusa erro de indentação.passé a instrução que não faz nada e serve só para ocupar o bloco enquanto o código ainda não está pronto. Depois é só trocarpasspelo comando de verdade.dia = 3 if dia == 3: pass else: print("outro dia")Trocar
00:51:23if-elifpormatch-caseA cadeia
if dia == 0,elif dia == 1... funciona mas repete a variável toda hora. Commatch dia_numerocadacase 0,case 1já testa igualdade direto. Fica mais curto para quando a decisão é só comparar um valor com vários fixos.dia_numero = 0 match dia_numero: case 0: print("domingo") case 6: print("sábado")Saída
domingo
01:00:16case _comoelsee sembreakcase _é o curinga que entra quando nenhumcasecasou, igual aoelsedomatch. Por isso dá para apagar oifde intervalo e deixar o inválido cair nocase _. Diferente de outras linguagens, Python não continua para o próximocase, então não precisa debreak.dia_numero = 67 match dia_numero: case 0: print("domingo") case _: print("dia inválido")Saída
dia inválido
RPG com ternário,
01:30:29randint()ematchcom guardA escolha do RPG é lida com
int(x) if x.isdigit() else None, que evita crash na conversão e guardaNonequando não é dígito.random.randint(1, 20)sorteia o D20 incluindo os dois extremos. O destino usamatchcom guard tipocase 0 if d20 >= 10, que só entra se casar o valor e a condição extra forTrue.import random x = "2" opcao = int(x) if x.isdigit() else None print(opcao) print(random.randint(1, 20))
Perguntas que valem a pena
O que isdigit() verifica?00:24:15
Testa se a string não vazia é formada só por dígitos. Nos exemplos da aula, com dígitos de 0 a 9, isso é usado antes de converter a entrada com int().
Por que usar pass em um bloco vazio?00:34:48
Porque bloco vazio é sintaxe inválida e gera erro de indentação.
Para que serve match-case?00:54:46
É uma ferramenta específica para comparar um valor com outros e decidir, não de propósito geral como if-else.
Dá para tirar a checagem com 0 <= dia <= 6 se os case já cobrem os dias?00:58:49
Sim, simplifica e reduz alinhamento deixando os inválidos para o case _.
Precisa de break no match-case?01:02:02
Não, Python não tem fall-through no match-case.
Conceitos da aula
- input()
- isdigit()
- validação de entrada
- comparação encadeada
- if/else
- elif
- match-case
- case _
- pass
- operador ternário
- random.randint()
- guard
Reforce este assunto
- `elif` e seleção aninhadaPython · trilha, etapa 6
- Seleção com `if`, `else` e operadores lógicosPython · trilha, etapa 5