@@ -81,7 +81,8 @@ Sequências planas::
8181Uma((("tuples", "simplified memory diagram for")))((("arrays"))) _sequência contêiner_ mantém
8282referências para os objetos que contém, que podem ser de qualquer tipo,
8383enquanto uma _sequência plana_ armazena o valor de seu conteúdo em seu próprio espaço de memória,
84- e não como objetos Python distintos. Veja a <<container_v_flat_img>>.
84+ e não como objetos Python distintos.
85+ Veja a <<container_v_flat_img>>.
8586
8687[[container_v_flat_img]]
8788.Diagramas de memória simplificados mostrando uma `tuple` e um `array`, cada uma com três itens. As células em cinza representam o cabeçalho de cada objeto Python na memória. A `tuple` tem um array de referências para seus itens. Cada item é um objeto Python separado, possivelmente contendo também referências aninhadas a outros objetos Python, como aquela lista de dois itens. Por outro lado, um `array` Python é um único objeto, contendo um array da linguagem C com três números de ponto flutuante`.
@@ -205,12 +206,14 @@ Um loop `for` pode ser usado para muitas coisas diferentes:
205206percorrer uma sequência para contar ou encontrar itens, computar valores agregados (somas, médias),
206207ou inúmeras outras tarefas.
207208O código no <<ex_build_list>> está criando uma lista.
208- Uma listcomp, por outro lado, é mais clara. Seu objetivo é sempre criar uma nova lista.
209+ Uma listcomp, por outro lado, é mais clara.
210+ Seu objetivo é sempre criar uma nova lista.
209211
210212Naturalmente, é possível abusar das compreensões de lista para escrever código verdadeiramente incompreensível.
211213Já vi código Python usando listcomps apenas para repetir um bloco de código por seus efeitos colaterais.
212214Se você não vai fazer alguma coisa com a lista criada, não deveria usar essa sintaxe.
213- Além disso, tente manter o código curto. Se uma compreensão ocupa mais de duas linhas,
215+ Além disso, tente manter o código curto.
216+ Se uma compreensão ocupa mais de duas linhas,
214217provavelmente seria melhor quebrá-la ou reescrevê-la como um bom e velho loop `for`.
215218Avalie qual o melhor caminho: em Python, como em português, não existem regras absolutas para se escrever bem.
216219
@@ -550,7 +553,8 @@ Agora vamos considerar o uso da classe `tuple` como uma variante imutável da cl
550553O((("tuples", "as immutable lists", secondary-sortas="immutable lists", id="Timlist02")))((("lists", "using tuples as immutable",
551554id="Ltupple02")))
552555interpretador Python e a biblioteca padrão fazem uso extensivo das tuplas como listas imutáveis,
553- e você deve seguir o exemplo. Isso traz dois benefícios importantes:
556+ e você deve seguir o exemplo.
557+ Isso traz dois benefícios importantes:
554558
555559Clareza:: Quando você vê uma `tuple` no código, sabe que seu tamanho nunca mudará.
556560Desempenho:: Uma `tuple` usa menos memória que uma `list` de mesmo tamanho, e permite ao Python realizar algumas otimizações.
@@ -611,7 +615,8 @@ Apesar dessa ressalva, as tuplas são frequentemente usadas como listas imutáve
611615Elas oferecem algumas vantagens de desempenho, explicadas por uma dos desenvolvedores principais de Python,
612616Raymond Hettinger, em uma resposta à questão
613617https://fpy.li/2-3["Are tuples more efficient than lists in Python?" (_As tuplas são mais eficientes que as listas no Python?_)]
614- no StackOverflow. Em resumo, Hettinger escreveu:
618+ no StackOverflow.
619+ Em resumo, Hettinger escreveu:
615620
616621* Para avaliar uma tupla literal, o compilador Python gera bytecode para uma constante tupla em uma operação;
617622mas para um literal lista, o bytecode gerado insere cada elemento como uma constante separada na pilha,
@@ -881,12 +886,13 @@ https://fpy.li/2r["Casamento de padrão estrutural"]footnote:[NT: A tradução e
881886Python adotou o termo "casamento de padrões" no lugar de _pattern matching_.
882887O termo em inglês é usado nas comunidades brasileiras
883888de linguagens que implementam _pattern matching_ há muitos anos, como por exemplo Scala,
884- Elixir e Haskell. Naturalmente mantivemos os títulos originais nos links externos.]
889+ Elixir e Haskell.
890+ Naturalmente mantivemos os títulos originais nos links externos.]
885891em https://fpy.li/2s["O que há de novo no Python 3.10"].
886892Você pode querer ler aquela revisão rápida.
887893Neste livro, dividi o tratamento do casamento de padrões em diferentes capítulos,
888894dependendo dos tipos de padrão:
889- Na <<pattern_matching_mappings_sec>> e na <<pattern_instances_sec>>.
895+ na <<pattern_matching_mappings_sec>> e na <<pattern_instances_sec>>.
890896E há um exemplo mais longo na <<pattern_matching_case_study_sec>>.
891897====
892898
@@ -918,13 +924,15 @@ Então, você poderia usar um método assim para interpretar mensagens naquele f
918924====
919925<1> A expressão após a palavra-chave `match` é o sujeito (_subject_).
920926O sujeito contém os dados que Python vai comparar aos padrões em cada instrução `case`.
921- <2> Esse padrão casa com qualquer sujeito que seja uma sequência de três itens. O primeiro item deve ser a string `BEEPER`.
927+ <2> Esse padrão casa com qualquer sujeito que seja uma sequência de três itens.
928+ O primeiro item deve ser a string `BEEPER`.
922929O segundo e o terceiro itens podem ser qualquer coisa, e serão vinculados às variáveis `frequency` e `times`, nessa ordem.
923930<3> Isso casa com qualquer sujeito com dois itens, se o primeiro for `'NECK'`.
924931<4> Isso vai casar com uma sujeito de três itens começando com `LED`.
925932Se o número de itens não for correspondente, Python segue para o próximo `case`.
926933<5> Outro padrão de sequência começando com `'LED'`, agora com cinco itens—incluindo a constante `'LED'`.
927- <6> Esse é o `case` default. Vai casar com qualquer sujeito que não tenha sido capturado por um dos padrões precedentes.
934+ <6> Esse é o `case` default.
935+ Vai casar com qualquer sujeito que não tenha sido capturado por um dos padrões precedentes.
928936A variável `_` é especial, como logo veremos.
929937
930938Olhando((("pattern matching", "destructuring"))) superficialmente,
@@ -979,7 +987,7 @@ Um sujeito de `match` de um desses tipos é tratado como um valor "atômico"—a
979987e não como uma sequência de dígitos.
980988Tratar aqueles três tipos como sequências poderia causar bugs devido a casamentos não intencionais.
981989Se você quer usar um objeto daqueles tipos como um sujeito sequência, converta-o na instrução `match`.
982- Por exemplo, veja `tuple(phone)` no trecho abaixo,
990+ Por exemplo, veja `tuple(phone)` no trecho abaixo,
983991que poderia ser usado para separar números de telefone por regiões do mundo com base no prefixo DDI:
984992
985993[source, py]
@@ -1003,10 +1011,12 @@ list memoryview array.array
10031011tuple range collections.deque
10041012----
10051013
1006- Ao contrário do desempacotamento, padrões não desestruturam iteráveis que não sejam sequências (tal como os iteradores).
1014+ Ao contrário do desempacotamento,
1015+ padrões não desestruturam iteráveis que não sejam sequências (tal como os iteradores).
10071016
10081017O((("pattern matching", "_ symbol")))((("_ symbol"))) símbolo `+_+` é especial nos padrões:
1009- ele casa com qualquer item naquela posição, mas nunca é vinculado ao valor daquele item. O valor é descartado.
1018+ ele casa com qualquer item naquela posição, mas nunca é vinculado ao valor daquele item.
1019+ O valor é descartado.
10101020Além disso, o `+_+` é a única variável que pode aparecer mais de uma vez em um padrão.
10111021
10121022Você pode vincular qualquer parte de um padrão a uma variável usando
@@ -1095,18 +1105,24 @@ O próximo exemplo mostra como o _pattern matching_ contribui para a criação d
10951105[[pattern_matching_seq_interp_sec]]
10961106==== Casando padrões de sequência em um interpretador
10971107
1098- Peter Norvig((("lis.py interpreter", "pattern matching in", id="lispypattern02")))((("pattern matching", "in lis.py interpreter",
1108+ Peter Norvig((("lis.py interpreter", "pattern matching in", id="lispypattern02")))((("pattern matching",
1109+ "in lis.py interpreter",
10991110secondary-sortas="lis.py", id="PMinterp02")))((("Scheme language", id="scheme02"))),
11001111da Universidade de Stanford, escreveu o
11011112https://fpy.li/2-11[_lis.py_]:
1102- um interpretador de um subconjunto do dialeto Scheme da linguagem de programação Lisp, em 132 belas linhas de código Python legível.
1103- Peguei o código fonte de Norvig (publicado sob a licença MIT) e o atualizei para Python 3.10, para exemplificar o _pattern matching_.
1104- Nessa seção, vamos comparar uma parte fundamental do código de Norvig—que usa `if/elif` e desempacotamento—com uma nova versão usando `match/case`.
1105-
1106- As duas funções principais do _lis.py_ são `parse` e `evaluate`.footnote:[A última é chamada `eval` no código original;
1107- a renomeei para evitar que fosse confundida com a função embutida `eval` de Python.]
1113+ um interpretador de um subconjunto do dialeto Scheme da linguagem de programação Lisp,
1114+ em 132 belas linhas de código Python legível.
1115+ Peguei o código fonte de Norvig (publicado sob a licença MIT) e o atualizei para Python 3.10,
1116+ para exemplificar o _pattern matching_.
1117+ Nessa seção, vamos comparar uma parte fundamental do código de Norvig—que usa `if/elif` e
1118+ desempacotamento—com uma nova versão usando `match/case`.
1119+
1120+ As duas funções principais do _lis.py_ são `parse` e `evaluate`.footnote:[A última é
1121+ chamada `eval` no código original;
1122+ a renomeei para evitar confusão com a função embutida `eval` de Python.]
11081123O parser (_analisador sintático_) recebe as expressões entre parênteses do Scheme
1109- e devolve listas Python. Aqui estão dois exemplos:
1124+ e devolve listas Python.
1125+ Aqui estão dois exemplos:
11101126
11111127[source, python]
11121128----
@@ -1251,7 +1267,8 @@ Acrescentar essas duas linhas ao `match` cuida da implementação:
12511267----
12521268
12531269Eu colocaria esse `case` após o `case` da outra forma de `define` no <<ex_match_eval>>.
1254- A ordem desses _cases_ de `define` é irrelevante nesse exemplo, pois nenhum sujeito pode casar com esses dois padrões:
1270+ A ordem desses _cases_ de `define` é irrelevante nesse exemplo,
1271+ pois nenhum sujeito pode casar com esses dois padrões:
12551272o segundo elemento deve ser um `Symbol` na forma original de `define`,
12561273mas deve ser uma sequência começando com um `Symbol` no atalho de `define` para definição de função.
12571274
@@ -1662,12 +1679,14 @@ Aqui está uma demonstração de `+*=+` com uma sequência mutável e depois com
16621679A concatenação repetida de sequências imutáveis é ineficiente, pois ao invés de apenas acrescentar novos itens,
16631680o interpretador tem que copiar toda a sequência alvo para criar um novo objeto com os novos itens
16641681concatenados.footnote:[`str` é uma exceção a essa descrição.
1665- Como criar strings com `+=` em loops é tão comum em bases de código reais, o CPython foi otimizado para esse caso de uso.
1682+ Como criar strings com `+=` em loops é tão comum em bases de código reais,
1683+ o CPython foi otimizado para esse caso de uso.
16661684Instâncias de `str` são alocadas na memória com espaço extra,
16671685então a concatenação não exige a cópia da string inteira a cada operação.]
16681686
16691687Vimos casos de uso comuns para `+=`.
1670- A próxima seção mostra um caso lateral intrigante, que realça o real significado de "imutável" no contexto das tuplas.
1688+ A próxima seção mostra um caso lateral intrigante,
1689+ que realça o real significado de "imutável" no contexto das tuplas.
16711690
16721691[[tuple_puzzler]]
16731692==== Um quebra-cabeça com a atribuição +=
@@ -1726,7 +1745,8 @@ mostrando os estados inicial e final da tupla `t` do <<ex_aug_item_assign_soluti
17261745.Estados inicial e final do enigma da atribuição de tuplas (diagrama gerado pelo Online Python Tutor).
17271746image::images/flpy_0205.png[Diagrama de referência]
17281747
1729- Se olharmos o bytecode gerado pelo Python para a expressão `s[a] += b` (<<ex_aug_item_assign_bytecode>>), fica claro como isso acontece.
1748+ Se olharmos o bytecode gerado pelo Python para a expressão `s[a] += b` (<<ex_aug_item_assign_bytecode>>),
1749+ fica claro como isso acontece.
17301750
17311751[[ex_aug_item_assign_bytecode]]
17321752.Bytecode para a expressão `s[a] += b`
@@ -1825,7 +1845,8 @@ Aqui estão alguns exemplos para esclarecer o uso dessas funções e dos argumen
18251845Os exemplos também demonstram que o algoritmo de ordenação de Python é estável
18261846(isto é, ele preserva a ordem relativa de itens que resultam iguais na comparação):footnote:[O
18271847principal algoritmo de ordenação de Python se chama Timsort, em homenagem a seu criador,
1828- Tim Peters. Para curiosidades sobre o Timsort, veja o <<sequences_soapbox>>.]
1848+ Tim Peters.
1849+ Para curiosidades sobre o Timsort, veja o <<sequences_soapbox>>.]
18291850
18301851
18311852[source, pycon]
@@ -1849,7 +1870,8 @@ Tim Peters. Para curiosidades sobre o Timsort, veja o <<sequences_soapbox>>.]
18491870----
18501871<1> Isso produz uma lista de strings ordenadas
18511872alfabeticamente.footnote:[As palavras nesse exemplo estão ordenadas em ordem alfabética
1852- porque são 100% constituídas de caracteres ASCII em letras minúsculas. Veja o aviso após o exemplo.]
1873+ porque são 100% constituídas de caracteres ASCII em letras minúsculas.
1874+ Veja o aviso após o exemplo.]
18531875<2> Inspecionando a lista original, vemos que ela não mudou.
18541876<3> Isso é a ordenação "alfabética" anterior, invertida.
18551877<4> Uma nova lista de strings, agora ordenada por tamanho.
@@ -1893,7 +1915,7 @@ Por outro lado, se você está constantemente acrescentando e removendo itens da
18931915é bom saber que um((("queues", "deque (double-ended queue)")))((("deque (double-ended queue)")))((("FIFO (first in, first out)")))
18941916`deque` (uma fila com duas pontas) é uma estrutura de dados
18951917FIFOfootnote:[Sigla em inglês para "First in, first out"
1896- (_Primeiro a entrar, primeiro a sair_— o comportamento padrão de filas.] mais eficiente.
1918+ (primeiro a entrar, primeiro a sair), o comportamento padrão de filas.] mais eficiente.
18971919
18981920[TIP]
18991921====
@@ -1904,7 +1926,8 @@ Eles também são iteráveis, mas não são coleções, porque a ordenação de
19041926Vamos falar deles no <<ch_dicts_sets>>.
19051927====
19061928
1907- O restante desse capítulo discute tipos mutáveis de sequências que, em muitos casos, podem substituir as listas. Começamos pelos arrays.
1929+ O restante desse capítulo discute tipos mutáveis de sequências que, em muitos casos, podem substituir as listas.
1930+ Começamos pelos arrays.
19081931
19091932[[arrays_sec]]
19101933==== Arrays
@@ -1916,7 +1939,7 @@ bem como métodos adicionais para carregamento e armazenamento rápidos, tais co
19161939
19171940Um array de Python quase tão enxuto quanto um array do C.
19181941Como mostrado na <<container_v_flat_img>>, um `array` de valores `float` não contém instâncias completas de `float`,
1919- mas apenas os bytes representando seus valores em código de máquina—de forma similar a um array de `double` na linguagem C.
1942+ mas apenas os bytes representando seus valores em código de máquina—como um array de `double` na linguagem C.
19201943Ao criar um `array`, você fornece um código de tipo (_typecode_),
19211944uma letra que determina o tipo C subjacente usado para armazenar cada item no array.
19221945Por exemplo, +b+ é o código de tipo para o que o C chama de `signed char`, um inteiro variando de -128 a 127.
@@ -2035,7 +2058,8 @@ Para manter a ordem de um array ordenado ao acrescentar novos itens, use a funç
20352058====
20362059
20372060Se você trabalha muito com arrays e não conhece `memoryview`,
2038- está perdendo oportunidades. Veja o próximo tópico.((("", startref="array02")))
2061+ está perdendo oportunidades.
2062+ Veja o próximo tópico.((("", startref="array02")))
20392063
20402064
20412065[[memoryview_sec]]
@@ -2458,7 +2482,9 @@ e mencionamos as outras implementações de filas na biblioteca padrão.
24582482O((("sequences", "further reading on"))) capítulo 1, "Data Structures" (_Estruturas de Dados_)
24592483do https://fpy.li/pycook3[Python Cookbook</em>, 3rd ed.]
24602484(EN) (O'Reilly), de David Beazley e Brian K. Jones, traz muitas receitas usando sequências,
2461- incluindo a "Recipe 1.11. Naming a Slice" (_Receita 1.11. Nomeando uma Fatia_),
2485+ incluindo a "Recipe 1.11.
2486+ Naming a Slice" (_Receita 1.11.
2487+ Nomeando uma Fatia_),
24622488onde aprendi o truque de atribuir fatias a variáveis para melhorar a legibilidade,
24632489como ilustrado no nosso <<flat_file_invoce>>.
24642490
@@ -2491,9 +2517,10 @@ https://fpy.li/2r["Casamento de padrão estrutural"],
24912517de Carol Willing, no
24922518https://fpy.li/2s["O que há de novo no Python 3.10"],
24932519é uma ótima introdução a esse novo grande recurso, em mais ou menos 1.400 palavras
2494- (isso é menos de 5 páginas quando o Firefox converte o HTML em PDF).
2495- A https://fpy.li/pep636[PEP 636—Structural Pattern Matching: Tutorial (_Casamento de Padrões Estrutural: Tutorial_)]
2496- (EN) também é boa, mas mais longa. A mesma PEP 636 inclui o
2520+ (isso é menos de 5 páginas quando o Firefox converte o HTML em PDF). A
2521+ https://fpy.li/pep636[PEP 636—Structural Pattern Matching: Tutorial (_Casamento de Padrões Estrutural: Tutorial_)]
2522+ (EN) também é boa, mas mais longa.
2523+ A mesma PEP 636 inclui o
24972524https://fpy.li/2-27["Appendix A—Quick Intro" (_Apêndice A-Introdução Rápida_)] (EN).
24982525Ele é menor que a introdução de Willing, porque omite as considerações gerais sobre os motivos pelos quais o
24992526casamento de padrões é útil.
0 commit comments