Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 28-10-2019 20:12:13

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Essai de mini-tuto Python

Bonjour,

Je vous propose ce qui suit : réactions, questions bienvenues...
Trop compliqué ?
Points pas clairs ?
Faites-le moi savoir que je rectifie le tir...

Réutilisez, modifiez, adaptez ce qui figure ci-dessous et testez : c'est ainsi qu'on progresse en Python...
Et programmer demandant une forme particulière de pensée, ne pas se décourager quand ça ne marche pas du 1er coup !!!
--------------------------------------------------------------------------------------------------------------------------------------------------------

Salut les djeunes,

Pour vos essais en Python, au début, vous n'avez pas besoin de l'installer (ce sera nécessaire à terme) :
copier /coller votre code ici : https://pynative.com/online-python-code … thon-code/ (en l'ayant écrit avec notepad ou notepad+ pour Windows ou tout autre éditeur de texte pour Mac ou Linux (avec Linux, il me semble bien que Python soit déjà installé en natif)...
En attendant la rédaction du mini-tuto, voilà de quoi tester...

Tout d'abord 2 particularités Python :
- L'indentation qui pertube tant cosinuspax
- Le Typage dynamique

La programmation propre se subdivise en blocs...

Voilà un programme Algobox, langage très proche de l'AlGOL dont j'ai tâté en 1969


1    VARIABLES
2       Fibo1 EST_DU_TYPE NOMBRE
3       Fibo2 EST_DU_TYPE NOMBRE
4       fibo EST_DU_TYPE NOMBRE
5       i EST_DU_TYPE NOMBRE
6    DEBUT_ALGORITHME
7       Fibo1 PREND_LA_VALEUR 1
8       Fibo2 PREND_LA_VALEUR 1
9      AFFICHER Fibo2
10      POUR i ALLANT_DE 2 A 24
11        DEBUT_POUR
12        AFFICHER " "
13        fibo PREND_LA_VALEUR Fibo1+Fibo2
14        Fibo1 PREND_LA_VALEUR Fibo2
15        Fibo2 PREND_LA_VALEUR fibo
16        AFFICHER fibo
17        FIN_POUR
18   FIN_ALGORITHME

Résultats :
***Algorithme lancé***
 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025
***Algorithme terminé***

Vous y voyez
* un semblant d'indentation (le décalage à à droite)
* les indications de Début et de Fin de Bloc
* le typage  : les déclarations des variables et leur appartenance à deux grands groupes : les nombres et les chaînes (de caractères)

En Python, et c'est un reproche récurrent qui lui est fait, on use du typage dynamique (çà la volée, si je puis dire)...
L'indentation est bien plus marquée et obligatoire et il n'y a pas d'indication de fin de bloc : c'est géré par l'indentation...

Traduit en Python, le script devient :

Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(2,25):
    fibo=Fibo1+Fibo2
    Fibo1=Fibo2
    Fibo2=fibo
    print(fibo,end= " ")

On peut même gagner une ligne :

Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(2,25):
    fibo=Fibo1+Fibo2
    Fibo1,Fibo2=Fibo2,fibo
    print(fibo,end= " ")

Les deux permettent d'obtenir :
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 

Si vous décaliez la 6e ligne pour que son 1er caractère  soit aligné verticalement avec le 1er caractère de chacune des 3 premières lignes, l'affichage serait limité à : 1 75025...
En supprimant l'indentation de la 6e ligne, vous auriez sorti l'affichage des valeurs intermédiaires de la boucle...
Voilà à quoi sert l'indentation...

La boucle c'est le pendant programmatique de la factorisation en maths : au lieu de répéter n fois la même séquence, on va l'insérer dans une boucle de 1 à n+1 ou de 0 à n...
La boucle for observe la syntaxe suivante :

for nom_de_la_variable_compteur in range (debut, fin, pas):

Si debut est omis, c'est 0 par défaut
Si le pas est omis, c'est 1 par défaut. Le pas est un entier...
Pour nom_de_la_variable_compteur, choisissez ce que vous voulez : i, j, k, truc, compteur, nom_de_la_variable_compteur...
La boucle avec fin se déroule jusqu'à fin-1 !
On peut afficher les nombres de 1 à 9 en choisissant 1 pour debut, 10 pour fin, de 0 à 9 soit en spécifiant 0 pour debut, soit en écrivant seulement range(10)
on peut afficher ces mêmes nombres en décroissant avec fin<debut et pas =-1:

for i in range(9,0,-1):
    print(i)

Sans surprise, on aura obtenu les nombres de 9 à... 1 !
Pour avoir le 0, il faut pousser fin jusqu'à -1 :

for i in range(9,-1,-1):
    print(i)

N-B
J'ai écrit : print(i) les nombres de 9 à à 1 ou 0 seront affichés avec un retour à la ligne après chaque nombre (l'affichage sera en colonne).
Pourquoi ? Pour écrire sur la même ligne, il faut une "," après le i...
Mais la virgule exige alors d'être suivie par ce qui doit suivre ce i : d'où le end=" " : j'avais choisi l'espace, mais je peux en choir deux, troisn un "+", un "-", un "*", n'importe quelle combinaison de caractères...

Deuxième type de boucle, la boucle while (Tant que).
Syntaxe :
while condition est vraie :
Si je veux reproduire à l'identique le script Fibonnaci avec une boucle while et non for, je suis contraint de gérer moi-même mon compteur i et donc de l'initialiser :

Fibo1,Fibo2,i=1,1,1
print(Fibo2,end=" ")
while i<24:
    i=i+1
    fibo=Fibo1+Fibo2
    Fibo1,Fibo2=Fibo2,fibo
    print(fibo,end= " ")

J'en vois qui se grattent la tête : pourquoi 24 et pas 25 ?

Pour répondre, on prend la place de Python...
Supposons que i =23
23 <24 ?
Oui
donc
i=i+1 --> i =24
calcul
et retour à while :
24<24 ?
Non
La boucle s'arrête.
Avec 25, on aurait eu une itération (un tour) de plus...
Apparemment donc, on pourrait obtenir le même affichage en changeant la condition et sans utiliser de compteur, le suivant de 75025 étant supérieur à 100000 ?
La réponse est non, pas vraiment, on teste :

Fibo1,Fibo2,fibo=1,1,0
print(Fibo2,end=" ")
while fibo<100000:
    fibo=Fibo1+Fibo2
    Fibo1,Fibo2=Fibo2,fibo
    print(fibo,end= " ")

Résultat :
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 ...
Cherchez donc pourquoi, puis comment modifier la condition pour ne plus avoir 121393...

Opérations
+, -, * , /, //,  ** : addition, soustraction, multiplication, quotient décimal, quotient euclidien, puissance...
sont disponibles de base...
Pour les autres :
racine carrée : sqrt()
exponentielle : exp()
logarithme de x : log(x,base)... Si base est omis, on a par défaut le log népérien.
sin(), cos(), tan(), asin(), acos(), atan()
(le nombre pi)
....
doivent être importées depuis le module math.
Syntaxe :

from math import *

On importe la totalité du module math : pas recommandé.
il vaut mieux importer selon nos besoins. Par exemple :

from math import log

