Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correções gramaticais e correção nos parâmetros de função(Roteiro 10) #52

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions roteiros/00_introducao.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@

Sinta-se um vencedor, se você chegou até aqui, isso significa que quer aprender mais sobre o mundo da programação.

Aprender novos paradígmas podem te trazer muitas coisas positivas, assim como aprender linguagens diferentes, pois paradígmas e linguagens transpõem maneiras, estruturas e métodos de implementação completamente diferentes. Com isso você pode ter mais ferramentas para usar no dia a dia. Você pode aumentar sua capacidade de expressar ideias de diferentes maneiras. Eu penso que o maior limitador de um programador é a linguagem de programação em que ele tem domínio. Quando você aprende linguagens imperativas, como C, Python, Java e etc..., você se vê limitado ao escopo de criar e manipular variáveis. Não que isso seja uma coisa ruim, porém existem outras maneiras de resolver problemas e quando você tem conhecimento disso consegue avaliar melhor quando implementar cada tipo de coisa.
Aprender novos paradigmas podem te trazer muitas coisas positivas, assim como aprender linguagens diferentes, pois paradigmas e linguagens transpõem maneiras, estruturas e métodos de implementação completamente diferentes. Com isso você pode ter mais ferramentas para usar no dia a dia. Você pode aumentar sua capacidade de expressar ideias de diferentes maneiras. Eu penso que o maior limitador de um programador é a linguagem de programação em que ele tem domínio. Quando você aprende linguagens imperativas, como C, Python, Java e etc..., você se vê limitado ao escopo de criar e manipular variáveis. Não que isso seja uma coisa ruim, porém existem outras maneiras de resolver problemas e quando você tem conhecimento disso consegue avaliar melhor quando implementar cada tipo de coisa.

Você pode me dizer que aprender diferentes tipos de estruturas e maneiras de computar é uma coisa negativa pois tudo é variável nesse contexto. Mas eu penso exatamente o contrário, quanto mais você aprender da sua língua nativa, no caso estamos falando em português, maior o campo de domínio que você tem sobre como se comunicar e expressar ideias. Assim como aprender outras línguas te darão mais fundamentos para expressar ideias em outros idiomas, que não são melhores que os seu, mas diferentes e compõem diferentes estruturas, e isso pode ser libertador. Não quero me prolongar nesse assunto, mas dizer que isso pode acrescentar muito na suas habilidades cognitivas, até mesmo para usar ferramentas que você já usa no seu dia a dia.
Você pode me dizer que aprender diferentes tipos de estruturas e maneiras de computar é uma coisa negativa pois tudo é variável nesse contexto. Mas eu penso exatamente o contrário, quanto mais você aprender da sua língua nativa, no caso estamos falando em português, maior o campo de domínio que você tem sobre como se comunicar e expressar ideias. Assim como aprender outras línguas te darão mais fundamentos para expressar ideias em outros idiomas, que não são melhores que os seu, mas diferentes e compõem diferentes estruturas, e isso pode ser libertador. Não quero me prolongar nesse assunto, mas dizer que isso pode acrescentar muito nas suas habilidades cognitivas, até mesmo para usar ferramentas que você já usa no seu dia a dia.


Vamos começar fazendo uma tentativa de entender os paradígmas de programação, sem muito falatório e complicações. Um exemplo muito legal é do David Mertz em "Functional Programming in Python":
Vamos começar fazendo uma tentativa de entender os paradigmas de programação, sem muito falatório e complicações. Um exemplo muito legal é do David Mertz em "Functional Programming in Python":

- Usa-se programação funcional quando se programa em Lisp, Haskell, Scala, Erlang, F# etc..

- Do mesmo modo que se usa programação imperativa quando se programada C/C++, Pascal, Java, Python etc...

- Também quando se programa Prolog estamos programando usando o paradígma lógico.
- Também quando se programa Prolog estamos programando usando o paradigma lógico.


Apesar de não ser uma definição muito elegante, talvez seja a melhor a ser dada em muitas ocasiões. Vamos tentar ser um pouco mais objetivos em relação ao estilo de computação, embora essa discussão não tenha fim:
Expand All @@ -27,7 +27,7 @@ Apesar de não ser uma definição muito elegante, talvez seja a melhor a ser da

## 0.1 Mas de onde vem a programação funcional?

