Python em uma linha
Alguns snippets simples para escrever code golf em Python.
Escrever os nomes do métodos leva muito tempo, use o assignment
a seu favor!
S = [1, 2, 3]
_, *S = S # list.pop(..., 0)
*S, _ = S # list.pop(...)
S += 5, # list.append(..., 5)
# list.extend(..., (5,))
S[:2] += 3, # list.insert(..., 2, 3)
S[:2] += [3]
Escreva nomes em uma linha de forma coerente!
x, *y = 2, # `y` será uma lista vazia!!
d, e, f = "def"
a, b, c = [0]*3 # Errado
a = b = c = 0 # Certo
Negar bools é bem simples, eu particularmente gosto muito de fazer assim:
print(True<1) # False
print(False<1) # True
Dentro de um if
, usar x<1
ocupa muito espaço, podemos fazer apenas ~-x
.
x = False
if~-x: ...
if x<1: ...
As vezes usar
if~x
pode ser suficiente
Condicionais são mais complexas de se comprimir, geralmente é melhor pensar em uma forma com o que você já tiver, mas pra te dar um norte, você pode usar a expressão (x, y)[z]
onde z
é um bool
ou um int
sendo 0
ou 1
- se for diferente, você receberá IndexError
-, x
corresponde z
a False
e y
, z
a True
.
c = lambda x, y, z: (x, y)[z]
print(j := c(5, 3, 5>3), j*j) # 3 6
Eu sei, eu sei… Com o walrus foi o único jeito que eu encontrei de deixar ambas linhas com o mesmo tamanho… Mentira! O
j*j
foi uma referência a você sabe o que - é, aquele anime das poses lá
Se você estiver mexendo com strings em sua forma literal - pelo menos uma -, é melhor utilizar a expressão z*y or z
.
z = True
n = z*"NiumXp"or"Nium" # Certo
n = ("NiumXp","Nium")[z] # Errado
False
é o mesmo que0
, ao fazermos0*"Nium"
, recebemos''
e oor
converte parabool
, resultando emFalse
novamente. Sex
resultar emFalse
na expressãox or y
,y
será retornado independentemente de seu resultado.
Converções de sequências também podem ser comprimidas!!!
D = {1: 0,
2: 0,
3: 0} # dict
T = (*D,) # tuple
S = {*D} # set
L = [*D] # list
Essas conversões que eu mostrei serve para diversos casos, é possível reduzir no assign
da seguinte forma:
T = *D, # tuple
*L, = D # list
Pra finalizar, uma coisa muito importante é entender a gramática do Python.
Só é preciso de espaço em um identificador caso a outra coisa não seja um identificador!
from.import*
while...:
while[1]:
""or[]and""
Se tiver highlight, estes ficarão errados, então decidi separa-los.
1or 2
0xfor 1in 2
[0xfor x in[2]]
A segunda e última linha desse último código são o mesmo que 15 or 1 in 2
e 15 or x in [2]
, respectivamente.