Skip to content

Commit 44a8587

Browse files
committed
cap12: wip
1 parent ea72dd5 commit 44a8587

File tree

8 files changed

+23
-917
lines changed

8 files changed

+23
-917
lines changed

ferramentas/anchors.ini

Lines changed: 0 additions & 897 deletions
This file was deleted.

ferramentas/anchors.ini.zip

25.1 KB
Binary file not shown.

online/cap07.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ pode escrever `fn(*args, **kwargs)` em vez de `apply(fn, args, kwargs)` como faz
182182
As funções de ordem superior `map`, `filter` e `reduce` ainda existem,
183183
mas temos alternativas melhores para a maioria de seus casos de uso, como mostra a próxima seção.
184184

185-
[[map_filter_reduce]]
185+
[[map_filter_reduce_sec]]
186186
==== Substitutos modernos para map, filter, e reduce
187187

188188
Linguagens funcionais((("list comprehensions (listcomps)", "versus map and filter functions")))((("generator expressions (genexps)")))
@@ -523,13 +523,13 @@ Após esse mergulho nos recursos flexíveis de declaração de argumentos no Pyt
523523
Apesar((("functions, as first-class objects", "packages for functional programming", id="FAFfp07")))((("functional programming", "packages for", id="fprogpack07"))) de Guido deixar claro que não projetou Python para ser uma linguagem de programação funcional, o estilo de programação funcional pode ser amplamente utilizado, graças a funções de primeira classe, _pattern matching_ e o suporte de pacotes como `operator` e `functools`, dos quais falaremos nas próximas duas seções.
524524

525525

526-
[[operator_module_section]]
526+
[[operator_module_sec]]
527527
==== O módulo operator
528528

529529
Na((("operator module", id="opmod07"))) programação funcional, é muitas vezes conveniente usar um operador aritmético como uma função.
530530
Por exemplo, suponha que você queira multiplicar uma sequência de números para calcular fatoriais, mas sem usar recursão.
531531
Para calcular a soma, podemos usar `sum`, mas não há uma função equivalente para multiplicação.
532-
Você poderia usar ``reduce``—como vimos na <<map_filter_reduce>>—mas isso exige um função para multiplicar dois itens da sequência.
532+
Você poderia usar ``reduce``—como vimos na <<map_filter_reduce_sec>>—mas isso exige um função para multiplicar dois itens da sequência.
533533
O <<fact_reduce_lambda_ex>> mostra como resolver esse problema usando `lambda`.
534534

535535
[[fact_reduce_lambda_ex]]
@@ -712,7 +712,7 @@ O segundo teste do <<methodcaller_demo>> mostra que `methodcaller` pode também
712712
==== Fixando argumentos com functools.partial
713713

714714
O((("functools module", "freezing arguments with", id="functools07")))((("arguments", "freezing with functools.partial"))) módulo `functools` oferece várias funções de ordem superior.
715-
Já vimos `reduce` na <<map_filter_reduce>>.
715+
Já vimos `reduce` na <<map_filter_reduce_sec>>.
716716
Uma outra é `partial`: dado um invocável, ela produz um novo invocável com alguns dos argumentos do invocável original vinculados a valores pré-determinados.
717717
Isso é útil para adaptar uma função que recebe um ou mais argumentos a uma API que requer uma função de callback com menos argumentos.
718718
O <<ex_partial_mul>> é uma demonstração trivial.

