domingo, 6 de dezembro de 2020

Sets em Python

Um set é um tipo de dados de coleção não ordenado iterável, mutável e sem elementos duplicados. A classe de sets do Python representa a noção matemática de um conjunto. A principal vantagem de usar um conjunto, ao contrário de uma lista, é que ele possui um método altamente otimizado para verificar se um elemento específico está contido no conjunto. Isso se baseia em uma estrutura de dados conhecida como tabela hash. Como os conjuntos são desordenados, não podemos acessar os itens usando índices como fazemos nas listas.

# Programa python para demonstrar
# o uso de sets

# O mesmo que {"a", "b", "c"} 
myset = set(["a", "b", "c"])
print(myset)

# Adiciona elementos ao conjunto (set)
myset.add("d")
print(myset)

Resultado>

{'c', 'b', 'a'}
{'d', 'c', 'b', 'a'}

Conjuntos Congelados (Frozen sets)

Conjuntos congelados em Python são objetos imutáveis que suportam apenas métodos e operadores que produzem um resultado sem afetar o conjunto ou conjuntos congelados aos quais são aplicados. Embora os elementos de um conjunto possam ser modificados a qualquer momento, os elementos do conjunto congelado permanecem os mesmos após a criação. Se nenhum parâmetro for passado, ele retornará um conjunto congeloda vazio.

# Programa Python para demonstrar diferenças
# entre conjunto normal e congelado 

# o mesmo que {"a", "b","c"}
normal_set = set(["a", "b","c"])

print("Conjunto normal") 
print(normal_set)

# Conjunto congelado
frozen_set = frozenset(["e", "f", "g"])

print("\nConjunto congelado")
print(frozen_set)

# Descomentar abaixo da linha causaria um erro, pois
# estamos tentando adicionar um elemento a um conjunto congelado 
# frozen_set.add("h") 

Resultado:

Conjunto normal
{'b', 'c', 'a'}

Conjunto congelado
frozenset({'e', 'g', 'f'})

Funcionamento interno do set

Isso se baseia em uma estrutura de dados conhecida como tabela hash. Se vários valores estiverem presentes na mesma posição de índice, o valor será anexado a essa posição de índice para formar uma Lista vinculada. Em, Python Sets são implementados usando dicionário com variáveis fictícias, onde a chave é o conjunto de membros com maiores otimizações para a complexidade do tempo.

Definir implementação:

Hash table

Conjuntos com várias operações em um único HashTable:

Métodos dos conjuntos em python

Adicionando elementos

A inserção no conjunto é feita por meio da função set.add(), onde um valor de registro apropriado é criado para armazenar na tabela hash. O mesmo que verificar um item, ou seja, O(1) em média. No entanto, na pior das hipóteses, pode se tornar O(n).

# programa python para demonstrar
# a adição de um novo elemento num conjunto

# Cria um conjunto
people = {"Jay", "Idrish", "Archi"}

print("Pessoas:", end=" ") 
print(people)

# Isso vai adicionar Daxit ao conjunto 
people.add("Daxit") 

# adicionando elementos ao
# conjunto usando um interador
for i in range(1, 6):
    people.add(i)

print("\nConjunto depois de adicionar os elementos:", end=" ") 
print(people) 

Resultado:

Pessoas: {'Archi', 'Idrish', 'Jay'}

Conjunto depois de adicionar os elementos: {1, 2, 3, 4, 5, 'Daxit', 'Idrish', 'Archi', 'Jay'}

União

Dois conjuntos podem ser mesclados usando a função union() ou o operador |. Ambos os valores da Tabela Hash são acessados e percorridos com a operação de mesclagem executada neles para combinar os elementos, ao mesmo tempo em que as duplicatas são removidas. A complexidade de tempo disso é O(len(s1) + len(s2)) onde s1 e s2 são dois conjuntos cuja união precisa ser feita.

# programa python para demonstrar
# a união de dois conjuntos

people = {"Jay", "Idrish", "Archil"}
vampires = {"Karan", "Arjun"}
dracula = {"Deepanshu", "Raju"}

# união usando a função union()
population = people.union(vampires)

print("Usando a função union")
print(population)

# usando o operador |
population = people | dracula

print("\nUnião usando o operador '|'")
print(population)

Interseção

