def affiche(mot='rien'):
    """pas de retour à la ligne, mais une espace"""
    for I in range(3):
        print(I,mot,end=' ')

affiche()

"""
Explanation: <a href="https://colab.research.google.com/github/jfaure3/.github.io/blob/master/Bases_de_Python.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>
Divers astuces et fonctions intéressantes
Ne pas aller à la ligne avec un print en spécifiant le caractère de fin. 
Ici end=' ' c'est une espace.
End of explanation
"""


def code_cesar(mot='Bonjour tout le monde', decalage=3):
    """César avec un décallage de 1"""
    return "".join([chr(ord(c)+decalage) for c in mot])
code_cesar()

"""
Explanation: Associer un caractère avec son point de code de façon biunivoque.
End of explanation
"""


def autre_ecriture_si(masse):
    """écrite de if en ligne"""
    return 3*masse if masse<=20 else (2*masse if masse<50 else masse)
autre_ecriture_si(20)

"""
Explanation: Ecrire des if en ligne.
End of explanation
"""


def si_en_ligne():
    """liste en compréhention"""
    return sum([float(input('jour '+str(I)+' : ')) for I in range(7)])/7
si_en_ligne()

"""
Explanation: Liste en compréhension avec des entrées.
End of explanation
"""


import matplotlib.pyplot as plt
def pseudo_alea(n=100):
    """liste de nombres pseudo-aléatoires"""
    liste=[13]
    for I in range(n):
        liste.append((16805*liste[I] + 1) % 32768)
    plt.subplot(1,2,1)
    plt.plot(liste,'.')
    plt.title('nombres')
    pileFace=[bin(nb)[-1] for nb in liste]
    plt.subplot(1,2,2 )
    plt.plot(pileFace,'.')
    plt.title('bits de poids faibles')
    plt.show()
pseudo_alea()

"""
Explanation: Liste de nombres pseudo-aléatoires, mais périodiques... (principe des tiroirs de Dirichlet)
End of explanation
"""


def puissance_de_2(n=10):
    """retourne la puissance n-ième de 2"""
    return 1 if n==0 else 2*puissance_de_2(n-1)
puissance_de_2()

def PGCD(a,b):
    """retourne le PGCD à partir de l'algorithme d'Euclide"""
    return b if a%b==0 else PGCD(b,a%b)
PGCD(30,42)

def base_10_vers_n_recursif(nb=6007,n=5):
    """retourne l'écriture de nb en base n"""
    return str(nb) if nb//n==0 else base_10_vers_n_recursif(nb//n,n)+str(nb%n)
base_10_vers_n_recursif(1020,2)

"""
Explanation: Récursivité
End of explanation
"""


def deux_tris(liste=[2,1,8,6,5,7,5,6]):
    """illusrte le tri en place et le tri dans une autre liste"""
    print(sorted(liste))#renvoie une autre liste
    print(liste)
    liste.sort()#en place
    print(liste)
deux_tris()

"""
Explanation: avec les listes différence entre le tri en place a.sort() et sorted(a) qui produit une autre liste
End of explanation
"""


print("\N{GREEK CAPITAL LETTER DELTA}")
print("\u0394")


"""
Explanation: L'encodage des caractères
End of explanation
"""


from math import *
def egalite(a=0.3,b=0.1+0.1+0.1):
    """retourne le test d'égalité stricte et le test de proximité"""
    return (a==b, isclose(a,b))
egalite()

"""
Explanation: Pour tester une égalité, l'astuce est de voir si les deux nombres sont \og vraiment \fg{} proches.
End of explanation
"""


import numpy as np
import matplotlib.pyplot as plt
def graphiques(f = lambda x : x**2):
    """tracés des courbes"""
    X=np.linspace(-2,1.5,100)#100 valeurs de -2 à 1.5 dans un ndarray de numpy
    Y=f(X)
    plt.plot(X,Y,'r-')#- -- ^ s -. : b g r c m y k w , linewidth=0.8, marker="+", label="Trajet 2"
    plt.ylabel('$C_f$')
    plt.title("f en fonction de x")
    plt.show()
graphiques()

"""
Explanation: Les graphiques avec matplotlib
Affichage de courbes avec matplotlib.pyplot
End of explanation
"""


import numpy as np
import matplotlib.pyplot as plt
def graphiques():
    """graphique statistiques"""
    x = [1,2,3,4,5]
    donnees=[20,5,60,10,20]
    noms=['A','B','C','D','E']
    explode=(0, 0, 0.15, 0,0)#sépart la part de 'B'
    
    plt.subplot(1,2,1)    
    plt.pie(donnees, explode=explode, labels=noms, autopct='%1.2f%%', startangle=90, shadow=True)
    plt.axis('equal')# un camembert bien rond
    
    plt.subplot(1,2,2)    
    plt.bar(x,donnees, width=0.5, color=(0.1,0.2,0.3, 1.0) )
    plt.xticks(x,noms)
    plt.grid()

    plt.savefig('circulaire et barres.png')    
    plt.show()
graphiques()

"""
Explanation: Graphiques statistiques avec matplotlib
End of explanation
"""


from random import *
import matplotlib.pyplot as plt
def graphiques(n=1000):
    """simule n fois la somme de 5 dés"""
    X1=[randint(1,6)+randint(1,6)+randint(1,6)+randint(1,6)+randint(1,6) for I in range(n)]
    X2=[randint(1,6)+randint(1,6)+randint(1,6)+randint(1,6)+randint(1,6)for I in range(n)]
    
    plt.subplot(1,2,1)    
    plt.boxplot([X1,X2])
    
    plt.subplot(1,2,2)    
    plt.hist(X1,bins=[0,10,15,18,20,22,25,31],color=(1,0,0,1))
    plt.hist(X2,bins=[0,10,15,18,20,22,25,31],color=(0,0,1,0.5))
    plt.grid()

    plt.savefig('boite et histogramme.png')    
    plt.show()
graphiques()

"""
Explanation: histogramme et diagramme en boite
End of explanation
"""