Tiens (réservé aux matheux qualifiés), en Python, en une ligne écrire comment vous trouveriez le nombre de chiffres de n = 123456789876543211234567898765432101234567898765432100 en utilisant seulement int()  la  partie entière et log()...
Si vous savez le faire en maths, vous savez l'écrire en Python, en utilisant les mots-clés ci-dessus...


A suivre...


Arx Tarpeia Capitoli proxima...

Hors ligne

#2 28-10-2019 22:44:24

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 132

Re : Essai de mini-tuto Python

Salut,

typage dynamique = on peut déclarer une variable en cours de programmation, comme si on avait oublié ou alors, il faut bien penser à tout déclarer au début ?


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#3 28-10-2019 23:01:26

Maenwe
Membre confirmé
Inscription : 06-09-2019
Messages : 387

Re : Essai de mini-tuto Python

Bonsoir,

De mon point de vue c'est très claire ! Enfin du point de vue de quelqu'un qui utilise python depuis presque 2 ans, donc je ne sais pas ce que ça vaut.
Je suppose que tu vas le mettre dans une prochaine complétion de ce poste, mais je le propose quand même :) : parler des fonctions et/ou du package Mathplotlib pour afficher des trucs, comme des graphiques. C'est toujours plus rigolo un programme python avec des graphiques !

Et je rejoins tout ce qu'à pu dire (ou tout ce que j'ai pu lire tout du moins ^^) Yoshi sur Python, c'est très simple d'utilisation pour les maths tout du moins, et plein d'aide se trouvent très facilement sur internet. Pour dire la facilité d'apprentissage de python, il y a deux ans lorsque j'ai commencé à apprendre python, j'ai commencé peu après un projet plutôt ambitieux (environ 4 mois après) d'intelligence artificielle (si quelqu'un connait j'ai travaillé sur l'algorithme de Kohonen) que j'ai dans un premier temps programmé dans des cas simple puis dans un objectif de compression d'image, certes le programme est ""long"" (environ 200 lignes). Le programme a aboutit presque comme je le voulais, je n'ai juste pas réussi à agencer correctement la partie JPEG... Enfin bon, une chose est sûr, python ne demande pas des notions "inintelligible" d'informatique et est très facilement abordable. Mais voici quelques trucs un peu casse pieds que l'on ne peut rencontrer parfois même dans des programmes court (d'une dizaines de lignes) :
- Les bugs "simples" : le compilateur nous dit qu'il y a un problème mais on ne comprend pas l'erreur (cas très rare, au début peut-être lorsque l'on ne comprend pas trop les messages d'erreurs de python, et dans ce cas internet est notre ami)
- Les bugs "un peu moins simples et très ch****" : un peu la même chose qu'avant mais beaucoup plus fréquents. Il est dû à des conflits entre variables, entre noms de variables... Ce qui peut amener à passer plusieurs dizaines de minutes à se demander : "Mais où est cette erreur !". Et dans les programmes plus long (comme ceux de plus de 100 lignes), il est possible que ce genre d'erreurs nous fasse passer plusieurs heures.
- Les bugs "de conceptions" : Ceux où le compilateur nous dit "tout va bien" (et l'ordinateur arrive à faire tourner le programme) mais le résultat n'est pas le bon. Là ça veut dire : "tu as mal compris le problème que tu veux résoudre" ou "tu n'as pas programmé correctement le problème que tu veux résoudre" ou "tu as fais une erreur bête mais ne cause pas de problème pour la machines" ou ...

Les leçons que j'en ais tiré pour la programmation :
être très claire dans les programmes que j'écris
1- ne pas hésiter à sauter des lignes
2- faire des noms de variables claire
3- commenter (le commentaire se fait sur python avec le hashtag : #, le programme ne va pas prendre en compte ce qui est écrit après), des noms de fonctions claire)

@freddy, il est possible de déclarer des variable au milieu d'un programme (à peu près où on veut en fait, il y a juste une particularité avec les fonctions, lorsque l'on y définit une variable à l'intérieur, c'est une variable interne à la fonction comme l'incrément pour une boucle for), mais il reste souhaitable de le faire en début de programme pour sa clarté et pour pouvoir gérer plus facilement les possibles conflits entre elles (il peut arriver que dans un "long" programme on oublie que l'on ait déjà utilisé tel nom de variable et qu'on le réutilise pour un autre objet, comme par exemple, on utilise une variable de type ""nombre"" au départ et au milieu du programme on oublie (involontairement) que cette variable existe, et on l'utilise pour manipuler des matrices...)

Dernière modification par Maenwe (28-10-2019 23:17:00)

Hors ligne

#4 29-10-2019 12:11:16

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Bonjour,

Concernant les variables.
Je ne pense qu'il soit judicieux de parler trop tôt de la portée des variables, tant qu'on n'a pas vu la fonction ou de procédure.
Et je ne pense pas non plus, contrairement à ce qu'il se fait en Lycée, d'aborder ce problème trop tôt.
Donc, freddy tu peux créer une variable dont tu as besoin où tu veux quand tu veux, tu n'as de type à déclarer au début : Python s'adapte...Tant qu'une variable est utilisée pour se voir affecter une valeur, elle n'a pas besoin d'être initialisée...
Par contre, c'est indispensable dans toute écriture du type i = i+1, sinon, crac ! message d'erreur...

@Maenwe : Python ne dispose pas en natif d'un compilateur, i.e qui permettre de convertir un script Python en un programme autoexécutable sans Python. Python est un langage interprété, il est réputé lent...
Ce qui se discute ! En travaillant sur un programme pour LEG, j'ai pu multiplier par 10 sa portée tout en divisant par 10 son temps d'exécution...

Les tutos Python ça court non pas les rues, mais le net... Je veux m'attacher à produire quelque chose de différent, dans l'esprit des "Roues de secours" que je pondais (en Maths) pour ceux qui n'avaient pas compris le cours et que je ne voulais pas laisser dans le wagon qu'on était sur le point de quitter avec les autres...

Adoncques, je vais poursuivre, sans dévier de ma route...

Avant de continuer, je veux préciser 3 points :
* toute ligne qui contient une déclaration de bloc comme les instructions de boucle, les tests condionnels avec if:... elif:... else :
sont terminées par deux points et les suivantes doivent être indentées.
* Oui, il faut commenter ce que l'on fait mais de façon non triviale. Je ne l'ai pas fait, volontairement, dans les scripts présentés.
* Avant de penser à traduire un Algorithme en Python (ou tout autre langage d'ailleurs), il faut pouvoir avec crayon/papier l'écrire en pseudo-code  (langage naturel : AlgoBox est presque du pseudo-code) et lorsqu'on est satisfait (ce qui n'est pas une garantie tous risque de bon fonctionnement) passer à la phase du vrai codage à l'écran.

Donc je reviens au code de Fibonacci...
Je l'ai d'abord écrit avec AlgoBox pour qu'il soit le plus clair possible...
J'avais dans l'idée d'écrire les 24 premiers termes de la suite des nombres de Fibonacci 
1 2 3 5 8 13 21 34....
Je vois que j'ai besoin de 3 variables : le terme en cours et les deux qui le précèdent : sans eux pas de calcul du terme en cours
Je les ai appelés Fibo1, Fibo2 et fibo...
A noter que Python est sensible à la casse : fibo1, ne serait pas la même variable que Fibo1, "piège" classique, les doigts dérapent facilement sur le clavier...
A la main, dès que j'ai 1 et 2, la pompe est amorcée : 1 + 2 --> 3 ; 2 + 3 --> 5 ; 3 + 5 --> 8...
Informatiquement, ce ne sera pas aussi simple :
Fibo1 = 1, Fbo2=2  et fibo = 1 + 2 =3 jusque-là pas de souci...
Mais ensuite, il faut que j'aie Fibo1 = 2, Fibo2 = 3 pour calculer fibo = 2 + 3...
Donc Fibo1 prend la valeur de Fibo2 et Fibo2 celle de fibo afin de pouvoir calculer  fibo= Fibo1+Fibo2
Ce qui m'oblige à écrire
fibo=Fibo1+Fibo2
Fibo1=Fibo2
Fibo2=fibo
Ainsi au début de l'itération suivante, avant calculs,  j'aurai la situation suivante
Fibo1   Fibo2    fibo
  2          3         3
Après calcul, j'aurai remplacé fibo par 2 +3 = 5 et affiché 5...

Et j'ai fini par remplacer les deux dernières lignes d'affectation par une seule :
Fibo1,Fibo2=Fibo2, fibo...
Alors, au début de l'itération suivante, avant calculs,  j'aurai la situation suivante
Fibo1   Fibo2    fibo
   3        5         8
J'aurai affiché 8...

Parmi les opérations directement accessibles sans importation depuis le module math, il y a encore :
le modulo :--> %  print(2018% 3)--> 2
Et une qui permet d'obtenir en une fois, quotient euclidien de la division euclidienne de a par b  : q,r=divmod(a,b)
print(divmod(2018,3))--> (672,2) un couple (désigné sous le terme générique de tuple en Python, n-uplet en Maths)

En utilisant une boucle, et avec le minimum de lignes, écrire la façon d'obtenir le PGCD de a=62 et b=72, par l'algorithme d'Euclide...

On réinvente la roue, s'pas, puisqu'il suffit d'importer le calcul du pgcd depuis le module fractions :

from fractions import gcd

freddy, tu es familier de la structure de boucle, mais pour le sieur Zebulor, j'aimerais avoir des retours...

Maintenant, il est temps de se pencher sur les opérateurs de comparaison :
<, > , <=, >=, != ($\neq$), ==
Ce dernier est une source d'erreurs d'inattention constantes
* = est l'opérateur d'affectation  a = 2 : a prend la valeur 2
* mais == est l'opérateur "comparateur d'égalité".
   print(2==3) renvoie False
   print(2.5==5/2) renvoie True

Cela dit, à cause du problème de la représentation des nombres en virgule flottante, les comparais d'égalité entre nombres à virgules est toujours douteuse...
Par exemple :
print(0.4-0.2==0.3-0.1) renvoie False...
Pourquoi ? Réponse : print (0.3-0.1) renvoie 0.19999999999999998

On a eu un zèbre ici, Extrazlove, fan des extraterrestres et adepte de la théorie du complot qui avait remarqué cela et qui criait, sur tous les toits, à la conspiration mondiale : on nous cachait quelque chose avec ces "nombres interdits"...

Si l'on parle comparaisons, il est incontournable d'aborder la structure :

if condition1 :
    instructions
elif condition2:  # elif est la contraction de else if, sinon si
    instructions
elif...:          #  autant de elif que vous voukez
............
else:             # sinon
    instructions

C'est d'ailleurs avec les if que se produisent le plus souvent les "confusions" entre a = b et a==n :
if a=b: déclenchera un message d'erreur vous signalant que c'est plutôt if a==b: qu'il fait écrire.

Par la méthode de dichotomie, en utilisant une boucle et la structure if... else calculer la racine carrée entière de 324546.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 29-10-2019 12:33:49

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 132

Re : Essai de mini-tuto Python

Hello et merci !

Ce que je comprends aussi est que si je veux voir le résultat d'un calcul, il faut impérativement que j'utilise la fonction print, mais qu'elle est sa structure ? Pour l'indentation, je pense avoir compris, et je pense avoir vu aussi qu'il faut laisser la dernière ligne du code vide, tu confirme ?
Oui, pour les boucles, je connais un peu, mais en revanche, on va de combien à combien, il s'arrête de calculer à quel moment ? J'avais compris une fois qu'il y avait une subtilité (le calcul n'est pas fait pour la dernière valeur et on sort de la boucle, alors que dans d'autres langages, il calcule pour la dernière valeur puis s'arrête)


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#6 29-10-2019 13:58:40

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Re,

