Python

Boas Práticas de Estruturas de Controle em Python: if, match-case e Expressões para Times Ágeis

15 min de leitura

Boas Práticas de Estruturas de Controle em Python: if, match-case e Expressões para Times Ágeis

Introdução: O Controle de Fluxo como Base da Programação As estruturas de controle são os alicerces de qualquer programa que toma decisões. Em Python, elas permitem que seu código execute diferentes camadas de lógica baseadas em condições específicas. Diferentemente de linguagens como Java ou C, Python privilegia legibilidade e simplicidade — características que veremos refletidas em cada instrução de controle. Dominar if, match-case e expressões condicionais não é apenas conhecer sintaxe; é aprender a pensar em termos de decisão e fluxo, construindo programas que respondem inteligentemente às variações de entrada. Neste artigo, você entenderá não apenas como usar essas estruturas, mas quando e por que usá-las. Começaremos pelo fundamento (if/else), avançaremos para a declaração match-case (introduzida no Python 3.10), e finalizaremos com expressões condicionais elegantes que elevam a qualidade do seu código. A Estrutura if: Decisões Simples e Complexas O if básico e sua lógica booleana A instrução if é a forma mais direta de executar código condicionalmente. Sua sintaxe

<h2>Introdução: O Controle de Fluxo como Base da Programação</h2>

<p>As estruturas de controle são os alicerces de qualquer programa que toma decisões. Em Python, elas permitem que seu código execute diferentes camadas de lógica baseadas em condições específicas. Diferentemente de linguagens como Java ou C, Python privilegia legibilidade e simplicidade — características que veremos refletidas em cada instrução de controle. Dominar <strong>if</strong>, <strong>match-case</strong> e expressões condicionais não é apenas conhecer sintaxe; é aprender a pensar em termos de decisão e fluxo, construindo programas que respondem inteligentemente às variações de entrada.</p>

<p>Neste artigo, você entenderá não apenas <em>como</em> usar essas estruturas, mas <em>quando</em> e <em>por que</em> usá-las. Começaremos pelo fundamento (if/else), avançaremos para a declaração match-case (introduzida no Python 3.10), e finalizaremos com expressões condicionais elegantes que elevam a qualidade do seu código.</p>

<h2>A Estrutura if: Decisões Simples e Complexas</h2>

<h3>O if básico e sua lógica booleana</h3>

<p>A instrução <strong>if</strong> é a forma mais direta de executar código condicionalmente. Sua sintaxe é intuitiva: você escreve uma condição que avalia para True ou False, e o bloco indentado abaixo é executado apenas se a condição for verdadeira. Python não usa chaves; a indentação é obrigatória e faz parte da linguagem.</p>

<pre><code class="language-python">idade = 18

if idade &gt;= 18:

print(&quot;Você é maior de idade&quot;)</code></pre>

<p>Aqui, a condição <code>idade &gt;= 18</code> é avaliada. Se verdadeira, a mensagem é exibida. A indentação (4 espaços ou 1 tabulação) é crítica — sem ela, você receberá um erro de sintaxe.</p>

<h3>Expandindo com elif e else</h3>

<p>Raramente uma decisão tem apenas um caminho. Por isso, usamos <strong>elif</strong> (abreviação de &quot;else if&quot;) para múltiplas condições e <strong>else</strong> para o caso padrão. A ordem importa: o Python avalia as condições de cima para baixo e para quando encontra uma verdadeira.</p>

<pre><code class="language-python">nota = 7.5

if nota &gt;= 9:

conceito = &quot;Excelente&quot;

elif nota &gt;= 7:

conceito = &quot;Bom&quot;

elif nota &gt;= 5:

conceito = &quot;Satisfatório&quot;

else:

conceito = &quot;Insuficiente&quot;

print(f&quot;Conceito: {conceito}&quot;) # Output: Conceito: Bom</code></pre>

<p>Observe que a primeira condição verdadeira encerra a avaliação. Se você fosse testar <code>nota &gt;= 5</code> primeiro e depois <code>nota &gt;= 7</code>, nunca entraria na segunda cláusula para uma nota de 8. A estrutura lógica é sequencial, não paralela.</p>

<h3>Operadores lógicos: and, or, not</h3>

<p>Frequentemente, uma decisão depende de múltiplas condições simultâneas. Python oferece três operadores lógicos que funcionam em nível de booleano:</p>