O florescer da programação funcional nasce no Lisp (acrônomo para List Processing) para tentar resolver alguns problemas de inteligência artificial que eram provenientes da linguística, que tinha foco em processamento de linguagem natural que por sua vez eram focados em processamento de listas em geral. Isso justifica uma grande parte do conteúdo que vamos ver aqui e seus tipos de dados variam somente entre listas e átomos. E assim foi mantido o foco de processamento de listas em todas as linguagens funcionais e suas funções e abstrações para resolver problemas relativos a listas e estruturas iteráveis. Uma curiosidade é que para quem não sabe porque em lisp existem tantos parênteses é que ele é baseado em s-expression, uma coisa que temos um "equivalente" evoluído em python, que parte dos teoremas de gramáticas livres de contexto:
O florescer da programação funcional nasce no Lisp (acrônimo para List Processing) para tentar resolver alguns problemas de inteligência artificial que eram provenientes da linguística, que tinha foco em processamento de linguagem natural que por sua vez eram focados em processamento de listas em geral. Isso justifica uma grande parte do conteúdo que vamos ver aqui e seus tipos de dados variam somente entre listas e átomos. E assim foi mantido o foco de processamento de listas em todas as linguagens funcionais e suas funções e abstrações para resolver problemas relativos a listas e estruturas iteráveis. Uma curiosidade é que para quem não sabe porque em lisp existem tantos parênteses é que ele é baseado em s-expression, uma coisa que temos um "equivalente" evoluído em python, que parte dos teoremas de gramáticas livres de contexto:

```clojure
(+ 4 5)
Expand Down Expand Up @@ -73,16 +73,16 @@ Vamos tentar mapear o que as linguagens funcionais fazem de diferente das lingua
- Como dito anteriormente, pensar em como as sequências podem nos ajudar a resolver problemas.

- O que deve ser computado, não como computar:
- Não ser tão expressivo e aceitar que as intruções não tem necessidade de estar explicitas todas as vezes, isso ajuda em legibilidade.
- Não ser tão expressivo e aceitar que as intruções não tem necessidade de estar explícitas todas as vezes, isso ajuda em legibilidade.

- Lazy evaluation:
- Criar sequências infinitas sem estourar nossa memória.

## 0.3 Python é uma linguagem funcional?

#### Não. Mas é uma linguagem que implementa muitos paradígmas e porque não usar todos de uma vez?
#### Não. Mas é uma linguagem que implementa muitos paradigmas e porque não usar todos de uma vez?

O objetivo desse 'conjunto de tópicos' é escrever código que gere menos efeito colateral e código com menos estados. Só que isso tudo feito na medida do possível, pois Python não é uma linguagem funcional. Porém, podemos contar o máximo possível com as features presentes do paradígma em python.
O objetivo desse 'conjunto de tópicos' é escrever código que gere menos efeito colateral e código com menos estados. Só que isso tudo feito na medida do possível, pois Python não é uma linguagem funcional. Porém, podemos contar o máximo possível com as features presentes do paradigma em python.

Exemplos de funcional (básicos) em python:

Expand Down Expand Up @@ -124,7 +124,7 @@ Jaber é nosso aluno de mentira, mas vamos pensar que ele é um aluno que senta

Não gosto muito de citar referências pois procurei não copiar texto dos livros, mas muita coisa contida neles serve de base para o entendimento de certos tópicos. Outro motivo é o nível de complexidade dos exemplos ou explicações que tentei reduzir ao máximo enquanto escrevia esses roteiros. Para um exemplo, você pode olhar o livro do Steven Lott, cheio de fórmulas e abstrações matemáticas que em certo ponto acabam comprometendo o entendimento de quem não tem uma sólida base em computação teórica ou matemática.

Como um todo, as referências serviram como guia, foi o que quando dúvidas para explicações surgiram. Não tiro nenhum crédito delas e as exponho para que todos saibam que existem muitos livros bons e que boa parte do que é passado aqui, foi aprendido neles.
Como um todo, as referências serviram como guia, foi o que li quando dúvidas para explicações surgiram. Não tiro nenhum crédito delas e as exponho para que todos saibam que existem muitos livros bons e que boa parte do que é passado aqui, foi aprendido neles.


## 0.7 Mais sobre o histórico das linguagens funcionais
Expand Down
2 changes: 1 addition & 1 deletion roteiros/01_funcoes.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ Isso quer dizer que podemos gerar classes que se comportam como funções?

SIIIIIM. Chupa Haskell

Essa é uma parte interessante da estrutura de criação do Python a qual veremos mais em outro momento sobre introspecção de funções, mas vale a pena dizer que classes, funções nomeadas, funções anônimas e funções geradoras usam uma base comum para funcionarem, essa é uma das coisas mais bonitas em python e que em certo ponto fere a ortogonalidade da linguagem, pois coisas iguais tem funcionamentos diferentes, mas facilita o aprendizado da linguagem, mas não é nosso foco agora.
Essa é uma parte interessante da estrutura de criação do Python a qual veremos mais em outro momento sobre introspecção de funções, mas vale a pena dizer que classes, funções nomeadas, funções anônimas e funções geradoras usam uma base comum para funcionarem, essa é uma das coisas mais bonitas em python e que em certo ponto fere a ortogonalidade da linguagem, pois coisas iguais têm funcionamentos diferentes, mas facilita o aprendizado da linguagem, mas não é nosso foco agora.

## 1.5 Funções geradoras

Expand Down
2 changes: 1 addition & 1 deletion roteiros/02_iteraveis_iteradores.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ Seguem dois links maravilhosos explicando sobre iteração em python:

- [Iteração em Python: do básico ao genial](https://www.youtube.com/watch?v=ULj7ejvuzI8)

O primeiro é a PEP sobre as estruturas dos iteráveis e o segundo um video do Guru Luciano Ramalho explicando tudo sobre iteradores.
O primeiro é a PEP sobre as estruturas dos iteráveis e o segundo um vídeo do Guru Luciano Ramalho explicando tudo sobre iteradores.


Ah... Ia quase me esquecendo, se você não entendeu muita coisa sobre os dunders, você pode ler o [Python data model](https://docs.python.org/3/reference/datamodel.html#special-method-names). Obs: não me responsabilizo pelo programador melhor que você sairá desta página.
Expand Down
4 changes: 2 additions & 2 deletions roteiros/03_consumindo_iteraveis.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ for x in [1, 2, 3, 4, 5]:
# 5
```

