Análogos em Python e JavaScript. Parte três

Continuamos a traduzir uma série de artigos sobre análogos em Python e JavaScript


Nas versões anteriores, contávamos com a sintaxe das versões clássicas do Python (2.7) e JS com base no ECMAScript 5. Desta vez, usaremos as novas funções que apareceram no Python 3.6 e JS do padrão ECMAScript 6.


O ECMAScript 6 é um padrão relativamente novo suportado pela maioria dos navegadores modernos . Para usar o padrão 6 em navegadores mais antigos, você precisará do Babel para traduzir os designs JS6 modernos no suporte a vários navegadores.


No artigo de hoje: variáveis ​​em strings, listas de desempacotamento, funções lambda, iteração sem índices, geradores e conjuntos.


Conteúdo de outros assuntos:


  1. A primeira parte - conversão de tipo, operador ternário, acesso a uma propriedade pelo nome da propriedade, dicionários, listas, cadeias de caracteres, concatenação de cadeias
  2. A segunda parte é a serialização de dicionários, JSON, regulares, erros e exceções.
  3. Este artigo
  4. A quarta parte são argumentos de função, criando e trabalhando com classes, herança, getter setter e propriedades de classe.

Variáveis ​​em linhas


A maneira tradicional de construir strings com variáveis ​​usa a concatenação de strings e variáveis:


name = 'World' value = 'Hello, ' + name + '!\nWelcome!' 

Esse registro pode parecer disperso e mal lido, e muitas vezes você pode cometer erros nos espaços ao redor das palavras nas linhas.


A partir da versão 3.6 no Python e no JS ECMAScrip6, é possível usar a interpolação de strings ou, em termos do Python, f-strings. Esses são padrões de cadeia em que os valores das variáveis ​​são substituídos.


No Python, as linhas f são marcadas com um f antes das aspas:


 name = 'World' value = f"""Hello, {name}! Welcome!""" price = 14.9 value = f'Price: {price:.2f} €' # 'Price: 14.90 €' 

Em JS, os padrões de string começam e terminam com um backtrick `


 name = 'World'; value = `Hello, ${name}! Welcome!`; price = 14.9; value = `Price ${price.toFixed(2)} €`; // 'Price: 14.90 €' 

Observe que os padrões podem ser de linha única e multilinha.
No Python, você pode definir a formatação das variáveis.


Desembalar listas


No Python, e agora no JS, há uma oportunidade interessante de atribuir elementos de sequência a várias variáveis. Por exemplo, podemos atribuir três valores da lista a três variáveis:


 [a, b, c] = [1, 2, 3] 

Para tuplas, colchetes podem ser omitidos.
O exemplo a seguir é muito popular no Python como uma maneira de trocar os valores de duas variáveis:


 a = 1 b = 2 a, b = b, a #   

No JS6 +, também é possível:


 a = 1; b = 2; [a, b] = [b, a]; //   

No Python, se tivermos um número indefinido de elementos em uma lista ou tupla, podemos atribuir esses elementos a uma tupla de variáveis ​​nas quais os últimos valores retornam como uma lista:


 first, second, *the_rest = [1, 2, 3, 4] # first == 1 # second == 2 # the_rest == [3, 4] 

O mesmo pode ser feito em JS (ECMAScrip6):


 [first, second, ...the_rest] = [1, 2, 3, 4]; // first === 1 // last === 2 // the_rest === [3, 4] 

Funções Lambda


Tanto o Python quanto o JS têm uma funcionalidade bastante clara para criar funções de linha única. Tais funções são chamadas funções lambda. Lambdas são funções que recebem um ou mais argumentos e retornam um valor calculado. Normalmente, as funções lambda são usadas quando você precisa transferir uma função para outra como retorno de chamada ou quando é necessário processar cada elemento da sequência.


No Python, você pode definir uma função lambda usando a palavra-chave lambda :


 sum = lambda x, y: x + y square = lambda x: x ** 2 

JS usa => notação. Se houver mais de um argumento, eles serão colocados entre colchetes:


 sum = (x, y) => x + y; square = x => Math.pow(x, 2); 

Iteração sem índices


Muitos PLs permitem ignorar matrizes apenas usando o acesso a um elemento específico pelo número do índice e alternando com o incremento desse índice.


 for (i=0; i<items.length; i++) { console.log(items[i]); } 

Este não é um registro bonito e um pouco complicado para iniciantes - esse registro não parece natural. O Python tem uma maneira bonita e concisa de contornar a lista:


 for item in ['A', 'B', 'C']: print(item) 

No JS moderno, isso é implementado usando o operador for..of :


 for (let item of ['A', 'B', 'C']) { console.log(item); } 

Você também pode ignorar a linha caractere por caractere no Python:


 for character in 'ABC': print(character) 

E no JavaScript moderno:


 for (let character of 'ABC') { console.log(character); } 

Geradores


Tanto o Python quanto o JS moderno permitem definir funções especiais que se parecerão com iteradores. Com cada chamada (iteração), eles retornarão o próximo valor gerado a partir da sequência. Tais funções são chamadas de geradores.


Os geradores geralmente são usados ​​para obter: números de um intervalo, linhas de um arquivo, dados página por página de uma API externa, números de fibonacci e outras seqüências geradas dinamicamente.


Tecnicamente, os geradores parecem funções comuns, mas, em vez de retornar um único valor (e interromper o trabalho), eles retornam um único valor e pausam a operação até a próxima chamada. Eles irão gerar os seguintes valores da lista com cada chamada até o final da lista.


Considere um exemplo em Python no qual o gerador countdown () é criado, que retorna números de um determinado número para 1 na ordem inversa (10,9,8, ..., 1):


 def countdown(counter): while counter > 0: yield counter counter -= 1 for counter in countdown(10): print(counter) 

O mesmo pode ser obtido no JS moderno, mas preste atenção a * na descrição da função. Isso a define como um gerador:


 function* countdown(counter) { while (counter > 0) { yield counter; counter--; } } for (let counter of countdown(10)) { console.log(counter); } 

Conjuntos


Já nos familiarizamos com listas (listas), tuplas (tuplas), matrizes (matrizes). Mas há outro tipo de conjunto de dados. Conjuntos são matrizes de dados nas quais cada elemento exclusivo está presente apenas em uma única cópia. A teoria dos conjuntos define operações com conjuntos como união, interseção e diferença, mas não as consideraremos agora.


Criamos um conjunto, adicionamos um elemento a ele, verificamos a existência do elemento, obtemos o número total de elementos, contornamos o conjunto por elementos e excluímos um elemento usando o Python:


 s = set(['A']) s.add('B'); s.add('C') 'A' in s len(s) == 3 for elem in s: print(elem) s.remove('C') 

A mesma coisa no JS:


 s = new Set(['A']); s.add('B').add('C'); s.has('A') === true; s.size === 3; for (let elem of s.values()) { console.log(elem); } s.delete('C') 

Resumir


  • Os padrões de string (linhas f) podem melhorar a legibilidade e simplificar o código, mesmo no caso de objetos com várias linhas.
  • Você pode ignorar matrizes, grupos ou seqüências de caracteres sem usar índices.
  • Usando geradores, você pode obter seqüências com um número quase ilimitado de elementos.
  • O uso de conjuntos facilita a verificação da exclusividade de um elemento em uma matriz.
  • Use lambdas quando precisar de pequenas funções de uma linha.

Na próxima parte, falaremos sobre argumentos, classes, herança e propriedades de funções.

Source: https://habr.com/ru/post/pt418191/


All Articles