<ul>

<li><strong>and</strong>: ambas as condições devem ser verdadeiras</li>

<li><strong>or</strong>: pelo menos uma condição deve ser verdadeira</li>

<li><strong>not</strong>: inverte o resultado booleano</li>

</ul>

<pre><code class="language-python">idade = 25

tem_carteira = True

if idade &gt;= 18 and tem_carteira:

print(&quot;Pode dirigir&quot;)

hora = 22

if hora &lt; 6 or hora &gt; 22:

print(&quot;Está fora do horário comercial&quot;)

ativo = False

if not ativo:

print(&quot;Usuário inativo&quot;)</code></pre>

<p>Um detalhe importante: Python usa avaliação de curto-circuito. Em <code>idade &gt;= 18 and tem_carteira</code>, se a primeira condição for falsa, a segunda nem é avaliada — o resultado já é definido. Isso não é apenas um detalhe de performance; pode ser crítico se a segunda condição tiver efeitos colaterais.</p>

<h2>match-case: O Novo Padrão Estruturado</h2>

<h3>O que é pattern matching e por que usar</h3>

<p>Introduzido no Python 3.10, <strong>match-case</strong> é uma forma estruturada e elegante de comparar um valor contra múltiplos padrões. Enquanto if/elif compara condições booleanas, match-case compara <em>padrões</em>, oferecendo mais expressividade e legibilidade em cenários específicos.</p>

<pre><code class="language-python">status_pedido = &quot;enviado&quot;

match status_pedido:

case &quot;pendente&quot;:

print(&quot;Pedido aguardando processamento&quot;)

case &quot;enviado&quot;:

print(&quot;Pedido saiu para entrega&quot;)

case &quot;entregue&quot;:

print(&quot;Pedido recebido com sucesso&quot;)

case _:

print(&quot;Status desconhecido&quot;)</code></pre>

<p>A cláusula <code>_</code> (underscore) funciona como um &quot;else&quot; padrão — ela captura qualquer caso que não foi explicitamente tratado. Sem ela, se nenhum padrão corresponder, o match simplesmente não executa nada.</p>

<h3>Pattern matching avançado: tipos, estruturas e guardas</h3>

<p>O poder real do match-case emerge quando você combina múltiplos padrões e condições. Você pode verificar tipos, desestruturar listas/tuplas e adicionar guardas (condições adicionais).</p>

<pre><code class="language-python">def processar_dados(valor):

match valor:

case int():

print(f&quot;Inteiro: {valor}&quot;)

case str():

print(f&quot;String: {valor}&quot;)

case [primeiro, segundo, *resto]:

print(f&quot;Lista com primeiro={primeiro}, segundo={segundo}, resto={resto}&quot;)

case {&quot;tipo&quot;: &quot;usuario&quot;, &quot;nome&quot;: nome}:

print(f&quot;Usuário: {nome}&quot;)

case x if x &gt; 100:

print(f&quot;Valor muito alto: {x}&quot;)

case _:

print(&quot;Tipo desconhecido&quot;)

processar_dados(42) # Output: Inteiro: 42

processar_dados(&quot;hello&quot;) # Output: String: hello

processar_dados([1, 2, 3, 4]) # Output: Lista com primeiro=1, segundo=2, resto=[3, 4]

processar_dados({&quot;tipo&quot;: &quot;usuario&quot;, &quot;nome&quot;: &quot;Alice&quot;}) # Output: Usuário: Alice

processar_dados(150) # Output: Valor muito alto: 150</code></pre>

<p>Neste exemplo, estamos combinando vários tipos de padrões:</p>

<ul>

<li><strong>Padrões de tipo</strong>: <code>int()</code>, <code>str()</code> — validam o tipo</li>

<li><strong>Desestruturação</strong>: <code>[primeiro, segundo, *resto]</code> — separa elementos de uma sequência</li>

<li><strong>Padrões de dicionário</strong>: <code>{&quot;tipo&quot;: &quot;usuario&quot;, &quot;nome&quot;: nome}</code> — valida estrutura e extrai valores</li>

<li><strong>Guardas</strong>: <code>if x &gt; 100</code> — adiciona lógica booleana ao padrão</li>

</ul>

<p>Quando usar match-case? Quando você tem múltiplas comparações contra o <em>mesmo valor</em> e cada ramo é fundamentalmente diferente em lógica ou estrutura.</p>

