<jupyter_start><jupyter_text>Les Fonctions  Définition Une fonction est un bloc de code qui se lance seulement lorsqu'il est appelé et qui remplit une tâche spécifique.  Usage  Comment définir une fonction ?Définir une fonction en Python, c'est simple :<jupyter_code>def nomdelafonction(argument1, argument2, argument3='defaultvalue'):
    pass
def helloname(name):
    print(f"Hello, {name} !")
def iseven(num):
    return num %2 == 0<jupyter_output><empty_output><jupyter_text>Comment appeler une fonction ?<jupyter_code>a = helloname("Elon")
a
iseven(5)<jupyter_output><empty_output><jupyter_text>Avec ou sans "return" ? Une fonction peut retourner une ou plusieurs valeurs.Exemple :<jupyter_code>def first2items(list):
    return list[0], list[1]

a, b = first2items(["Hello", "world", "hi", "universe"])
print(a + " " + b)<jupyter_output>Hello world<jupyter_text>Il faut savoir que "return" arrête l'exécution d'une fonction et retourne la valeur assignée au moment où Python lit cette instruction.  Récursivité La récursivité, en programmation, consiste à appeler la fonction au sein-même d'elle-même (elle " s'autoappelle"...).<jupyter_code>## Fonction f(x) = 2*x
def f(x):
    x = 2 * x
    return x

f(3)
# Fonction : factorielle
def factorielle(nb):
    if nb > 2:
        return nb * factorielle(nb - 1)
    return nb

factorielle(4)
def fibo_rec(i):
    if i < 2 :
        return 1
    return fibo_rec(i-1)+fibo_rec(i-2)

fibo_rec(10)<jupyter_output><empty_output><jupyter_text>Arguments multiples On utilise \*args quand on n'est pas sûr du nombre d'arguments passés :<jupyter_code>def print_everything(*args):
    for thing in args:
        print( '{}'.format(thing))

print_everything('apple', 'banana', 'cabbage', "Elon")<jupyter_output>apple
banana
cabbage
Elon<jupyter_text>De la même manière, \**kwargs permet de prendre un nombre non pré-défini d'arguments.<jupyter_code>def table_things(**kwargs):
    print("**********")
    for i in kwargs:
        print(i)
    print("**********")
    for name, value in kwargs.items():
        print( '{0} = {1}'.format(name, value))


table_things(apple = 'fruit', cabbage = 'vegetable')<jupyter_output>**********
apple
cabbage
**********
apple = fruit
cabbage = vegetable<jupyter_text>On peut aussi utiliser les astériques quand on appelle une fonction :<jupyter_code>def print_three_things(a, b, c):
    print( 'a = {0}, b = {1}, c = {2}'.format(a,b,c))

mylist = ['aardvark', 'baboon', 'cat']
print_three_things(*mylist)<jupyter_output>a = aardvark, b = baboon, c = cat<jupyter_text>Mais :<jupyter_code>mylist2 = ["mot1", "mot2", "mot3", "mot4"]
print_three_things(*mylist2)<jupyter_output><empty_output><jupyter_text>Ou encore<jupyter_code>print_three_things(mylist2)<jupyter_output><empty_output><jupyter_text>Typage des arguments dans une fonction **Python est un langage fortement typé dynamiquement.**Le typage statique signifie que les variables sont vérifiées avant  l'exécution contrairement au typage dynamique où les variables sont vérifiées pendant l'exécution.Le typage dynamique est aussi valable pour les paramètres d'une fonction. Python est typé dynamiquement puisque l'on peut changer une variable int en string:<jupyter_code>x = 'chose'
x = 50<jupyter_output><empty_output><jupyter_text>Python est fortement typé puisque l'on ne peut mélanger les types de variable:<jupyter_code>'x' + 3<jupyter_output><empty_output><jupyter_text>Dans d'autres langages cela pourrait donner : 'x'+3 = 'x3' Par exemple, la fonction suivante fonctionne puisque l'argument **'nom'** est attendu en tant que **str** tout comme le type **str** dans return<jupyter_code>def bienvenue(nom):
    return 'Bonjour ' + str(nom)
bienvenue('Benjamin')<jupyter_output><empty_output><jupyter_text>Exemple de fonction fortement typeé :<jupyter_code>def add2(num):
    return num+2
add2(34)
add2("Bonjour")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12596599690880989, 'fraction_numerical': 0.011591962905718702, 'mean_word_length': 5.909252669039146, 'pattern_counts': {'":': 0, '<': 50, '<?xml version=': 0, '>': 50, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '615214', 'license': 'MIT', 'n_tokens_mistral': 1434, 'n_tokens_neox': 1409, 'n_words': 373, 'path': 'Semaine02/20190402_-_presa_Fonctions.ipynb', 'repo_name': 'kinoute/stegosaurus', 'size': '3882'}