Isso pode ser feito por meio de intersection() ou operador &. Elementos comuns são selecionados. Eles são semelhantes à iteração sobre as listas Hash e combinam os mesmos valores em ambas as tabelas. A complexidade de tempo disso é O(min(len(s1), len(s2)) onde s1 e s2 são dois conjuntos cuja união precisa ser feita.

# programa python para demonstrar
# a interseção de dois conjuntos 

set1 = set()
set2 = set()

for i in range(5):
    set1.add(i) 

for i in range(3,9):
    set2.add(i)

# interseção usando a função
# intersection()
set3 = set1.intersection(set2)

print("interseção usando a função intersection()")
print(set3)

# interseção usando o operador &
set3 = set1 & set2

print("\ninterseção usando o operador &")
print(set3)

Resultado:

interseção usando a função intersection()
{3, 4}

interseção usando o operador &
{3, 4}

Diferença

Para encontrar a diferença entre os conjuntos. Semelhante para encontrar diferença na lista vinculada. Isso é feito por meio da função difference() ou pelo operador -. Complexidade de tempo para encontrar a diferença s1 - s2 é O(len(s1))

# programa para monstrar a diferença
# entre dois conjuntos

set1 = set()
set2 = set()

for i in range(5):
    set1.add(i)

for i in range(3,9):
    set2.add(i)

# diferença entre dois conjuntos
# usando a função difference()
set3 = set1.difference(set2)

print("Diferença entre dois conjuntos usando a função difference()")
print(set3)

# diferença entre dois conjuntos
# usando o operador '-'
set3 = set1 - set2

print("\nDiferença entre dois conjuntos usando o operador '-'")
print(set3)

Resultado:

{0, 1, 2}

Diferença entre dois conjuntos usando o operador '-'
{0, 1, 2}

Limpando um conjunto

O método Clear() esvazia todo o conjunto.

# programa python para demonstrar
# a como limpar um conjunto

set1 = {1,2,3,4,5,6}

print("Conjunto inicial:") 
print(set1)

# Esse método vai limpar o conjunto
set1.clear()

print("\nConjunto depois de chamar a função clear():")
print(set1)

Resultado:

Conjunto inicial:
{1, 2, 3, 4, 5, 6}

Conjunto depois de chamar a função clear():
set()

No entanto, existem duas armadilhas principais nos conjuntos Python:

  1. O conjunto não mantém elementos em nenhuma ordem particular.
  2. Apenas instâncias de tipos imutáveis podem ser adicionadas a um conjunto Python.

Complexidade de tempo dos conjuntos

Operação Caso médio Pior caso Observações
x in s O(1) O(n)
Union s|t O(len(s)+len(t))
Interseção s&t O(min(len(s), len(t)) O(len(s) * len(t)) Troque “min” por “max” se t não é um conjunto
Várias interseções s1&s2&..&sn (n-1)*O(l) where l is max(len(s1),..,len(sn))
Diferença s-t O(len(s))

Operadores do conjuntos

Conjuntos e conjuntos congelados suportam os seguintes operadores:

Operadores Observações
chave em s verificação de contenção
Sem chave em s sem verificação de contenção
s1 == s2 s1 é equivalente a s2
s1 != s2 s1 não é equivalente a s2
s1 <= s2 s1 é um subconjunto de s2
s1 < s2 s1 é um subconjunto adequado de s2
s1 >= s2 s1 é um super conjunto de s2
s1 > s2 s1 é um superconjunto adequado de s2
s1 | s2 a união de s1 e s2
s1 & s2 a interseção de s1 e s2
s1 – s2 o conjunto de elementos em s1 mas não em s2
s1 ˆ s2 o conjunto de elementos precisamente em um de s1 ou s2

Snippet de código para ilustrar todas as operações Set em Python:

# programa para desmonstar o funcionamento
# dos conjuntos em python

# cria dois conjuntos
set1 = set()
set2 = set()

# Adicionando elementos ao conjunto set1
for i in range(1, 6):
    set1.add(i)

# Adicionando elementos ao conjunto set2
for i in range(3, 8):
    set2.add(i)

print("Set1 = ", set1)
print("Set2 = ", set2)
print("\n")

# união dos conjuntos set1 e set2 
set3 = set1 | set2 # set1.union(set2)
print("União de Set1 & Set2: Set3 = ", set3)

# interseção de set1 e set2 
set4 = set1 & set2# set1.intersection(set2) 
print("Interseção de Set1 & Set2: Set4 = ", set4)
print("\n")

# Verificando a relação entre set3 e set4 
if set3 > set4: # set3.issuperset(set4)
    print("Set3 é um super conjunto de Set4")
elif set3 < set4: # set3.issubset(set4) 
    print("Set3 é um subconjunto de Set4")
else: # set3 == set4
    print("Set3 é o mesmo que Set4")

# mostrando a relação entre set4 e set3
if set4 < set3: # set4.issubset(set3)
    print("Set4 é um subconjunto de Set3")
    print("\n")

# diferença entre set3 e set4
set5 = set3 - set4
print("Elementos presentes em Set3 e não presentes em Set4: Set5 = ", set5)
print("\n")

# Verifica se set4 e set5 são conjuntos separados
if set4.isdisjoint(set5):
    print("Set4 e Set5 não tem nada em comun\n")

# Remove todos os elementos do conjunto set5
set5.clear()

print("Depois de chamar a função clear() do objeto Set5: ")
print("Set5 = ", set5) 

Resultado:

Set1 =  {1, 2, 3, 4, 5}
Set2 =  {3, 4, 5, 6, 7}


União de Set1 & Set2: Set3 =  {1, 2, 3, 4, 5, 6, 7}
Interseção de Set1 & Set2: Set4 =  {3, 4, 5}


Set3 é um super conjunto de Set4
Set4 é um subconjunto de Set3


Elementos presentes em Set3 e não presentes em Set4: Set5 =  {1, 2, 6, 7}


Set4 e Set5 não tem nada em comun

Depois de chamar a função clear() do objeto Set5: 
Set5 =  set()

Artigo escrito por nikhilaggarwal3 e traduzido por Acervo Lima de Sets in Python

Permutação e combinação em Python

Python fornece métodos diretos para encontrar permutações e combinações de uma sequência. Esses métodos estão presentes no pacote itertools.

Permutação

Primeiro, importe o pacote itertools para implementar o método permutations() em python. Este método recebe uma lista como entrada e retorna uma lista de objetos de tuplas que contém todas as permutações em uma forma de lista.

# Um programa Python para imprimir todas as
# permutações usando a função da biblioteca itertools
from itertools import permutations

# Obtem todas as permutações de [1, 2, 3]  
perm = permutations([1, 2, 3])

# Imprime as permutações
for i in list(perm):
    print(i) 

Resultado:

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

Ele gera n! permutações se o comprimento da sequência de entrada for n.

Se quiser obter permutações de comprimento L, implemente-o desta forma.

# Um programa Python para imprimir todos as
# permutações de determinado comprimento
from itertools import permutations

# Obtem todas as permutações de tamanho 2
# e tamanho 2
perm = permutations([1, 2, 3], 2)

# imprime as permutações
for i in list(perm):
    print(i) 

Resultado:

(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)

Ele gera nCr * r! permutações se o comprimento da sequência de entrada for n e o parâmetro de entrada for r.

Combinações

Este método pega uma lista e uma entrada r como entrada e retorna uma lista de objetos de tuplas que contém todas as combinações possíveis de comprimento r em uma forma de lista.

# Um programa Python para imprimir todas as
# combinações de determinado comprimento
from itertools import combinations

# Obtem todas as combinações de [1, 2, 3] 
# e tamanho 2
comb = combinations([1, 2, 3], 2)

# imprime todas as combinações
for i in list(comb):
    print (i)

Resultado:

(1, 2)
(1, 3)
(2, 3)
  1. As combinações são emitidas em ordem de classificação lexicográfica de entrada. Portanto, se a lista de entrada for classificada, as tuplas de combinação serão produzidas em ordem classificada.
    # Um programa Python para imprimir todas as
    # combinações de um determinado comprimento
    from itertools import combinations  
      
    # Obtem todas as combinações de [1, 2, 3]  
    # e tamanho 2  
    comb = combinations([1, 2, 3], 2)
    
    # Imprime as combinações
    for i in list(comb):
        print (i)
    

    Resultado:

    (2, 1)
    (2, 3)
    (1, 3)
    
  2. Os elementos são tratados como únicos com base em sua posição, não em seu valor. Portanto, se os elementos de entrada forem exclusivos, não haverá valores de repetição em cada combinação.

    # Um programa Python para imprimir todas as combinações
    # de determinado comprimento com entrada não classificada. 
    from itertools import combinations  
      
    # Obtem todas as combinações de [2, 1, 3]  
    # e tamanho 2  
    comb = combinations([2, 1, 3], 2)
    
    # imprime as combinações
    for i in list(comb):
        print(i)
    

    Resultado:

    (2, 1)
    (2, 3)
    (1, 3)
    
  3. Se quisermos fazer combinações do mesmo elemento para o mesmo elemento, usamos combinations_with_replacement.

    # Um programa Python para imprimir todas as combinações
    # com uma combinação com o próprio elemento
    # também é incluído 
    from itertools import combinations_with_replacement
    
    # Obtem todas as combinações de [1, 2, 3] e tamanho 2
    comb = combinations_with_replacement([1, 2, 3], 2)
    
    # Imprime as combinações
    for i in list(comb):
        print(i)
    

    Resultado:

    (1, 1)
    (1, 2)
    (1, 3)
    (2, 2)
    (2, 3)
    (3, 3)
    

Artigo escrito por Raju Varshney e traduzido por Acervo Lima de Permutation and Combination in Python

sábado, 5 de dezembro de 2020

Compreensão e segmentação de listas em Python

A compreensão de listas é uma maneira elegante de definir e criar uma lista em python. Podemos criar listas apenas como declarações matemáticas e em apenas uma linha. A sintaxe de compreensão de lista é mais fácil de entender.

A compreensão de uma lista geralmente consiste nestas partes:

  1. Expressão de saída,
  2. Sequência de entrada,
  3. Uma variável que representa um membro da sequência de entrada e
  4. Uma parte opcional do predicado.
Por exemplo:

lst  =  [x ** 2  for x in range (1, 11)   if  x % 2 == 1] 

aqui, x ** 2 é a expressão de saída, 
      range (1, 11)  é a seguencia de entrada, 
      x é variável e  
      if x % 2 == 1 é a parte do predicado.

Exemplo 1:

# Programa Python para demonstrar compreensão de listas em Python

# a lista abaixo contém o quadrado de todos os números ímpares de 1 a 10 
odd_square = [x ** 2 for x in range(1, 11) if x % 2 == 1]
print (odd_square)

# para compreensão, a geração acima é igual a, 
odd_square = []
for x in range(1, 11):
    if x % 2 == 1:
        odd_square.append(x**2)
print (odd_square)

# a lista abaixo contém potência de 2 de 1 a 8
power_of_2 = [2 ** x for x in range(1, 9)]
print (power_of_2)

# a lista abaixo contém primos e não primos no intervalo de 1 a 50
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
primes = [x for x in range(2, 50) if x not in noprimes]
print(primes)

# lista para diminuir os personagens
print ([x.lower() for x in ["A","B","C"]])

# lista que extrai o número
string = "Meu número de telefone é: 11122 !!"

print("\nDigitos extraidos")
numbers = [x for x in string if x.isdigit()]
print(numbers)

# Uma lista de lista para tabuada
a = 5
table = [[a, b, a * b] for b in range(1, 11)]

print("\nTabela de multiplicação")
for i in table:
    print(i) 

Resultado:

[1, 9, 25, 49, 81]
[1, 9, 25, 49, 81]
[2, 4, 8, 16, 32, 64, 128, 256]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
['a', 'b', 'c']

Digitos extraidos
['1', '1', '1', '2', '2']

Tabela de multiplicação
[5, 1, 5]
[5, 2, 10]
[5, 3, 15]
[5, 4, 20]
[5, 5, 25]
[5, 6, 30]
[5, 7, 35]
[5, 8, 40]
[5, 9, 45]
[5, 10, 50]

Depois de obter a lista, podemos obter uma parte dela usando o operador de fatiamento do Python, que tem a seguinte sintaxe:

[inicio: fim: paso]

o que significa que o corte começará do início do índice
e vai até o fim de acordo com o paso.
O valor padrão de início é 0, a parada é o último índice da lista e o paso é 1

Assim, [:fim] dividirá a lista do início ao fim do índice e [inicio:] dividirá a lista do índice inicial até o final. O valor negativo das etapas mostra o percurso da direita para a esquerda em vez de o percurso da esquerda para a direita. É por isso que [::-1] imprime a lista na ordem inversa.

Exemplo 2:

# Vamos primeiro criar uma lista para demonstrar o fatiamento
# lst contém todos os números de 1 a 10
lst =list(range(1, 11))
print(lst)

# a lista abaixo tem números de 2 a 5
lst1_5 = lst[1:5]
print(lst1_5)

# a lista abaixo tem números de 6 a 8
lst5_8 = lst[5:8]
print(lst5_8)

# a lista abaixo tem números de 2 a 10
lst1_ = lst[1:]
print(lst1_) 

# a lista abaixo tem números de 1 a 5
lst_5 = lst[:5]
print(lst_5)

# a lista abaixo tem números de 2 a 8 no paso 2
lst1_8_2 = lst[1:8:2]
print(lst1_8_2)

# a lista abaixo tem números de 10 a 1
lst_rev = lst[::-1]
print(lst_rev)

# a lista abaixo tem números de 10 a 6 na etapa 2
lst_rev_9_5_2 = lst[9:4:-2]
print(lst_rev_9_5_2)

Resultado:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 3, 4, 5]
[6, 7, 8]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]
[2, 4, 6, 8]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[10, 8, 6]

