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!