<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Elma Santos</title>
    <description>The latest articles on DEV Community by Elma Santos (@elmasantos).</description>
    <link>https://dev.to/elmasantos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F39980%2Fd896156f-982d-47d7-81e3-07e41173f002.jpg</url>
      <title>DEV Community: Elma Santos</title>
      <link>https://dev.to/elmasantos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elmasantos"/>
    <language>en</language>
    <item>
      <title>Python e Programação Funcional</title>
      <dc:creator>Elma Santos</dc:creator>
      <pubDate>Thu, 18 Jun 2020 02:21:47 +0000</pubDate>
      <link>https://dev.to/elmasantos/python-e-programacao-funcional-4mhj</link>
      <guid>https://dev.to/elmasantos/python-e-programacao-funcional-4mhj</guid>
      <description>&lt;p&gt;A programação funcional pode nos ajudar a reduzir efeitos colaterais e tornar nosso código mais simples de manter. Nesse post, explicarei um pouco sobre os seus principais conceitos e como podemos aplicá-los em Python!&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Programação Funcional?
&lt;/h2&gt;

&lt;p&gt;Programação funcional é um &lt;strong&gt;paradigma de programação&lt;/strong&gt;.&lt;br&gt;
Resumidamente, paradigma de programação é uma forma de classificar linguagens baseando-se em suas funcionalidades e estilo de código. Normalmente, isso vai te guiar na forma que você vai estruturar seu código e desenvolver soluções.&lt;/p&gt;

&lt;p&gt;Na programação funcional, funções são utilizadas para resolver problemas, buscando evitar mutabilidade de dados e estados.&lt;/p&gt;

&lt;p&gt;Talvez essa definição seja um pouco confusa de início, mas existem alguns conceitos importantes que farão as coisas terem mais sentido!&lt;/p&gt;
&lt;h2&gt;
  
  
  Funções de primeira classe
&lt;/h2&gt;

&lt;p&gt;Como dito acima, na programação funcional resolvemos problemas usando funções. Nesse paradigma, elas são tratadas como funções de primeira classe.&lt;br&gt;
Isso significa que uma função pode ser atribuída a uma variável, ser passada como argumento para outra função ou devolvida como resultado.&lt;/p&gt;

&lt;p&gt;Esse é um exemplo simples, mostrando que conseguimos atribuir a função embutida &lt;code&gt;print&lt;/code&gt; a uma variável chamada &lt;code&gt;escreve&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; escreve &lt;span class="o"&gt;=&lt;/span&gt; print
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; escreve
&amp;lt;built-in &lt;span class="k"&gt;function &lt;/span&gt;print&amp;gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; escreve&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"abc"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
abc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Imutabilidade de dados
&lt;/h2&gt;

&lt;p&gt;Os dados usados na programação funcional não devem ser modificados após a sua criação. Por exemplo, se quisermos modificar um dado em uma lista, nós devemos criar uma cópia da lista com a modificação desejada ao invés de alterar diretamente a lista original.&lt;/p&gt;

&lt;p&gt;Um exemplo de tipo de dado imutável em Python é a &lt;code&gt;tupla&lt;/code&gt;. No exemplo a seguir, utilizamos a classe collections para definir a tupla nomeada Pessoa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt;
&lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Pessoa'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'nome'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'personagem'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;elenco_bacurau&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Sonia Braga'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Domingas'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                  &lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Barbara Colen'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Teresa'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                  &lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Silvero Pereira'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Lunga'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Aqui, estamos garantindo que os atributos &lt;code&gt;nome&lt;/code&gt; e &lt;code&gt;personagem&lt;/code&gt; não serão alterados diretamente e nenhum item de &lt;code&gt;elenco_bacurau&lt;/code&gt; será excluído.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; elenco_bacurau[0].nome &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Kleber'&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
  File &lt;span class="s2"&gt;"&amp;lt;stdin&amp;gt;"&lt;/span&gt;, line 1, &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;module&amp;gt;
AttributeError: can&lt;span class="s1"&gt;'t set attribute
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; del elenco_bacurau[0]
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
  File &lt;span class="s2"&gt;"&amp;lt;stdin&amp;gt;"&lt;/span&gt;, line 1, &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;module&amp;gt;
TypeError: &lt;span class="s1"&gt;'tuple'&lt;/span&gt; object doesn&lt;span class="s1"&gt;'t support item deletion
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções puras
&lt;/h2&gt;

&lt;p&gt;As funções ditas como puras são as que não produzem efeitos colaterais, ou seja, não alteram o estado do programa. Um novo valor é criado e retornado.&lt;/p&gt;

&lt;p&gt;Se quiséssemos remover o último item de uma lista, o jeito não funcional seria alterar a lista utilizando, por exemplo, o método &lt;code&gt;pop&lt;/code&gt;. Uma solução funcional retornaria uma cópia dessa lista alterada, como vemos no exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_ultimo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""Remove item, alterando a lista original"""&lt;/span&gt;
    &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lista_sem_ultimo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""Retorna cópia da lista sem o último item"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de ordem superior
&lt;/h2&gt;

&lt;p&gt;Funções de ordem superior podem aceitar outra função como argumento e podem retornar uma função como saída.&lt;/p&gt;

&lt;p&gt;Python possui algumas funções embutidas de ordem superior (como &lt;code&gt;map&lt;/code&gt; e &lt;code&gt;filter&lt;/code&gt;) que nos permitem escrever códigos seguindo a programação funcional, de forma concisa e sem efeitos colaterais.&lt;/p&gt;

&lt;p&gt;Abaixo, um exemplo de uso da função &lt;code&gt;map&lt;/code&gt; que aplica uma &lt;code&gt;lambda&lt;/code&gt; (função anônima) para cada item do iterável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;integers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;integers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;integers&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Python não é uma linguagem puramente funcional, mas, por ser &lt;strong&gt;multiparadigma&lt;/strong&gt;, ela dá suporte ao paradigma funcional e existem diversas vantagens em utilizá-lo.&lt;/p&gt;

&lt;p&gt;Testar um programa funcional pode ser mais simples (tudo o que você precisa é de um conjunto de entradas e um conjunto esperado de saídas). Além disso, facilita a reutilização de código — como a função não depende de nenhuma variável ou estado externo, é fácil chamá-la de outro contexto.&lt;/p&gt;

&lt;p&gt;É interessante ter visões diferentes de como resolver determinado problema, e dependendo do contexto, a programação funcional pode nos ajudar a chegar a uma solução simples e eficiente. ✨&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.python.org/3/howto/functional.html"&gt;Functional Programming HOWTO&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://julien.danjou.info/python-and-functional-programming/"&gt;An Introduction to Functional Programming with Python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackabuse.com/functional-programming-in-python/"&gt;Functional Programming in Python&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://towardsdatascience.com/elements-of-functional-programming-in-python-1b295ea5bbe0"&gt;Elements of Functional Programming in Python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse post é baseado na palestra que apresentei no Python Day 2019, realizado pelo Grupy RN. Os slides podem ser vistos &lt;a href="https://github.com/elmasantos/talks/tree/master/python-day-2019"&gt;aqui&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Imagem de &lt;a href="https://pixabay.com/pt/users/picsbyjameslee-13643653"&gt;James Lee&lt;/a&gt; por &lt;a href="https://pixabay.com"&gt;Pixabay&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>funcional</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