Podemos usar a função filter para filtrar uma lista com base em alguma condição fornecida como uma expressão lambda como primeiro argumento e lista como segundo argumento, exemplo disso é mostrado abaixo:

Exemplo 3:

import functools 

# filtrando números ímpares 
lst = filter(lambda x : x % 2 == 1, range(1, 20)) 
print(list(lst))

# filtrando quadrados ímpares que são divisíveis por 5
lst = filter(lambda x : x % 5 == 0,
    [x ** 2 for x in range(1, 11) if x % 2 == 1])
print(list(lst))

# filtrando números negativos
lst = filter((lambda x: x < 0), range(-5,5))
print(list(lst))

# implementando a função max()
print(functools.reduce(lambda a,b: a if (a > b) else b, [7, 12, 45, 100, 15])) 

Resultado:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[25]
[-5, -4, -3, -2, -1]
100

Artigo escrito por Utkarsh Trivedi e melhorado por ManasChhabra2, ramalaiguhan e traduzido por Acervo Lima de Python List Comprehension and Slicing

Alterando membros de classe em Python

Já sabemos que Python não tem palavra-chave static. Todas as variáveis que recebem um valor na declaração de classe são variáveis de classe.

Devemos ter cuidado ao alterar o valor da variável de uma classe. Se tentarmos mudar a variável de uma classe usando objeto, uma nova variável da instância (ou não estática) para aquele objeto particular é criada e esta variável obscurece as variáveis da classe. Abaixo está o programa Python para demonstrar o mesmo.