Le print() est depuis les versions 3.x devenu une fonction
Dans print() on peut mélanger texte et valeurs uomériques:

q,r=divmod(2018,3)
print("Le quotient de la division euclidienne de 2018 par 3 est",q,"son reste :",r)

renvoie :

Le quotient de la division euclidienne de 2018 par 3 est 672 son reste : 2

Tout est écrit sur la même ligne, grâce aux virgules.
Je concentre ce que j'ai écrit dans mon 1er texte.
2 affichages possible
- en colonne :

  for i in range(5):
      print(i)

   affiche :
   0
   1
   3
   4
- en ligne
  beaucoup de variantes possible au gré de tes envies
  * standard  :
   

  for i in range(5):
      print(i,end=" ") # ajoute une espace après chaque chiffre

    0 1 2 3 4 5
  * personnalisé
    au lieu de mettre une seule espace, on peut en mettre deux (ou plus)entre les ""
    0  1  2  3  4  5
    tu peux les séparer par virgule + espace
   

  for i in range(5):
      print(i,end=", ") # ajoute une virgule espace après chaque chiffre

    0, 1, 2, 3, 4,
    C'est là qu'on voit le revers de la médaille...
    Encore plus visible si je remplace l'espace par autre chose, par exemple _
       

  for i in range(5):
      print(i,end=", ") # ajoute une virgule espace après chaque chiffre

    0,_1,_2,_ 3,_ 4,_
    Disgracieux, voire gênant...
    Contournable, par ex, par ajout de
   


    if i<4:
        print(i,end=",_")
    else:
        print(i)

Quant à la boucle for, en Basic on écrivait
FOR i = 0 TO 4
mais en sortie de boucle, que constatait-on ? que i =5 !
- Avec i=4, il avait fait i=i+1 =5
- Comparaison i : i >4 oui, on sort de la boucle...