<h2>Expressões Condicionais: O Operador Ternário Pythônico</h2>

<h3>A expressão condicional (ternário)</h3>

<p>Em Python, você pode usar uma expressão condicional — frequentemente chamada de &quot;ternário&quot; em outras linguagens — para atribuir valores de forma compacta. A sintaxe é: <code>valor_se_verdade if condição else valor_se_falso</code>.</p>

<pre><code class="language-python">idade = 16

categoria = &quot;maior&quot; if idade &gt;= 18 else &quot;menor&quot;

print(categoria) # Output: menor

temperatura = 25

clima = &quot;quente&quot; if temperatura &gt; 30 else &quot;frio&quot; if temperatura &lt; 15 else &quot;agradável&quot;

print(clima) # Output: agradável</code></pre>

<p>A expressão condicional é uma expressão, não uma instrução. Isso significa que ela retorna um valor e pode ser usada em qualquer contexto onde um valor é esperado: atribuições, argumentos de função, retorno de função, etc.</p>

<h3>Aninhamento moderado e boas práticas</h3>

<p>Embora seja possível aninhar múltiplas expressões ternárias, isso rapidamente prejudica a legibilidade. A regra prática: use ternário para decisões simples e binárias. Para lógica complexa, volte para if/elif/else.</p>

<pre><code class="language-python"># ✓ Bom: ternário simples

status = &quot;ativo&quot; if usuario.logado else &quot;inativo&quot;

✗ Ruim: muito aninhado

resultado = &quot;A&quot; if x &gt; 90 else &quot;B&quot; if x &gt; 80 else &quot;C&quot; if x &gt; 70 else &quot;D&quot; if x &gt; 60 else &quot;F&quot;

✓ Melhor: use if/elif/else

if x &gt; 90:

resultado = &quot;A&quot;

elif x &gt; 80:

resultado = &quot;B&quot;

elif x &gt; 70:

resultado = &quot;C&quot;

elif x &gt; 60:

resultado = &quot;D&quot;

else:

resultado = &quot;F&quot;</code></pre>

<p>A legibilidade é uma característica central do Python. O Zen of Python (PEP 20) diz: &quot;Explícito é melhor que implícito.&quot; Use ferramentas que tornem seu código mais claro, não mais confuso.</p>

<h3>Expressões condicionais em coleções</h3>

<p>Um uso elegante do ternário é ao processar listas ou construir estruturas de dados condicionalmente.</p>

<pre><code class="language-python">numeros = [1, 2, 3, 4, 5, 6]

pares_ou_zeros = [x if x % 2 == 0 else 0 for x in numeros]

print(pares_ou_zeros) # Output: [0, 2, 0, 4, 0, 6]

dados = {&quot;nome&quot;: &quot;Alice&quot;, &quot;idade&quot;: 25}