# Programa para testar a funcionalidade

# Classe para estudantes de ciência da computação 
class CSStudent:
    stream = 'cse' # Variável da classe
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll

# Criação de objetos da classe CSStudent
a = CSStudent("Geek", 1)
b = CSStudent("Nerd", 2)

print ("Inicialmente")
print ("a.stream =", a.stream)
print ("b.stream =", b.stream)

# Isso não muda a variável da classe
# Em vez disso, cria uma variável de instância para o objeto
# 'a' que sombreia o membro da classe.
a.stream = "ece"

print ("\nDepois de mudar a.stream")
print ("a.stream =", a.stream)
print ("b.stream =", b.stream)

Resultado:

Initially
Inicialmente
a.stream = cse
b.stream = cse

Depois de mudar a.stream
a.stream = ece
b.stream = cse

Devemos alterar as variáveis da classe usando apenas o nome da classe.

# Programa para mostrar como fazer alterações na
# variável da classe em Python

# Classe para estudante de ciência da computação
class CSStudent:
    stream = 'cse' # Variável da classe  
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll

# Novo objeto para implementação posterior
a = CSStudent("check", 3)
print("a.tream =", a.stream)

# Maneira correta de alterar o valor da variável de classe
CSStudent.stream = "mec"
print("\nA variável da classe mudou para mec")