En Python, range(5) désigne l'intervalle $[1\,;\,5[$ de $\mathbb N$
et les valeurs ne sont pas calculées en bloc, mais l'une après l'autre
for i in range(5):
pourrait se traduire par
$\forall i \in [0\,;\,5[, i \in\mathbb N$
Donc si ru veux vraiment aller jusqu'à 5, il faut écrire

for i in range(6):

...

Si par dernière ligne du code vide tu entends absence de next (pour boucle for), de end ou end while (boucle while), end if pour structure if... else, alors oui, sinon la ligne vide permet d'aérer ton code...
J'avais écrit :

Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(2,25):
    fibo=Fibo1+Fibo2
    Fibo1,Fibo2=Fibo2,fibo
    print(fibo,end= " ")

Les deux permettent d'obtenir :
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025

Si vous décaliez la 6e ligne pour que son 1er caractère  soit aligné verticalement avec le 1er caractère de chacune des 3 premières lignes, l'affichage serait limité à : 1 75025...
En supprimant l'indentation de la 6e ligne, vous auriez sorti l'affichage des valeurs intermédiaires de la boucle...
Voilà à quoi sert l'indentation...

Ce qui correspondait au code suivant :

Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(2,25):
    fibo=Fibo1+Fibo2
    Fibo1,Fibo2=Fibo2,fibo
print(fibo,end= " ")

Si tu cliques sur citer, ru verras que la dernière ligne n'est pas vide...

Je vois qu'en fin de tuto il faudra que je crée un lexique alphabétique reprenant sans fioritures les mots-clés, leurs syntaxes et utilisations...

@+

Dernière modification par yoshi (29-10-2019 19:17:31)


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 29-10-2019 14:31:37

Zebulor
Membre
Inscription : 21-10-2018
Messages : 951

Re : Essai de mini-tuto Python

Bonjour les Djeun'z,
chui la chui là..j'ai lu en vitesse le 1er post de Yoshi ce matin, trop occupé à répondre à un autre 'sieur et par des révisions de ..physique.

@Yoshi : Merci pour cette introduction.
Sur la forme ça donne envie de tout lire car bien équilibré entre explications et illustrations colorées..
Sur le fond  : Le typage dynamique me faisait peur mais je vois que Freddy a expliqué ce que c'est..
Quant à la structure de la boucle, sans en être familier, je la comprends pour avoir programmé en BASIC dans les années Mitterrand (pour changer de Hollande toujours présent sur ce site).
En écrivant les valeurs de Fibo, fibo1, fibo2 pour chaque i je m y retrouve. Si j'ai bien compris Le print sert à écrire la nouvelle valeur Fibo et ajoute un espace..; en prévision du print de la boucle suivante.
Question :

yoshi a écrit :

En supprimant l'indentation de la 6e ligne, vous auriez sorti l'affichage des valeurs intermédiaires de la boucle...
Voilà à quoi sert l'indentation...

"sorti" : tu veux dire supprimer ? donc on a plus que le dernier nombre 75020 . ok je comprends.
En tout cas ca semble bien plus clair que les pseudos cours d 'informatique que j'avais en fac et ailleurs…

PS  : Je vais relire ce que tu as écris pour les fins de boucle ("fin-1") .. c'est une subtilité qui m'échappe..

Dernière modification par Zebulor (29-10-2019 15:25:11)

Hors ligne

#8 29-10-2019 18:09:14

LEG
Membre
Inscription : 19-09-2012
Messages : 518

Re : Essai de mini-tuto Python

Bonjour

("Une petite intro : concernant mon programme de base en Python je dirai qu'il a été multiplié par 50 et un temps divisé par 1000  , au départ il ne dépassait pas le 1000 000 000
ensuite tu l'as simplifié en ne travaillant que dans un famille fixé ce qui a permis d'aller à 150 000 000 000 . puis une personne aussi intéressé que toi la retranscrit en C++ , résultat 15 000 000 000 000 en moins d'une heure , pour un crible c'est pas mal du tout ...")

En lisant tes explications et ce que j'ai pu apprendre avec toi en python , étant à la base complètement nul et autant en anglais ce qui n'arrange pas les choses , je comprend quand même l'idée ; Mais pour un profane il y a des points de bases à vraiment connaître :

1) l'indentation qui change après chaque fonction , ou en dessous de chaque fonction.

2) les lignes print par rapport à ce que l'on veut faire apparaître ne se place pas n'importe où, on le voit dans tes deux exemples...avec fibo..et print avec la même indentation ou pas ??? après la fonction  (for i in range(2,25):)

3) certaines fonctions doivent avoir une indentation différente suivant où la fonction est placé :
exemple : la fonction else


if i<4:
        print(i,end=",_")
    else:
         print(i)
 

Je pense que si à la base on ne maitrise pas bien l'indentation  on va galérer , c'est le problème que j'ai rencontré et le reste vient assez vite avec de bonnes explications....

4) quand tu parles du pas dans l'instruction :

for nom_de_la_variable_compteur in range (debut, fin, pas):

le pas: est une variable qui est fixé au départ de la chaine d'instruction , je suppose que dans ce cas précis le pas = fibo1+fibo2, etc fibo2+fibo3...fibo(n) + fibo (n+1)

5) il est vraie que d'écrire ce que fait chaque bloc d'instruction permet de bien appréhender son programme ou sa façon de programmer...

Ton exemple : # ajoute une virgule espace après chaque chiffre

Souvent elle permet d'expliciter ce que va faire le bloc de fonction par exmple:

def E_Crible(premiers, n, fam):

# On génère un tableau de N/30 cases rempli de 1
# On calcule les produits: j = a * b

j'arrête là ....

Dernière modification par LEG (29-10-2019 18:11:07)

Hors ligne

#9 29-10-2019 19:25:26

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Re,

@zebulor
subtilité ? non... Les concepteurs de Python ont fait un choix qui est justifiable mais même s'il peut être discuté, ça n'y changera rien. Alors...
freddy avait le même souci que toi :
je lui ai répondu ceci :

Quant à la boucle for, en Basic on écrivait
FOR i = 0 TO 4
mais en sortie de boucle, que constatait-on ? que i =5 !
- Avec i=4, il avait fait i=i+1 =5
- Comparaison i : i >4 oui, on sort de la boucle...

En Python, range(5) désigne l'intervalle $[1\,;\,5[$ de $\mathbb N$
et les valeurs ne sont pas calculées en bloc, mais l'une après l'autre

for i in range(5):

