As funções em Python são estruturas de bloco de código reutilizáveis e que executam uma tarefa específica, promovendo a modularização e a organização do código, permitindo o agrupamento de instruções relacionadas, facilitando a sua manutenção e leitura.
São declaradas com a palavra-reservada def, seguida do nome, parênteses '()' com parâmetros separados por vírgula ',', finalizando o cabeçalho com dois pontos ':'. Nas linhas seguintes ao cabeçalho, o corpo da função é declarado com as instruções indentadas, retornando com palavra-chave return seguida por um ou mais valores, ou até finalizar o recuo. Neste caso a função retorna None.
O diagrama a seguir apresenta o fluxo de declaração de função:
Declaração de função:
As funções permitem que dados sejam fornecidos na entrada, então sejam processados e que os resultados obtidos sejam retornados para serem usados em outras partes do programa.
Os parâmetros são opcionais e são usados como variáveis locais que recebem valores dos argumentos na chamada da função.
Funções podem ser aninhadas dentro de outras funções, criando escopos locais específicos que melhoram o encapsulamento e a segurança do código.
Além das funções definidas pelo usuário, Python oferece uma rica coleção de funções nativas (integradas, built-in) que simplificam muitas operações comuns.
Estas funções abrangem desde manipulações matemáticas e conversões de tipo até operações com sequências e controle de fluxo.
Funções como len(), sum(), print() e input(), por exemplo, são amplamente utilizadas devido à sua simplicidade e eficácia.
A capacidade de converter tipos de dados com funções como int(), float() e str(), assim como a facilidade de ordenar, filtrar e mapear iteráveis com sorted(), filter() e map(), exemplificam a versatilidade das funções nativas de Python, não apenas economizando tempo de desenvolvimento, mas também garantem que o código seja mais conciso e legível.
Conceitualmente, funções são fundamentais para a programação estruturada, permitindo a decomposição de problemas complexos em partes menores e mais gerenciáveis, facilitando a reutilização de código, reduzindo a redundância e minimizando erros.
A habilidade de definir funções personalizadas e de utilizar funções nativas prontas torna Python uma linguagem poderosa e flexível, adequada para uma ampla gama de aplicações, desde scripts simples até sistemas complexos.
O uso estratégico de funções contribui significativamente para a eficiência do desenvolvimento de software (programas de computador), permitindo que os programadores escrevam código mais limpo, modular e fácil de manter.
A declaração e chamada de funções em Python são processos fundamentais que promovem a modularidade e a reutilização do código.
As funções são declaradas com:
Após a finalização do cabeçalho com dois pontos, o corpo da função é declarado com as instruções aninhadas seguindo as regras de indentação, a partir da linha seguinte ao cabeçalho.
As funções encapsulam blocos de código que executam tarefas específicas.
Dentro dos parênteses na declaração do cabeçalho da função, podem ser definidos parâmetros em número variável, posicionais ou nomeados, para receber valores necessários para a função, quando é chamada, nos argumentos da chamada.
Os parâmetros posicionais são os primeiros à esquerda da lista de parâmetros e não recebem valores-padrão.
def soma(n1, n2):
return n1 + n2
Os parâmetros nomeados seguem aos posicionais na ordem de declaração formam um par do nome com o valor-padrão definido.
import random
def lista_aleatoria(gerados,selecionados,ordenar=False,ordem_reversa=False):
lista = random.sample(range(gerados), selecionados)
if ordenar:
lista = sorted(lista,reverse=ordem_reversa)
return lista
Podemos chamar a lista aleatória passando apenas o argumento obrigatório n.
lista = lista_aleatoria(100,30)
print(lista)
O parâmetro ordenar define que a lista deve ser ordanada:
lista = lista_aleatoria(100,30,ordenar=True)
print(lista)
O parâmetro ordem_reversa define que a lista deve ser ordenada em ordem reversa:
lista = lista_aleatoria(100,30,ordenar=True,ordem_reversa=True)
print(lista)
O parâmetro ordenar e ordem_reversa são parâmetros nomeados e não são obrigatórios, entretanto têm valor-padrao False que será utilizado na falta do argumento alterando o valor.
Formalmente, chamamos de parâmetros aos identificadores utilizados entre parênteses na declaração da função, e de argumentos aos valores passados na chamada da função. Mas não há problema algum em referirmos aos parâmetros como argumentos e vice-versa.
Resumidamente, as funções são estruturas de bloco de código reutilizáveis que executam tarefas específicas, promovendo a modularidade e a reutilização do código; podem ser chamadas pelo nome seguido por parênteses, nos quais são passados os argumentos correspondentes aos parâmetros definidos no cabeçalho. O mecanismo de chamada de funções permite organizar o código de forma mais clara e eficiente, facilitando a manutenção e a extensão dos programas.
Em Python, uma função é declarada utilizando a palavra-reservada def, seguida pelo nome da função, parênteses com os parâmetros, que são opcionais, separados por virgula, e de dois pontos encerrando o cabeçalho da função. Então o corpo da função é indentado adequadamente nas linhas a seguir com as instruções simples e em blocos aninhados.
Dentro dos parênteses, podem ser definidos parâmetros que a função irá aceitar.
O bloco de código que compõe a função é indentado.
Exemplo básico de declaração de uma função, sem parâmetros e com apenas uma instrução aninhada no corpo da função:
def minha_funcao():
print("Olá, mundo!")
Para utilizar uma função, basta ser chamada pelo nome seguido de parênteses com os argumentos, se houverem parâmetros obrigatórios e opcionais.
Exemplo da chamada de minha_funcao():
minha_funcao()
Funções podem aceitar parâmetros, que são variáveis locais utilizadas para receber valores ao chamar a função.
Os argumentos são os valores passados para esses parâmetros na chamada da função.
Exemplo com utilização de parâmetro e argumento:
def saudacao(nome):
print(f'Olá, {nome}!')
saudacao('Dora')
O parâmetro é nome e o argumento é 'Dora', entretanto isto é apenas uma convenção, para facilitar a associação da definição ao que se refere. A referência a parâmetro remete à declaração no cabeçalho, e a referência o argumento remete ao valor passado na chamada da função.
O parâmetro nomeado é aquele acompanhado, na declaração da função, de valor-padrão que será utilizado sempre que o argumento do parâmetro-nomeado for omitido na chamada da função.
Exemplo com parâmetro-nomeado e valor-padrão:
def saudacao(nome="mundo"):
print(f"Olá, {nome}!")
saudacao()
saudacao("Dora")
saudacao(nome="Beto")
Funções podem retornar valores utilizando a palavra-reservada return.
Exemplo de função com retorno de valor:
def soma(a, b):
return a + b
resultado = soma(3, 4)
print(resultado)
Em Python, funções podem ser aninhadas, ou seja, definidas dentro de outras funções.
Além disso, as variáveis têm escopo local e global.
Exemplo de função aninhada:
def externa():
print("Função externa")
def interna():
print("Função interna")
interna()
externa()
Python também suporta funções anônimas, ou lambdas, que são funções definidas em uma única linha utilizando a palavra-reservada lambda.
Os parâmetros não precisam vir entre parênteses, o que causa erro, e a expressão no corpo da função lambda deve retornar um valor.
soma = lambda a, b: a + b
print(soma(3, 4))
Os métodos especiais, conhecidos como dunder methods (redução de Double UNDERscore), que são utilizados principalmente em classes, mas também podem ser aplicados em funções fora das classes, embora de maneira mais limitada.
Esses métodos, que começam e terminam com dois sublinhados (__), são usados para definir comportamentos específicos de objetos, como operadores e conversões de tipo.
Abaixo, vamos explorar alguns desses métodos que podem ser relevantes para funções fora das classes:
As anotações de tipo __name__ e __doc__ são usadas para mostrar o nome e a docstring da função.
def funcao():
"""Esta função faz algo."""
pass
print(funcao.__name__)
print(funcao.__doc__)
Este atributo contém as anotações de tipo das funções, envolvendo os valores dos argumentos e de retorno, se existirem.
def soma(a: int, b: int) -> int:
return a + b
print(soma.__annotations__)
Esses atributos armazenam os valores padrão dos argumentos posicionais e de palavra-reservada das funções, respectivamente.
Exemplo:
def minha_funcao(a, b=2, *, c=3):
return a + b + c
print(minha_funcao.__defaults__) # Saída: (2,)
print(minha_funcao.__kwdefaults__) # Saída: {'c': 3}
Este atributo contém o objeto código da função, que inclui o bytecode executável.
Exemplo:
def minha_funcao():
pass
print(minha_funcao.__code__)
Retorna o dicionário que representa o namespace global no qual a função foi definida.
É útil para acessar variáveis globais a partir do contexto da função.
def minha_funcao():
pass
print(minha_funcao.__globals__.keys())
Contém os atributos arbitrários definidos na função. Você pode adicionar atributos personalizados às funções.
Exemplo:
def minha_funcao():
pass
minha_funcao.atributo = "valor"
print(minha_funcao.__dict__)
Este atributo é uma tupla de células que contêm bindings para variáveis livres. Ele é usado em funções que capturam variáveis do escopo de definição (funções de clausura).
Exemplo:
def externa(x):
def interna(y):
return x + y
return interna
func = externa(10)
print(func.__closure__) # Saída: (<cell at 0x...: int object at 0x...>,)
print(func.__closure__[0].cell_contents)
Nome do módulo no qual a função foi definida.
Exemplo:
def minha_funcao():
pass
print(minha_funcao.__module__)
Decoradores de funções são uma ferramenta poderosa em Python que permite modificar ou estender o comportamento de funções ou métodos sem alterar seu código diretamente.
Eles são amplamente usados para adicionar funcionalidades como logging, verificação de permissões, memorização, entre outros.
Abaixo estão alguns dos decoradores de funções mais importantes e comuns.
Utilizado para adicionar mensagens de logging antes e/ou depois da execução de uma função.
def log_decorator(func):
def embrulho(*args, **kwargs):
print(f"Chamada de função: {func.__name__} com args: {args} e kwargs: {kwargs}")
script = func(*args, **kwargs)
print(f"Função {func.__name__} retornou {script}")
return script
return embrulho
@log_decorator
def soma(a, b):
return a + b
soma(3, 5)
Usado para medir o tempo de execução de uma função.
import time
def time_decorator(func):
def embrulho(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
termino = time.time()
print(f"Função {func.__name__} executada em {termino - inicio} segundos")
return resultado
return embrulho
@time_decorator
def operacao_demorada():
j = 0
for i in range(100_000_000):
j += 1
operacao_demorada()
Utilizado para cachear resultados de funções caras para otimização de desempenho.
def decorador_memorizacao(func):
cache = {}
def embrulho(*args):
if args in cache:
return cache[args]
script = func(*args)
cache[args] = script
return script
return embrulho
@decorador_memorizacao
def fib(n):
if n in (0, 1):
return n
return fib(n - 1) + fib(n - 2)
print(fib(10))
Utilizado para verificar permissões antes de executar uma função.
def checar_permissoes(papel_usuario):
def decorador(func):
def embrulho(*args, **kwargs):
if papel_usuario != 'admin':
raise PermissionError("Permissão negada")
return func(*args, **kwargs)
return embrulho
return decorador
@checar_permissoes('admin')
def acesso_restrito():
print("Acesso permitido")
acesso_restrito()
Reexecuta a função várias vezes em caso de falha.
import time
import random
def decorador_retry(tentativas):
def decorador(func):
def embrulho(*args, **kwargs):
for _ in range(tentativas):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Falha: {e}, tentando novamente...")
time.sleep(1)
raise Exception("Falhou após várias tentativas")
return embrulho
return decorador
@decorador_retry(3)
def instavel():
if random.choice([True, False]):
raise ValueError("Erro intermitente")
return "Sucesso!"
print(instavel())
O decorador @wraps do módulo functools é usado dentro de decoradores customizados para copiar as informações da função original para a função decorada, preservando o nome da função original e sua documentação.
from functools import wraps
def medir_tempo(func):
@wraps(func)
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fim = time.time()
print(f"Tempo de execução de {func.__name__}: {fim - inicio} segundos")
return resultado
return wrapper
@medir_tempo
def soma(a, b):
time.sleep(1)
return a + b
print(soma.__name__)
O decorador @lru_cache do módulo functools é usado para cachear os resultados de chamadas de função para evitar recomputações dispendiosas.
from functools import lru_cache
@lru_cache(maxsize=100)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(50)) # Calcula rapidamente usando cache
As funções são explicadas no capítulo "Blocos", e os programadores estão sempre declarando novas funções especializadas na realização de tarefas especializadas.
Neste capítulo, são abordadas as principais funções nativas do Python, comumente usadas, inclusive nos exemplos mostrados em outros capítulos desse curso.
As principais funções nativas são apresentadas a seguir em ordem alfabética.
A função abs() retorna o valor absoluto de um número dado, que é a distância de um número até zero no eixo numérico, sem considerar a direção.
O valor absoluto de um número inteiro ou de ponto flutuante é seu valor positivo, e o valor absoluto de um número complexo é sua magnitude.
É uma função extremamente útil em matemática e estatísticas, quando se deseja manipular apenas a magnitude dos valores, ignorando seu sinal.
abs(num)
# Exemplo de abs() com um número inteiro
numero_inteiro = -10
print(abs(numero_inteiro)) # Saída: 10
# Exemplo de abs() com um número flutuante
numero_flutuante = -20.5
print(abs(numero_flutuante)) # Saída: 20.5
# Exemplo de abs() com um número complexo
numero_complexo = 3 + 4j
print(abs(numero_complexo)) # Saída: 5.0
Neste exemplo, a função abs() é chamada com diferentes tipos de números.
No caso do número complexo 3 + 4j, abs() retorna a magnitude, que é calculada como a raiz quadrada da soma dos quadrados dos componentes real e imaginário, resultando em 5.0, que é a hipotenusa de um triângulo retângulo com lados de comprimentos 3 e 4.
A função all() retorna True se todos os elementos de um iterável são considerados verdadeiros.
Um elemento é considerado verdadeiro a menos que seja equivalente a False, None , 0 (zero), "", [], (), {}, ou seja, um valor, sequência ou coleção vazia.
all() é particularmente útil quando você precisa verificar uma condição em múltiplos itens em uma coleção de dados, como listas, tuplas, dicionários, ou outros iteráveis.
O uso da função all() pode simplificar o código que, de outra forma, exigiria laços explícitos para verificar cada item de um iterável.
Por exemplo, ao verificar se todos os elementos de uma lista satisfazem uma condição específica, em vez de usar um laço for com uma série de comparações, você pode usar all() com uma expressão geradora.
Este método não só torna o código mais limpo e fácil de ler, mas também é eficiente.
all(iteravel)
Se o iterável estiver vazio, all() retorna True.
# Verificar se todos os números em uma lista são positivos
numeros = [10, 20, 30, 40, 50]
resultado = all(n > 0 for n in numeros)
print(resultado) # Saída: True
# Verificar se todas as palavras em uma lista são não-vazias
palavras = ["maçã", "banana", "cereja", ""]
resultado = all(palavras)
print(resultado) # Saída: False, porque uma das strings está vazia
# Verificar se todos os valores em um dicionário são verdadeiros
dados = {'a': True, 'b': False, 'c': True}
resultado = all(dados.values())
print(resultado) # Saída: False, porque um dos valores é False
Nesse exemplo, a função all() é utilizada para verificar condições em diferentes tipos de coleções.
No caso de listas de números e strings, a função ajuda a determinar rapidamente se todos os elementos atendem a um critério específico.
No caso do dicionário, all() é usada para verificar se todos os valores são verdadeiros, baseando-se apenas nos valores do dicionário.
Esta função é extremamente útil em validações e condições onde todos os elementos devem atender a uma certa condição para que a operação prossiga.
A função any() retorna True se qualquer elemento de um iterável é considerado verdadeiro.
Se o iterável estiver vazio, any() retorna False.
Esta função é o complemento de all(), sendo útil para verificar se pelo menos um elemento em uma coleção de dados, como listas, tuplas, dicionários, entre outros, satisfaz uma condição específica.
any() é especialmente valiosa em situações onde você deseja verificar rapidamente a presença de qualquer valor verdadeiro em uma coleção, sem a necessidade de iterar explicitamente por todos os elementos.
Por exemplo, pode ser usada para verificar se há algum item não nulo em uma lista, ou se algum elemento de uma lista de booleanos é True.
A função proporciona uma maneira concisa e eficiente de realizar essas verificações, melhorando a legibilidade do código e reduzindo a quantidade de código necessária para expressar tal condição.
any(iteravel)
Cada elemento é considerado verdadeiro a menos que seja False, None , zero, ou uma coleção vazia.
# Verificar se há algum número positivo em uma lista
numeros = [-1, -2, 0, 3, -5]
resultado = any(n > 0 for n in numeros)
print(resultado) # Saída: True
# Verificar se há algum elemento não vazio em uma lista de strings
palavras = ["", "", "", "banana"]
resultado = any(palavras)
print(resultado) # Saída: True, porque "banana" é um texto não-vazio
# Verificar se qualquer chave de um dicionário possui um valor especificado
dicionario = {'a': 10, 'b': 0, 'c': 5}
resultado = any(valor == 10 for valor in dicionario.values())
print(resultado) # Saída: True, porque há um valor 10 no dicionário
Nestes exemplos, any() é usada para verificar rapidamente a presença de condições específicas em diferentes tipos de coleções.
A função pode simplificar significativamente o código em situações onde apenas um "verdadeiro" é necessário para que uma condição seja considerada satisfeita.
A função any() é, portanto, uma ferramenta poderosa para aumentar a eficiência e clareza em operações condicionais.
Neste exemplo, o uso de isinstance() com str em Python 3 é a maneira correta de verificar se uma variável é um texto, substituindo a antiga checagem com basestring que era usada no Python 2.
A função bin() converte um número inteiro em texto (string) com o valor binário (zeros ou uns) prefixado com "0b", que indica que o número está em base binária.
Essa função é particularmente útil para aplicações que requerem manipulação de bits, ou para visualização da representação binária de números para determinado objetivo, como por exemplo depuração (debug) de código, ou ensino.
bin() aceita um número inteiro e retorna a sua representação como uma string binária.
Se o número fornecido for negativo, o retorno incluirá um sinal de menos ('-') antes do prefixo '0b'.
Esta função facilita a conversão entre bases numéricas, que é uma tarefa comum em áreas como computação gráfica, criptografia, e outras operações de baixo nível.
bin(numint)
numero_positivo = 10
numero_negativo = -10
binario_positivo = bin(numero_positivo)
binario_negativo = bin(numero_negativo)
print("Binário de 10:", binario_positivo)
print("Binário de -10:", binario_negativo)
print("\ntipos:\n")
print("binario_positivo:", type(binario_positivo))
print("binario_negativo:", type(binario_negativo))
Neste exemplo, a função bin() é usada para converter dois números inteiros (um positivo e um negativo) para suas respectivas representações binárias.
Como visto no exemplo, o número negativo também reflete o sinal na sua representação binária.
Este método é extremamente útil para entender como números são armazenados e manipulados em nível de bits dentro de computadores, facilitando a análise e o ensino de conceitos relacionados à arquitetura de computadores e programação de sistemas.
A função bool() converte um valor dado para um valor booleano, ou seja, True ou False.
É fundamental em muitas áreas de desenvolvimento de software, pois permite avaliar a verdade ou falsidade de diferentes tipos de dados de maneira eficiente e clara, sendo usada frequentemente para testar a verdade de uma expressão em condições e laços (loops), bem como em operações lógicas e de atribuição.
Valores como None, zero de qualquer tipo numérico (0, 0.0, 0j, respectivamente inteiro, real e complexo), sequências vazias ('', (), []), e conjuntos vazios ({}) são considerados False.
Todos os outros valores são considerados True.
Portanto, bool() é uma forma conveniente de avaliar qualquer valor para essa verdade ou falsidade lógica.
A função bool() pode ser aplicada a qualquer objeto, e Python possui regras claras para determinar o valor booleano de diferentes tipos de dados.
Por exemplo, valores numéricos são False se forem zero e True caso contrário.
Para coleções (como textos, listas, tuplas, dicionários e conjuntos), a função retorna False se a coleção estiver vazia e True se houver pelo menos um item.
None sempre retorna False.
Essa função é amplamente utilizada em condições e laços, onde a conversão implícita para booleano é comum.
bool(obj)
def print_bool(valores):
if isinstance(valores,list):
limite = len(valores)-1
i = 0
while i <= limite:
valor = valores[i]
print(f"bool({valor}) = {bool(valor)}",
end='; ' if i < limite else '\n')
i += 1
else:
print(f"bool({valores}) = {bool(valores)}")
print_bool([0,0.0,0j])
print_bool([1,1.1,1j])
print_bool([-1,-1.1,-1j,-1e-10])
print_bool(['','python'])
print_bool([[],[1,2,3]])
print_bool([(),(1,2,3)])
print_bool([{},{1,2,3}])
print_bool(None)
print_valor = lambda valor: print(
f"A variável valor = bool({valor})",
f"{'não ' if bool(valor) else ''}está vazia!")
print_valor([])
print_valor([1,2,3])
Neste exemplo, diferentes tipos de valores são testados com a função bool().
Os resultados ilustram as regras de verdade e falsidade em Python: valores numericamente equivalentes a zero, None, e coleções vazias são False, enquanto números não-zero, strings não-vazias e coleções com itens são True.
Compreender essas regras é crucial para desenvolver lógicas de controle eficazes em programas Python, fazendo de bool() uma ferramenta essencial para qualquer desenvolvedor Python.
A função callable() verifica se um objeto é "chamável", ou seja, se pode ser chamado como uma função.
Isso inclui não apenas funções definidas pelo usuário, mas também métodos de classes, instâncias de classes que implementam o método __call__, e outras entidades que possuem um comportamento de chamada.
Usar callable() é uma maneira eficiente de determinar se um objeto pode ser invocado como uma função, o que é útil em situações de programação dinâmica ou quando se trabalha com APIs e bibliotecas onde não é imediatamente óbvio se um objeto é ou não chamável.
Esta função ajuda a prevenir erros que ocorreriam ao tentar "chamar" objetos que não suportam essa operação, fornecendo um meio seguro de verificação antes da execução de chamadas.
callable(obj)
# a função print_callable() verifica se um objeto é chamável ou não
def print_callable(lista_objetos):
for obj in lista_objetos:
print(f"{obj} {'' if callable(obj) else 'não '}é chamável.")
print("Testando objetos chamáveis\n")
def funcao():
print("Olá!")
class ExemploClasse:
def __call__(self):
print("Instância chamável!")
objeto = ExemploClasse()
print_callable([funcao, ExemploClasse, objeto])
print("\nTestando objetos não chamáveis\n")
nao_chamavel = 10
print_callable([nao_chamavel, -10, "", (), [], {}, None])
No exemplo, a função callable() é usada para verificar se diferentes tipos de objetos são chamáveis.
A função funcao é chamável, assim como a instância de ExemploClasse, que implementa o método __call__, permitindo que suas instâncias se comportem como funções.
Por outro lado, um número inteiro (nao_chamavel) não é chamável, o que é corretamente identificado pela função callable().
Este exemplo demonstra como callable() pode ser usada para garantir que as operações de chamada sejam aplicadas apenas a objetos que suportam tal funcionalidade, evitando erros e melhorando a robustez do código.
A função chr() converte um número inteiro (representando um código Unicode) em seu correspondente caractere.
Esta função é bastante útil quando você está trabalhando com manipulação de dados que envolvem caracteres Unicode, permitindo que caracteres sejam representados e manipulados através de seus códigos numéricos.
chr() recebe um inteiro que representa o código Unicode de um caractere e retorna o caractere como um texto.
É o inverso da função ord(), que recebe um caractere como argumento e retorna seu código Unicode.
A função chr() é limitada ao intervalo válido de pontos de código Unicode, de 0 a 0x10FFFF (0 a 1.114.111 em decimal), abrangendo o conjunto completo de caracteres Unicode, incluindo letras de diferentes alfabetos, símbolos matemáticos, emojis e muito mais.
chr(numint)
linha = 0
conta_letras = 0
while linha < 16:
coluna = 0
while coluna < 64:
print(chr(conta_letras), end='')
coluna += 1
conta_letras += 1
print()
linha += 1
Neste exemplo, a função chr() é usada para converter um número inteiro de 0 a 1023 para o caractere correspondente, em 16 linhas de 64 colunas, num total de 1024 caracteres Unicode.
Essa funcionalidade é essencial para desenvolvedores que lidam com a codificação de caracteres, formatação de texto ou simplesmente necessitam de uma conversão específica entre códigos e caracteres em seus programas.
O método clear() é usado em Python para remover todos os itens de um objeto colecionável, como listas, dicionários e conjuntos, deixando-os vazios.
Este método é uma forma conveniente e eficiente de limpar o conteúdo de uma coleção sem a necessidade de reatribuir um novo objeto vazio à variável original, preservando assim o identificador e quaisquer referências existentes.
Em coleções mutáveis, como listas, dicionários e conjuntos, clear() é extremamente útil para resetar o conteúdo sem alterar a identidade do objeto.
Isso é particularmente importante em cenários onde a coleção está sendo compartilhada ou referenciada em múltiplas partes de um programa.
Utilizar clear() assegura que todas as referências apontam para o mesmo objeto vazio, ao invés de criar novos objetos, o que poderia levar a inconsistências.
Cabeçalho típico do método:
colecao.clear()
Para Listas:
lista = [1, 2, 3, 4, 5]
lista.clear()
print(lista) # Saída: []
Para Dicionários:
dicionario = {'a': 1, 'b': 2, 'c': 3}
dicionario.clear()
print(dicionario) # Saída: {}
Para Conjuntos:
conjunto = {1, 2, 3, 4, 5}
conjunto.clear()
print(conjunto) # Saída: set()
Nos exemplos acima, o método clear() é usado para remover todos os elementos de diferentes tipos de coleções.
Após a chamada de clear(), as coleções são mostradas como vazias.
Esse método é especialmente útil em aplicações que precisam reutilizar coleções já existentes mas limpar seus dados, como em loops de processamento ou na redefinição de estados em interfaces gráficas.
Ao utilizar clear(), você mantém as propriedades do objeto original, como sua identidade e referências, o que pode ser crucial dependendo do contexto.
Utilizar clear() é uma maneira prática e rápida de resetar o estado de listas, dicionários e conjuntos quando necessário, sem alocar novos recursos ou criar novas instâncias desses objetos.
A função compile() compila um texto contendo uma expressão ou um bloco de código Python, em um objeto de código, que podem ser executados posteriormente pelas funções exec() ou eval().
Isso é útil para situações onde você precisa executar dinamicamente código Python que é gerado em tempo de execução ou vem de uma fonte externa.
A função compile() é usada principalmente para pré-compilar código que será executado várias vezes, permitindo que o Python otimize a execução ao evitar a recompilação repetida do mesmo código.
A função aceita código em forma de texto ou objeto de código, juntamente com um nome de arquivo, que pode ser qualquer texto, uma vez que não é usado para abrir um arquivo real, mas apenas para identificação em mensagens de erro; e um modo que especifica o tipo de código que está sendo compilado.
Os modos disponíveis são:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
# Compilando e executando uma expressão
expr = "3 * x + 2"
codigo_compilado = compile(expr, '<string>', 'eval')
resultado_eval = eval(codigo_compilado, {'x': 2})
print(f"Resultado eval(): {resultado_eval}") # Saída: 8
# Compilando e executando múltiplas instruções
codigo = """
def alo(nome):
alo_nome = f"Alo {nome}"
print(f"Resultado exec(): {alo_nome}")
alo("Alice")
"""
codigo_compilado = compile(codigo, '<string>', 'exec')
exec(codigo_compilado) # Saída: Alô, Alice
Neste exemplo, a função compile() é usada para transformar textos contendo código Python em objetos de código que podem ser executados.
A expressão é avaliada usando eval(), enquanto um bloco de código com definições de função e comandos é executado usando exec().
Isso demonstra a flexibilidade de compile() em lidar com diferentes tipos de código Python dinamicamente.
A função complex() cria um número complexo a partir de argumentos reais e imaginários.
Números complexos, que são uma extensão dos números reais, incluem uma parte real e uma parte imaginária, expressa como real + imag*j, onde j é a unidade imaginária (equivalente à raiz quadrada de -1).
complex() é usada para construir valores complexos.
Essa função é útil em diversas áreas da matemática e engenharia, especialmente em contextos onde fenômenos como ondas eletromagnéticas, acústica ou circuitos elétricos são modelados, pois esses contextos frequentemente requerem manipulação de números complexos.
A função pode ser chamada com um ou dois argumentos numéricos, onde o primeiro argumento é tratado como a parte real e o segundo, opcional, como a parte imaginária.
Se chamada sem argumentos, retorna o número complexo 0j.
complex(real=0, imag=0)
# Criando números complexos
c1 = complex(2, 3)
c2 = complex(1) # Parte imaginária será 0
c3 = complex() # Equivalente a complex(0, 0)
c4 = complex('10+2j') # Criando a partir de um texto
print(c1) # Saída: (2+3j)
print(c2) # Saída: (1+0j)
print(c3) # Saída: 0j
print(c4) # Saída: (10+2j)
Além de sua utilização direta para criar números complexos, a função complex() também aceita strings como argumento.
A string deve estar no formato reconhecível como um número complexo (por exemplo, '1+2j').
Isso pode ser particularmente útil ao processar dados que vêm em formatos textuais e necessitam ser convertidos para um formato numérico complexo para cálculos subsequentes.
Essa capacidade de manipular e criar números complexos de forma simples e integrada é uma das muitas razões que tornam Python uma linguagem popular para aplicações científicas e de engenharia, onde a necessidade de operações com números complexos é comum.
A função delattr() remove um atributo de um objeto, desde que o objeto permita tal operação.
Esta função é útil em situações onde você precisa modificar dinamicamente os objetos, removendo atributos que não são mais necessários ou que devem ser limpos por algum motivo.
Ela é equivalente a deletar um atributo com a sintaxe del obj.atributo.
delattr() é comumente usada em programação avançada e metaprogramação, onde a manipulação de objetos e suas estruturas em tempo de execução é requerida.
Ela permite a alteração de objetos de uma maneira que não é possível com métodos estáticos ou menos flexíveis.
É importante usar essa função com cuidado, pois a remoção de atributos essenciais de um objeto pode levar a erros em tempo de execução se o código subsequente tentar acessar o atributo deletado.
delattr(objeto, nome)
objeto: O objeto do qual o atributo será removido.
nome: Uma string que especifica o nome do atributo a ser removido.
class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
# Criando uma instância da classe Pessoa
p = Pessoa("Alice", 30)
# Verificando a existência dos atributos
print(hasattr(p, 'nome')) # Saída: True
print(hasattr(p, 'idade')) # Saída: True
# Removendo o atributo 'idade'
delattr(p, 'idade')
# Verificando a remoção do atributo
print(hasattr(p, 'idade')) # Saída: False
# Tentando acessar o atributo removido resultará em erro
try:
print(p.idade)
except AttributeError as e:
print(e) # Saída: 'Pessoa' object has no attribute 'idade'
Neste exemplo, delattr() é usada para remover o atributo idade de uma instância da classe Pessoa.
Após a remoção, a verificação com hasattr() mostra que o atributo idade não está mais presente, e tentar acessá-lo resulta em um AttributeError.
Isso ilustra como delattr() pode ser eficaz para modificar dinamicamente as propriedades de objetos em Python.
Usar delattr() fornece uma abordagem programática para manipulação de atributos, complementando funções como setattr() e getattr(), que são usadas para definir e obter atributos, respectivamente.
Juntas, estas funções oferecem uma maneira poderosa de manipular objetos em Python de forma dinâmica e flexível.
A função dict() em Python é uma das funções nativas mais úteis e frequentemente usadas, que cria um novo dicionário, uma das estruturas de dados essenciais em Python.
Dicionários são coleções desordenadas de pares chave-valor, onde cada chave é única e o valor pode ser de qualquer tipo.
A função dict() é versátil, suportando várias formas de criar dicionários a partir de diferentes tipos de dados.
Dicionários são extremamente úteis para casos onde pares de associações são necessários, como armazenar propriedades de um objeto, parâmetros de funções, ou dados tabulares.
Eles permitem o acesso rápido a dados baseados em chaves e são otimizados para recuperações rápidas, inserções e deleções.
A função dict() pode ser usada para criar dicionários vazios ou para converter outras estruturas de dados em dicionários, como listas de tuplas ou outras instâncias de dicionários.
dict(**kwargs)
dict(mapping, **kwargs)
dict(iteravel, **kwargs)
# Criando um dicionário vazio
d1 = dict()
print(d1) # Saída: {}
# Criando um dicionário a partir de kwargs
d2 = dict(nome="Alice", idade=25)
print(d2) # Saída: {'nome': 'Alice', 'idade': 25}
# Criando um dicionário a partir de um iterável de tuplas
lista_de_pares = [('nome', 'Bob'), ('idade', 30)]
d3 = dict(lista_de_pares)
print(d3) # Saída: {'nome': 'Bob', 'idade': 30}
# Criando um dicionário a partir de outro dicionário
d4 = dict(d3)
print(d4) # Saída: {'nome': 'Bob', 'idade': 30}
Além de sua função básica de criação de dicionários, dict() também é frequentemente usada em conjunto com funções como zip(), que pode ser usada para combinar duas listas em uma estrutura de dicionário, transformando uma lista de chaves e outra de valores correspondentes em um dicionário.
chaves = ['nome', 'idade']
valores = ['Alice', 28]
d5 = dict(zip(chaves, valores))
print(d5) # Saída: {'nome': 'Alice', 'idade': 28}
A função dict() é uma ferramenta fundamental para o trabalho com dados em Python, oferecendo flexibilidade na criação e manipulação de dicionários, que são uma das estruturas de dados mais poderosas e amplamente utilizadas na linguagem.
A função dir() em Python é uma função nativa extremamente útil para introspecção, ou seja, para obter informações sobre os atributos e métodos disponíveis para qualquer objeto.
Isso inclui módulos, classes, instâncias de classes e até mesmo tipos de dados incorporados.
dir() é frequentemente usada durante o desenvolvimento e depuração para entender rapidamente quais operações são possíveis com um objeto ou para simplesmente explorar quais propriedades e métodos um objeto possui.
Quando chamada sem argumentos, dir() lista os nomes no escopo atual.
Quando um objeto é passado como argumento, ela retorna uma lista de todos os atributos válidos para aquele objeto.
Isso pode incluir atributos herdados de classes base (no caso de objetos de classe) e também métodos e atributos especiais definidos pelo Python, como aqueles precedidos e seguidos por __ (dunder methods).
dir([x])
O argumento x é opcional e sendo omitido, dir() retorna os nomes no escopo local atual.
class Exemplo:
def __init__(self, valor):
self.valor = valor
def mostrar_valor(self):
print(self.valor)
# Instanciando a classe
obj = Exemplo(42)
# Usando dir() para listar as propriedades e métodos do objeto
print(dir(obj))
# Usando dir() em um tipo de dado incorporado
print(dir(str))
A saída de dir(obj) incluirá, além de mostrar_valor e valor, uma série de métodos especiais do Python que são automaticamente herdados por objetos de classe.
A saída de dir(str) mostrará os métodos que podem ser aplicados a strings em Python, como capitalize, join, split, e assim por diante.
dir() não fornece informações sobre a funcionalidade dos métodos ou se eles são acessíveis (por exemplo, métodos privados começando com _).
A função apenas lista os atributos e métodos disponíveis, sem detalhar sua visibilidade ou propósito.
Para uma exploração mais profunda de um objeto, outras ferramentas e técnicas, como help(), podem ser mais informativas, pois oferecem descrições dos métodos e propriedades, incluindo suas assinaturas e informações docstring quando disponíveis.
A função divmod() aceita dois números como argumentos e retorna um par (uma tupla) contendo o quociente e o resto da divisão inteira desses números.
Ela combina as operações normalmente realizadas pelas operações // (divisão inteira) e % (módulo), fazendo ambas em uma única chamada de função eficiente.
divmod() é útil em situações onde você precisa dos resultados de uma divisão inteira e do módulo ao mesmo tempo.
Essa funcionalidade é frequentemente aplicada em algoritmos matemáticos, como aqueles que lidam com conversão de bases numéricas, cálculos envolvendo tempo (como converter segundos em horas e minutos), e em situações de paginamento em programação web ou em sistemas de arquivos.
divmod(a, b)
# Usando divmod com números inteiros
resultado = divmod(20, 6)
print(resultado) # Saída: (3, 2), onde 3 é o quociente e 2 é o resto
# Usando divmod com números de ponto flutuante
resultado_float = divmod(20.5, 6.5)
print(resultado_float) # Saída: (3.0, 1.0), onde 3.0 é o quociente e 1.0 é o resto
# Exemplo prático: convertendo segundos em horas e minutos
segundos = 5000
horas, resto = divmod(segundos, 3600)
minutos, segundos = divmod(resto, 60)
print(f"{horas} horas, {minutos} minutos e {segundos} segundos")
A primeira chamada com inteiros retorna (3, 2), onde 3 é o número de vezes que 6 cabe em 20, e 2 é o que sobra.
A segunda chamada com números de ponto flutuante retorna (3.0, 2.0) seguindo a mesma lógica, mas ajustada para números de ponto flutuante.
O exemplo prático mostra como divmod() pode ser utilizado para converter um total de segundos em uma combinação mais legível de horas, minutos e segundos.
divmod() é uma função extremamente prática para operações que necessitam da divisão inteira e do cálculo do resto simultaneamente.
Ela simplifica o código ao combinar duas operações em uma, melhorando a clareza e potencialmente a performance do código ao reduzir o número de operações necessárias.
A função enumerate() em Python é uma função nativa extremamente útil para iterar sobre sequências de uma maneira que você tem acesso tanto ao índice quanto ao valor de cada item na sequência.
Esta função adiciona uma contagem automática aos itens de qualquer iterável (como listas, tuplas ou objetos de iterador), e é frequentemente usada em loops, especialmente em situações onde os índices dos itens são necessários junto com os valores.
Ao usar enumerate(), você pode simplificar o código que requer tanto o acesso aos elementos de um iterável quanto aos seus índices.
Isso elimina a necessidade de inicializar e atualizar manualmente um contador.
Esta função é particularmente útil em loops onde o índice dos elementos é necessário para operações como acessar um elemento correspondente em outra sequência, realizar cálculos baseados na posição, ou para condições que dependem da posição do item na sequência.
enumerate(iteravel, start=0)
O padrão é 0, mas pode ser alterado para qualquer valor inteiro.
# Exemplo de uso de enumerate em uma lista
nomes = ['Alice', 'Bob', 'Charlie', 'Diana']
# Iterando sobre a lista com índice e valor
for indice, nome in enumerate(nomes):
print(f"Índice {indice}: {nome}")
# Usando enumerate com um valor inicial diferente para o índice
for indice, nome in enumerate(nomes, start=1):
print(f"Índice {indice}: {nome}")
Neste exemplo, a primeira iteração mostra como enumerate() pode ser usado para acessar índices e valores de uma lista.
Na segunda iteração, o parâmetro start é ajustado para 1, mostrando como o índice pode ser iniciado de um valor diferente de 0, o que pode ser útil em contextos onde a indexação baseada em 1 é necessária ou mais intuitiva.
enumerate() é uma ferramenta poderosa e flexível em Python, facilitando a escrita de loops mais claros e concisos quando os índices dos elementos são necessários.
Ela é amplamente utilizada em situações que vão desde simples iterações para visualização de dados até operações mais complexas onde os índices dos elementos desempenham um papel crucial nas lógicas de processamento.
A função eval() avalia uma expressão Python especificada como um texto ou uma expressão compilada e retorna o resultado.
Esta função é extremamente poderosa, mas seu uso deve ser feito com cuidado, especialmente ao avaliar expressões que podem conter código não confiável, pois pode levar a vulnerabilidades de segurança.
eval() é frequentemente usada para executar uma expressão dinâmica que é um texto ou um código compilado.
Isso pode incluir operações matemáticas simples, avaliação de expressões lógicas, ou a manipulação de diferentes tipos de dados em Python.
No entanto, dado que eval() executa o código Python que lhe é fornecido como um texto, ela pode apresentar riscos significativos de segurança se usada com dados de entrada não verificados, permitindo potencialmente a execução de operações mal-intencionadas.
eval(expressao, globals=None, locals=None)
# Avaliando uma expressão simples
resultado = eval('3 * 4 + 5')
print(resultado) # Saída: 17
# Avaliando uma expressão com variáveis
x = 10
y = 20
resultado = eval('x + y')
print(resultado) # Saída: 30
# Avaliando uma expressão com globals e locals
ambiente_global = {'x': 7, 'y': 3}
ambiente_local = {}
resultado = eval('x + y', ambiente_global, ambiente_local)
print(resultado) # Saída: 10
Devido à sua capacidade de executar código arbitrário, é crucial usar eval() com cuidado.
Evite usar eval() com dados não confiáveis ou provenientes de fontes externas.
Se a funcionalidade necessária pode ser alcançada de outra forma mais segura, é aconselhável fazer isso.
Alternativas como o uso de ast.literal_eval() para avaliação segura de expressões literalmente Python (como strings, números, tuplas, listas, dicts, booleans, e None ) devem ser consideradas quando adequado.
Enquanto eval() oferece uma funcionalidade poderosa para a execução dinâmica de expressões Python, seu uso deve ser cuidadosamente considerado e restrito a contextos onde a entrada é controlada ou completamente confiável para evitar possíveis vulnerabilidades de segurança.
Em Python 2, a função execfile() era usada para executar um script Python dentro de outro arquivo Python.
execfilefacilitava a execução de arquivos Python como parte de um script maior, permitindo a inclusão dinâmica e a execução de códigos Python de arquivos externos.
No entanto, é importante notar que execfile() foi removida no Python 3 e não está disponível diretamente.
Em vez disso, as funcionalidades que execfile() proporcionava podem ser alcançadas usando outras técnicas em Python 3.
No Python 2 a função execfile() executava diretamente o código Python de um arquivo especificado,
Ela lia o arquivo, compilava o código e o executava, tudo em um único passo.
Era como se o código do arquivo estivesse no corpo do script que chamava execfile().
Isso era conveniente, mas também trazia os mesmos riscos de segurança associados a funções como eval() e exec(), especialmente quando usado com arquivos de fontes não confiáveis.
Em Python 3, a funcionalidade de execfile() pode ser replicada usando a função exec() em combinação com outras funções de leitura de arquivos.
Aqui está como você pode emular execfile() em Python 3:
def execfile(filepath, globals=None, locals=None):
if globals is None:
globals = {}
if locals is None:
locals = globals
with open(filepath, 'r') as file:
exec(file.read(), globals, locals)
# Exemplo de uso da função execfile recriada
execfile('script.py')
No exemplo, execfile() é definida para abrir um arquivo e executar seu conteúdo como código Python dentro do ambiente de execução atual.
O uso de globals e locals permite especificar o ambiente em que o código será executado, o que pode ser útil para limitar o escopo das variáveis ou isolar o código executado.
Assim como com exec(), o uso de execfile() (e sua reimplementação em Python 3) deve ser feito com cautela.
Executar código de fontes não verificadas pode levar a sérios problemas de segurança, como execução de operações mal-intencionadas ou vazamento de dados sensíveis.
É essencial garantir que o código que você está executando é confiável e não compromete a segurança do sistema.
Enquanto execfile() não existe mais em Python 3, sua funcionalidade pode ser facilmente replicada usando técnicas padrão de leitura de arquivos e a função exec().
No entanto, a segurança deve ser uma prioridade ao considerar a execução dinâmica de código Python, especialmente quando envolve a interpretação de scripts externos.
O tipo file em Python 2 era usado para criar um objeto de arquivo, que permitia realizar operações de leitura e escrita em arquivos.
O construtor file() era uma forma integrada de abrir arquivos, similar à função open().
No entanto, com a chegada do Python 3, file() foi removido e substituído completamente pelo uso de open() para todas as operações de arquivo.
Isso faz parte de uma série de mudanças que visam simplificar e padronizar a linguagem.
Em Python 2, file() era tanto um construtor quanto um tipo de dados, e você poderia usar file() para abrir um arquivo e retornar um objeto de arquivo correspondente.
A sintaxe básica de file() era similar à de open(), e frequentemente as duas funções eram usadas de forma intercambiável.
No entanto, open() era mais comumente recomendado para abertura de arquivos devido à sua familiaridade e consistência com outras linguagens de programação.
# Em Python 2, você poderia abrir um arquivo assim:
f = file('example.txt', 'r')
print(f.read())
f.close()
# A maneira recomendada mesmo em Python 2 era usar open(), que continua válido em Python 3:
f = open('example.txt', 'r')
print(f.read())
f.close()
Com o Python 3, o tipo file foi removido, e a função open() é agora o método padrão e recomendado para trabalhar com arquivos.
open() retorna um objeto de arquivo com métodos como .read(), .write(), .close(), entre outros, e deve ser usado para todas as operações de arquivo.
# Abrindo e lendo um arquivo em Python 3
with open('example.txt', 'r') as f:
print(f.read())
# Essa abordagem também gerencia automaticamente o fechamento do arquivo
A mudança para utilizar exclusivamente open() em Python 3 é parte dos esforços para tornar a linguagem mais consistente e fácil de aprender para novos programadores, além de eliminar redundâncias.
O uso de with open() as é particularmente encorajado porque garante que o arquivo seja fechado automaticamente após o bloco de código indentado ser executado, reduzindo a possibilidade de erros relacionados ao gerenciamento de arquivos, como arquivos não fechados.
A função float() converte um número ou um texto contendo um número para um objeto de ponto flutuante (float).
É uma ferramenta essencial em Python, pois permite a manipulação de números com casas decimais e é fundamental para cálculos que exigem precisão fracionária.
float() é usada para criar um objeto float a partir de números inteiros, strings que representam números, e até de outros números de ponto flutuante.
Os números de ponto flutuante são uma representação aproximada dos números reais e são usados em quase todos os campos da ciência e tecnologia quando a precisão exata não é necessária, mas uma boa aproximação é suficiente.
O tipo float em Python é implementado usando o tipo de ponto flutuante de precisão dupla da IEEE 754, que fornece uma precisão razoável para a maioria das aplicações.
float([obj])
Pode ser um texto, um número, ou qualquer objeto que implemente o método especial __float__().
Se nenhum argumento for fornecido, retorna 0.0.
# Convertendo um número inteiro para float
num_int = 10
print(float(num_int)) # Saída: 10.0
# Convertendo um texto para float
num_str = "3.14159"
print(float(num_str)) # Saída: 3.14159
# Convertendo um número float para float (redundante mas válido)
num_float = 2.71828
print(float(num_float)) # Saída: 2.71828
# Usando float sem argumentos
print(float()) # Saída: 0.0
Ao usar float() com strings, é importante que a string represente um número válido em formato decimal ou científico, caso contrário, um ValueError será levantado indicando que a conversão falhou.
Além disso, devido à natureza da representação de ponto flutuante, alguns números não podem ser representados exatamente, o que pode levar a pequenas imprecisões em cálculos complexos ou de alta precisão.
A função float() é uma parte fundamental da manipulação de números em Python, permitindo conversões flexíveis entre tipos e a execução de operações matemáticas que requerem representações fracionárias.
Seu entendimento e uso correto são essenciais para a programação eficaz em Python, especialmente em campos que lidam com matemática, ciência e engenharia.
A função format() em Python é uma ferramenta poderosa que facilita a formatação de valores em strings.
Ela permite configurar a apresentação de diferentes tipos de dados de forma legível e de acordo com as necessidades específicas de visualização ou saída de dados.
Esta função é parte integrante da linguagem e oferece flexibilidade significativa para formatar números, strings, objetos e mais.
format() é utilizada para aplicar um formato específico a um valor, retornando a representação formatada como um texto.
Ela é particularmente útil para controlar o layout de impressão de números, alinhamento de texto, preenchimento, representação numérica e outros aspectos de formatação de dados.
A função pode ser usada de forma independente ou como parte da sintaxe de strings formatadas, conhecida como interpolação de texto (string interpolation), ou literais de textos formatados - (formatted string literals ou f-strings).
format(valor, format_spec='')
# Formatando números decimais
num = 123.456789
formatted_num = format(num, ".2f")
print(formatted_num) # Saída: 123.46
# Formatando números em estilo percentual
percentage = 0.756
formatted_percentage = format(percentage, ".1%")
print(formatted_percentage) # Saída: 75.6%
# Alinhamento e preenchimento de strings
text = "Python"
formatted_text = format(text, "^20")
print(f"'{formatted_text}'") # Saída: ' Python '
# Formatando números com separadores de milhar
large_number = 123456789
formatted_large_number = format(large_number, ",")
print(formatted_large_number) # Saída: 123,456,789
A especificação de formato pode ser detalhada e suporta uma variedade de opções, como preenchimento, alinhamento, número de casas decimais, formato numérico (decimal, binário, hexadecimal, científico), e mais.
Esta especificação é um texto que geralmente inclui um ou mais "códigos de formato" que indicam como o valor deve ser modificado.
format() é uma função extremamente versátil que ajuda na criação de saídas formatadas limpas e profissionais em Python.
Ela é essencial para programas que requerem uma apresentação de dados específica e é amplamente utilizada em aplicações que vão desde a geração de relatórios até interfaces de usuário.
Seu uso combinado com f-strings proporciona um poderoso mecanismo de formatação incorporado diretamente na linguagem Python.
A função frozenset() em Python cria uma versão imutável de um conjunto, chamada de frozenset.
Assim como os conjuntos (sets), os frozensets são coleções não ordenadas que não permitem elementos duplicados.
A principal diferença é que, enquanto os sets são mutáveis e permitem operações como adição e remoção de elementos, os frozensets são imutáveis e não suportam métodos que alteram os elementos depois de criados.
Frozensets são particularmente úteis quando você precisa de um conjunto de elementos que não deve ser alterado ao longo do tempo ou quando você deseja usar um conjunto como elemento de outro conjunto ou como chave em um dicionário, o que não é possível com conjuntos normais devido à sua mutabilidade.
Os frozensets suportam métodos como união, interseção, diferença e diferença simétrica, mas todos esses métodos retornarão um novo frozenset sem alterar o original.
frozenset([iteravel])
Se nenhum iterável for fornecido, o frozenset criado será vazio.
# Criando um frozenset a partir de uma lista
fs = frozenset([1, 2, 3, 2, 1])
print(fs) # Saída: frozenset({1, 2, 3})
# Demonstrando a imutabilidade
try:
fs.add(4)
except AttributeError as e:
print(e) # Saída: 'frozenset' object has no attribute 'add'
# Operações com frozensets
fs1 = frozenset([1, 2, 3])
fs2 = frozenset([3, 4, 5])
# União
print(fs1.union(fs2)) # Saída: frozenset({1, 2, 3, 4, 5})
# Interseção
print(fs1.intersection(fs2)) # Saída: frozenset({3})
# Diferença
print(fs1.difference(fs2)) # Saída: frozenset({1, 2})
# Diferença simétrica
print(fs1.symmetric_difference(fs2)) # Saída: frozenset({1, 2, 4, 5})
Frozensets são uma ferramenta poderosa em Python quando é necessário garantir que uma coleção de elementos não seja modificada após sua criação ou quando é necessário usar conjuntos como chaves de dicionário.
Ao fornecer funcionalidade similar aos conjuntos, mas com a garantia de imutabilidade, os frozensets expandem as possibilidades de uso de conjuntos em Python de forma segura e eficaz.
A função getattr() em Python é uma função nativa extremamente útil para acessar o valor de um atributo de um objeto de maneira dinâmica.
Esta função permite que você obtenha o valor de um atributo a partir de seu nome como um texto, o que é particularmente útil em situações onde o nome do atributo a ser acessado não é conhecido antes do tempo de execução.
getattr() é usada principalmente quando o nome do atributo a ser acessado em um objeto é variável e determinado em tempo de execução.
Essa capacidade de acessar atributos dinamicamente é uma parte fundamental da metaprogramação em Python, permitindo que os programas sejam mais flexíveis e adaptáveis.
A função também pode ser usada com um terceiro argumento opcional, que é um valor padrão retornado caso o atributo especificado não exista no objeto.
getattr(obj, nome, default=None)
O parâmetro default é opcional e se não for fornecido, e o atributo não existir, um AttributeError será levantado.
class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
# Criando uma instância de Pessoa
p = Pessoa("Alice", 30)
# Acessando atributos dinamicamente
nome = getattr(p, 'nome')
print(nome) # Saída: Alice
idade = getattr(p, 'idade')
print(idade) # Saída: 30
# Acessando um atributo que não existe com um valor padrão
profissao = getattr(p, 'profissao', 'Não especificada')
print(profissao) # Saída: Não especificada
Neste exemplo, getattr() é usado para acessar o nome e a idade de uma instância da classe Pessoa.
Além disso, tentamos acessar um atributo profissao que não existe na classe Pessoa, e especificamos um valor padrão 'Não especificada', que é retornado em vez de levantar um AttributeError.
getattr() é uma função poderosa que suporta a escrita de código flexível e dinâmico, facilitando a interação com objetos sem necessidade de conhecer todos os detalhes de sua implementação em tempo de compilação.
Essa função é essencial para cenários de reflexão e introspecção, onde os atributos de objetos precisam ser acessados de maneira não estática.
A função globals() retorna um dicionário representando a tabela de símbolos global atual.
Este dicionário é sempre acessível, pois contém todas as variáveis globais definidas no módulo ou no ambiente de execução atual, incluindo funções, classes, e outras variáveis.
globals() é uma ferramenta útil em cenários de metaprogramação e para depuração, permitindo aos programadores acessar e modificar variáveis globais dinamicamente.
O dicionário retornado por globals() pode ser modificado, o que afeta diretamente as variáveis globais do módulo.
Isso significa que, além de poder consultar as variáveis globais, você também pode alterar seus valores ou adicionar novas variáveis globalmente.
globals()
Não há parâmetros para esta função.
# Definindo algumas variáveis globais
nome = "Alice"
idade = 30
# Acessando o dicionário de variáveis globais
g = globals()
# Exibindo o dicionário global
print(g)
# Acessando uma variável global dinamicamente via globals()
print(g['nome']) # Saída: Alice
# Modificando uma variável global dinamicamente
g['idade'] = 31
print(idade) # Saída: 31
# Adicionando uma nova variável global
g['profissao'] = 'Engenheira'
print(profissao) # Saída: Engenheira