1
resposta

Dúvida sobre print() da playlist_fim_de_semana

Dentro do for a função print() retorna exatamente o resultado da aula

    for programa in playlist_fim_de_semana.programas:
        print(programa)

Porém ao tentar utilizar a função print() fora de um laço for e dentro de uma função lambda ele me retorna o local na memória dos objetos dentro da playlist e não os seus valores se assim posso chamar

    exibe_lista = lambda x: [c for c in x]

    print(exibe_lista(playlist_fim_de_semana.programas))

Consegui corrigir o código usando a função str() mas queria saber por que ao utilizar o laço for não preciso desse recurso, já que a função print() por si só já deveria me retornar o conteúdo str do objeto ou não?

O código com str():

    exibe_lista = lambda x: [str(c) for c in x]

    print(exibe_lista(playlist_fim_de_semana.programas))
1 resposta

Olá Gustavo, tudo bem com você?

Peço desculpas pela demora no retorno.

Essa é dúvida é interessante e tem a ver com o comportamento da função print() em diferentes contextos.

Quando corre o uso da função print() numa função lambda, o Python está imprimindo o retorno da função, neste caso, imprime uma lista com a referência à memória de cada objeto da lista playlist_fim_de_semana. Isso acontece porque a função lambda exibe_lista está criando uma nova lista com os mesmos objetos da lista original, mas sem chamá-los implicitamente com o método __str__.

Comportamento esse apresentado no código abaixo:

filmes_series = [obj_narcos, obj_vingadores, obj_constantine]
playlist_fim_de_semana = Playlist('Final de semana', filmes_series)
exibe_lista = lambda x: [c for c in x]
print(exibe_lista(playlist_fim_de_semana.programas))

Resultado

[<__main__.Serie object at 0x0000029E7027FAC0>, <__main__.Filme object at 0x0000029E7027FB80>, <__main__.Filme object at 0x0000029E7027FB20>]

Para contornar esse comportamento devemos adicionar a função str() para converter cada objeto da lista em uma string chamando o método __str__ da classe Playlist, antes de adicioná-lo à nova lista criada pela função lambda. Assim, ao utilizarmos a função print() será impresso uma lista contendo a representação em string de cada objeto, conforme abaixo:

filmes_series = [obj_narcos, obj_vingadores, obj_constantine]
playlist_fim_de_semana = Playlist('Final de semana', filmes_series)
exibe_lista = lambda x: [str(c) for c in x]
print(exibe_lista(playlist_fim_de_semana.programas))

Resultado

['Nome: Narcos - Ano: 2017 - Temporada: 4 - Likes: 2', 'Nome: Vingadores - Ano: 2018 - Duração: 160 - Likes: 0 ', 'Nome: Constantine - Ano: 2001 - Duração: 185 - Likes: 0 ']

Por outro lado, quando usamos a função print() em um laço for, como no exemplo, ela imprime na tela o conteúdo de cada elemento da lista playlist_fim_de_semana.programas. Isso acontece porque, quando você usa a função print() num laço for, o Python assume que você quer imprimir a representação em string de cada objeto da lista e, por isso, chama implicitamente o método __str__ de cada objeto da lista.

Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!