Présentation des langages Javascript et Python

publicité
Présentation des langages Javascript et Python
P. Duval et L. Signac
Contenu du document
1 Situation des 2 langages
1
2 Environnements de travail
1
3 Types de données scalaires
2
4 Opérateurs
3
5 Types de données collections
3
6 Entrées/sorties
4
7 Fonctions
4
8 Itérations
5
9 Tests
7
1
Situation des 2 langages
Javascript et Python sont des langages multi-paradigmes, comme beaucoup de langages modernes.
Voici quelques-unes de leurs caractéristiques :
• langages interprétés, pouvant être compilés en bytecode, et disposant d’une REPL (boucle lecture, évaluation,
affichage)
• programmation impérative structurée
• programamtion orientée objets
• bribes de programmation fonctionnelle
• typages dynamiques
2
Environnements de travail
2.1
Python
• Minimum requis : python 3 officiel (livré avec idle)
• Utilisation d’un EDI / distribution plus complète
– Ma config : Pyzo + Miniconda + IPython + Jupyter
– EduPython (attention au module lycee)
– Anaconda + Spyder
– ...
2.2
Javascript
• Minimum requis : Navigateur + Editeur de texte à coloration syntaxique
1
• Configurations :
– Ma config : Firefox et Notepad++
– ou Firefox + extension Firebug + Notepad++ ou sublimetext (non libre)
– ou Chrome + Notepad++ ou sublimetext (non libre)
– ...
3
Types de données scalaires
3.1
•
•
•
•
•
Python
int : entiers sans limite de taille (autre que la RAM)
float : virgule flottante IEE754 double précision (idem double du C)
complex : nombres complexes (formé d’un couple de float)
bool : deux valeurs True et False
NoneType : une seule valeur None
Particularité : le typage est fort (on ne peut pas ajouter une chaîne et un nombre), mais dynamique. Le type des variables
(en Python, on devrait parler de noms ou d’étiquettes), est défini à l’exécution, au moment de l’affectation, et non à
l’écriture du code.
La fonction type permet de connaître le type d’un objet (ou d’une variable) :
type(3 + 4j)
--> complex
3.2
Javascript
• number : virgule flottante IEE754 double précision (64 bits) (idem double du C)
• boolean: deux valeurs true et false
• null : permet de ne donner, à un élément existant, ni type ni valeur
Particularité : Javascript est un langage faiblement typé, mais dynamique. Le type des variables est défini à l’exécution,
lors de l’affectation et non à l’écriture du code. Il est possible de modifier le type d’une variable en cours de programme.
La fonction typeof permet de connaître le type d’un objet (ou d’une variable).
var y;
typeof(y);
--> undefined
y = null;
typeof y; // autre syntaxe possible
--> object
y = -12;
typeof(y);
--> number
var tablo = [1,2,4,8,16];
typeof(tablo);
--> object
Tout élément pouvant dériver d’un objet, dans Javascript, il peut être nécessaire de demander plus de précision :
y = null;
Object.prototype.toString.apply(y);
--> [object Null]
y = -12;
2
Object.prototype.toString.apply(y);
--> [object Number]
var tablo = [1,2,4,8,16];
Object.prototype.toString.apply(tablo);
--> [object Array]
4
Opérateurs
4.1
Python
• Arithmétique sur les nombres : +, -, *, ** (exponentiation), /, // (division entière), % (reste de la division entière),
et affectation élargie +=, *=. . . mais pas ++ ou -• opérateurs binaires : & et, | ou, ˆ ou exclusif, ~ non , <<, >> décalages
• opérateurs booléens : or, and, not
• opérateurs de comparaison : ==, !=, <=, <, >=, >
Particularité : en Python 3, le type du résultat de la division est fonction de l’opérateur (/ ou //) et non des opérandes
4.2
Javascript
• Arithmétique sur les nombres :
– opérateurs binaires + (addition ou concaténation), -, *, /, % (reste de la division entière)
– opérateurs unaires + (conversion en nombre), - (CPL2), ++ (incrémentation), -- (décrémentation)
• opérateurs binaires : & (et), | (ou), ˆ (ou exclusif), ~ (non => CPL1), <<, >>,>>> (décalages)
• opérateurs booléens : || (ou logique), && (et logique), ! (non logique)
• opérateurs de comparaison : ==, === (égalité stricte), !=, !== (inégalité stricte), <=, <, >=, >
Particularités : en Javascript, l’opérateur + force le retypage du résultat du type du premier opérande en number
alert(1 != '1')
// renvoie false
alert (1 !== '1') // renvoie true
alert(1 !== +'1') // renvoie false
5
Types de données collections
5.1
Python
• list : séquence mutable d’objets hétérogènes
• dict : collection mutable de couples clé-valeur
• str : chaînes de caractères (séquence non mutable)
noms_hobbits = ['Frodon', 'Sam', 'Pippin', 'Merry', 'Pippin'] # une liste de chaînes
noms_hobbits[1]
--> 'Sam'
naissances_hobbits = {'Frodon': 1368, 'Bilbon': 1290, 'Sam': 1380,
'Pippin' : 1390, 'Merry': 1382} # dictionnaire
naissances_hobbits['Sam']
--> 1380
Particularité : Pour des tableaux multidimensionnels rapides et homogènes (matrices, etc. . . ), on utilise généralement le
module extérieur numpy plutôt que des listes imbriquées.
3
5.2
Javascript
• array : tableau d’objets hétérogènes mutable (différentes méthodes disponibles : pop, push, reverse, sort. . . )
• object : JSON pour JavaScript Object Notation, appelé aussi tableau associatif (mutable)
• string : chaînes de caractères (séquence immutable)
monTableau = [15, monBooleen, 'texte a trou', monObjet, -7654]; // tableau hétérogène
monTableau[1];
--> 'true'
naissances_personnages = {'George Boole': 1815, 'Gordon Moore': 1929,
'John von Neumann': 1903, 'Blaise Pascal': 1623} // object
naissances_personnages['John von Neumann'];
--> 1903
Particularité : Tous les objets Javascript sont adressés par référence et non par valeur. Pour traiter rapidement de
gros tableaux, Javascript intègre des stuctures prédéfinies avec des nombres entiers sur 8, 16 ou 32 bits. Int8Array, . . .
Int32Array, . . .
6
Entrées/sorties
6.1
Python
• Affichage : print
• Entrée : input
a = int(input("Votre âge ?")) # input renvoie une chaîne, qu'il faut convertir
a = a + 10
print("Dans 10 ans, vous aurez", a, "ans")
6.2
Javascript
• Affichage : document.write (ou document.writeln) ou alert (ou console.log)
• Entrée : prompt
a = Number(prompt("Votre âge ?")); // prompt renvoie une chaîne, qu'il faut convertir
a = a + 10;
document.write("Dans 10 ans, vous aurez ", a, " ans");
7
Fonctions
7.1
Python
def syracuse(n):
""" syracuse(n) renvoie le terme suivant
n de la suite n/2 ou 3n+1
"""
if n % 2 == 0:
return n // 2
4
else:
return n * 3 + 1
n = 27
for i in range(10):
print(n)
n = syracuse(n)
• les fonctions sont des objets de première classe (on peut par exemple écrire f = syracuse)
• la récursivité est permise
• il n’y a pas d’optimisation pour la récursivité terminale
Particularité : les blocs sont délimités par l’indentation et il n’y a pas de mot clé de fin de bloc (idem pour les fonctions,
tests, boucles etc. . . )
7.2
Javascript
function syracuseRecursive(tabloSuite) {
// exemple de fonction réversible qui reçoit et renvoie un objet Array
var n = tabloSuite[tabloSuite.length-1];
if (n == 1) return tabloSuite;
if (n % 2 == 0) {
tabloSuite.push(n / 2);
return syracuseRecursive(tabloSuite);
} else {
tabloSuite.push(n * 3 + 1);
return syracuseRecursive(tabloSuite);
}
}
document.write("suite : " , syracuseRecursive([6]));
• En JavaScript, les fonctions sont des objets de première classe (objets Function) (on peut écrire f = syracuse). Cela
signifie qu’elles peuvent être manipulées et échangées, qu’elles peuvent avoir des propriétés et des méthodes, comme
tous les autres objets JavaScript.
• la récursivité est permise et il n’y a pas d’optimisation pour la récursivité terminale
var sin = Math.sin;
alert(sin(Math.PI/6));
8
Itérations
8.1
Python
La boucle for permet d’itérer sur tout objet itérable (listes, dictionnaires. . . ).
for nom in noms_hobbits:
print(nom, end=", ")
--> Frodon, Bilbon, Sam, Merry, Pippin,
for nom, naiss in naissances_hobbits.items():
5
print(nom, "est né en", naiss)
-->
Sam est né en 1380
Bilbon est né en 1290
Merry est né en 1382
Pippin est né en 1390
Frodon est né en 1368
# Compteur classique (la borne max est exclue de range)
for i in range(1, 10):
for j in range(1, 10):
print(i,'x',j,'=',i*j)
--> ...
La boucle while exécute le corps de la boucle tant qu’une condition est vraie (moins utile que for en Python, mais plus
générale)
n = 27
i = 1
while n != 1:
print(n, end=',')
n = syracuse(n)
i = i + 1
print("\nLongueur :", i)
--> 27,82,41,124,62,31,94,47,142,71,214,107,322,161,484,242,121,364,182,
...
106,53,160,80,40,20,10,5,16,8,4,2,
Longueur : 112
Particularité : Pas besoin de parenthèses autour du test
8.2
Javascript
La boucle for in permet d’itérer sur tout objet itérable.
for (var nom in naissances_personnages) {
document.write(nom, ', ');
}
--> George Boole, Gordon Moore, John von Neumann, Blaise Pascal
for (var nom in naissances_personnages) {
document.write(nom , " est né en " , naissances_personnages[nom]);
}
-->
George Boole est né en 1815
Gordon Moore est né en 1929
John von Neumann est né en 1903
Blaise Pascal est né en 1623
// Compteur classique (on peut choisir l'évolution i++, i--, i=i+2...)
// (solution conseillée pour parcourir les tableaux ou lorsque l'on connait le nombre d'itérations au départ
for (var i = 1; i < 10; i++) {
6
for (var j = 1; j < 10; j++) {
document.write(i , "x" , j, " = ", i*j, ", ");
}
}
--> 1x1 = 1, 1x2 = 2, 1x3 = 3, ... 9x8 = 72, 9x9 = 81,
La boucle while exécute le corps de la boucle tant qu’une condition est vraie (à utiliser lorsque l’on ne connait pas, au
départ, le nombre d’itérations)
function syracuse(n) {
if (n % 2 == 0) {
return n / 2;
} else {
return n * 3 + 1;
}
}
var n = 27;
var i = 1;
while (n != 1) {
document.write(n , ", ");
n = syracuse(n);
i = i + 1;
}
document.write(n , " Longueur = " , i);
--> 27,82,41,124,62,31,94,47,142, ... 106,53,160, ... 16,8,4,2,1 Longueur = 112
A noter que while existe sous deux formes, permettant de tester au moment opportun :
• while (test) { ... } // tant que. . . faire. . .
• do { ... } while (test); // faire. . . tant que. . .
9
Tests
9.1
Python
Le mot clé if est requis. Les mot-clés elif et else sont facultatifs.
import random
a = random.randint(1,10)
if a % 2 == 0:
print(a, 'est pair')
elif a % 3 == 0:
print(a, 'est impair et divisible par 3')
elif a % 5 == 0:
print(a, 'n\'est pas divisible par 3 et se termine par le chiffre 5')
else:
print(a, 'est impair, et n\'est divisible ni par 3, ni par 5')
Particularité : Pas besoin de parenthèses autour du test. Une mauvaise indentation ne donne pas forcément une erreur de
syntaxe mais peut changer la signification du code.
7
9.2
Javascript
Le mot clé if est requis. Le mot-clé else est facultatif. Les accolades, conseillées, sont facultatives s’il n’y a qu’une
seule instruction. Lorsqu’il faut effectuer différents traitements selon la valeur d’une expression, il est possible d’utiliser la
structure switch(. . . ) case. . .
var a = Math.floor((Math.random() * 10) + 1);
if(a % 2 == 0)
document.write(a , " est
else
if (a % 3 == 0)
document.write(a , "
else
if(a % 5 == 0)
document.write(a
else
document.write(a
pair");
est impair et divisible par 3");
, " n'est pas divisible par 3 et se termine par le chiffre 5");
, " est impair, et n'est divisible ni par 3, ni par 5");
8
Téléchargement