Em desenvolvimento Python, existem diferenças importantes entre ambientes como o PyCharm e a linha de comando. O PyCharm opera com blocos de código, enquanto a linha de comando utiliza um sistema de pools de dados para otimização.
- Mecanismo de Internação
O mecanismo de internação permite que objetos idênticos compartilhem o mesmo endereço de memória, economizando recursos. Este comportamento é controlado por regras específicas:
- Números: Apenas valores entre -5 e 256 são internados automaticamente.
- Strings: São internadas quando possuem conteúdo idêntico (excluindo caracteres chineses e especiais), independetnemente do tamanho.
- Em Python 3.6, strings resultantes de operações de multiplicação não podem exceder 20 caracteres.
- Em Python 3.7, esse limite é aumentado para 4096 caracteres.
- Valores booleanos (True/False) são sempre internados.
O benefício principal desse mecanismo é a economai de memória e o aumento de eficiência.
- Operadores de Comparação
É fundamental distinguir entre os operadores is e ==:
isverifica se dois objetos referenciam o mesmo endereço de memória.==verifica se o conteúdo de dois objetos é igual.
- Atribuição, Cópia Rasa e Cópia Profunda
Atribuição
Na atribuição, múltiplas variáveis podem apontar para o mesmo endereço de memória. Qualquer alteração afeta todas as referências.
Cópia Rasa (Shallow Copy)
A cópia rasa duplica apenas o primeiro nível de elementos. Elementos mutáveis compartilham o mesmo endereço de memória.
Cópia Profunda (Deep Copy)
A cópia profunda cria novas instâncias para todos os elementos, incluindo aninhados, garantindo total independência entre os objetos originais e copiados.
Exemplos Práticos:
# Exemplo de atribuição
lista_original = [1, 2, 3, [4, 5], 6]
lista_referencia = lista_original
lista_original.append(7)
print(lista_original) # [1, 2, 3, [4, 5], 6, 7]
print(lista_referencia) # [1, 2, 3, [4, 5], 6, 7]
# Exemplo de cópia rasa
lista_original = [1, 2, 3, [4, 5], 6]
lista_copia_rasa = lista_original.copy()
lista_original.append(7)
print(lista_original) # [1, 2, 3, [4, 5], 6, 7]
print(lista_copia_rasa) # [1, 2, 3, [4, 5], 6]
# Modificando elemento mutável na cópia rasa
lista_original[-2].append(9)
print(lista_original) # [1, 2, 3, [4, 5, 9], 6, 7]
print(lista_copia_rasa) # [1, 2, 3, [4, 5, 9], 6]
# Exemplo de cópia profunda
import copy
lista_original = [1, 2, 3, [4, 5], 6]
lista_copia_profunda = copy.deepcopy(lista_original)
lista_original.append(7)
lista_original[-2].append(9)
print(lista_original) # [1, 2, 3, [4, 5, 9], 6, 7]
print(lista_copia_profunda) # [1, 2, 3, [4, 5], 6]
- Conjuntos em Python
Características Principais:
- Remoção automática de duplicatas
- Elmeentos devem ser imutáveis (hashable)
- Desordenados e mutáveis
- Iteráveis
Operações Básicas:
# Criação de conjunto
conjunto_vazio = set()
conjunto = {1, 2, 3, 4, 4, 3, 2, 1} # {1, 2, 3, 4}
# Remoção de duplicatas de lista
lista_com_duplicatas = [11, 11, 11, 22, 33, 44, 55]
lista_unicos = list(set(lista_com_duplicatas)) # [33, 11, 44, 22, 55]
# Adicionando elementos
conjunto.add("novo_elemento")
conjunto.update(["outra", "lista"])
# Removendo elementos
elemento_removido = conjunto.pop() # Remove elemento aleatório
conjunto.remove("elemento_especifico") # Remove elemento específico
conjunto.clear() # Esvazia o conjunto
# Operações entre conjuntos
conjunto_a = {1, 2, 3, 4}
conjunto_b = {3, 4, 5, 6}
# União
print(conjunto_a | conjunto_b) # {1, 2, 3, 4, 5, 6}
# Interseção
print(conjunto_a & conjunto_b) # {3, 4}
# Diferença
print(conjunto_a - conjunto_b) # {1, 2}
# Diferença simétrica
print(conjunto_a ^ conjunto_b) # {1, 2, 5, 6}
# Verificação de subconjuntos
print(conjunto_a.issubset(conjunto_b)) # False
print(conjunto_a.issuperset(conjunto_b)) # False
- Aplicações Práticas
Exemplo: Gerenciador de Compras
# Dicionário de produtos
produtos = [
{"nome": "Notebook", "preco": 1999},
{"nome": "Mouse", "preco": 10},
{"nome": "Barco", "preco": 20},
{"nome": "Serviço", "preco": 998}
]
# Sistema de compras
saldo = float(input("Informe o valor a depositar: "))
carrinho = {}
compras_realizadas = []
while True:
# Exibir produtos
print("\nProdutos disponíveis:")
for i, produto in enumerate(produtos, 1):
print(f"{i}. {produto['nome']} - R${produto['preco']:.2f}")
# Seleção do usuário
opcao = input("\nEscolha um produto (N para finalizar, S para sair): ").upper()
if opcao == 'S':
break
elif opcao == 'N':
# Finalizar compra
total = sum(item["preco"] * item["quantidade"] for item in carrinho.values())
if total > saldo:
print(f"\nSaldo insuficiente! Total: R${total:.2f}, Saldo: R${saldo:.2f}")
# Remover itens do carrinho
while total > saldo and carrinho:
print("\nItens no carrinho:")
for nome, info in carrinho.items():
print(f"- {nome}: {info['quantidade']} x R${info['preco']:.2f}")
item_remover = input("Informe o item para remover: ")
if item_remover in carrinho:
if carrinho[item_remover]["quantidade"] > 1:
carrinho[item_remover]["quantidade"] -= 1
else:
del carrinho[item_remover]
total = sum(item["preco"] * item["quantidade"] for item in carrinho.values())
else:
# Compra realizada
saldo -= total
compras_realizadas.append(carrinho.copy())
carrinho = {}
print(f"\nCompra realizada! Novo saldo: R${saldo:.2f}")
elif opcao.isdigit() and 1 <= int(opcao) <= len(produtos):
# Adicionar produto ao carrinho
produto_selecionado = produtos[int(opcao) - 1]
nome = produto_selecionado["nome"]
if nome in carrinho:
carrinho[nome]["quantidade"] += 1
else:
carrinho[nome] = {
"preco": produto_selecionado["preco"],
"quantidade": 1
}
print(f"{nome} adicionado ao carrinho!")
else:
print("Opção inválida!")
Exemplo: Jogo do Sete