Skip to content

Commit ea18a9c

Browse files
committed
cap17: praparação
1 parent 6ee47c0 commit ea18a9c

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

online/cap17.adoc

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -901,10 +901,10 @@ iterador::
901901
902902
gerador::
903903
Um iterador criado pelo compilador Python.
904-
Para criar um gerador, não implementamos `+__next__+`.
905-
Em vez disso, usamos((("yield keyword")))((("keywords", "yield keyword"))) a palavra reservada `yield` para criar uma _função submarina_, que é uma fábrica de _objetos geradores_.
906-
Uma _expressão submarina_ é outra maneira de criar um objeto gerador.
907-
Objetos geradores fornecem `+__next__+`, então são iteradores.
904+
Para criar um gerador, não implementamos uma classe com `+__next__+`.
905+
Em vez disso, usamos((("yield keyword")))((("keywords", "yield keyword"))) a palavra reservada `yield` para criar uma _função geradora_, que é uma fábrica de _objetos geradores_.
906+
Uma _expressão geradora_ é outra maneira de criar um objeto gerador.
907+
Objetos geradores fornecem `+__next__+`, portanto são iteradores.
908908
Desde o Python 3.5, também temos _geradores assíncronos_, declarados com `async def`.
909909
Vamos estudá-los no <<ch_async>>.
910910
@@ -937,14 +937,23 @@ os objetos devolvidos em ambos os casos são objetos geradores:
937937

938938
=== Um gerador de progressão aritmética
939939

940-
O((("generators", "arithmetic progression generators", id="Garith17"))) padrão _Iterator_ clássico está todo baseado em uma travessia: navegar por alguma estrutura de dados. Mas uma interface padrão baseada em um método para obter o próximo item em uma série também é útil quando os itens são produzidos sob demanda, ao invés de serem obtidos de uma coleção. Por exemplo, a função embutida `range` gera uma progressão aritmética (PA) de inteiros delimitada. E se precisarmos gerar uma PA com números de qualquer tipo, não apenas inteiros?
940+
O((("generators", "arithmetic progression generators", id="Garith17")))
941+
padrão _Iterator_ clássico trata de navegar por uma estrutura de dados.
942+
Sua interface padrão é um método que fornece o próximo item de uma série.
943+
Tal interface também é util quando os itens são produzidos sob demanda,
944+
ao invés de serem lidos de uma coleção.
945+
Por exemplo, a função embutida `range` gera uma progressão aritmética (PA)
946+
de inteiros.
947+
E se precisarmos gerar uma PA com números de qualquer tipo, não apenas inteiros?
941948

942949
O <<ap_class_demo>> mostra alguns testes no console com uma classe `ArithmeticProgression`, que vermos em breve.
943950
A assinatura do construtor no <<ap_class_demo>> é `ArithmeticProgression(begin, step[, end])`.
944951
A assinatura completa da função embutida `range` é `range(start, stop[, step])`.
945-
Escolhi implementar uma assinatura diferente porque o `step` é obrigatório, mas `end` é opcional em uma progressão aritmética.
946-
Também mudei os nomes dos argumentos de `start/stop` para `begin/end`, para deixar claro que optei por uma assinatura diferente.
947-
Para cada teste no <<ap_class_demo>>, chamo `list()` com o resultado para inspecionar o valores gerados.
952+
Escolhi implementar uma assinatura diferente porque o `step` é obrigatório,
953+
mas o `end` é opcional.
954+
Também mudei os nomes dos argumentos `start/stop` para `begin/end`,
955+
para deixar claro que optei por uma assinatura diferente.
956+
Para cada teste no <<ap_class_demo>>, chamo `list()` com o resultado para exibir o valores gerados.
948957

949958
[[ap_class_demo]]
950959
.Demonstração de uma classe `ArithmeticProgression`
@@ -955,7 +964,9 @@ include::../code/17-it-generator/aritprog_v1.py[tags=ARITPROG_CLASS_DEMO]
955964
----
956965
====
957966

958-
Observe que o tipo dos números na progressão aritmética resultante segue o tipo de `begin + step`, de acordo com as regras de coerção numérica da aritmética de Python. No <<ap_class_demo>>, você pode ver listas de números `int`, `float`, `Fraction`, e `Decimal`.
967+
Observe que o tipo dos números na progressão aritmética resultante
968+
segue o tipo de `begin + step`, de acordo com as regras de coerção numérica da aritmética de Python.
969+
No <<ap_class_demo>>, você pode ver listas de números `int`, `float`, `Fraction`, e `Decimal`.
959970
O <<ex_ap_class>> mostra a implementação da classe `ArithmeticProgression`.
960971

961972
[[ex_ap_class]]
@@ -966,12 +977,19 @@ O <<ex_ap_class>> mostra a implementação da classe `ArithmeticProgression`.
966977
include::../code/17-it-generator/aritprog_v1.py[tags=ARITPROG_CLASS]
967978
----
968979
====
980+
969981
<1> `+__init__+` exige dois argumentos: `begin` e `step`; `end` é opcional, se for `None`, a série será ilimitada.
982+
970983
<2> Obtém o tipo somando `self.begin` e `self.step`. Por exemplo, se um for `int` e o outro `float`, o `result_type` será `float`.
984+
971985
<3> Essa linha cria um `result` com o mesmo valor numérico de `self.begin`, mas coagido para o tipo das somas subsequentes.footnote:[No Python 2, havia uma função embutida `coerce()`, mas ela não existe mais no Python 3. Foi considerada desnecessária, pois as regras de coerção numérica estão implícitas nos métodos dos operadores aritméticos. Então, a melhor forma que pude imaginar para forçar o valor inicial para o mesmo tipo do restante da série foi realizar a adição e usar seu tipo para converter o resultado. Perguntei sobre isso na Python-list e recebi uma excelente https://fpy.li/17-11[resposta de Steven D'Aprano] (EN).]
986+
972987
<4> Para melhorar a legibilidade, o sinalizador `forever` será `True` se o atributo `self.end` for `None`, resultando em uma série ilimitada.
973-
<5> Esse loop roda `forever` ou até o resultado ser igual ou maior que `self.end`. Quando esse loop termina, a função retorna.
988+
989+
<5> Este loop roda `forever` ou até o resultado ser igual ou maior que `self.end`. Quando este loop termina, a função retorna.
990+
974991
<6> O `result` atual é produzido.
992+
975993
<7> O próximo resultado em potencial é calculado. Ele pode nunca ser produzido, se o loop `while` terminar.
976994

977995
Na última linha do <<ex_ap_class>>,

0 commit comments

Comments
 (0)