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