Porém, esse "for", aos meus olhos, só vale pra printar coisas, não? Pense comigo. Toda vez que realmente iteramos em alguma sequência, nós queremos os valores, queremos modificá-los, querendo incrementar, criar novos objetos e por ai vai...
Porém, esse "for", aos meus olhos, só vale pra printar coisas, não? Pense comigo. Toda vez que realmente iteramos em alguma sequência, nós queremos os valores, queremos modificá-los, querendo incrementar, criar novos objetos e por vai...

Existem muitas maneiras diferentes e até mais eficientes, não briguem comigo, de iterar sobre sequências. Uma delas é uma list comprehensions.

Expand Down Expand Up @@ -115,6 +115,6 @@ Acaba-se de reproduzir o estado de amor Pythonico agora. Você foi funcional! T

Tá, agora você já sabe o poder que tem nas mãos. Nunca mais declare uma lista vazia para receber appends, combinado?

Agora que você é um entendedor da iterações, vamos complicar um pouco e falar sobre functors, monads e catamorphismo. Tá, mas sem palavras difíceis, os seus coleguinhas não gostam de nomenclaturas haskelianas. Mas você vai poder esnobar seus conhecimentos teóricos sobre Teoria das Categorias. Até o próximo tópico.
Agora que você é um entendedor das iterações, vamos complicar um pouco e falar sobre functors, monads e catamorphismo. Tá, mas sem palavras difíceis, os seus coleguinhas não gostam de nomenclaturas haskelianas. Mas você vai poder esnobar seus conhecimentos teóricos sobre Teoria das Categorias. Até o próximo tópico.

[Retorne <<< 2. Iteráveis e iteradores](./02_iteraveis_iteradores.md) - [Continue lendo >>> 4. Funções de redução/mapeamento](./04_funcoes_reducao_mapeamento.md)
2 changes: 1 addition & 1 deletion roteiros/04_funcoes_reducao_mapeamento.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ print(list(reversed(lista))) # [5, 4, 3, 2, 1]
# construtor de um conjunto
print(set(reversed(lista))) # {5, 4, 3, 2, 1}

