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
Copy file name to clipboardExpand all lines: online/cap17.adoc
+28-10Lines changed: 28 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -901,10 +901,10 @@ iterador::
901
901
902
902
gerador::
903
903
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.
908
908
Desde o Python 3.5, também temos _geradores assíncronos_, declarados com `async def`.
909
909
Vamos estudá-los no <<ch_async>>.
910
910
@@ -937,14 +937,23 @@ os objetos devolvidos em ambos os casos são objetos geradores:
937
937
938
938
=== Um gerador de progressão aritmética
939
939
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?
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`.
959
970
O <<ex_ap_class>> mostra a implementação da classe `ArithmeticProgression`.
960
971
961
972
[[ex_ap_class]]
@@ -966,12 +977,19 @@ O <<ex_ap_class>> mostra a implementação da classe `ArithmeticProgression`.
<1> `+__init__+` exige dois argumentos: `begin` e `step`; `end` é opcional, se for `None`, a série será ilimitada.
982
+
970
983
<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
+
971
985
<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
+
972
987
<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
+
974
991
<6> O `result` atual é produzido.
992
+
975
993
<7> O próximo resultado em potencial é calculado. Ele pode nunca ser produzido, se o loop `while` terminar.
0 commit comments