Aqui estão 11 dicas e truques que ajudarão você a escrever um código Python melhor e a se tornar um programador melhor:
range(len(x))
Em Python, geralmente usamos um loop for
para iterar sobre um objeto iterável. Um loop for
em Python usa iteração baseada em coleção, ou seja, Python atribui o próximo item de um iterável à variável de loop em cada iteração. O caso de uso usual de um loop for
é o seguinte:
values = ["a", "b", "c"] for value in values: print(value) # a # b # c
Agora, se além do valor você quiser imprimir o índice também, pode fazer assim:
index = 0 for value in values: print(index, value) index += 1 # 0 a # 1 b # 2 c
ou outra maneira comum de fazer isso é usando range(len(x))
:
for index in range(len(values)): value = values[index] print(index, value) # 0 a # 1 b # 2 c
No entanto, há uma maneira mais fácil e pythônica de iterar sobre objetos iteráveis usando enumerate()
. Ele é usado em um loop for
quase da mesma maneira que você usa da maneira usual, mas em vez de colocar o objeto iterável diretamente depois in
loop for
, ou colocá-lo como range(len(values))
, você o coloca dentro os parênteses de enumerate()
como mostrado abaixo:
for count, value in enumerate(values): print(count, value) # 0 a # 1 b # 2 c
Também podemos definir um argumento start
para enumerate()
conforme mostrado abaixo:
for count, value in enumerate(values, start=1): print(count, value) # 1 a # 2 b # 3 c
A função enumerate()
retorna duas variáveis:
Assim como as variáveis de loop em um loop for
, as variáveis de loop podem ter qualquer nome, por exemplo, podemos chamá-las de index
e value
e elas ainda funcionarão. enumerate()
é mais eficiente que um loop for
, pois evita que você tenha que lembrar de acessar o valor dentro do loop e usá-lo corretamente e também lembrar de avançar o valor da variável do loop, tudo é tratado automaticamente pelo Python .
A compreensão da lista é uma maneira mais fácil e elegante de definir e criar listas com base nas listas existentes. Eles são apenas uma única linha de código que consiste em colchetes contendo a expressão que é executada repetidamente a cada iteração. Portanto, eles são mais eficientes em tempo e espaço do que loops e transformam instruções iterativas em uma única linha de código.
A sintaxe usual de uma compreensão de lista é assim:
newList = [ expression(element) for element in oldList if condition ]
Aqui está um exemplo de compreensão de lista no código:
# Using list comprehension to iterate through loop List = [character for character in 'HackerNoon'] # Displaying list print(List) # Output # ['H', 'a', 'c', 'k', 'e', 'r', 'N', 'o', 'o', 'n']
sorted()
A função sorted()
do Python classifica os elementos de um objeto iterável em uma ordem específica (crescente ou decrescente) e os retorna como uma lista classificada. Ele pode ser usado para classificar uma sequência (string, tupla, lista) ou coleção (conjunto, dicionário, conjunto congelado) ou qualquer outro iterador.
A sintaxe da função sorted()
é a seguinte:
sorted(iterable, key=None, reverse=False)
A função sorted()
leva no máximo três parâmetros:
Um Python Set armazena uma única cópia dos valores duplicados nele. Portanto, pode ser usado para verificar valores exclusivos em uma lista. Por exemplo:
list_inp = [100, 75, 100, 20, 75, 12, 75, 25] set_res = set(list_inp) print("The unique elements of the input list using set():\n") list_res = (list(set_res)) for item in list_res: print(item)
Portanto, a saída do programa acima ficaria assim:
The unique elements of the input list using set(): 25 75 100 20 12
A função básica do gerador é avaliar os elementos sob demanda. É muito semelhante à sintaxe para compreensão de lista, onde em vez de colchetes, usamos parênteses.
Vamos considerar um exemplo onde queremos imprimir o quadrado de todos os números pares em uma lista:
myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("The given list is:", myList) mygen = (element ** 2 for element in myList if element % 2 == 0) print("Elements obtained from the generator are:") for ele in mygen: print(ele)
A saída do código acima ficaria assim:
The given list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Elements obtained from the generator are: 4 16 36 64 100
Tendo dito que a sintaxe deles é bastante semelhante à compreensão de lista, você deve estar se perguntando como ela é diferente da compreensão de lista ou conjunto. Ao contrário da compreensão de lista ou conjunto, a compreensão do gerador não inicializa nenhum objeto. Como resultado, você pode utilizar a compreensão do gerador em vez de listar ou definir a compreensão para reduzir os requisitos de memória do programa.
.get()
e .setdefault()
O método .setdefault()
permite definir dict[key]=default
se a chave ainda não estiver no dict.
A sintaxe de .setdefault()
se parece com o seguinte:
dict.setdefault(key, default=None)
Aqui está um trecho de código de exemplo para entender como usar .setdefault()
:
a_dictionary = {"a": 1, "b": 2, "d": 4} a_dictionary.setdefault("c", 3) print(a_dictionary)
A saída do código acima ficaria assim:
{'a': 1, 'b': 2, 'd': 4, 'c': 3}
A mesma coisa também pode ser obtida usando o método .get()
passando um valor padrão para a chave, como você pode ver abaixo:
a_dictionary = {"a": 1, "b": 2, "d": 4} print(a_dictionary.get("c", 3)) print(a_dictionary)
A saída do código acima ficaria assim:
3 {'a': 1, 'b': 2, 'd': 4}
collections.Counter
O módulo Collections oferece suporte a tipos de dados contêineres de alto desempenho (além da lista de tipos incorporada, dict e tupla) e contém uma variedade de estruturas de dados úteis para armazenar informações na memória.
Um contador é um contêiner que controla o número de vezes que valores iguais são adicionados.
Ele pode ser usado para implementar os mesmos algoritmos que outras linguagens empregam estruturas de dados bag ou multiset para implementar.
As coleções de importação disponibilizam o material nas coleções como:
import collections
Como vamos usar apenas o Counter, podemos simplesmente fazer isso:
from collections import Counter
Pode ser usado da seguinte forma:
import collections c = collections.Counter('abcdaab') for letter in 'abcde': print '%s : %d' % (letter, c[letter])
A saída do código acima ficaria assim:
a : 3 b : 2 c : 1 d : 1 e : 0
f-strings, também chamadas de “literais de string formatadas“, são uma maneira nova e mais pythônica de formatar strings, suportada pelo Python 3.6+. Eles são uma maneira mais rápida, mais legível, mais concisa e menos propensa a erros de formatação de strings em Python.
Como o nome “f-string” diz, são strings literais que possuem um f no início e chaves contendo expressões que serão substituídas por seus valores em tempo de execução e depois formatadas usando o protocolo __format__
.
F-strings podem ser usadas da seguinte forma:
name = "Eric" age = 74 print(f"Hello, {name}. You are {age}.") # 'Hello, Eric. You are 74.'
.join()
Em Python, podemos usar o método .join()
para concatenar uma lista de strings em uma única string. A sintaxe usual para este método é a seguinte:
'String to insert'.join([List of strings])
Ele pode ser usado de várias maneiras -- se você usar a string vazia ““
, [List of strings] é simplesmente concatenada, e se você usar uma vírgula, uma string delimitada por vírgula é criada. Quando o caractere de nova linha \n
é usado, uma nova linha é acrescentada após cada string. Veja o exemplo abaixo:
l = ['aaa', 'bbb', 'ccc'] s = ''.join(l) print(s) # aaabbbccc s = ','.join(l) print(s) # aaa,bbb,ccc s = '-'.join(l) print(s) # aaa-bbb-ccc s = '\n'.join(l) print(s) # aaa # bbb # ccc
{**d1, **d2}
(Python 3.5+) A maneira mais fácil de mesclar dicionários é usando o operador de descompactação ( **
). A sintaxe desse método se parece com isso:
{**dict1, **dict2, **dict3}
Veja um exemplo para entender melhor esse método:
d1 = {'k1': 1, 'k2': 2} d2 = {'k3': 3, 'k4': 4} print({**d1, **d2}) # {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
if x in list
Suponha que temos uma lista com as cores primárias vermelho, verde e azul. E em algum lugar do nosso código, temos uma nova variável com uma cor, então c = vermelho. Depois veremos se esta é uma das nossas cores primárias. Claro, podemos comparar isso com cada item da nossa lista da seguinte maneira:
colors = ["red", "green", "blue"] c = "red" # cumbersome and error-prone if c == "red" or c == "green" or c == "blue": print("is main color")
No entanto, isso pode consumir muito tempo e podemos facilmente cometer erros, como se tivéssemos um erro de digitação aqui para vermelho. É mais simples e preferível usar apenas a expressão if x in list:
colors = ["red", "green", "blue"] c = "red" # better: if c in colors: print("is main color")
Python é uma linguagem de programação amplamente usada e, usando as dicas e truques acima, você pode se tornar um programador Python melhor.
Espero que este artigo tenha sido útil. Continue lendo!