# Novo objeto para implementação posterior
b = CSStudent("carter", 4)

print("\nValor da variável steam para cada objeto")
print("a.stream =", a.stream)
print("b.stream =", b.stream)

Resultado:

a.tream = cse

A variável da classe mudou para mec

Valor da variável steam para cada objeto
a.stream = mec
b.stream = mec

Artigo escrito por Nikhil Kumar Singh e traduzido por Acervo Lima de Changing Class Members in Python

Operadores lógicos com string em Python

Para strings em python, os operadores booleanos (and, or, not) funcionam. Vamos considerar as duas strings, a saber, str1 e str2 e tentar operadores booleanos nelas:

str1 = ''
str2 = 'Lima'

# repr é usado para imprimir a string junto com as aspas

# Retorna str1 
print(repr(str1 and str2))

# Retorna str1
print(repr(str2 and str1))

# Retorna str2
print(repr(str1 or str2))

# Retorna str2
print(repr(str2 or str1))

str1 = 'Acervo'

# Retorna str2
print(repr(str1 and str2))

# Retorna str1
print(repr(str2 and str1))

# Retorna str1
print(repr(str1 or str2))

# Retorna str2
print(repr(str2 or str1))

str1='coleção'

# Retorna False
print(repr(not str1))

str1 = ''