apresentacao = f&quot;{dados[&#039;nome&#039;]} ({dados[&#039;idade&#039;]} anos)&quot; if &quot;idade&quot; in dados else dados[&#039;nome&#039;]

print(apresentacao) # Output: Alice (25 anos)</code></pre>

<h2>Comparação Prática: if vs match-case vs Ternário</h2>

<p>Agora que você conhece as três abordagens, vamos ver como escolher a certa para cada situação:</p>

<pre><code class="language-python"># Cenário 1: Validação de entrada com múltiplas faixas

entrada = input(&quot;Digite um número: &quot;)

valor = int(entrada)

✓ Use if/elif quando há condições complexas ou múltiplas variáveis

if valor &lt; 0:

categoria = &quot;negativo&quot;

elif valor == 0:

categoria = &quot;zero&quot;

elif valor &lt;= 10:

categoria = &quot;pequeno&quot;

else:

categoria = &quot;grande&quot;

Cenário 2: Comparação de um valor contra múltiplos padrões fixos

comando = input(&quot;Digite um comando: &quot;)

✓ Use match-case para padrões estruturados e distintos

match comando:

case &quot;sair&quot;:

print(&quot;Encerrando...&quot;)

case &quot;ajuda&quot;:

print(&quot;Comandos disponíveis...&quot;)

case &quot;status&quot;:

print(&quot;Sistema operacional&quot;)

case _:

print(&quot;Comando desconhecido&quot;)

Cenário 3: Escolha simples entre dois valores

conexao_ativa = True

✓ Use ternário para decisões binárias simples

mensagem = &quot;Conectado&quot; if conexao_ativa else &quot;Desconectado&quot;

print(mensagem)</code></pre>

<p>A escolha entre essas estruturas reflete o princípio de design: use a ferramenta mais apropriada para o trabalho. Um if/elif é flexível mas pode ficar verboso. Um match-case é elegante para padrões, mas menos aplicável a lógica condicional complexa. Um ternário é conciso, mas apenas para decisões binárias simples.</p>

<h2>Tratamento de Erros em Contexto de Controle</h2>

<p>Estruturas de controle frequentemente trabalham junto com tratamento de exceções. Considere este exemplo prático:</p>

<pre><code class="language-python">def dividir(a, b):

if b == 0:

return None

return a / b

Funciona, mas não é idiomático

resultado = dividir(10, 0)

if resultado is None:

print(&quot;Divisão inválida&quot;)

else:

print(f&quot;Resultado: {resultado}&quot;)

✓ Pythônico: use try/except

def dividir_robusto(a, b):

try:

return a / b

except ZeroDivisionError:

print(&quot;Não é possível dividir por zero&quot;)

return None

resultado = dividir_robusto(10, 0)</code></pre>

<p>Embora try/except não seja uma &quot;estrutura de controle&quot; no sentido tradicional, ela trabalha em conjunto com if para criar código robusto. A lição: verificar condições com if é válido para lógica de negócio; usar exceções para erros genuínos é mais pythônico.</p>

<h2>Conclusão</h2>

<p>Três conceitos essenciais emergem desta jornada:</p>

<ol>

<li><strong>if/elif/else é a base</strong>, e deve ser sua primeira escolha para lógica condicional. Ela é versátil, legível e funciona em todas as versões do Python. Combine-a com operadores lógicos (and, or, not) para expressar condições complexas de forma clara.</li>

</ol>

<ol>

<li><strong>match-case (Python 3.10+) é uma ferramenta especializada</strong> para quando você precisa comparar um valor contra múltiplos padrões estruturados. Ela não substitui if; complementa-a. Use quando seus casos são mutuamente exclusivos e bem definidos.</li>

</ol>

<ol>

<li><strong>Expressões ternárias são elegantes, mas apenas em contextos simples</strong>. Elas brilham em atribuições binárias e compreensões de lista, mas sacrificam clareza em aninhamentos profundos. Sempre favoreça legibilidade.</li>

</ol>

<p>O verdadeiro domínio não é decorar sintaxe, mas desenvolver a intuição para escolher a ferramenta certa. À medida que você escreve mais código, essa escolha se tornará natural — refletindo não apenas conhecimento técnico, mas maturidade como programador.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.python.org/3/tutorial/controlflow.html#if-statements" target="_blank" rel="noopener noreferrer">Python Official Documentation - if statements</a></li>

<li><a href="https://www.python.org/dev/peps/pep-0634/" target="_blank" rel="noopener noreferrer">PEP 634 - Structural Pattern Matching (match-case)</a></li>

<li><a href="https://realpython.com/python-conditional-statements/" target="_blank" rel="noopener noreferrer">Real Python - Python Conditional Statements</a></li>

<li><a href="https://www.python.org/dev/peps/pep-0020/" target="_blank" rel="noopener noreferrer">Python Zen - PEP 20</a></li>

<li><a href="https://realpython.com/structural-pattern-matching-python/" target="_blank" rel="noopener noreferrer">Real Python - Pattern Matching in Python 3.10</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em Python

Clean Architecture em Python: Estruturando Projetos para Escalar na Prática
Clean Architecture em Python: Estruturando Projetos para Escalar na Prática

Clean Architecture em Python: Estruturando Projetos para Escalar A Clean Arch...

Logging em Python: logging module, structlog e Boas Práticas: Do Básico ao Avançado
Logging em Python: logging module, structlog e Boas Práticas: Do Básico ao Avançado

O módulo logging nativo do Python O módulo é parte da biblioteca padrão do Py...

O que Todo Dev Deve Saber sobre Alembic em Python: Migrations Versionadas com SQLAlchemy
O que Todo Dev Deve Saber sobre Alembic em Python: Migrations Versionadas com SQLAlchemy

O que é Alembic e Por Que Você Precisa Dele Alembic é uma ferramenta de versi...