 Ok, então, olá, pessoal. Meu nome é Mateus e eu sou software engenheiro de Red Hat. Muito obrigado a todos. Este é o programa funcional de Python, listas, compreensões. Afortunadamente, o tempo está na essência, então eu não tenho tempo para perguntar, mas serei gratificado em conhecer-me depois e eu vou estar feliz em adicionar eles. Então, vamos começar. Mais vezes que não, nós precisamos de coletões, listas de objetos, sobretudo, e, mais vezes, podemos comprar com um loop, que em Python é elegante para cada loop, performando uma ação para a alteração. E nós também sabemos que Python é uma linguagem multiparadiga, que suporta diversas estruturas para este pattern de coletão de performar uma ação para o elemento coletivo. Então, vamos ver algumas das estruturas em ação, e comparar elas para ver como elas parecem e, talvez, qual é o melhor. Então, nós podemos começar com um exemplo simples de computando os squares de todos os integers de zero a um grande número. Então, vamos assumir que vamos ter um approach iterativo. Primeiro, vamos definir a função principal. Então, vamos ver que queremos uma lista de squares, que vamos começar com o empty, e, depois, 4x, porque nós estamos fazendo uma meta aqui, em uma range que vai de zero a 10, a 2... Vem de novo? Oh, então, me desculpe, meu velho, isso é melhor? Obrigado. Então, para x na range de zero a 10 a 8, vamos adicionar a lista de squares, dot append, x times x. Então, tudo bem, nada muito fã, parece como cs101 code, então vamos voltar squares, e nós devemos ser bons. Não me pareça, não me pareça com você? Não sei, vamos ver. Então, se o nome equals main, porque Python acha que é uma boa ideia, de qualquer forma, resulta equals main, então vamos pegar a lista de squares, mas nós não queremos ir para, como, isso é 100 milhões de números, nós não queremos ver eles, vamos só ver a última. Então, vamos adicionar, resulta, a última, resulta de minus 1. E vamos ver o que acontece quando nós jogamos isso. Vamos, na verdade, entrar no folder, Python, mas deve tomar um pouco, é um grande número, mas eventualmente, se retornarmos a um número mais grande, porque isso é 10 a 18, minus 1, então sim, isso me parece bem, isso funciona, até então, bem. Mas, quatro loops são abertos, talvez há uma forma mais funcional para fazer isso. Então, podemos alcançar uma mapa aqui, então a mapa é uma função de high order, que takes another function and a collection as arguments, applies that function over that collection and returns that collection modified with the function on each of its arguments. Então, vamos fazer isso, vamos tentar ficar fã. Então, vamos copiar isso e vamos chamar de mapa. Então, em vez de ir para um for loop, vamos fazer isso. Retornar. As ranges não são realmente uma lista, mas um gerador, vamos encastar para uma lista. Então, vamos retornar a lista de uma mapa. Então, vamos passar uma função anonymous, lambda x, x times x, over the original range of 0 to 10 to the 8. E isso já está olhando muito liso. Pode estar fazendo algo aqui, parece muito funcional. Então, vamos salvar, vamos alcançar. E se eu não alcançar, os resultados deveriam ser the same. Então, espero que eu não escutei isso. Então, isso também faz um pouco para alcançar, mas, afortunadamente, se você alcançar bem, sim, ele fez. Então, isso é um approach muito funcional, um approach muito liso. Mas isso não é Python. Nós queremos chamar de Python. Eu não sou um desenvolvedor de lista. Eu sou um desenvolvedor de Python. Eu quero fazer isso em um jeito mais Pythonico. E há um jeito mais Pythonico para fazer isso. Pode alguém me dizer qual é? Você pode entender, talvez, o título do talk, talvez? Então, há um jeito de compreensão de lista. Um jeito de lista. E, para ser completamente honesto, ele parece muito bom. Porque o que vamos fazer é declarar a lista com open and closed brackets. Vamos fazer x times x, para x in range. Parece muito melhor. Apenas, para mim, parece muito melhor, muito cleaner. Mucho mais carácter. Vamos ver se ele ainda usa o mesmo resultado, como mostrava. Eu acho que ele vai usar o mesmo resultado. Mas provavelmente vocês podem estar pensando a mesma coisa que eu. Qual é o melhor? Por que você tem mais que fazer x times? Se no Python X, isso deveria ser um jeito obvio de fazer algo. Então, vamos ver isso. Vamos criar um script de benchmarks. Compare-los. Então, para script em UI, vamos mostrar o nome do script. Então, echo script Python 3. Na verdade, time Python 3. Script. Vamos abrir a linha no final. Eu acho que é assim. Pronto? Vamos rolar. Vamos comparar. Quem acha que o for loop vai ser mais rápido? Deixe suas mãos. Ninguém. Ok. Quem acha que a approach do mapa vai ser mais rápido? Vocês vejam o github, então você está mentindo. Quem acha que a lista de compreensão vai ser mais fácil? Oh, isso é legal. Então, a approach de iterativa deu 12 segundos e muda a lista de compreensão de 10 segundos. Então, já é mais rápido do for loop. Então, talvez o mapa seja mais rápido. Ou talvez não. Vamos encontrar. Então, o mapa é o mais baixo. Então, ok. Nós já sabemos que as listas de compreensão são mais rápidas para este particular caso de uso. Mas há outros casos de uso que podemos ter, porque o mapa é uma função específica, mas temos outros que são os filtros. Quem sabe o que é um filtro? Legal. Muita função de programação. O pessoal me faz orgulhar. Então, se esse... Você está aplicando um filtro com um for loop, podemos dizer que, ok. Agora, nós só queremos as quantidades de... Vamos dizer, mesmo número. Então, se fx mod2 equal a zero, nós apendamos para a lista de compreensão de compreensão. Mas isso é negativo. Isso funciona. Como implementar isso em uma... Vamos dizer, uma forma funcional, uma forma lisa. Nós aplicaríamos um filtro sobre a range aqui. E o filtro é outra função de high order, que faz outra função, aplica-se sobre o intervalo. E se o resultado da função é verdadeiro, ele preserva o valor lá na coleção, mas se é falsa, ele remova. Então, nós vamos passar ainda outra função anônima e aplicar sobre a range. Mas isso está se tornando menos readable, certo? E agora, nós temos quatro parânteses no final do... do contato. Isso não parece como o Python. Então, como nós fazemos isso com a compreensão de fx? Canta-me alguém me dizer. Vocês me fazem orgulhar. Você está fazendo o meu dia aqui. Então, fx mod2 equal a zero. Muito mais readable, muito mais elegante syntax. Mas, é-se ainda o mais rápido? Talvez, a approach interativa vai ser mais fácil, porque pode beneficiar para alguma predicação branch. O que vocês acham? Vamos rolar. De novo, quem acha que a approach interativa vai ser mais fácil? Ninguém. E a approach map. Ninguém. Então, eu acho que todo mundo Então, a approach interativa é 11,5 segundos. Está bem. Vamos ver a approach compreensão da lista. 8,7 segundos. Então, ainda mais rápido. Então, eu acho que agora, você deveria pensar. Você deveria sempre usar essas compreensões porque é mais rápido. E eu acho que você... não seria um take away. Mas, as compreensões da lista não really stop there. Vamos dizer que você tem uma lista de listas, que é algo assim. E você quer linearizar isso. Em outras palavras, você quer fazer um single list de scalars. Você pode fazer isso com a lista de compreensões. Então, a lista de scalars se torna x for y in list of lists for x in y. Então, se você print scalars, aí é isso. Linealize. E você pode estar pensando o que se for a lista de listas? E assim. Você pode ter as muitas 4 elementos ineterrables 4 elementos ineterrables 4 statements as você quer as você precisa para conseguir o que você precisa fazer. Mas, não stop there. O que se você quer filter apenas as listas que têm mais que um elemento? Por exemplo, você pode fazer isso. Então, vamos dizer que eu quero uma lista de scalars grande, meaning que eu só quero x for y in list of lists for x in y if land of y is greater than 1. Em outras palavras, eu não quero single elements lists to be considered. Will that work? Yes, it will. You can see that the 6 is missing from here because we excluded this element here from the list comprehension. So, this is a tiny bit of why these comprehensions are great and the main thing always guys really is that they look good. They are cool to write but that's not really what matters here even though that's pretty awesome what matters is that they have excellent performance and begin writing these comprehensions in your Python code guys it won't hurt you and even take a step further Python even has dictionary comprehensions but this is probably a topic for another talk and whenever you need to iterate over something, apply a single action at a time remember that list comprehensions exist all this talks code examples and much more in-depth information can check in this GitHub repository here so please check it out the link to it is also on this talks page in the schedule app and thank you very much