a=10
b,c=-2,3
print(b,c)
Python permet une permutation très simple de deux variables.
b,c=c,b
print(b,c)
Python reconnait deux types de nombres : les entiers et les flottants. On peut ici (et ailleurs) faire usage de la fonction type.
print(type(a))
print(type(b))
d=a/c
type(d)
type(a/b)
type(8/2)
8/2
8*2
Méthode rapide d'incrémentation en Python.
a+=1
print(a)
a-=1
print(a)
Attention premier module en approche ! Le module math est un indispensable pour nous les matheux. Il contient les fonctions et variables pour faire notre bonheur. Le module lycee que l'on trouve aussi dans edupython propose les fonctions de math (et d'autres) en version francisé. L'utilisation des modules usuels nous paraît plus efficace sur le moyen terme.
import math #pour importer le module dans votre programme
print(math.sqrt(9))
math.pow(10,3)
10**3
Notons que l'opérateur que ** renvoie un entier quand cela est possible, ce qui n'est pas le cas de math.pow qui va renvoie systématiquement en flottant.
math.log(math.exp(5))
Rappelons que Python permet d'obtenir toutes les informations nécessaires sur une fonction ou tout un module en utilisant, dans la console, la fonction help.
help(math.log)
math.floor(5.9)
math.floor(-1.2)
Vous avez reconnu.
print(math.pi," *** ",math.e)
En trigo, Python fonctionne à priori en radians.
math.sin(math.pi/6)
Oui, ça nous rappelle que nous sommes sur un ordinateur. C'est le moment de revenir sur les arrondis et valeurs approchées.
Et d'entamer le travail sur les fonctions. Construire une fonction qui renvoie 0.999 si on lui a donné le chiffre 9 et le nombre 3 et 0.3333333 si on lui a donné le chiffre 3 et le nombre 7.
def decimalVirgule(c,n):
nombre=0
for i in range(n):
nombre=nombre+c*math.pow(10,-i-1)
return(nombre)
decimalVirgule(3,2)
decimalVirgule(9,12)
1==decimalVirgule(9,14)
1==decimalVirgule(9,16)
1==decimalVirgule(9,18)
1==decimalVirgule(9,17)
a=1/3
a==decimalVirgule(3,25)
En plus de floor, vue plus haut, le module math comprend les deux fonctions ceil et trunc.
math.ceil(4.6)
math.ceil(-math.pi)
math.trunc(math.e)
math.trunc(-3.125)
Par ailleurs, une fonction d'arrondi existe dans python : round
round(2.55)
round(2.55,1)
round(-math.e)
round(-math.e,2)
Le module sympy permet de faire du calcul formel. Mais il existe d'autres solutions qui ont aussi un intérêt pédagogique, par exemple le module "fractions" et plus précisément la classe "Fraction" de ce module.
from fractions import Fraction
Trois possibilités pour entrer la fraction 2/5 :
ma_fraction=Fraction(2,5)
print(ma_fraction)
ma_fraction=Fraction('2/5')
print(ma_fraction)
ma_fraction=Fraction(8,20)
ma_fraction
ma_fraction==Fraction.from_float(0.4)
Fraction.from_float(0.4)
Fraction.from_float(0.5)
float(ma_fraction)==0.4
ma_fraction+Fraction(1,2)
0.1+0.1+0.1
un_dixieme=Fraction('1/10')
un_dixieme+un_dixieme+un_dixieme
ma_fraction+0.3
trois_dixieme=Fraction(3,10)
ma_fraction+trois_dixieme
Pour rebondir sur ce qui précède tout en parlant des fonctions, on peut s'imspirer de ce que propose le site https://emilypython.wordpress.com/
Son approche propose de créer les fonctions indispensables pour faire du calcul sur les fractions. Ces activités ont toutes leur place en classe de Seconde où les élèves ont des acquis du collège qu'il faut, d'une part, réanimer et, d'autre part, faire aller plus loin vers le littéral. Cela permet aussi de parler du type List.
frac=[1,2]
frac[0]
frac[1]
On peut déjà chercher à vérifier que deux fractions sont égales. Avec b et d non nuls a/b et c/d sont égales ssi ad=bc.
def egaliteFrac(frac1,frac2):
nb1 = frac1[0]*frac2[1] #on calcule a*d
nb2 = frac1[1]*frac2[0] #on calcule b*c
if nb1 == nb2:
test = True
else:
test = False
return test
egaliteFrac([1,2],[-20,-40])
C'est le moment de parler "Fonctions" en précisant deux points. Il est coseillé de préciser l'utilité d'une fonction que l'on crée afin qu'un autre utilisateur puisse s'en saisir à bon escient.
def egaliteFrac(frac1,frac2):
"""Renvoie un booléen lié à l'égalité des deux fractions entrées en paramètres"""
nb1 = frac1[0]*frac2[1] #on calcule a*d
nb2 = frac1[1]*frac2[0] #on calcule b*c
if nb1 == nb2:
test = True
else:
test = False
return test
Entrer cette fonction dans l'éditeur et lancer le programme. On peut alors utiliser cette fonction dans la console et le simple fait d'entrer au claivier "eg..." fait apparaître une fenêtre qui propose d'utiliser cette fonction et qui affiche son "utilité".
En classe, on peut ainsi définir avec les élèves, le produit de deux fractions, l'inverse d'une fraction ou le quotient (en utilisant les deux précédentes) de deux fractions.
Du bon usage des fonctions dans l'esprit des programmes : le mieux est d'analyser des exemples. Nous allons étudier l'exemple des nombres de Kaprekar (encore des nombres!). Mais tout d'abord, faisons quelques rappels sur les listes.
L1=list() #création d'une liste
L2=[] #autre façon de créer une liste (vide aussi)
L3=list(range(4)) #encore un autre type de création de liste (pas vide celle-ci)
L3
Pour compléter une liste, on ne peut pas utiliser un simple "+" comme pour les chaînes de charactères. Les méthodes append et insert sont très utiles.
L1.append("Lundi")
L1.append("Mardi")
L1.append("Vendredi")
L1
L1.insert(2,"Mercredi")
L1
L1.insert(3,"Jeudi")
L1
L1.extend(["Samedi","Dimanche"])
L1
Comment accéder aux éléments d'une liste ?
L1[2]
L1[:2]
L1[2:]
Pour supprimer des éléments, la fonction del et la méthode .remove : del L1[1] va supprimer le deuxième élèment de L1 tandis que L1.remove('Jeudi') va chercher 'Jeudi' dans L1 et va le supprimer.
Revenons donc à un exemple de programme : le test pour savoir si un nombre est un nombre de Kaprekar. Un nombre de Kaprekar est tel que son carré forme un nombre qui, si on le sépare au bon endroit, donne deux nombres dont la somme est égale au nombre lui-même. Ci-dessous un programme trouvé dans la documentation d'Edupython et qui permet de déterminer si un nombre est un nombre de Kaprekar.
#tiré de la documentation de edupython http://edupython.tuxfamily.org
# Créé par IANTE, le 20/06/2011
from math import *
n=int(input("Entrez un nombre entier strictement positif : "))
N=n*n
L=[]
trouveG,trouveD=-1,-1
while N!=0 :
L.insert(0,N%10)
N=N//10
for i in range(len(L)) :
gauche=0
droite=0
for j in range(i) :
gauche=gauche*10+L[j]
for j in range(i,len(L)) :
droite=droite*10+L[j]
if gauche+droite==n :
trouveG,trouveD=gauche,droite
if trouveG>-1:
print (n,"est nombre de Kaprekar ",end="")
print (n,"²=",n*n," et ",n,"=",trouveG,"+",trouveD)
else :
print (n,"n'est pas nombre de Kaprekar")
Après quelques modifications, on obtient:
#pour info 4879 ou 703 sont des nombres de Kaprekar
def testKaprekar(n):
N=n*n
L=[]
trouveG,trouveD=-1,-1
while N!=0 :
L.insert(0,N%10)
N=N//10
for i in range(len(L)) :
gauche=0
droite=0
for j in range(i) :
gauche=gauche*10+L[j]
for j in range(i,len(L)) :
droite=droite*10+L[j]
if gauche+droite==n :
trouveG,trouveD=gauche,droite
if trouveG>-1:
return(True)
else :
return(False)
testKaprekar(703)