Continuamos traduciendo una serie de artículos sobre análogos en Python y JavaScript
En versiones anteriores, confiamos en la sintaxis de las versiones clásicas de Python (2.7) y JS basadas en ECMAScript 5. Esta vez utilizaremos las nuevas funciones que aparecieron en Python 3.6 y JS del estándar ECMAScript 6.
ECMAScript 6 es un estándar relativamente nuevo compatible con la mayoría de los navegadores modernos . Para usar el estándar 6 en navegadores más antiguos, necesitará que Babel traduzca los diseños modernos de JS6 a la compatibilidad entre navegadores.
En el artículo de hoy: variables en cadenas, listas de desempaquetado, funciones lambda, iteración sin índices, generadores y conjuntos.
Contenido de otros temas:
- La primera parte : conversión de tipo, operador ternario, acceso a una propiedad por nombre de propiedad, diccionarios, listas, cadenas, concatenación de cadenas
- La segunda parte es la serialización de diccionarios, JSON, regulares, errores y excepciones.
- Este articulo
- La cuarta parte es argumentos de función, crear y trabajar con clases, herencia, getter setter y propiedades de clase.
Variables en filas
La forma tradicional de construir cadenas con variables utiliza la concatenación de cadenas y variables:
name = 'World' value = 'Hello, ' + name + '!\nWelcome!'
Tal registro puede parecer disperso y mal leído, y a menudo puede cometer errores en los espacios que rodean las palabras en las líneas.
A partir de la versión 3.6 en Python y en JS ECMAScrip6, puede usar la interpolación de cadenas o, en términos de Python, las cadenas f. Estos son patrones de cadena en los que se sustituyen los valores de las variables.
En Python, las líneas f están marcadas con una f antes de las comillas:
name = 'World' value = f"""Hello, {name}! Welcome!""" price = 14.9 value = f'Price: {price:.2f} €'
En JS, los patrones de cadena comienzan y terminan con un retroceso `
name = 'World'; value = `Hello, ${name}! Welcome!`; price = 14.9; value = `Price ${price.toFixed(2)} €`;
Tenga en cuenta que los patrones pueden ser tanto de una sola línea como de varias líneas.
En Python, puede establecer el formato de las variables.
Desempacando Listas
En Python, y ahora en JS, hay una oportunidad interesante para asignar elementos de secuencia a varias variables. Por ejemplo, podemos asignar tres valores de la lista a tres variables:
[a, b, c] = [1, 2, 3]
Para las tuplas, se pueden omitir los corchetes.
El siguiente ejemplo es muy popular en Python como una forma de intercambiar los valores de dos variables:
a = 1 b = 2 a, b = b, a
En JS6 +, también es posible:
a = 1; b = 2; [a, b] = [b, a];
En Python, si tenemos un número indefinido de elementos en una lista o tupla, podemos asignar estos elementos a una tupla de variables en la que los últimos valores regresan como una lista:
first, second, *the_rest = [1, 2, 3, 4]
Lo mismo se puede hacer en JS (ECMAScrip6):
[first, second, ...the_rest] = [1, 2, 3, 4];
Funciones lambda
Tanto Python como JS tienen una funcionalidad bastante clara para crear funciones de una sola línea. Dichas funciones se denominan funciones lambda. Las lambdas son funciones que toman uno o más argumentos y devuelven un valor calculado. Típicamente, las funciones lambda se usan cuando necesita transferir una función a otra función como devolución de llamada, o cuando es necesario procesar cada elemento de la secuencia.
En Python, puede definir una función lambda utilizando la palabra clave lambda
:
sum = lambda x, y: x + y square = lambda x: x ** 2
JS usa =>
notación. Si hay más de un argumento, se colocan entre paréntesis:
sum = (x, y) => x + y; square = x => Math.pow(x, 2);
Iteración sin índices
Muchos PL le permiten omitir matrices solo usando el acceso a un elemento específico por número de índice y ciclo con el incremento de este índice.
for (i=0; i<items.length; i++) { console.log(items[i]); }
Este no es un disco muy hermoso, y un poco complicado para los principiantes: tal registro no parece natural. Python tiene una forma hermosa y concisa de moverse por la lista:
for item in ['A', 'B', 'C']: print(item)
En JS moderno, esto se implementa utilizando el operador for..of
:
for (let item of ['A', 'B', 'C']) { console.log(item); }
También puede omitir la línea carácter por carácter en Python:
for character in 'ABC': print(character)
Y en JavaScript moderno:
for (let character of 'ABC') { console.log(character); }
Generadores
Tanto Python como JS moderno le permiten definir funciones especiales que se verán como iteradores. Con cada llamada (iteración), devolverán el siguiente valor generado de la secuencia. Tales funciones se llaman generadores.
Los generadores se usan generalmente para obtener: números de un rango, líneas de un archivo, datos página por página de una API externa, números de Fibonacci y otras secuencias generadas dinámicamente.
Técnicamente, los generadores se ven como funciones ordinarias, pero en lugar de devolver un solo valor (y detener el trabajo), devuelven un único valor y detienen la operación hasta la próxima llamada. Generarán los siguientes valores de la lista con cada llamada hasta llegar al final de la lista.
Considere un ejemplo en Python en el que se crea el generador de cuenta regresiva (), que devuelve los números de un número dado a 1 en el orden inverso (10,9,8, ..., 1):
def countdown(counter): while counter > 0: yield counter counter -= 1 for counter in countdown(10): print(counter)
Lo mismo se puede obtener en JS moderno, pero preste atención a * en la descripción de la función. Esto la define como una generadora:
function* countdown(counter) { while (counter > 0) { yield counter; counter--; } } for (let counter of countdown(10)) { console.log(counter); }
Conjuntos
Ya nos familiarizamos con listas (listas), tuplas (tuplas), matrices (matrices). Pero hay otro tipo de datos: conjuntos. Los conjuntos son matrices de datos en las que cada elemento único está presente solo en una sola copia. La teoría de conjuntos define operaciones con conjuntos como unión, intersección y diferencia, pero no las consideraremos ahora.
Creamos un conjunto, le agregamos un elemento, verificamos la existencia del elemento, obtenemos el número total de elementos, damos la vuelta al conjunto por elementos y eliminamos un elemento usando 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')
Lo mismo en 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')
Para resumir
- Los patrones de cadena (líneas f) pueden mejorar la legibilidad y simplificar el código, incluso en el caso de objetos de varias líneas.
- Puede omitir matrices, grupos o cadenas sin usar índices.
- Usando generadores, puede obtener secuencias con un número casi ilimitado de elementos.
- El uso de conjuntos facilita la verificación de la unicidad de un elemento en una matriz.
- Use lambdas cuando necesite funciones pequeñas de una línea.
En la siguiente parte, hablaremos sobre argumentos de función, clases, herencia y propiedades.