IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fonction dans une fonction


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Fonction dans une fonction
    Bonsoir,
    j'ai découvert un truc qui me paraissait être "mauvais" mais au final qui n'est pas mal du tout. Jusqu'à présent, pratiquant majoritairement de la POO, je n'avais pas besoin de définir des fonctions dans des fonctions comme dans le 1er code ci-dessous proposé par un collègue.

    Je préfère malgré tout le 2nd pour des raisons de lisibilité mais je vois tout l'intérêt de cette technique pour notamment cacher de fonctions internes d'un package qui n'ont aucune utilité pour l'utilisateur du dit package.

    MA QUESTION. Ceci étant que pensez-vous de cette pratique ? Existe-t-il des effets indésirables ?


    CODE AVEC FONCTION DANS FONCTION
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    def recherche(x, L):
        d, f = 0, len(L)-1
     
        def r(deb, fin):
            if deb > fin:
                return "Elément non trouvé"
     
            t = (deb + fin)//2
     
            if x == L[t]:
                return t
     
            elif x < L[t]:
                return r(deb, t-1)
     
            else:
                return r(t+1, fin)
     
        return r(d, f)
     
     
    L = [3, 5, 8, 9, 15, 45, 123, 125]
     
    print(recherche(45, L))
    CODE SANS FONCTION DANS FONCTION
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    def r(deb, fin):
        global x, L
     
        if deb > fin:
            return "Elément non trouvé"
     
        t = (deb + fin)//2
     
        if x == L[t]:
            return t
     
        elif x < L[t]:
            return r(deb, t-1)
     
        else:
            return r(t+1, fin)
     
    def recherche(x, L):
        d, f = 0, len(L) - 1
     
        return r(d, f)
     
    x = 45
    L = [3, 5, 8, 9, 15, 45, 123, 125]
     
    print(recherche(45, L))

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour rambc,

    J'ai souvent ce problème de choix avec des fonctions récursives qu'il faut initialiser: la fonction extérieure permet cette initialisation, lance la fonction intérieure, et peut, à la fin, renvoyer des données correctement mises en forme.

    Je ne me méfie de cette forme seulement pour une raison: j'ai déjà rencontré des problèmes avec un traitement de code python, mais je ne me rappelle plus lequel (py2exe? cx_freeze? cython?). De ce fait, à titre préventif, je programme souvent comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def _mafonction(...):
        ...
     
    def mafonction(...):
        ...
        x = _mafonction(...)
        ...
    La différence est qu'il ne faut pas oublier de paramètres à passer. En effet, dans la forme compacte (fonction de fonction), les variables locales de la fonction extérieure sont des variables globales pour la fonction intérieure.

    Mais par ailleurs, la forme compacte permet de faire des décorateurs plutôt élégants, et pour eux, je ne cherche pas à faire autrement.

    A titre d'exemple, voilà un décorateur qui affiche le temps d'exécution de la fonction décorée (python 2.7) exécutée n fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import functools
    import time
     
    def tempsexec(n=1):
        """ decorateur pour calculer le temps d'exécution de n appels """
        def _decorateur(fonc):
            @functools.wraps(fonc)
            def appelfonc(*args, **kwargs):
                t = time.clock()
                for i in xrange(0,n):
                    result = fonc(*args, **kwargs)
                t = time.clock()-t
                print u"Temps d'exécution: %.7f s" % (t,)
                return result
            return appelfonc
        return _decorateur
    Exemple d'application pour le temps total de 100 exécutions de la fonction 'calcul':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @tempsexec(100)
    def calcul(a,b,c):
        ...
        ...
     
    print calcul(50,51,52)
    Affichage:

    Temps d'exécution: 1.4949730 s
    2071046250
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Avec Python3, j'ai repris le code précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import functools
    import time
     
    def tempsexec(n=1):
        """ decorateur pour calculer le temps d'exécution de n appels """
        def _decorateur(fonc):
            @functools.wraps(fonc)
            def appelfonc(*args, **kwargs):
                t = time.clock()
                for i in range(0,n):
                    result = fonc(*args, **kwargs)
                t = time.clock()-t
                print ("Temps d'exécution: %.7f s" % (t,))
                return result
            return appelfonc
        return _decorateur
     
    @tempsexec(100)
    def pair1(m):
    	el = range(0,m)
    	paire=[]
    	for np in el:
    		if np%2==0:
    			paire.append(np)
    	return(paire)
     
    print(pair1(20))
    Et j'obtiens 0 dans tous les cas...
    J'ai loupé quelque chose ?

    Temps d'exécution: 0.0000000 s
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    Pas d'aide par mp.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour marco056,

    Légèrement inquiet, j'ai repris ton code en copier-coller sous Python 3.2, et: ça marche!

    Cela donne:

    Temps d'exécution: 0.0005489 s
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    Essaie avec une fonction simple comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @tempsexec(100)
    def calcul():
        time.sleep(0.1)
        return "fin"
    Qui devrait donner environ 10s.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    Bonjour,

    Cela s'appelle closure, ce type de syntaxe est utilisé pour les décorateurs, et souvent pour éviter les variables globales, où l'on préfèrera les variables locales.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par rambc Voir le message
    MA QUESTION. Ceci étant que pensez-vous de cette pratique ? Existe-t-il des effets indésirables ?
    Le comportement de la fonction "r" n'est prédictible qu'appelée par "recherche". Impossible de la tester "indépendamment" sans faire le boulot d'initialisation fait par "recherche".
    Cette dépendance entre "recherche" et "r" est quand même mieux traduite via un "nesting" que par le passage de variables globales.


    Citation Envoyé par fred1599 Voir le message
    Cela s'appelle closure, ce type de syntaxe est utilisé pour les décorateurs, et souvent pour éviter les variables globales, où l'on préfèrera les variables locales.
    rambc ne nous parle que de "nested functions".
    Une fonction n'est pas un objet: sa duree de vie est réduite aux moments ou l’interpréteur l’exécute.
    Une "closure" a la même durée de vie que d'autres objets: zero reference => destruction par le GC.

    rambc aurait pu écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def recherche(x, L):
        def r(deb, fin):
            if deb > fin:
                return "Element non trouve"
            t = (deb + fin)//2
            if x == L[t]:
                return t
            elif x < L[t]:
                return r(deb, t-1)
            else:
                return r(t+1, fin)
        return r
    x = 45
    L = [3, 5, 8, 9, 15, 45, 123, 125]
    print('use closure ', recherche(45, L)(0, len(L)))
    Dans ce cas, recherche retourne un objet "function" et aura stocke (x, L) dans le locals() construit a son appel. La référence a la fonction "r" scotche ce locals() "englobant".
    Avec des "class" on pourrait écrire cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class recherche:
        def __init__(self, x, L):
            self._args = x, L
        def __call__(self, deb, fin):
            x, L = self._args
            if deb > fin:
                return "Element non trouve"
            t = (deb + fin)//2
            if x == L[t]:
                return t
            elif x < L[t]:
                return self(deb, t-1)
            else:
                return self(t+1, fin)
     
    x = 45
    L = [3, 5, 8, 9, 15, 45, 123, 125]
    print('use instance dict', recherche(45, L)(0, len(L)))
    La syntaxe d'appel ne change pas.
    C'est juste la construction de l'objet retourne (un callable) par "recherche(x, L)" qui est écrite (et réalisée) autrement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour marco056,
    Légèrement inquiet, j'ai repris ton code en copier-coller sous Python 3.2, et: ça marche!

    Étrange !
    Chez moi, le code suivant donne cela :

    Temps d'exécution: 0.0000000 s
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    Temps d'exécution: 0.0100000 s
    fin
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #! /usr/bin/env python3
    # -*- coding: utf8 -*-
     
    import functools
    import time
     
    def tempsexec(n=1):
        """ decorateur pour calculer le temps d'exécution de n appels """
        def _decorateur(fonc):
            @functools.wraps(fonc)
            def appelfonc(*args, **kwargs):
                t = time.clock()
                for i in range(0,n):
                    result = fonc(*args, **kwargs)
                t = time.clock()-t
                print ("Temps d'exécution: %.7f s" % (t,))
                return result
            return appelfonc
        return _decorateur
     
    @tempsexec(100)
    def pair1(m):
    	el = range(0,m)
    	paire=[]
    	for np in el:
    		if np%2==0:
    			paire.append(np)
    	return(paire)
     
    print(pair1(20))
     
    @tempsexec(100)
    def calcul():
        time.sleep(0.1)
        return "fin"
     
    print(calcul())
    Pas d'aide par mp.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    RTFM

    Sur Linux, time.clock ne retourne pas l'elapsed time mais le temps CPU consomme par le process. time.sleep(0.1) ne consommant pas grand chose => le résultat est "petit".

    Sur Windows, time.clock retourne l'elapsed time 100 * 0.1 ~ 10s.
    A partir de Python 3.3, time.clock est "deprecated", il est recommande d'utiliser time.process_time a la place.
    Et ça devrait être "consistant" sur tous les OS.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    @marco056

    Jusqu'à présent, j'étais sous Windows.

    Je viens d'essayer sous Linux (Mint15) avec Python 2.7 et Python 3.3: je trouve la même chose que toi dans les 2 versions. Le problème vient donc de la différence d'implémentation de time.clock entre les 2 OS.

    Par contre, ça marche en remplaçant time.clock() par time.time().

    Bizarre, bizarre...

    [grillé par wiztricks]: merci pour l'explication! Je vais faire les modifs qui s'imposent.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    @marco056

    Jusqu'à présent, j'étais sous Windows.

    Je viens d'essayer sous Linux (Mint15) avec Python 2.7 et Python 3.3: je trouve la même chose que toi dans les 2 versions. Le problème vient donc de la différence d'implémentation de time.clock entre les 2 OS.

    Par contre, ça marche en remplaçant time.clock() par time.time().

    Bizarre, bizarre...

    [grillé par wiztricks]: merci pour l'explication! Je vais faire les modifs qui s'imposent.
    OK, merci.
    Je suis en ce moment sous linux, cela vient donc de là.
    Pas d'aide par mp.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    @[B][grillé par wiztricks]: merci pour l'explication! Je vais faire les modifs qui s'imposent.
    Sous Linux, time.time() est la moins mauvaise solution pour les versions antérieures a 3.3. Le soucis étant sa précision bien inférieure au time.clock (sous Windows).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    [coup_de_gueule]
    Oui, mais ce n'est pas chouette de la part de Python.

    Sous Linux, ça ne marche pas sous Python 2.7, mais clock n'est pas obsolète, et ni perf_counter() ni process_time() n'existe: la seule solution est donc d'utiliser time()? Mais avec time(), on a l'activité de l'ordinateur, et pas seulement la fonction mesurée.

    Et sous Python 3.3, il faut utiliser soit perf_counter(), soit process_time() selon la machine: on fait quoi pour choisir dans un programme qu'on transporte: on joue aux dés?

    Faut-il maintenant un "sniffeur" à l'exécution pour sélectionner la fonction qui marche?
    [/coup_de_gueule]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Ce n'est pas bête le coup du sniffeur :
    Qqchose comme cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import os
    import sys
    import platform
     
    # print(os.name)
    # print(os.uname())
    if os.name == "posix":
    	if platform.system() == "Linux":
    		print("linux")
    	else:
    		print("Mac")
    else:
    	print("Wndows")
     
    print (sys.platform,"=>", end=" ")
    if sys.platform == "win32":
        print("Windows")
    elif sys.platform == "mac":
        print("Mac")
    elif sys.platform == "linux":
    	print("Linux")
    else:
    	print("Inconnu")
    Pas d'aide par mp.

  14. #14
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci pour toutes ces réponses.

    Reste à voir si j'aurais besoin un jour ou l'autre des closures... Pour les fonctions imbriquées, je ne m'en servais que pour les décorateurs.

  15. #15
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Finalement, on n'aura peut-être pas besoin d'un "sniffeur" pour savoir quel fonction de mesure des temps fonctionne: Python a déjà ça avec le module "timeit".

    Ainsi, on remplace dans les codes ci-dessus "time.clock()" par "timeit.default_timer()", et c'est Python qui se débrouille pour que ça marche (Windows ou Linux, Python 2.7 ou Python 3.3. Ok aussi sous Mac OS X 10.8.5 avec Python 2.7).

    Bon. Je ne suis pas sûr qu'on ait les microsecondes dans tous les cas, mais au moins, ça ne raconte pas n'importe quoi.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par rambc Voir le message
    Reste à voir si j'aurais besoin un jour ou l'autre des closures... Pour les fonctions imbriquées, je ne m'en servais que pour les décorateurs.
    Les decorateurs retournent des callables. Ecrits sous forme de nested functions, ce sont des "closures".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Response.Redirect dans une fonction dans une classe
    Par jpower dans le forum ASP.NET
    Réponses: 14
    Dernier message: 24/08/2007, 09h45
  3. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39
  4. Import d'une fonction, dans une fonction
    Par Goupo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/01/2007, 16h50
  5. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo