You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -523,13 +523,13 @@ Após esse mergulho nos recursos flexíveis de declaração de argumentos no Pyt
523
523
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.
524
524
525
525
526
-
[[operator_module_section]]
526
+
[[operator_module_sec]]
527
527
==== O módulo operator
528
528
529
529
Na((("operator module", id="opmod07"))) programação funcional, é muitas vezes conveniente usar um operador aritmético como uma função.
530
530
Por exemplo, suponha que você queira multiplicar uma sequência de números para calcular fatoriais, mas sem usar recursão.
531
531
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.
533
533
O <<fact_reduce_lambda_ex>> mostra como resolver esse problema usando `lambda`.
534
534
535
535
[[fact_reduce_lambda_ex]]
@@ -712,7 +712,7 @@ O segundo teste do <<methodcaller_demo>> mostra que `methodcaller` pode também
712
712
==== Fixando argumentos com functools.partial
713
713
714
714
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>>.
716
716
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.
717
717
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.
Juntamente com o `+__eq__+` existente, isso tornará as instâncias de `Vector` _hashable_.
441
441
442
442
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`.
444
444
445
445
////
446
446
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
490
490
491
491
Das alternativas apresentadas no <<ex_reduce_xor>>, a última é minha favorita, e o loop `for` vem a seguir. Qual sua preferida?
492
492
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`.
494
494
495
495
Para escrever `+Vector.__hash__+` no meu estilo preferido precisamos importar os módulos `functools` e `operator`. <<ex_vector_v4>> apresenta as modificações relevantes.
496
496
@@ -683,7 +683,7 @@ para evitar manipulação direta de variáveis índice.
683
683
Quem não estiver familiarizado com `enumerate` deve estudar a seção dedicada a ela na
684
684
https://docs.python.org/pt-br/3/library/functions.html#enumerate[documentação das "Funções embutidas"].
685
685
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>>.
687
687
****
688
688
689
689
Vamos encerrar esse capítulo trazendo de volta o método `+__format__+` do `Vector2d` para o `Vector`.
Copy file name to clipboardExpand all lines: online/cap17.adoc
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -943,15 +943,15 @@ ao implementar geradoras, olhe o que já está disponível na biblioteca padrão
943
943
Por isso a próxima seção trata de várias funções geradoras prontas para usar.((("", startref="Garith17")))
944
944
945
945
946
-
[[stdlib_generators]]
946
+
[[stdlib_generators_sec]]
947
947
=== Funções geradoras na biblioteca padrão
948
948
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`.
955
955
956
956
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.
@@ -524,13 +524,13 @@ Após esse mergulho nos recursos flexíveis de declaração de argumentos no Pyt
524
524
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.
525
525
526
526
527
-
[[operator_module_section]]
527
+
[[operator_module_sec]]
528
528
==== O módulo operator
529
529
530
530
Na((("operator module", id="opmod07"))) programação funcional, é muitas vezes conveniente usar um operador aritmético como uma função.
531
531
Por exemplo, suponha que você queira multiplicar uma sequência de números para calcular fatoriais, mas sem usar recursão.
532
532
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.
534
534
O <<fact_reduce_lambda_ex>> mostra como resolver esse problema usando `lambda`.
535
535
536
536
[[fact_reduce_lambda_ex]]
@@ -713,7 +713,7 @@ O segundo teste do <<methodcaller_demo>> mostra que `methodcaller` pode também
713
713
==== Fixando argumentos com functools.partial
714
714
715
715
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>>.
717
717
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.
718
718
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.
0 commit comments