# ============================================================
# Fichier: python_cheats/cheatsheets/builtins.txt
# ============================================================

[OK] FONCTIONS MATHÉMATIQUES
    abs(-5)                    # 5 - Valeur absolue
    pow(2, 3)                  # 8 - Puissance (2^3)
    round(3.7)                 # 4 - Arrondir
    round(3.14159, 2)          # 3.14 - Arrondir à 2 décimales
    max(1, 5, 3)               # 5 - Maximum
    min(1, 5, 3)               # 1 - Minimum
    sum([1, 2, 3, 4])          # 10 - Somme

[OK] CONVERSIONS DE TYPE
    int('42')                  # 42 - String vers int
    int(3.7)                   # 3 - Float vers int (troncature)
    float('3.14')              # 3.14 - String vers float
    str(42)                    # '42' - Nombre vers string
    bool(0)                    # False
    bool(1)                    # True
    list('abc')                # ['a', 'b', 'c']
    tuple([1, 2, 3])          # (1, 2, 3)
    set([1, 2, 2, 3])         # {1, 2, 3}
    dict([('a', 1), ('b', 2)]) # {'a': 1, 'b': 2}

[OK] LISTES - MÉTHODES
    lst = [1, 2, 3]
    
    lst.append(4)              # Ajouter à la fin
    lst.extend([5, 6])         # Ajouter plusieurs éléments
    lst.insert(0, 0)           # Insérer à l'index
    lst.remove(2)              # Supprimer première occurrence
    lst.pop()                  # Supprimer et retourner dernier
    lst.pop(0)                 # Supprimer à l'index
    lst.clear()                # Vider la liste
    lst.index(3)               # Trouver l'index
    lst.count(2)               # Compter occurrences
    lst.sort()                 # Trier sur place
    lst.sort(reverse=True)     # Trier décroissant
    lst.reverse()              # Inverser sur place
    lst.copy()                 # Copie superficielle

[OK] STRINGS - MÉTHODES
    s = "Hello World"
    
    s.upper()                  # 'HELLO WORLD'
    s.lower()                  # 'hello world'
    s.capitalize()             # 'Hello world'
    s.title()                  # 'Hello World'
    s.strip()                  # Supprimer espaces début/fin
    s.lstrip()                 # Supprimer espaces à gauche
    s.rstrip()                 # Supprimer espaces à droite
    s.replace('World', 'Python') # Remplacer
    s.split()                  # ['Hello', 'World']
    s.split(',')               # Séparer par délimiteur
    ','.join(['a', 'b'])       # 'a,b' - Joindre
    s.startswith('Hello')      # True
    s.endswith('World')        # True
    s.find('World')            # 6 - Index (-1 si absent)
    s.count('l')               # 3 - Compter occurrences
    s.isdigit()                # False - Que des chiffres?
    s.isalpha()                # False - Que des lettres?
    s.isalnum()                # False - Lettres ou chiffres?
    s.islower()                # False
    s.isupper()                # False

[OK] DICTIONNAIRES - MÉTHODES
    d = {'a': 1, 'b': 2}
    
    d.get('a')                 # 1 - Accès sécurisé
    d.get('c', 0)              # 0 - Valeur par défaut
    d.keys()                   # dict_keys(['a', 'b'])
    d.values()                 # dict_values([1, 2])
    d.items()                  # dict_items([('a', 1), ('b', 2)])
    d.pop('a')                 # 1 - Supprimer et retourner
    d.popitem()                # ('b', 2) - Supprimer dernier
    d.clear()                  # Vider
    d.update({'c': 3})         # Ajouter/mettre à jour
    d.setdefault('d', 4)       # Ajouter si absent
    d.copy()                   # Copie superficielle