pourrait se traduire par
$\forall i \in [0\,;\,5[, i \in\mathbb N$
Donc si tu veux vraiment aller jusqu'à 5, il faut écrire

for i in range(6):

...

C'est plus clair comme ça ?

@LEG
Dans une boucle for, le pas c'est l'incrément du compteur :

for i in range(0,11,2):
    print(i,end=" ")

affiche
0 2 4 6 8 10

for i in range(1,11,2):
    print(i,end=" ")

affiche
1 3 5 7 9
et s'arrête à 9 parce que le suivant 11 est "out of range"

Dans le cas où on a une deux boucles enchâssées, le pas de la 2e déterminé dans la 1ere

for j in range(4):
    pas=pas*3
    for i in range(0,100,pas):
        print(i,end=" ")
    print() # pour forcer le retour à la ligne après la sortie de la boucle i

qui renvoie :
0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
0 9 18 27 36 45 54 63 72 81 90 99
0 27 54 81
0 81
A noter que le pas de 1ere ligne est de 3, de 2e ligne : 9, de 3e ligne 27, de 4e ligne 81...
Et on peut aussi constater qu'après le 99 de 1ere ligne, 99 de 2e ligne 81 de 3e ligne, quand la 2e boucle reprend à 0, le 0 est retourné à la ligne...
C'est le boulot du 2e print()... indenté correctement !
Pourquoi est-ce nécessaire ?
Copier le code
Aller sur https://pynative.com/online-python-code … thon-code/
Coller le code dans la fenêtre
Mettez un # devant le p du print()
Cliquez sur le triangle pointe à droite...
Que voyez-vous ?
Ça :
0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 0 9 18 27 36 45 54 63 72 81 90 99 0 27 54 81 0 81, pas de retour à ligne...
Diable ! Pourquoi ça ?
Le 99 de 1ere ligne a été écrit par print(i,end=" ") qui gère ce qui se passe après l'affichage du 99. En l'abscence d'instruction contraire, le 0 qui était sur la 2e ligne a été cette fois affiché à la suite...
Le print() devait écrire sur la même ligne que le 99, mais il était vide :
- il n'a donc rien écrit
- de plus, comme le end=" " n'était pas spécifié, il a "écrit du vide" puis le curseur s'en est allé se positionner en début de ligne suivante

Oui, l'indentation c'est la pierre angulaire de Python...
Ceci ne pouvait marcher :

if i<4:
        print(i,end=",_")
    else:
         print(i)

else est précédé de if et sont sur la même verticale :


    if i<4:
        print(i,end=",_")
    else:
        print(i)

Je n'avais pas vérifié l'affichage (pourtant, je le sais) c'est une blague des balise code :
pour obtenir un affichage correct, je ne dois plus écrire quoi que ce soit sur la même ligne que la balise, il a suffi que j'écrive à la ligne suivante pour que cela redevienne correct...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 30-10-2019 09:49:02

Zebulor
Membre
Inscription : 21-10-2018
Messages : 951

Re : Essai de mini-tuto Python

re,
@Bonjour Yoshi. Je ne me souvenais plus qu'en BASIC le compteur était incrémenté de 1 en sortie de boucle.
Oui c'est plus clair comme ça avec l'analogie mathématique. Merci

Hors ligne

#11 30-10-2019 09:56:43

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 132

Re : Essai de mini-tuto Python

Zebulor a écrit :

re,
@Bonjour Yoshi. Je ne me souvenais plus qu'en BASIC le compteur était incrémenté de 1 en sortie de boucle.
Oui c'est plus clair comme ça avec l'analogie mathématique. Merci

Salut,

le pas de 1 est par défaut, sinon, tu peux faire type $+p$ ou $-q$, tout dépend de ton besoin.

@yoshi : j'ai vu que pour certains calculs, tu faisais appel à des fonctions que tu importes. Elles sont dans de nombreuse bibliothèques distinctes, regroupées par thème, genre : algèbre, arithmétique, statistiques, ... ? ou il faut importer tout le catalogue ?

Par exemple, je veux faire un calcul de proba pour les grilles de l'Euromillions. J'ai besoin de faire du dénombrement. Il faut que je programme mon calcul factoriel avec les bonnes boucles ou bien il y a des fonctions types à importer ?


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#12 30-10-2019 10:59:28

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Salut m'sieu freddy,

Oui, il y a des bibliothèques spéciales : combinaisons, permutations pour éviter de réinventer la roue...
En Python, il y a des bibliothèques pour à peu près tout ce que tu veux faire :
- soit elles sont livrées avec et alors, il suffit de savoir ce que tu veux et tu l'importes
- soit elles sont disponibles à l'extérieur et alors on va les chercher et on les installe (c'est un peu pénible à faire par contre):   
  * dédiées au calcul scientifique numpy+scipy (scipy équivalent matlab), matrices (déterminant, diagonalisation, pivot de Gauss...)
  * dédiées à l'affichage de toutes sortes sortes de graphiques : matplotlib
  * dédiées au traitement des pdf
  * dédiées à la gestion des sites web
  * cryptographie

Si tu es curieux, va voir ce que la doc Python raconte sur le module itertools (intégré à Python) :
https://docs.python.org/fr/3/library/itertools.html.
La factorielle, elle, figure dans le module math intégré  :


from math import factorial

print(factorial(150))

renvoie (instantané) :

57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000

Moyennant la connaissance du module decimal on peut travailler avec 1000, 10000, 30000 décimales sans souci...
Sans rien importer, Python peut gérer sans souci des entiers de  dizaines de milliers de chiffres...

Python est tellement vaste que je ne pense pas en connaître plus de 10%...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#13 30-10-2019 11:14:10

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Bonjour,

Réponses en spoilers...

Calcul du PGCD de deux nombres

En utilisant une boucle, et avec le minimum de lignes, écrire la façon d'obtenir le PGCD de a=162 et b=72, par l'algorithme d'Euclide...


a,b=162,72 # dans l'ordre croissant
a0,b0=a,b

while b>0:
    a,b=b,a%b
print("Le PGCD de",a0,"et",b0, "est :",a)

renvoie :

Le PGCD de 162 et 72 est : 18

Au vu de la forme de la réponse que je veux et comme a et b seront modifiés, je garde les valeurs initiales en double dans a0,b0
La division de a par b faite, je refais une division en divisant le précédent diviseur qui devient Dividende par le reste
Donc a prend la valeur de b et b le reste de $a\div b$ : a,b=b,a%b
Le test d'arrêt est le reste 0 et le dernier diviseur est le PGCD cherché : ça c'est valable à la main...
Si je teste
Avant de rentrer dans la boucle, j'ai :
a,b=162,72
b>0 ? Oui, on continue
a,b=72,162%72 soit a,b=72,18
On remonte vérifier si on s'arrête là :
b>0 ? Oui, on continue
a,b=18, 72%18 soit 0
On remonte vérifier si on s'arrête là :
b>0 ? Non, on quitte la boucle et le PGCD est a

racine entière par dichotomie
n=324546
a,b=500,600

while b-a>1:
    m=(a+b)//2
    if m**2>n:
        b=m
    else:
        a=m
if m**2>n:
    m=m-1
print("la racine carrée entière de", n, "est :",m)

J'encadre d'abord cette racine entre deux entiers

Je vois que 324546 est supérieur à $30000 =30\times 10^4$
Donc sa racine entière est supérieure à $100\sqrt{30}$
Les tables de multiplication suffisent pour prendre : borne inférieure 500 et borne supérieure 600, voilà pour a,b=500,600...
Je vais donc boucler tant que l'écart entre bornes inférieure et supérieure est supérieur à , voilà pour la définition de la boucle :
while b-a>1:
Je calcule ensuite la partie entière de la moyenne arithmétique des bornes : m =(a+b)//2 (// donne le quotient entier)
Ce sera ma racine carrée entière.
Et maintenant je compare m2 à n...
Si m2>n ma racine est trop grande, donc je la prends comme borne supérieure b=m, la borne inférieure a restant inchangée...
sinon
la borne inférieure a devient a=m, la borne sup b ne change pas
Une fois la condition vérifié, on sort de la boucle...
Après essais, je me suis aperçu que, si le nombre n était un carré parfait, à cause de l'utilisation du quotient entier, il arrivait que la racine calculée soit supérieure de 1.
Donc test en sortie...
Moyennant quoi le script renvoie :

la racine carrée entière de 324546 est : 569

nombre de chiffres

from math import log
n = 123456789876543211234567898765432101234567898765432100
print("Le nombre",n,"possède", 1+int(log(n,10)),"chiffres.")
 

renvoie :

Le nombre 123456789876543211234567898765432101234567898765432100 possède 54 chiffres

En effet, $\log_{10}(10)=1$ donc $(log_{10}(10^3)=3$
Mais $10^3$ possède 4 chiffres, il faut donc ajouter 1.
ET un nombre aura 4 chiffres de 1000 (103) à 9999 et ne passera à 5 chiffres qu'à 10000 (105) :
$\forall n \in \mathbb N,\; n \in [10^3\,;\,10^4[\;: \; 3\leqslant \log_{10}(n)<4$
La partie décimale du log  ne nous intéressant pas, on en prend la partie entière

D'où la formule Python : $1+\int(\log(n,10))$

@+

Dernière modification par yoshi (30-10-2019 12:11:39)


Arx Tarpeia Capitoli proxima...

Hors ligne

#14 30-10-2019 14:27:49

Zebulor
Membre
Inscription : 21-10-2018
Messages : 951

Re : Essai de mini-tuto Python

Re Yoshi,
j'en suis encore au début mais quand tu écris :

yoshi a écrit :
Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(2,25):
    fibo=Fibo1+Fibo2
    Fibo1=Fibo2
    Fibo2=fibo
    print(fibo,end= " ")

ça donne le même résultat :

Fibo1,Fibo2=1,1
print(Fibo2,end=" ")
for i in range(1,24):
    fibo=Fibo1+Fibo2
    Fibo1=Fibo2
    Fibo2=fibo
    print(fibo,end= " ")

Car i n'est qu'un compteur si j'ai bien compris.

Hors ligne

#15 30-10-2019 15:29:21

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Salut,

Oui, c'est même un... compte-tours !
Alors, que ce soit de 2 à 25 ou 1 à 24, cela fait 24 tours
Donc il affiche 24 nombres de 2 à 75025 en plus du 1 initial avant l'entrée en boucle...
Soit 25 en tout...

Alors pourquoi l'un plutôt que l'autre ?
En fait après vérification, quel que soit le site où je cherche la suite des nombres Fibonacci, celle-ci commence ainsi :
1 1 2 3 5  et moi, j'ai fait afficher 1 2 3 5...
Je n'avais corrigé un détail...
Le script original commençait ainsi :


Fibo1,Fibo2=1,1
print(Fibo1,Fibo2,end=" ")
for i in range(2,25):

Et avant de vous le proposer (en AlgoBox et en Python) j'ai corrigé l'affichage en "sucrant" l'affichage d'un 1 qui ne me plaisait pas (j'avais tort !)
C'eut été plus logique de ne pas faire la modif, même si ça ne change rien... Pourquoi ?
Parce que commençant le décompte par i=2, le 2, valeur de fibo affichée, devait être le 3e nombre de la liste (de i=0 à i = 2, ça fait 3 : par défaut le début du compteur de boucles est 0)...
Or moi, j'affiche seulement 1,2 et non 1, 1, 2, donc le 2 est le 2e liste et le non le 3e...
Purisme quand tu nous tiens.
Donc , en ne commençant qu'avec 1, 2, la 2e version avec de i = 1 à 24 est plus "logique"...
Il y a un autre inconvénient par rapport à la suite officielle, j'y reviendrais au moment où j'évoquerai les listes (sortes de tableaux) en Python...

Donc, oui, tu as parfaitement compris !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#16 30-10-2019 15:54:08

Zebulor
Membre
Inscription : 21-10-2018
Messages : 951

Re : Essai de mini-tuto Python

@Yoshi. Ok merci.
Mentalement : for i in range(1,24)=for i in range[1,24[

yoshi a écrit :

Salut,
Oui, c'est même un... compte-tours !
Alors, que ce soit de 2 à 25 ou 1 à 24, cela fait 24 tours
Donc il affiche 24 nombres de 2 à 75025 en plus du 1 initial avant l'entrée en boucle...
Soit 25 en tout...

euh  ... for i in range(1,24) ça fait.. 23 tours non? puisqu'il y a 23 nombres de 2 à 75025. Là je me sens comme Yann..

Dernière modification par Zebulor (30-10-2019 16:03:54)

Hors ligne

#17 30-10-2019 17:12:06

LEG
Membre
Inscription : 19-09-2012
Messages : 518

Re : Essai de mini-tuto Python

pour les nombres de Fibonacci en partant de 1, il y a 23 itérations , et il me semble même qu'à l'origine
ça commence ainsi : pour n = 0 et n+1 = 1:

  soit 0 +1 =1 première itération
1+1 = 2
1+2 =3

etc
la dernière et 23ème :

28657 + 46368 = 75025   ce qui donne 23 itérations, mais 24 nombres car le dernier est le résultat de la 23ème itération...
la fonction [for in range (1,24) va bien afficher les 24 résultats en partant du 1 ce qui sous entend la première itération 0+1 = 1 et la 23 ème:  28657 + 46368

si on part de 2 et pour for in range (1,25) il y aura 25 nombres pour 24 itérations car le 25 ème nombre serra 46368 + 75025 = 121393 si on compte le 1
sous entendu la première itération = 0+1 =1

Mais pour : for in range(2,25) si il affiche 24 nombres , cela veut dire qu'il va jusqu'à la 23 itération en partant de 2 ; mais il compte en commençant par 1 jusqu'au 25 ème nombre

Donc ou est l'astuce ???

si j'ai bien retenue la leçon .... sinon je vais prendre des coups de Bâtons...

Dernière modification par LEG (30-10-2019 17:41:55)

Hors ligne

#18 30-10-2019 19:25:02

Zebulor
Membre
Inscription : 21-10-2018
Messages : 951

Re : Essai de mini-tuto Python

Je crois avoir mal lu :

yoshi a écrit :

Donc il affiche 24 nombres de 2 à 75025 en plus du 1 initial avant l'entrée en boucle...

Je vais me prendre des coups de Bâtons aussi!

Autre chose :

yoshi a écrit :
for j in range(4):
    pas=pas*3
    for i in range(0,100,pas):
        print(i,end=" ")
    print() # pour forcer le retour à la ligne après la sortie de la boucle i

Donc pas=1 par défaut à l'entrée de la boucle j si j'en crois freddy. Si j'ai bien compris, toute variable "qui débarque" dans un programme vaut implicitement 1, sauf à être initialisée avec une valeur différente par le programmeur.

Dernière modification par Zebulor (30-10-2019 19:40:34)

Hors ligne

#19 30-10-2019 19:49:54

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Re,

Non, c'est sur mes doigts que je dois taper...
Que ne suis-je une femme ? La mienne ne cesse de me répéter que seules les femmes ont la capacité de faire plusieurs choses à la fois...
Et j'ai encore un post commencé que je n'ai pas terminé !
Dont acte.
Reprenons : range(2,25) ou range(1,24) cela fait effectivement 23 itérations.
Les fibo effectivement calculés de 2 à 75025 sont au nombre de 23.
En calculant un fibo par tour, 23 tours --> 23 fibo...
Si j'affiche Fibo2, seul, avant ma suite comporte 24 termes.
Si avant d'entrer dans la boucle, j'affiche Fibo1, puis Fibo 2, et enfin les fibo calculés, j'ai :
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025
cela fait 25 termes...
Je vais anticiper un un petit peu, si je stocke ces nombres dans une liste, j'ai alors
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025]
Pour coller à cela, j'aurais dû appeler Fibo1 et Fibo2, respectivement Fibo0 et Fibo1...
Et, là aussi, indexation commence à 0
Si je demande l'affichage du 6e terme de la liste, c'est le 8, son index dans la liste est 5 puisqu'on commence à 0.

la fonction for in range (1,24) va bien afficher les 24 résultats(...)

Non, la boucle (et non fonction) n'affiche que 23 résultats.
Si avant la boucle
- j'écris : print(Fibo2,end=" "), l'affichage final comportera 24 nombres dont seuls les 23 derniers auront été calculés...
- j'écris : print(Fibo1,Fibo2,end=" "), l'affichage final comportera 25 nombres dont seuls les 23 derniers auront été calculés.
Le i est un simple compteur, il n'intervient pas dans les calculs : seules comptent les 3 variables  Fibo1,Fibo2 et fibo.
Si je modifie une (ou les 2) valeurs de départ, je ne suis plus dans la suite de Fibonacci...
Donc j'aurais dû écrire


Fibo0,Fibo1=1,1
print(Fibo0,Fibo1,end=" ")
for i in range (2,25):
    fibo=Fibo0+Fibo1
    Fibo1,Fibo0=fibo,Fibo1
    print(fibo,end=" ")

qui renvoyait :

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025

Et je reprends ce que j'avais dit à zebulor en le complétant :
l'index du nombre 2 dans cette liste est 2, mais c'est le 3e affiché (on commence à l'index 0)...
Même si ça ne change pas les résultats pour une question d'éthique, de cohérence,  je préfère commencer ma boucle à i =2...

Et emporté par mon élan, ce que je comptais dire à Yann, le post en route, la correction, que je comptais opérer, des fautes de frappe dans une réponse, le temps qu'il me faut pour rédiger une réponse, j'ai perdu de vue que range (2,25) c'est $[2\,;\,25[$ soit encore $[2\,;\,24]$, donc 23 itérations...
Toutes mes excuses.
C'est relativement rare, mais il m'arrive de faillir !

En particulier pour LEG, parce que je pense que freddy et Zebulor, connaissent déjà :
http://villemin.gerard.free.fr/Wwwgvmm/ … boLapi.htm

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#20 30-10-2019 20:45:19

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Re,

Bon, on va délaisser les nombres es qualité pour un moment...
En dehors des nombres on peut aussi manipuler des "objets" désignés sous le nom générique de "caractères alphanumériques"... Ils se distinguent des nombres par le fait qu'ils sont encadrés par des guillemets anglais "...


a="C'est moi !"
print(a)
print(type(a))

Renvoie :

C'est moi !
<class 'str'>

N-B :
type(objet) demande le type de l'objet
str est l'abréviation de l'anglais string qui, en programmation (et en français) se traduit par chaîne (de caractères)
Mais... peut-on transformer un nombre en chaîne puisque j'ai employé l'adjectif "alphanumériques"...
Oui, grâce au mot-clé str :


a=1234
b=str(a)
print (a,b)
print (type(a))
print(type(b))

renvoie :

1234 1234
<class 'int'>
<class 'str'>

int pour integer, entier...
A l'affichage, pas de différence visible entre les deux types...
Pourtant Python dit que si (c'est à l'affichage que c'est dû).
Alors Python n'aime pas que l'on mélange les types...
Ajouter un integer et un string est aussi saugrenu pour lui que pour nous d'essayer d'additionner (au sens arithmétique) 2 choux et 3 cheveux...
Essayer, c'est le plantage assuré.
Pourtant, il veut bien que l'on mette un + entre 2 strings

print("ABRA"+"CADBRA")

retourne : ABRACDABRA

Ce n'est pas de l'arithmétique, c'est de la concaténation...

A=""  # je déclare que A est une chaîne vide
for i in range(4):
    A=A+"A_1@""
print (A)

donne :
A_1@A_1@A_1@A_1@
Tiens...
il y a 4 tours (de 0 à 3)
et 4 fois la chaîne "A_1@"...J'ai donc fait
A="A_1@"+"A_1@"+"A_1@"+"A_1@" ?
Oui !
Hmmmm....
Mais $5+5+5 = 5 \times 3$...
Est-ce que.... ?
Bin yaka essayer :
print("ABCDf"*4) donne ABCDfABCDfABCDfABCDf...
Et maintenant que la fête commence...
Les éléments des chaînes ont aussi un index, il commence aussi à 0
On peut accéder à n'importe quel élément en donnant son index.
Syntaxe : mot[index]
Exemple

adjectif_chiraquien="ABRACADABRANTESQUE"
print(adjectif_chiraquien[12])

nous donnera T (13e lettre)

Mais je peux prélever une tranche (slice) plus ou mois longue, comme ceci

adjectif_chiraquien="ABRACADABRANTESQUE"
print(adjectif_chiraquien[12:15])

Et là, c'est encore la même musique : le 15 est exclu...
On obtient :
TES...
Et si je veux aller jusqu'à la fin ?
Soit vous connaissez la longueur n du mot et alors vous demandez :

print(adjectif_chiraquien[12:n-1])

Soit vous ne la connaissez pas et alors, vous demandez à Python de se débrouiller sans vous :

print(adjectif_chiraquien[12:])

vous laissez le 2e index vide
Dans les deux cas, la réponse est : TESQUE...
Tout aussi drôle, vous pouvez demander à Python d'épeler chaque élément l'un après l'autre sans connaitre la longueur de la chaîne non plus.


adjectif_chiraquien="ABRACADABRANTESQUE"
for element in adjectif_chiraquien:
    print(element,end=" ")
 

qui donne :
A B R A C A D A B R A N T E S Q U E
Vous voulez les 3 dernières lettres ?


adjectif_chiraquien="ABRACADABRANTESQUE"
print(adjectif_chiraquien[-3:])
 

Résultat : QUE
Et


adjectif_chiraquien="ABRACADABRANTESQUE"
print(adjectif_chiraquien[:-3])
 

c'est possible ?
Yaka essayer :
ABRACADABRANTES
Tout sauf les 3 dernières !

Bon, cela dit, on peut connaître la longueur d'une chaîne :

adjectif_chiraquien="ABRACADABRANTESQUE"
print(len(adjectif_chiraquien))

len, abréviation de length, longueur
Réponse : 18

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#21 31-10-2019 07:24:36

LEG
Membre
Inscription : 19-09-2012
Messages : 518

Re : Essai de mini-tuto Python

Salut à tous là il y a quelque chose qui m'échappe
si on écrit le résultat , avec un intervalle fermé [a,c] dans un tel cas le a,b et c sont pris en compte non ?

Dans ton exemple:

Mais je peux prélever une tranche (slice) plus ou mois longue, comme ceci

adjectif_chiraquien="ABRACADABRANTESQUE"
print(adjectif_chiraquien[12:15])

Et là, c'est encore la même musique : le 15 est exclu...
On obtient :
TES...

pourquoi que les trois lettres TES alors que l'on devrait avoir au minimum TESQU ou peut être TESQUE  au maximum ??

ie: la fonction print(adjectif_chiraquien[12:15]) oublie des lettres ???

Car la 12ème lettre est bien pris en compte, ton EX au dessus, avec la lettre T de l'intervalle, print(.......[12]) oublie ou erreur de manip ?

Dernière modification par LEG (31-10-2019 07:28:40)

Hors ligne

#22 31-10-2019 08:41:13

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Re


Les gaffes, c'est pas tous les jours, hein !!!

Quand j'écris [12:15] en Python, ce n'est pas la notation mathématique, c'est une notation Python, il s'agit d'un opérateur spécifique...
1. La notation mathématique serait $[12\,;\,15[$, index 15 exclu
2. On va chercher la tranche plage (c'est plus joli)  comprenant les lettres d'index 12, 13 et 14
3. L'indexage en Python commençant à 0, ce sont en fait les 13e, 14e et 15e du mot (nous, humains, lorsque nous comptons nos liasses de billets de cinq cents euros ^_^, on commence à 1, pas Python...
                A   B   R   A   C   A   D   A    B    R    A    N    T     E     S    Q    U    E
    Index    0   1   2   3   4   5   6    7    8    9   10   11  12   13   14   15   16  17

   Si je demande à l'un d'entre vous (ou à un enfant) de me dire  quelle est la 5e lettre, il me répondra : C.
   Mais, pas Python...
   La 5e lettre a pour index 4 (de 0 à 4, il y a bien 5 éléments)
   print("ABRACADABRANTESQUE"[4]   ---> C

   Il faut, en Python (et dans d'autres langages) penser index : et la 5e lettre c'est la lettre repérée par l'index 4
   print("ABRACADABRANTESQUE"[12] ---> T
   print("ABRACADABRANTESQUE"[13] ---> E
   print("ABRACADABRANTESQUE"[14] ---> S

   Sachant que, écrire print("ABRACADABRANTESQUE"[12: 15],  c'est demander d'afficher les lettres de l'index 12 à 15 (exclu), il donne donc les lettres  allant de l'index 12 à l'index 14 (compris) : il répond TES....
   adjectif_chiraquien, c'est long à taper ? Alors, choisissons de dire mot="ABRACADABRANTESQUE"
   Encore trop long ? Bon, va pour m="ABRACADABRANTESQUE"
   
   LEG, pour avoir :
   --> TESQU, il faut demander print (m[12:17])
   --> TESQUE, il faut demander print (m[12:18])  ou print(m[12:])
   
  Mais si tu t'avisais de demander : print (m[18]), voilà la réponse que vous obtiendriez :
  Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    print(m[18])
  IndexError: string index out of range

  Les index dans le mot s'arrêtent à 17, m[12:18] ce sont les lettres de l'index 12 à l'index 17 (inclus)
   Mais demander m[18] c'est demander la lettre dont l'index est 18 : cet index est out of range, hors intervalle...

   Comme si je dis tout d'un coup, votre mémoire va déborder, alors je distille...
   Je vous distille alors une info de plus :

   Python comprend le verbe anglais to find = trouver...

   En Python, find() c'est : trouve l'index de ce qui est entre parenthèses. Mais ll donnera l'index de sa première apparition...
   En Python find() est appelée méthode.
   Syntaxe : m.find("T")

   LEG, tape donc print(m.find("T"))  la réponse donnée par Python est 12
   print(m.find("E")) renvoie 13
   print(m.find("S")) renvoie 14
  Donc
   print(m[12:15]) renvoie la tranche comprenant les lettres d'index 12, 13 et 14, soit TES

  Je vous propose de tester vos connaissances :
  à partir de m="ABRACADABRANTESQUE" et en utilisant une boucle écrire :
  EUQSETNARBADACARBA soit le mot allant de sa fin au début.

@+

[EDIT]Les affres de LEG (cf post ci-dessous) m'ont donné une idée de prolongation du test proposé...
La phrase : ESOPE RESTE ICI ET SE REPOSE est une phrase palindrome (=qui se lit de la même façon dans les deux sens) si on ne tient pas compte des espaces.
En  réutilisant la boucle que vous aurez écrite ci-dessus et à partir de :


    ph1="ESOPERESTEICIETSEREPOSE"
    ph2="" #ph2 est vide au départ et on y stocke, lettre après lettre, la phrase ph1 lue à l'envers)

    tester si ph est bien un palindrome, c'est à dire ici, si ph1 est bien égal à ph2 :
    1. Vous devrez obtenir simplement True ou False
    2. Avec la structure if... else afficher la réponse sous la forme d'une phrase en bon français

Pas vraiment évident pour des débutants... mais ô combien formateur !

Dernière modification par yoshi (31-10-2019 12:03:41)


Arx Tarpeia Capitoli proxima...

Hors ligne

#23 31-10-2019 10:03:28

LEG
Membre
Inscription : 19-09-2012
Messages : 518

Re : Essai de mini-tuto Python

Je savais que je prenais le bâton pour me faire réfléchir...aie aie.....

D'abord excuse moi, car je savais qu'il fallait compter les index qui commencent à 0 , on l'a suffisamment utilisé pour ton programme pour mon algorithme, mais pour aller trop vite je n'ai pas vérifié le nombre de lettres de l'adjectif..
grosse erreur de confiance et d'inattention...

Effectivement ta réponse était limpide , mais il faut compter avec ""ceux du fond de la classe... "" qui eux, fond des erreurs presque tous les jours ......

Bonne continuation

Cordialement
LG

je viens de tester et échec.....! mais j'ai tout fais à l'envers de ta demande ..pour aujourd'hui je laisse  les autres ....


>>>

Dernière modification par LEG (31-10-2019 11:03:18)

Hors ligne

#24 31-10-2019 11:29:16

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 768

Re : Essai de mini-tuto Python

Salut hombre !

je viens de tester et échec.....!

Tu veux parler du test proposé ? Alors, c'est intéressant, on va passer au débogage.
Si oui,
1. As-tu obtenu l'affichage d'un quelconque résultat ? Si oui lequel ?
2. Si tu n'as obtenu qu'un message d'erreur, donne ce message d'erreur que je l'analyse...

Pour LEG ou ceux qui auront testé sans succès

Connaissances à mobiliser
1. Savoir utiliser une boucle
2. Savoir que, entre l'index 0 et l'index 17, puisque le mot a 18 lettres (0 à 17 ça fait bien 18), la lettre placée à l'index donné est obtenue par m[index]
3. Savoir utiliser une boucle allant de la fin au début...
4. Savoir afficher plusieurs éléments sur une même ligne, avec une espace entre chaque... ou rien du tout.

Rappel : Un débutant (ou même qq de chevronné à son niveau)
- doit se faire à l'idée que les ratés seront monnaie courante
- doit penser, s'il est présent, à exploiter le message d'erreur qui  dit ce qu'est l'erreur
- sans message d'erreur, placer des print() bien choisis pour savoir où ce qui se passe n'est pas ce qui est attendu (que croyez-vous que je fasse ?) ...

Sans Python à la maison,
- taper votre code dans un éditeur de texte tout bête
- faire attention à l'indentation (compter les appuis sur la barre espace)
- copier votre code
- et pour le tester :
  *  le coller ici : https://pynative.com/online-python-code … thon-code/
  *  cliquer sur le groupe des 2 triangles poine à droite et pointe en bas

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#25 01-11-2019 05:35:19

LEG
Membre
Inscription : 19-09-2012
Messages : 518

Re : Essai de mini-tuto Python

re
je n'avais pas compris qu'il fallait faire une boucle pour écrire a l'envers de la fin au début ...avec m=............
je ne sais absolument comment m'y prendre ni pour le palindrome ...Donc je laisse place aux jeunes...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
vingt et un plus quarantetrois
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums