SóProvas


ID
3180430
Banca
CESGRANRIO
Órgão
Transpetro
Ano
2018
Provas
Disciplina
Programação
Assuntos

Considerando o programa em Python abaixo.

def x(u):

for i in range(u):

yield(i**i)

def z(n): return lambda x:x+n

w=0

for k in x(5):

w+=(lambda x:x//2)(z(k)(k))

print(w)



Que resultado será impresso por esse programa?

Alternativas
Comentários
  • Se você copia e cola o código direto no Python ele vai apresentar um erro. A indentação do código vai com erro, o lance é você ir apertando a tecla TAB no teclado até sumir o erro, depois só executar o comando.

    Será impresso o resultado de 289.

  • Essa questão é nível PF ?cargo de agente

  • Gab. D

    Se esse é o nível de Python que cai na PF, o único PF que vou achar é o Prato Feito, no Akilo de 10,00 R$...

    Misericórdia

  • Alguém consegue explicar essa questão..?

  • 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