[OK] SETS - MÉTHODES
    s = {1, 2, 3}
    
    s.add(4)                   # Ajouter un élément
    s.update([5, 6])           # Ajouter plusieurs
    s.remove(1)                # Supprimer (erreur si absent)
    s.discard(1)               # Supprimer (pas d'erreur)
    s.pop()                    # Supprimer aléatoire
    s.clear()                  # Vider
    s1.union(s2)               # s1 | s2
    s1.intersection(s2)        # s1 & s2
    s1.difference(s2)          # s1 - s2
    s1.symmetric_difference(s2) # s1 ^ s2
    s1.issubset(s2)            # s1 <= s2
    s1.issuperset(s2)          # s1 >= s2

[OK] FONCTIONS D'AGRÉGATION
    numbers = [1, 2, 3, 4, 5]
    
    sum(numbers)               # 15
    max(numbers)               # 5
    min(numbers)               # 1
    len(numbers)               # 5
    any([False, True, False])  # True - Au moins un True
    all([True, True, True])    # True - Tous True

[OK] MAP, FILTER, REDUCE
    # map - Appliquer fonction à chaque élément
    list(map(lambda x: x**2, [1, 2, 3]))  # [1, 4, 9]
    
    # filter - Filtrer par condition
    list(filter(lambda x: x % 2 == 0, range(10)))  # [0, 2, 4, 6, 8]
    
    # reduce - Réduire à une valeur
    from functools import reduce
    reduce(lambda x, y: x + y, [1, 2, 3, 4])  # 10

[OK] ENUMERATE
    fruits = ['apple', 'banana', 'cherry']
    
    for i, fruit in enumerate(fruits):
        print(f"{i}: {fruit}")
    
    # Commencer à 1
    list(enumerate(fruits, start=1))
    # [(1, 'apple'), (2, 'banana'), (3, 'cherry')]

[OK] ZIP
    names = ['Alice', 'Bob']
    ages = [25, 30]
    
    list(zip(names, ages))
    # [('Alice', 25), ('Bob', 30)]
    
    # Unzip
    pairs = [('a', 1), ('b', 2)]
    letters, numbers = zip(*pairs)
    # letters = ('a', 'b'), numbers = (1, 2)

[OK] SORTED
    numbers = [3, 1, 4, 1, 5]
    
    sorted(numbers)            # [1, 1, 3, 4, 5] - Nouvelle liste
    sorted(numbers, reverse=True)  # [5, 4, 3, 1, 1]
    
    # Trier par clé
    words = ['apple', 'pie', 'zoo', 'a']
    sorted(words, key=len)     # ['a', 'pie', 'zoo', 'apple']
    
    # Trier dict par valeur
    d = {'a': 3, 'b': 1, 'c': 2}
    sorted(d.items(), key=lambda x: x[1])

[OK] REVERSED
    list(reversed([1, 2, 3]))  # [3, 2, 1]
    
    # Pour strings
    ''.join(reversed('hello'))  # 'olleh'

[OK] RANGE
    list(range(5))             # [0, 1, 2, 3, 4]
    list(range(2, 10))         # [2, 3, 4, 5, 6, 7, 8, 9]
    list(range(0, 10, 2))      # [0, 2, 4, 6, 8]

[OK] INPUT/OUTPUT
    name = input("Your name: ")  # Lire entrée utilisateur
    print("Hello", name)         # Afficher
    print("a", "b", sep="-")     # a-b
    print("text", end="")        # Pas de nouvelle ligne

[OK] TYPE ET ISINSTANCE
    type(42)                   # <class 'int'>
    isinstance(42, int)        # True
    isinstance('hello', str)   # True
    isinstance([1, 2], (list, tuple))  # True

[OK] ID ET HASH
    id(obj)                    # Identité de l'objet
    hash(obj)                  # Hash (pour objets hashables)

[OK] DIR ET HELP
    dir(list)                  # Liste tous les attributs
    help(list.append)          # Documentation

[OK] EVAL ET EXEC
    eval('2 + 3')              # 5 - Évaluer expression
    exec('x = 10')             # Exécuter code Python

[OK] COMPREHENSIONS AVANCÉES
    # Condition multiple
    [x for x in range(20) if x % 2 == 0 if x % 3 == 0]  # [0, 6, 12, 18]
    
    # Avec enumerate dans comprehension
    {i: val for i, val in enumerate(['a', 'b', 'c'])}