Javascript e Python sono due tra i più popolari linguaggi di programmazione. Per gli sviluppatori Javascript che hanno necessità o intenzione di migrare a Python, e per il caso precisamente inverso, abbiamo a disposizione due ottimi lavori, sviluppati da Saya e Ilya Schurov, che ci forniscono chiari clean sheets sul confronto tra le sintassi dei due linguaggi di programmazione, confrontati con costrutti che svolgono compiti identici o simili. Basandoci su questi lavori, in questo articolo cercheremo di fare chiarezza per facilitare, il più possibile, la migrazione da un linguaggio all'altro.
Il lavoro di Saya riassume le differenze raggruppandole come di seguito:
- Operazioni matematiche (Math)
- Operatori di controllo del flusso (if/else, costrutto try/catch, booleani, operatore ternario, eccezioni, cicli interrotti e cosi via)
- Lavoro con le stringhe (concatenazione, interpolazione)
- Lavoro con le liste e gli array (iterazione, operazioni con gli elementi e gli indici)
- Lavoro con i dizionari/oggetti (iterazione, mappatura, operazioni con le keywords, operazioni con i valori, lavoro con JSON)
- Lavoro le funzioni (definizione, dichiarazione di parametri, dichiarazione di parametri di default, parametri posizionali, parametri variabili)
- Lavoro con le classi (dichiarazione, creazione di istanze)
Quanto segue tiene in considerazione la versione 3 di Python e lo standard Ecma Script 2015 per Javascript.
Nel lavoro di Ilya, possiamo invece trovare:
- Liste e array
- Ciclo for e cicli iterativi
- Dizionari e oggetti
- Scope delle variabili
- Tipizzazione e tipi di variabili
- Comparazione tra variabili ed operatori di comparazione
- Funzioni
Vediamo qualche esempio che ci permette di capire come questi clean sheets possono essere utili nella pratica di migrazione tra un linguaggio di programmazione e l'altro, analizzando alcune delle voci elencate in precedenza.
Math: operazioni di arrotondamento
Python
import math
# 2
print(math.ceil(1.5))
# 1
print(math.floor(1.5))
# 2
print(round(1.5))
Javascript
// 2
console.log(Math.ceil(1.5))
// 1
console.log(Math.floor(1.5))
// 2
console.log(Math.round(1.5))
Operatore If/else
Python
some_number = 3
# Number is 3
if some_number == 1:
print("Number is 1")
elif some_number == 2:
print("Number is 2")
elif some_number == 3:
print("Number is 3")
else:
print("?")
Javascript
const someNumber = 3
// Number is 3
if (someNumber === 1) {
console.log('Number is 1')
} else if (someNumber === 2) {
console.log('Number is 2')
} else if (someNumber === 3) {
console.log('Number is 3')
} else {
console.log('?')
}
Ciclo for, break/continue
Python
# 1
# 2
# Fizz
# 4
# Buzz
for number in range(1, 101):
if number == 3:
print("Fizz")
continue
if number == 5:
print("Buzz")
break
print(number)
Javascript
// 1
// 2
// Fizz
// 4
// Buzz
for (let i = 1; i <= 100; i = i + 1) {
if (i === 3) {
console.log('Fizz')
continue
}
if (i === 5) {
console.log('Buzz')
break
}
console.log(i)
}
Interpolazione di stringhe
Python
x = "Hello"
# Hello World
print(f"{x} World")
Javascript
const x = 'Hello'
// Hello World
console.log(`${x} World`)
Enumerazione di array
Python
some_list = [6, 3, 5]
# 0 6
# 1 3
# 2 5
for i, item in enumerate(some_list):
print(f"{i} {item}")
# If you're not using this in a for loop, use list()
# list(enumerate(some_list)) # [(0, 6), (1, 3), (2, 5)]
Javascript
const someList = [6, 3, 5]
// 0 6
// 1 3
// 2 5
someList.forEach((element, index) => {
console.log(`${index} ${element}`)
})
Oggetti: lavorare con i valori
Python
some_dict = {"one": 1, "two": 2, "three": 3}
# 1
# 2
# 3
# NOTE: If you're not using this in a for loop,
# convert it into a list: list(some_dict.values())
for x in some_dict.values():
print(x)
Javascript
const someDict = { one: 1, two: 2, three: 3 }
// 1
// 2
// 3
Object.values(someDict).forEach(element => {
console.log(element)
})
Funzioni: argomenti di default
Python
def greet(name, word="Hello"):
print(f"{word} {name}")
# Hello World
greet("World")
# Goodbye World
greet("World", "Goodbye")
Javascript
const greet = (name, word = 'Hello') => {
console.log(`${word} ${name}`)
}
// Hello World
greet('World')
// Goodbye World
greet('World', 'Goodbye')
Classi
Python
class Duck:
def __init__(self, name):
self.name = name
def fly(self):
print(f"{self.name} can fly")
# not @classmethod: call a method on an instance
# duck = Duck(...)
# duck.create(...)
#
# @classmethod: call a method on a class
# Duck.create(...)
@classmethod
def create(cls, name, kind):
if kind == "mallard":
return MallardDuck(name)
elif kind == "rubber":
return RubberDuck(name)
else:
# cls = Duck
return cls(name)
class MallardDuck(Duck):
# @property:
# use duck.color instead of duck.color()
@property
def color(self):
return "green"
class RubberDuck(Duck):
def __init__(self, name, eye_color="black"):
super().__init__(name)
self.eye_color = eye_color
def fly(self):
super().fly()
print(f"Just kidding, {self.name} cannot fly")
@property
def color(self):
return "yellow"
regularDuck = Duck("reggie")
# reggie can fly
regularDuck.fly()
mallardDuck = Duck.create("mal", "mallard")
# mal
print(mallardDuck.name)
# green
print(mallardDuck.color)
rubberDuck = RubberDuck("vic", "blue")
# vic can fly
# Just kidding, vic cannot fly
rubberDuck.fly()
# yellow
print(rubberDuck.color)
# blue
print(rubberDuck.eye_color)
Javascript
class Duck {
constructor(name) {
this.name = name
}
fly() {
console.log(`${this.name} can fly`)
}
// not static: call a method on an instance
// const duck = new Duck(...)
// duck.create(...)
//
// static: call a method on a class
// Duck.create(...)
static create(name, kind) {
if (kind === 'mallard') {
return new MallardDuck(name)
} else if (kind === 'rubber') {
return new RubberDuck(name)
} else {
// this = Duck
return new this(name)
}
}
}
class MallardDuck extends Duck {
// get:
// use duck.color instead of duck.color()
get color() {
return 'green'
}
}
class RubberDuck extends Duck {
constructor(name, eyeColor = 'black') {
super(name)
this.eyeColor = eyeColor
}
fly() {
super.fly()
console.log(`Just kidding, ${this.name} cannot fly`)
}
get color() {
return 'yellow'
}
}
const regularDuck = new Duck('reggie')
// reggie can fly
regularDuck.fly()
const mallardDuck = Duck.create('mal', 'mallard')
// mal
console.log(mallardDuck.name)
// green
console.log(mallardDuck.color)
rubberDuck = new RubberDuck('vic', 'blue')
// vic can fly
// Just kidding, vic cannot fly
rubberDuck.fly()
// yellow
console.log(rubberDuck.color)
// blue
console.log(rubberDuck.eyeColor)
Nelle pagine ufficiali dei lavori sopra citati, sono disponibili una moltitudine di esempi aggiuntivi, molto utili a comprendere le differenze tra Javascript e Python, facilitando quindi la migrazione tra questi linguaggi.