Paradigmas de Linguagens de Programação em Python: Fundamentos básicos (Part. 03)
- #Python
Você já se perguntou por que Python se tornou uma das linguagens mais populares e queridas do mundo da programação? A resposta vai muito além da sua sintaxe simples.
Python foi criado no final da década de 1980 por Guido van Rossum, um programador holandês que trabalhava no Centrum Wiskunde & Informatica (CWI), na Holanda. Seu objetivo era desenvolver uma linguagem que fosse tão poderosa quanto as existentes (como C), mas muito mais legível, acessível e intuitiva para humanos. A inspiração para o nome da linguagem não veio de um animal, como muitos pensam, mas sim do grupo britânico de comédia Monty Python — um toque de irreverência que reflete a filosofia da linguagem: tornar a programação mais divertida, elegante e clara.
Lançada oficialmente em 1991, Python nasceu com recursos avançados para a época, como tipagem dinâmica, coleta de lixo automatizada e suporte a múltiplos paradigmas de programação. Em um tempo em que escrever código era muitas vezes uma tarefa árdua e mecânica, Python propunha uma abordagem mais humana e produtiva.
Curiosamente, Python foi durante muitos anos uma linguagem "alternativa", adotada por pesquisadores, professores e entusiastas. No entanto, com o crescimento do open source, da ciência de dados e da inteligência artificial, a linguagem ganhou espaço em empresas de todos os portes — de startups a gigantes como Google, Netflix e NASA.
Outra curiosidade que poucos mencionam: Guido van Rossum foi chamado de "Benevolent Dictator For Life" (BDFL), ou seja, o líder vitalício da linguagem — título que ele manteve por quase 30 anos até se aposentar do cargo em 2018. Ainda assim, seu legado vive no espírito comunitário e na evolução contínua da linguagem, guiada por propostas formais conhecidas como PEPs (Python Enhancement Proposals).
Neste artigo, vamos explorar os fundamentos essenciais da linguagem Python, que vão além da sintaxe: abordaremos como Python lida com variáveis, escopos, objetos, expressões e boas práticas. Entender esses conceitos é mais do que aprender a escrever código — é compreender a filosofia que tornou Python uma das ferramentas mais influentes da computação moderna.
📌 Características da Linguagem
Python é uma linguagem:
- Multiparadigma (suporta programação imperativa, orientada a objetos e funcional),
- Interativa,
- Portável e extensível,
- Suporta bancos de dados e interfaces gráficas,
- Pode ser usada para desenvolvimento web, aplicações comerciais e como linguagem de script.
Além disso, sua sintaxe simples e direta incentiva boas práticas e a clareza do código.
🧩 Estrutura e Organização do Código
A estrutura do código em Python é baseada em simplicidade, legibilidade e clareza, princípios que norteiam a filosofia da linguagem desde sua criação. Diferente de outras linguagens como C, Java ou JavaScript, que usam delimitadores explícitos como {}
para blocos de código, Python adota a indentação obrigatória como mecanismo estrutural. Isso obriga o programador a escrever código limpo e bem organizado — não é apenas uma questão de estilo, mas parte da sintaxe.
A indentação define claramente os blocos de código, como os usados em condicionais, laços e funções. Além disso, Python segue uma série de boas práticas sugeridas pela PEP 8, o guia oficial de estilo da linguagem, que estabelece convenções para nomes de variáveis, organização de funções, espaços em branco, entre outros.
Regras essenciais de estruturação:
- Indentação obrigatória: geralmente com 4 espaços por nível.
- Blocos definidos por
:
e indentação (sem{}
). - Comentário com
#
para uma linha;""" """
para múltiplas. - Declaração de variáveis sem necessidade de tipo.
- Scripts organizados em funções e, preferencialmente, módulos.
Exemplo 1: Estrutura de Condicional
Neste exemplo, observe que o if
e o else
terminam com :
e os blocos são definidos pela indentação.
Exemplo 2: Função com retorno e uso de docstring
Este é um exemplo simples, mas que demonstra três pontos importantes:
- Uso de funções para modularizar código.
- Inclusão de docstrings para documentação automática.
- Estrutura limpa e direta, típica de Python.
Exemplo 3: Loop for
com range()
O range()
é muito utilizado em Python para gerar sequências numéricas. Esse loop imprime os números de 1 a 5, reforçando o uso prático do for
.
Exemplo 4: Uso do input()
e organização por funções
Este exemplo mostra uma estrutura real e muito comum em scripts Python: entrada de dados, chamada de função e saída.
Exemplo 5: Comentários e boas práticas
Comentários ajudam a explicar o "porquê" do código, facilitando a leitura, manutenção e colaboração em equipe.
A maneira como organizamos o código em Python não é apenas uma questão estética: ela influencia diretamente a legibilidade, manutenibilidade e funcionamento correto do programa. Seguir boas práticas como indentação correta, uso de funções bem definidas e comentários explicativos não só melhora a qualidade do seu código, como também facilita sua evolução como programador.
🎯 Variáveis, Objetos e Tipos
Entender como variáveis, objetos e tipos de dados funcionam em Python é fundamental para dominar a linguagem. Embora esses conceitos sejam comuns em várias linguagens de programação, Python trata tudo como objetos, o que confere à linguagem grande flexibilidade e poder.
Variáveis: nomes que apontam para objetos
Em Python, uma variável é uma referência (ou apelido) para um objeto armazenado na memória. Ao contrário de linguagens como C ou Java, você não precisa declarar o tipo de uma variável previamente. Basta atribuir um valor a ela:
python
x = 10 # int
nome = "Ana" # str
Aqui, x
não “contém” diretamente o número 10. Em vez disso, x
aponta para um objeto do tipo int
cujo valor é 10.
Exemplo conceitual:
python
a = 5
b = a
a = 10
print(b) # Saída: 5
Nesse exemplo, b
guarda a referência ao objeto 5
no momento em que é atribuído. Quando a
muda para 10
, b
continua referenciando o 5
.
Objetos: tudo em Python é um objeto
Frase comum: “Em Python, tudo é objeto”. Isso quer dizer que valores, tipos, funções, classes, até o próprio código, são representados como objetos, com atributos e métodos embutidos. Isso permite que você trabalhe de maneira uniforme com praticamente qualquer estrutura.
python
x = "Python"
print(x.upper()) # Saída: 'PYTHON'
Nesse exemplo, x
é uma variável que aponta para um objeto do tipo str
, que possui métodos como .upper()
para transformar o texto em maiúsculo.
Tipos de dados internos (built-in types)
Python possui diversos tipos de dados embutidos, agrupados em categorias:
Conversão de tipos (casting)
Você pode converter entre tipos explicitamente:
python
# int → float
n = 5
print(float(n)) # Saída: 5.0
# str → int
idade = int("25")
# list → tuple
valores = [1, 2, 3]
tupla = tuple(valores)
Boas práticas com variáveis
- Nomes significativos:
preco_unitario
, e nãox
. - Snake_case: padrão em Python (
nome_completo
,idade_media
). - Evite palavras reservadas: como
list
,str
,int
,input
.
Constantes em Python
Python não possui constante real como em outras linguagens. Por convenção, usamos letras maiúsculas para indicar que um valor não deve ser alterado:
python
PI = 3.1415
TAXA_CONVERSAO = 4.91
É responsabilidade do programador manter o valor fixo.
Amarração (Binding)
O conceito de binding é a ligação entre um nome (variável) e um objeto. Python faz binding dinâmico, ou seja, você pode reatribuir tipos diferentes a uma mesma variável ao longo do tempo:
python
valor = 42 # Agora é int
valor = "texto" # Agora é str
Essa flexibilidade é poderosa, mas exige responsabilidade para evitar bugs silenciosos.
Escopo e Tempo de Vida
Variáveis têm escopo (onde são visíveis) e tempo de vida (quando são criadas e destruídas):
python
def exemplo():
local = "só dentro da função"
print(local)
exemplo()
# print(local) # Erro: local não é acessível fora da função
- Escopo local: definido dentro de funções.
- Escopo global: acessível por todo o script.
- Tempo de vida: variáveis locais morrem quando a função termina.
Dominar os conceitos de variáveis, objetos e tipos em Python vai além da sintaxe: envolve entender como a linguagem gerencia memória, referências e estrutura seus dados internamente. A clareza dessa arquitetura é uma das grandes forças de Python, permitindo ao programador focar no que fazer, em vez de como controlar o sistema em baixo nível.
🔄 Escopo e Tempo de Vida
Imagine que você está organizando uma festa. Para cada cômodo da casa, há um grupo diferente de convidados que podem entrar e sair. Em programação, o escopo é como esse “quarto” onde variáveis podem existir e serem acessadas — e o tempo de vida é o tempo que esses convidados ficam na festa antes de irem embora.
Entender onde e por quanto tempo suas variáveis "vivem" dentro do código é essencial para evitar confusões, bugs e garantir que seu programa funcione como esperado.
O que é escopo?
O escopo determina o alcance ou a visibilidade de uma variável no seu programa — em outras palavras, onde você pode acessar aquela variável.
- Escopo global: Variáveis definidas fora de qualquer função ou classe, que ficam disponíveis para todo o programa.
- Escopo local: Variáveis criadas dentro de uma função, que só existem e podem ser usadas dentro daquela função.
Exemplo prático: escopo global e local
Aqui, temos duas variáveis mensagem
, uma global e outra local, cada uma existindo em seu próprio “quarto”. Quando chamamos falar()
, o Python usa a variável local, porque está dentro do escopo da função. Fora da função, a variável global é usada.
Tempo de vida das variáveis
O tempo de vida é o período durante o qual a variável está “viva” na memória, armazenando um valor.
- Variáveis globais: vivem durante toda a execução do programa. Só “morrem” quando o programa termina.
- Variáveis locais: “nascem” quando a função é chamada e “morrem” quando a função termina. Depois disso, o espaço de memória que ocupavam é liberado.
Exemplo de tempo de vida:
Ao chamar saudacao()
, a variável frase
é criada, usada e logo após a função terminar, frase
desaparece. Se você tentar acessá-la fora da função, o Python avisará que a variável não está definida.
Escopo de bloco: o que Python não tem
Em algumas linguagens, como JavaScript, existe o escopo de bloco — ou seja, variáveis definidas dentro de um if
, for
ou while
só existem dentro daquele bloco delimitado por {}
.
Em Python, não existe escopo de bloco, e variáveis criadas dentro desses blocos pertencem ao escopo da função ou global:
Variáveis não locais e globais
Às vezes, queremos modificar uma variável global dentro de uma função. Para isso, usamos as palavras-chave global
e nonlocal
.
global
permite acessar e modificar variáveis globais dentro de funções.nonlocal
permite modificar variáveis em escopos intermediários, como em funções aninhadas.
Conhecer bem o escopo e o tempo de vida evita erros difíceis de detectar, como:
- Variáveis que desaparecem quando você menos espera
- Conflitos de nomes entre variáveis globais e locais
- Modificações acidentais de variáveis importantes
- Escopo é o lugar onde uma variável pode ser acessada.
- Tempo de vida é o período em que a variável existe na memória.
- Em Python, escopo é geralmente global ou local a funções — não existe escopo de bloco.
- Usar bem esses conceitos ajuda a escrever código mais limpo, seguro e fácil de manter.
🧷 Constantes em Python
Se você já programou em outras linguagens como Java, C ou C++, pode estar acostumada a ver palavras-chave como final
ou const
para declarar constantes — valores que, uma vez atribuídos, não podem mais ser alterados.
Mas ao chegar em Python, você percebe algo curioso: essas palavras-chave simplesmente não existem. E isso não é um descuido da linguagem — é uma escolha de design.
Mas o que é, afinal, uma constante?
Uma constante é como uma regra da casa: "isso aqui não pode ser mudado". Você define um valor uma vez, e espera que ele continue assim durante toda a execução do seu programa.
Por exemplo:
python
PI = 3.14159
TAXA_DE_CONVERSAO = 5.42
Aqui, estamos dizendo para quem lê: “Ei, essa variável não deve ser alterada!” — mas o Python não vai impedir ninguém de fazer isso. Ou seja:
python
PI = 3.14159
PI = 99 # Python permite, mesmo que não seja o correto!
Convenções para criar constantes
Como Python não tem constantes reais, usamos nomes em letras maiúsculas para indicar que uma variável não deve ser alterada:
python
VELOCIDADE_DA_LUZ = 299_792_458 # em metros por segundo
NOME_DO_SISTEMA = "SISTEMA_X"
Esse padrão é reconhecido por toda a comunidade e por ferramentas como linters (ex: Flake8, Pylint). Inclusive, a PEP 8 — o guia oficial de estilo da linguagem — recomenda exatamente isso.
Protegendo valores: técnicas alternativas
Apesar de Python não ter const
, há formas de proteger valores críticos, especialmente em programas maiores ou em bibliotecas públicas.
1. Uso de propriedades com @property
Você pode usar classes para criar atributos somente leitura:
python
class Config:
@property
def VERSAO(self):
return "1.0.0"
cfg = Config()
print(cfg.VERSAO) # Saída: 1.0.0
cfg.VERSAO = "2.0.0" # Vai gerar erro: can't set attribute
2. Namedtuples (imutáveis)
python
from collections import namedtuple
Constantes = namedtuple('Constantes', ['PI', 'EULER'])
const = Constantes(3.14, 2.71)
print(const.PI) # Saída: 3.14
# const.PI = 3 # Isso gera erro, pois namedtuples são imutáveis
3. Usar módulos separados para constantes
python
# arquivo: constantes.py
API_KEY = "abc123"
TEMPO_ESPERA = 5
# Em outro arquivo
import constantes
print(constantes.API_KEY)
Se alguém tentar mudar API_KEY
, será uma má prática, mas é fácil rastrear.
⚠️ Importante lembrar ⚠️
- Python não proíbe a mudança de uma constante. Cabe ao programador seguir a convenção.
- Nomes em maiúsculas sinalizam intenção, mas não oferecem proteção real.
- Em projetos colaborativos, documentar suas "constantes" ajuda o time a entender o que pode ou não ser alterado.
Mesmo que o Python não force o uso de constantes, pensar como se elas existissem torna seu código mais previsível, organizado e fácil de manter. Ao adotar boas práticas, você cria um ambiente de trabalho mais confiável — e seus colegas (ou seu “eu” do futuro) vão te agradecer.
📊 Tipos de Dados e Expressões
Tipos Numéricos:
int
→ inteirosfloat
→ ponto flutuantecomplex
→ números complexosbool
→ booleano (subtipo deint
)
Tipos Sequenciais:
str
,list
,tuple
, entre outros.
Dicionários:
dict
→ estrutura chave:valor para representar dados associativos.
Operadores Numéricos:
- Matemáticos:
+
,-
,*
,/
,**
,//
,%
- Booleanos:
and
,or
,not
- Comparativos:
==
,!=
,<
,<=
,>
,>=
➕ Precedência de Operadores
A ordem em que os operadores são avaliados influencia diretamente no resultado de uma expressão. Por exemplo:
python
x = 2 + 3 * 4 # Resultado: 14, e não 20
Ordem geral:
[]
,()
,**
+x
,-x
*
,/
,//
,%
+
,-
<
,>
,==
,!=
not
,and
,or
🔁 Conversões de Tipos
Implícitas:
Python converte automaticamente quando possível:
python
x = 5 + 3.0 # Resultado: 8.0 (int + float => float)
Explícitas:
Feita manualmente com funções como:
int()
,float()
,str()
,bool()
🎛 Entrada, Saída e Atribuição
Entrada:
python
nome = input("Digite seu nome: ")
Saída:
python
print("Olá,", nome)
Atribuição:
python
x = 10
Pode ser feita de forma encadeada ou múltipla:
python
a, b = 1, 2
🔚 Conclusão
Neste terceiro artigo da série sobre paradigmas de programação em Python, exploramos os fundamentos essenciais da linguagem, como variáveis, escopos, objetos, tipos de dados, comentários e muito mais.
Compreender esses pilares é indispensável para quem deseja dominar Python com profundidade e construir soluções robustas e bem estruturadas. Agora que você tem essa base sólida, estará mais preparado(a) para explorar os paradigmas mais avançados da linguagem nos próximos artigos.
👉 No próximo artigo, vamos explorar dominando programação com Python.