Olivier Guibé - LMRS, fortement inspiré d'un document de Pierre Navaro (IRMAR).
En Python, pas de {/}
de begin/end
, de ;
en fin de ligne. Toute la structure des boucles, tests, définition des routines se fait par indentation (puisqu'il est indispensable de le faire, autant que cela serve de structure).
def f(x):
return x**2
print(f(4))
tant que
¶while
while
indenté# et un PGCD
a, b = 123456789, 532341
while a%b!=0: ## !a%b==0
a, b = b, a%b
print(b)
x = 42
if x < 0:
x = 0
print('négative met zéro')
elif x == 0:
print('Zéro')
elif x == 1:
print('c\'est un')
else:
print('c\'est plus que un')
Pas de case of
(ou switch
) en Python. On peut faire du elif
ou utiliser un dictionnaire.
La boucle se fait sur un itérateur
. Sur une chaîne de caractère : les caractères, sur une liste : les éléments de la liste
s=0
for i in range(0,11):
s+=i
print(s==55) # car je connais la formule 10*11/2 !
Pour une boucle décroissante, deux solutions, range
avec pas négatif ou reversed(range)
avec pas positif. Par exemple pour calculer une approximation de $e$ avec la méthode de Horner,
$$
e=\sum_{n=0}^{\infty} \frac{1}{n!}
$$
En s'arrêtant bien avant l'infini
s=1
for i in range(100,0,-1):
s=1+ 1/i*s
print(s)
N=1000; s=1
for i in reversed(range(1,N+1)):
s/=i
s+=1
print(s)
break
ou comment tuer une boucle¶for n in range(2, 10): # n = 2,3,4,5,6,7,8,9
for x in range(2, n): # x = 2, ..., n-1
if n % x == 0: # reste de la division euclidienne
print (n, " = ", x, "*", n//x)
break # stop la boucle sur x
else:
print(" %d est un nombre premier" % n)
enumerate
ou la correspondance position/élément¶primes = [1,2,3,5,7,11,13]
for idx, ele in enumerate (primes):
print(idx, " --- ", ele)
print(list(enumerate(primes)))
def
¶def is_palindrome( s ):
"renvoie True si s est un palindrome"
return s == s[::-1]
is_palindrome("kayak")
Sauf instruction spécifique, une variable définie dans une fonction n'altère pas la variable de même nom définie en dehors de cette fonction.
global
permet de modifier globalement la variablepi = 1.
def deg2rad(theta):
pi = 3.14
return theta * pi / 180.
print(deg2rad(45))
print(pi)
def rad2deg(theta):
return theta*180./pi
print(rad2deg(0.785))
pi = 3.14
print(rad2deg(0.785))
from math import pi
print(pi)
def deg2rad(theta):
global pi
pi = 3.14
return theta * pi / 180
pi = 1
print(deg2rad(45))
print(pi)
Python permet de construire une liste d'une façon particulière, nommée la "compréhension de liste".
li = [1, 9, 8, 4]
[elem**2 for elem in li]
[n*n for n in range(1,10)]
[n*n for n in range(1,10) if n%2==0]
[n+1 if n&1 else n//2 for n in range(1,10) ]
map
ou appliquer une fonction à une séquence¶from math import sin, pi; res = map(sin,[i*pi/6 for i in range(0,12)])
print(res)
Depuis Python 3.x, map
appliquée à une liste, un itérateur (type range
) retourne un objet de type map
et pas une liste. Cela est plus rapide et économise la mémoire.
Pour afficher le résultat list
ou *
sont là.
print(*res)
map
avec sa fonction¶def add(x,y):
return x+y
L1 = [1, 2, 3]
L2 = [4, 5, 6]
print(*(map(add,L1,L2)))
Python permet évidemment des définitions récursives ! Et comme une fonction permet de définir une fonction, voici un exemple de définition récursive de l'escalier de Cantor (ne pas aller trop loin) et du tracé de la courbe représentative.
# un oral de Centrale, avec illustration Python
import numpy as np #la vectorisation
import matplotlib.pyplot as plt # tracé de fonctions
def T(f,x):
# le découpage façon Cantor
s=f(3*x)/2*((0<=x)&(x<1/3)) + .5*((x>=1/3)*(x<=2/3))+(f(3*x-2)+1)/2*((x>2/3)&(x<=1))
return s
def I(x):
# l'identité
return x
def TR(f,n):
if n==1:
def rT(x):
return T(f,x)
return rT
if (n>1):
return TR(TR(f,1),n-1)
print(TR(I,3)(.4))
plt.plot(np.linspace(0,1,100),TR(I,9)(np.linspace(0,1,100)))
plt.show()
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.