Vou comentar essa questão, porém é imprescindível que o código esteja indentado!
#define uma função, ela simplesmente faz um range e eleva ao mesmo número.
def x(u):
for i in range(u):
yield(i**i)
#define uma função que simplesmente realiza a soma
def z(n): return lambda x:x+n
#código executável (main)
w=0
#chama a função x e passa 5, logo o range será 0,1,2,3,4. Elevando a eles mesmo fica 0^0, 1^1, 2^2, 3^3, 4^4
for k in x(5):
w+=(lambda x:x//2)(z(k)(k)) # realiza a soma do 0^0, 1^1, 2^2, 3^3, 4^4
print(w) # exibe 289
Uma das questões mais punks de python que já vi kkkkk
Depois de depurar o código várias vezes eu entendi o que esse fel@ da peida fez...
Para não aprofundar muito, entenda o yield como um return padrão (geradores podem ser um assunto bem cascudo)... A primeira função irá gerar uma lista em que cada elemento é elevado a ele mesmo, fica assim
[1,1,4,27,256]
Até ai tudo bem, agora começa o pythonismo...
A segunda função, z(n), irá retornar uma outra função!!!
Ou seja, o for irá iterar na lista acima, se passarmos a função z(1) o retorno é a função lambda onde o 1 irá ficar no lugar de n -> lambda x: x+1
Ai te pergunto, da onde vem o valor de x? Segura que o negócio vai ficar mais esquisito ainda...
Preste muita atenção nessa parte!!
w+=(lambda x:x//2) (z(k) (k))
Primeiro será executado isso (z(k) (k)) ps: não me pergunte o por que...
Na primeira iteração K é 1, e vc já sabe então que z(1) retorna lambda x: x+1 (Agora que vem o pulo do gato)
K é passado como argumento para a função lambda!!!
(z(k) (k))
z(1) = lambda x: x +1
(k) = (1)
(z(k) (k)) = (lambda x: x +1 (1)) -> (1) será o valor de x na função lambda
(lambda x: x +1 (1)) = (lambda x: 1 +1) = 2
Ou seja, substitui x pelo valor de K, ficando assim -> lambda x: 1+1 (o retorno da função será 2)
Se entendeu esse esquema vc consegue resolver a função... ( E perder alguns neurônios)
A mesma coisa irá acontecer com a outra função lambda (lambda x:x//2) O retorno entre os parênteses (z(k) (k)) irá abastecer a função (lambda x:x//2)
Primeira iteração k = 1
(z(1) (1)) -> retorna 2
substitui x por 2
(lambda x:2//2) -> retorna 1
adiciona resultado a variável w
w = 1
Segunda iteração k = 1
(z(1) (1)) -> retorna 2
substitui x por 2
(lambda x:2//2) -> retorna 1
adiciona resultado a variável w
w = 2
Terceira iteração k = 4
(z(4) (4)) -> retorna 8
substitui x por 8
(lambda x:8//2) -> retorna 4
adiciona resultado a variável w
w = 6 (nesse ponto talvez vc já tenha percebido que o examinador só queira encher linguiça com as funções lambdas e só tá adicionado cada valor da lista a variável... mas vamos continuar essa brincadeira!)
Quarta iteração k = 27
(z(27) (27)) -> retorna 54
substitui x por 54
(lambda x:54//2) -> retorna 27
adiciona resultado a variável w
w = 33
Quinta iteração k = 256
(z(256) (256)) -> retorna 512
substitui x por 512
(lambda x:512//2) -> retorna 256
adiciona resultado a variável w
w = 289