# Retorna True
print(repr(not str1))

Resultado:

''
''
'Lima'
'Lima'
'Lima'
'Acervo'
'Acervo'
'Lima'
False
True

A saída das operações booleanas entre as strings depende do seguinte:

  1. Python considera strings vazias como tendo valor booleano de ‘false’ e string não vazia como tendo valor booleano de ‘true’.
  2. Para o operador 'and', se o valor esquerdo for verdadeiro, o valor direito será verificado e retornado. Se o valor da esquerda for falso, ele será retornado.
  3. Para o operador 'or', se o valor esquerdo for verdadeiro, ele será retornado; caso contrário, se o valor esquerdo for falso, o valor direito será retornado.

Observe que os operadores bit a bit (|, &) não funcionam para strings.

Artigo escrito por Nikhil Kumar Singh e melhorado por Suchendra Adiga e traduzido por Acervo Lima de Logical Operators on String in Python

Classe String Template em Python

No módulo string, a classe Template nos permite criar sintaxe simplificada para especificação de saída. O formato usa nomes de placeholder formados por $ com identificadores Python válidos (caracteres alfanuméricos e sublinhados). Rodear o placeholder com colchetes permite que ele seja seguido por mais letras alfanuméricas sem espaços intermediários. Escrever $$ cria um único $ com escape.

String Template python

O modelo de string do Python é criado passando a string do modelo para seu construtor. Ele suporta substituições baseadas em $. Esta classe possui 2 métodos principais:

  • substitute(mapping, **kwds): Este método realiza substituições usando um dicionário com um processo semelhante a objetos de mapeamento baseados em chave. argumentos de palavra-chave também podem ser usados para o mesmo propósito. Caso o mapeamento baseado em chave e os argumentos de palavra-chave tenham a mesma chave, ele lança um TypeError. Se as chaves estiverem faltando, ele retornará um KeyError.
  • substitute(mapping, **kwds): o comportamento deste método é semelhante ao do método substitute, mas não lança um KeyError se uma chave estiver faltando, em vez disso, ele retorna um marcador de posição na string de resultado.

O método substitute() gera um KeyError quando um espaço reservado não é fornecido em um dicionário ou em um argumento de palavra-chave. Para aplicativos de estilo mala direta, os dados fornecidos pelo usuário podem estar incompletos e o método safe_substitute() pode ser mais apropriado - ele deixará os marcadores de posição inalterados se houver dados ausentes:

Abaixo estão alguns exemplos simples.

Exemplo 1:

# Um exemplo simples usando Template
from string import Template

# Cria um modelo que tenha espaço reservado para o valor de x
t = Template('x é $x')

# Valor substituto de x no modelo acima
print(t.substitute({'x' : 1}))

Resultado:

x é 1

A seguir está outro exemplo em que importamos nomes e marcas de alunos de uma lista e os imprimimos usando um modelo.

Exemplo 2:

# Um programa Python para demonstrar o
# funcionamento de Template
from string import Template

# Lista Aluno armazena o nome e as notas de três alunos
Aluno = [('Ram',90), ('Ankit',78), ('Bob',92)]

# Estamos criando uma estrutura básica para
# imprimir o nome e as notas dos alunos.
t = Template('Olá $nome, você tem a nota $nota') 

for i in Aluno:
    print (t.substitute(nome = i[0], nota = i[1])) 

Resultado:

Olá Ram, você tem a nota 90
Olá Ankit, você tem a nota 78
Olá Bob, você tem a nota 92

O exemplo abaixo mostra a implementação do método safe_substitute().

Exemplo 3:

from string import Template

template = Template('$nome é o novo $função da $empresa')

string = template.safe_substitute(nome='Raju Kumar', empresa='TCE')
print(string)

Resultado:

Raju Kumar é o novo $função da TCE

Observe que não fornecemos ao marcador de posição $função quaisquer dados, mas isso não gerará um erro, em vez disso, retornará o marcador de posição como uma string, conforme discutido acima.