online/cap12.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ Vamos((("Vector class, multidimensional", "&#x005F;&#x005F;hash&#x005F;&#x005F;
440440
Juntamente com o `+__eq__+` existente, isso tornará as instâncias de `Vector` _hashable_.
441441

442442
O `+__hash__+` do `Vector2d` (no <<ex_vector2d_v3_hash>>) computava o _hash_ de uma `tuple` construída com os dois componentes, `self.x` and `self.y`.
443-
Agora podemos estar lidando com milhares de componentes, então criar uma `tuple` pode ser caro demais. Em vez disso, vou aplicar sucessivamente o operador `^` (xor) aos _hashes_ de todos os componentes, assim: `v[0] ^ v[1] ^ v[2]`. É para isso que serve a função `functools.reduce`. Anteriormente afirmei que `reduce` não é mais tão popular quanto antes,footnote:[`sum`, `any`, e `all` cobrem a maioria dos casos de uso comuns de `reduce`. Veja a discussão na <<map_filter_reduce>>.] mas computar o _hash_ de todos os componentes do vetor é um bom caso de uso para ela. A <<reduce_fig>> ilustra a ideia geral da((("reducing functions"))) função `reduce`.
443+
Agora podemos estar lidando com milhares de componentes, então criar uma `tuple` pode ser caro demais. Em vez disso, vou aplicar sucessivamente o operador `^` (xor) aos _hashes_ de todos os componentes, assim: `v[0] ^ v[1] ^ v[2]`. É para isso que serve a função `functools.reduce`. Anteriormente afirmei que `reduce` não é mais tão popular quanto antes,footnote:[`sum`, `any`, e `all` cobrem a maioria dos casos de uso comuns de `reduce`. Veja a discussão na <<map_filter_reduce_sec>>.] mas computar o _hash_ de todos os componentes do vetor é um bom caso de uso para ela. A <<reduce_fig>> ilustra a ideia geral da((("reducing functions"))) função `reduce`.
444444

445445
////
446446
PROD: unexpected indent in first line after page break
@@ -490,7 +490,7 @@ Voltando a nosso problema de _hash_, o <<ex_reduce_xor>> demonstra a ideia da co
490490

491491
Das alternativas apresentadas no <<ex_reduce_xor>>, a última é minha favorita, e o loop `for` vem a seguir. Qual sua preferida?
492492

493-
Como visto na <<operator_module_section>>, `operator` oferece a funcionalidade de todos os operadores infixos de Python em formato de função, diminuindo a necessidade do uso de `lambda`.
493+
Como visto na <<operator_module_sec>>, `operator` oferece a funcionalidade de todos os operadores infixos de Python em formato de função, diminuindo a necessidade do uso de `lambda`.
494494

495495
Para escrever `+Vector.__hash__+` no meu estilo preferido precisamos importar os módulos `functools` e `operator`. <<ex_vector_v4>> apresenta as modificações relevantes.
496496

@@ -683,7 +683,7 @@ para evitar manipulação direta de variáveis índice.
683683
Quem não estiver familiarizado com `enumerate` deve estudar a seção dedicada a ela na
684684
https://docs.python.org/pt-br/3/library/functions.html#enumerate[documentação das "Funções embutidas"].
685685
As funções embutidas `zip` e `enumerate`, bem como várias outras funções geradores na biblioteca padrão,
686-
são tratadas na <<stdlib_generators>>.
686+
são tratadas na <<stdlib_generators_sec>>.
687687
****
688688

689689
Vamos encerrar esse capítulo trazendo de volta o método `+__format__+` do `Vector2d` para o `Vector`.

online/cap17.adoc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -943,15 +943,15 @@ ao implementar geradoras, olhe o que já está disponível na biblioteca padrão
943943
Por isso a próxima seção trata de várias funções geradoras prontas para usar.((("", startref="Garith17")))
944944
945945
946-
[[stdlib_generators]]
946+
[[stdlib_generators_sec]]
947947
=== Funções geradoras na biblioteca padrão
948948
949-
// [NOTE]
950-
// ====
951-
// Perhaps you know all the functions mentioned in this section, but some of them are underused, so a quick overview may be good to recall what's already available.
952-
// ====
953-
954-
A((("generators", "generator functions in Python standard library", id="Ggenfunc17"))) biblioteca padrão oferece muitas geradoras, desde objetos de arquivo de texto fornecendo iteração linha por linha até a incrível função pass:[<a href="https://fpy.li/17-12"><code>os.walk</code></a>], que produz nomes de arquivos enquanto cruza uma árvore de diretórios, tornando buscas recursivas no sistema de arquivos tão simples quanto um loop `for`.
949+
A((("generators", "generator functions in Python standard library",
950+
id="Ggenfunc17"))) biblioteca padrão oferece muitas geradoras, desde objetos de
951+
arquivo de texto fornecendo iteração linha por linha até a incrível função
952+
https://fpy.li/17-12[os.walk], que produz nomes de arquivos percorrendo uma
953+
árvore de diretórios, reduzindo uma busca recursiva no sistema de arquivos
954+
a um simples laço `for`.
955955
956956
A função geradora `os.walk` é impressionante, mas nesta seção quero me concentrar em funções genéricas que recebem iteráveis arbitrários como argumento e devolvem geradores que produzem itens selecionados, calculados ou reordenados. Nas tabelas a seguir, resumi duas dúzias delas, algumas embutidas, outras dos módulos `itertools` e `functools`. Por conveniência, elas estão agrupadas por sua funcionalidade de alto nível, independente de onde são definidas.
957957

print/pdf_export.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#!/bin/bash
22
set -e # exit when any command fails
3+
name="${1%.*}-miolo.pdf"
4+
echo $name
35
bundle exec asciidoctor-pdf -v --theme pyfl-fontmix-theme.yml -a pdf-fontsdir=./fonts/ $1
4-
open "${1%.*}.pdf"
6+
pdfunite "${1%.*}.pdf" colofao.pdf $name
7+
open $name

vol1/cap07.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ pode escrever `fn(*args, **kwargs)` em vez de `apply(fn, args, kwargs)` como faz
182182
As funções de ordem superior `map`, `filter` e `reduce` ainda existem,
183183
mas temos alternativas melhores para a maioria de seus casos de uso.
184184

185-
[[map_filter_reduce]]
185+
[[map_filter_reduce_sec]]
186186
==== Substitutos modernos para map, filter, e reduce
187187

188188
Linguagens funcionais((("list comprehensions (listcomps)", "versus map and filter functions")))((("generator expressions (genexps)")))
@@ -524,13 +524,13 @@ Após esse mergulho nos recursos flexíveis de declaração de argumentos no Pyt
524524
Apesar((("functions, as first-class objects", "packages for functional programming", id="FAFfp07")))((("functional programming", "packages for", id="fprogpack07"))) de Guido deixar claro que não projetou Python para ser uma linguagem de programação funcional, o estilo de programação funcional pode ser amplamente utilizado, graças a funções de primeira classe, _pattern matching_ e o suporte de pacotes como `operator` e `functools`, dos quais falaremos nas próximas duas seções.
525525

526526

527-
[[operator_module_section]]
527+
[[operator_module_sec]]
528528
==== O módulo operator
529529

530530
Na((("operator module", id="opmod07"))) programação funcional, é muitas vezes conveniente usar um operador aritmético como uma função.
531531
Por exemplo, suponha que você queira multiplicar uma sequência de números para calcular fatoriais, mas sem usar recursão.
532532
Para calcular a soma, podemos usar `sum`, mas não há uma função equivalente para multiplicação.
533-
Você poderia usar ``reduce``—como vimos na <<map_filter_reduce>>—mas isso exige um função para multiplicar dois itens da sequência.
533+
Você poderia usar ``reduce``—como vimos na <<map_filter_reduce_sec>>—mas isso exige um função para multiplicar dois itens da sequência.
534534
O <<fact_reduce_lambda_ex>> mostra como resolver esse problema usando `lambda`.
535535

536536
[[fact_reduce_lambda_ex]]
@@ -713,7 +713,7 @@ O segundo teste do <<methodcaller_demo>> mostra que `methodcaller` pode também
713713
==== Fixando argumentos com functools.partial
714714

715715
O((("functools module", "freezing arguments with", id="functools07")))((("arguments", "freezing with functools.partial"))) módulo `functools` oferece várias funções de ordem superior.
716-
Já vimos `reduce` na <<map_filter_reduce>>.
716+
Já vimos `reduce` na <<map_filter_reduce_sec>>.
717717
Uma outra é `partial`: dado um invocável, ela produz um novo invocável com alguns dos argumentos do invocável original vinculados a valores pré-determinados.
718718
Isso é útil para adaptar uma função que recebe um ou mais argumentos a uma API que requer uma função de _callback_ com menos argumentos.
719719
O <<ex_partial_mul>> é uma demonstração trivial.

vol1/vol1-cor.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
:!chapter-signifier:
1919
include::../print/attrib-print-pt-br.adoc[]
2020
include::titulos-vol1.adoc[]
21-
:revisao: 12
21+
:revisao: 13
2222

2323
include::Copyright-cor.adoc[]
2424

0 commit comments

Comments
 (0)