# construtor de uma lista
# construtor de uma tupla
print(tuple(reversed(lista))) # (5, 4, 3, 2, 1)
```

Expand Down
2 changes: 1 addition & 1 deletion roteiros/05_hofs.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ Ou seja, é passado um objeto com um método no lugar de uma função. O método

## 5.5 sorted()

Para os viciados em listas, como eu, o método sort da lista funciona bem, apesar de ordenar a lista e não trazer uma nova lista, o que as vezes é uma dor de cabeça.
Para os viciados em listas, como eu, o método sort da lista funciona bem, apesar de ordenar a lista e não trazer uma nova lista, o que às vezes é uma dor de cabeça.

```Python
lista = [1, 2, 3, 3, 2, 1]
Expand Down
4 changes: 2 additions & 2 deletions roteiros/06_funcoes_geradoras_e_hofs_p2.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ Agora que você já conhece mais um tipo de função, vamos voltar as nossas HOF

Como já sabemos e já foi dito exaustivamente, funções são objetos de primeira classe em Python. Já sabemos. Ok.

Então como já entendemos tudo isso, vamos só usar alguns exemplos de funções que recebem funções. OBS: Vamos criar algumas funções meio especialistas agora, isso não é muito bom. Mas serve como base de aprendizado. No proxímo tópico vamos explorar mais funções simples e que são de grande utilidade em muitos contextos, porém...
Então como já entendemos tudo isso, vamos só usar alguns exemplos de funções que recebem funções. OBS: Vamos criar algumas funções meio especialistas agora, isso não é muito bom. Mas serve como base de aprendizado. No próximo tópico vamos explorar mais funções simples e que são de grande utilidade em muitos contextos, porém...

Vamos trabalhar em outra frente então:

Expand Down Expand Up @@ -265,6 +265,6 @@ Counter('abacaxi verde limão verde como coco verde'.split()) # Counter({'abacax

Tá, vai... A gente tentou e você aprendeu. SUAHSUAHUSHA.

Com isso, no próximo tópico, vamos construir nossa propria lib de HOFs simples e que servem para tudo. Um abraço.
Com isso, no próximo tópico, vamos construir nossa própria lib de HOFs simples e que servem para tudo. Um abraço.

[Retornar <<< 5. Funções de ordem superior](./05_hofs.md) - [Continue lendo >>> 7. Nossa primeira biblioteca de funções](./07_construindo_nossa_lib.md)
8 changes: 4 additions & 4 deletions roteiros/07_construindo_nossa_lib.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ def tail(seq, n=1, key=None):
Pode parecer uma função extremamente simples, mas ela é bem legal. Dá pra conseguir muitos resultados legais com ela:

```Python
'Por padrão vai retornar só o ultimo'
'Por padrão vai retornar só o último'
tail([1,2,3,4]) # [4]

'Aqui usamos n, que nesse caso retorna os ultimos 3 elementos'
'Aqui usamos n, que nesse caso retorna os últimos 3 elementos'
tail([1,2,3,4], 3) # [2, 3, 4]

'O resultado reverso'
Expand Down Expand Up @@ -134,7 +134,7 @@ Se você analisar de perto, drop() tem um comportamento muito parecido com a fun
drop(n, seq)
```

`n` é o valor que queremos ignorar de `seq`. Em uma chamada `n=5` de uma sequência de 6 valores, só o último valor será retonado. O que faz o comportamento da função ser exatamente inverso ao take() que nos retornaria os primeiros cinco valores. Tá bom, falamos muito, vamos tentar implementar:
`n` é o valor que queremos ignorar de `seq`. Em uma chamada `n=5` de uma sequência de 6 valores, só o último valor será retornado. O que faz o comportamento da função ser exatamente inverso ao take() que nos retornaria os primeiros cinco valores. Tá bom, falamos muito, vamos tentar implementar:


```Python
Expand Down Expand Up @@ -166,7 +166,7 @@ Imagina pegar o resultado de uma função e atribuir a entrada de outra função
# cat - mostra o conteúdo do arquivo na tela, porém mostrar na tela é uma saída para STDOUT (saída padrão)
# oi.txt - é um arquivo de texto que contém as linhas (oi Jaber \n oi Eduardo \n Oi dinossauros)
# | - é um pipe
# grep - é um comando usado para procurar uma determinada string (grep oi) vai exibir todas as linhas do arquivo que comtém a string oi
# grep - é um comando usado para procurar uma determinada string (grep oi) vai exibir todas as linhas do arquivo que contém a string oi

cat oi.txt | grep Jaber

Expand Down
Loading