Imprimindo uma template String

O atributo “template” do objeto Template pode ser usado para retornar a string do template conforme mostrado abaixo:

Exemplo:

t = Template('Eu sou $nome e venho de $cidade')
print('Template String =', t.template)

Resultado:

Template String = Eu sou $nome e venho de $cidade

Sinal de escape $

O $$ pode ser usado para escapar de $ e ser tratado como parte da string.

Exemplo:

template = Template('$$ é o simbolo usado para se referir ao $name')
string = template.substitute(name='Dollar')
print(string)

Resultado:

$ é o simbolo usado para se referir ao Dollar

O ${identificador}

O ${identificador} funciona de forma semelhante ao de $identificador. É útil quando caracteres identificadores válidos seguem o espaço reservado, mas não fazem parte do espaço reservado.

Exemplo:

template = Template('That $noun looks ${noun}y')
string = template.substitute(noun='Fish')
print(string)

Resultado:

That Fish looks Fishy

Outra aplicação para template é separar a lógica do programa dos detalhes de vários formatos de saída. Isso torna possível substituir modelos personalizados por arquivos XML, relatórios de texto simples e relatórios da web em HTML.

Observe que existem outras maneiras de imprimir a saída formatada como %d para inteiro, %f para flutuante.

Referência: https://docs.python.org/3.3/tutorial/stdlib2.html

Artigo escrito por Siddharth Lalwani e traduzido por Acervo Lima de String Template Class in Python

str() vs repr() em Python

str() e repr() são usados para obter uma representação de string do objeto.

Exemplo de str():

s = 'Olá, Acervo Lima'
print(str(s)) 
print(str(2.0/11.0)) 

Saída:

Olá, Acervo Lima
0.181818181818

Exemplo de repr():

s = 'Olá, Acervo Lima'
print(repr(s))
print(repr(2.0/11.0))

Saída:

'Olá, Acervo Lima'
0.18181818181818182

A partir da saída acima, podemos ver se imprimimos string usando a função repr(), em seguida, ela imprime com um par de aspas e, se calcularmos um valor, obtemos um valor mais preciso do que a função str().

A seguir estão as diferenças:

  • str() é usado para criar saída para o usuário final, enquanto repr() é usado principalmente para depuração e desenvolvimento. o objetivo de repr é ser inequívoco e str’s deve ser legível. Por exemplo, se suspeitarmos que um float tem um pequeno erro de arredondamento, repr irá nos mostrar, enquanto str pode não.
  • repr() calcula a representação de string "oficial" de um objeto (uma representação que tem todas as informações sobre o objeto) e str() é usado para calcular a representação de string "informal" de um objeto (uma representação que é útil para imprimir o objeto).
  • A função print e a função interna str() usam __str__ para exibir a representação de string do objeto, enquanto a função interna repr() usa __repr__ para exibir o objeto.

Vamos entender isso por um exemplo:

import datetime
today = datetime.datetime.now()

# Imprime formato legível para objeto de data e hora
print(str(today))

# imprime o formato oficial do objeto data-hora
print(repr(today))

Resultado:

2020-12-05 19:05:20.173734
datetime.datetime(2020, 12, 5, 19, 5, 20, 173734)

str() exibe a data de hoje de uma forma que o usuário pode entender a data e hora.

repr() imprime a representação “oficial” de um objeto de data e hora (significa que usando a representação de string “oficial” podemos reconstruir o objeto).

Como fazê-los funcionar para nossas próprias classes definidas?
Uma classe definida pelo usuário também deve ter um __repr__ se precisarmos de informações detalhadas para depuração. E se acharmos que seria útil ter uma versão string para os usuários, criamos uma função __str__.

# Programa Python para demonstrar a escrita
# de __repr__ e __str__ para classes definidas pelo usuário

# Uma classe definida pelo usuário para representar números complexos
class Complex:

    # construtor
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    # Para chamar repr (). Imprime informações do objeto
    def __repr__(self):
        return 'Racional(%s, %s)' % (self.real, self.imag)

    # Para chamar str(). Imprime forma legível
    def __str__(self):
        return '%s + i%s' % (self.real, self.imag)

t = Complex(10, 20)

print(str(t))
print(repr(t))

Resultado:

10 + i20
Racional(10, 20)

Artigo escrito por Arpit Agarwal e melhorado por rajivsarkar67 e traduzido por Acervo Lima de str() vs repr() in Python