Explication détaillée des fonctions d'appel de Python


1. L'ordre dans lequel les fonctions sont définies et appelées

Une fois la fonction définie, elle ne sera pas exécutée automatiquement, ce n'est qu'après son appel que la fonction sera exécutée et les résultats correspondants seront obtenus. Mais un point clé auquel nous devons prêter attention dans Python est que Python n'autorise pas les références avancées, c'est-à-dire que la fonction ne peut pas être appelée avant qu'elle ne soit définie.

Par exemple:

print plus(1,2)
def plus(a,b):  
    return a+b  

Le résultat courant est :

NameError: name 'plus' is not defined  

Le résultat de l'erreur montre que la fonction nommée plus n'a pas encore été définie (même si nous la définirons plus tard). Ainsi, lorsque nous appelons une fonction, nous devons nous assurer que la fonction est définie avant l'appel.

2. Utilisez correctement les paramètres

Lorsque nous appelons une fonction, nous devons appeler correctement le nom et les paramètres de la fonction.

Par exemple, nous définissons une fonction d'addition :

def plus(a,b):  
    return a+b  

Lorsque nous appelons la fonction plus(), si le type de paramètre transmis est incorrect, une erreur TypeError sera signalée. Et parfois, si le type de paramètre que nous transmettons n'est pas le type spécifié, même si la fonction appelante ne signale pas d'erreur, une erreur logique se produira.

Par exemple:

# 定义plus函数,作用是求两个正整数之和  
def plus(a,b):  
    return a+b
# 调用plus函数,参数类型为'1','2'  
print(plus('1','2'))  

Résultat de sortie :

12  

Bien que le programme de l'exemple ci-dessus n'ait pas signalé d'erreur, le résultat n'était pas conforme à nos attentes car notre intention initiale était d'appeler la fonction de style gras plus() pour ajouter deux entiers. Mais si nous transmettons une valeur de type chaîne, le résultat est la concaténation de deux chaînes. Cet exemple nous indique donc que nous devons faire attention au type de paramètres transmis. Lorsque nous transmettons des paramètres de type normaux et que le nombre de paramètres transmis est incohérent, une TypeError sera également signalée.

Par exemple:

# 定义plus函数,作用是求两个正整数之和  
def plus(a,b):  
    return a+b
# 调用plus函数,参数为1,2,3  
print(plus(1,2,3))  

Erreur signalée :

TypeError: plus() takes 2 positional arguments but 3 were given  

La raison de l'erreur montre que, comme la fonction plus() n'autorise que 2 paramètres, mais que 3 paramètres ont été transmis lors de l'appel, le programme a signalé une erreur.

3. Appels entre fonctions

3.1 Le code du programme pour le premier cas est le suivant :

def x(f):  
    def y():  
        print(1)  
    return y
def f():  
    print(2)
x(f)  

résultat de l'opération :

无结果

Analyse : étant donné que f dans x(f) à la ligne 9 n'a pas de parenthèses et que f n'est qu'un paramètre ordinaire, le programme appelle et exécute uniquement la fonction x(f) et n'appelle ni n'exécute la fonction f(). Bien que la fonction y() soit également définie dans la fonction x(f), la fonction y() n'est pas appelée et exécutée dans la fonction x(f), mais return y est exécuté. La variable y n'a aucune valeur, donc la valeur de retour de l'ensemble du programme n'est aucun résultat.

3.2 Le code du programme pour le deuxième cas est le suivant :

def x(f):  
    def y():  
        print(1)  
    return y
def f():  
    print(2)
x(f())  

résultat de l'opération :

2  

Analyse : étant donné que f() dans x(f()) à la ligne 9 a des parenthèses, le programme appelle et exécute d'abord la fonction f() et génère 2 en premier. Ensuite, 2 est passé dans la fonction x(f) en tant que paramètre et le programme commence à appeler et à exécuter la fonction x(f). Bien que la fonction y() soit également définie dans la fonction x(f), la fonction y() n'est pas appelée et exécutée dans la fonction x(f), mais return y est exécuté. La variable y n'a aucune valeur, donc appeler la fonction x(f) ne produit aucun résultat. Le programme finit donc par n’en produire que 2.

3.3 Le code du programme pour le troisième cas est le suivant :

def x(f):  
    def y():  
        print(1)  
    return y()
def f():  
    print(2)
x(f)  

résultat de l'opération :

1

Analyse : étant donné que f dans x(f) à la ligne 9 n'a pas de parenthèses et que f n'est qu'un paramètre ordinaire, le programme appelle et exécute uniquement la fonction x(f) et n'appelle ni n'exécute la fonction f(). La fonction y() est également définie dans la fonction x(f), et le retour est la fonction y(). Par conséquent, le programme appelle et exécute la fonction y() et le résultat de sortie est 1.

3.4 La quatrième situation

def x(f):  
    def y():  
        print(1)  
    return y()
def f():  
    print(2)
x(f())

résultat de l'opération :

2  
1  

Analyse : étant donné que f() dans x(f()) à la ligne 9 a des parenthèses, le programme appelle et exécute la fonction f() et génère 2 en premier. Ensuite, 2 est passé dans la fonction x(f) en tant que paramètre et le programme commence à appeler et à exécuter la fonction x(f). La fonction y() est également définie dans la fonction x(f), et le retour est la fonction y(). Par conséquent, le programme appelle et exécute également la fonction y() et génère 1. Enfin, le programme génère successivement 2 et 1.

3.5 Le code de programme pour le cinquième cas est le suivant :

def x(f):  
    def y():  
        print(1)  
        print(f())  
    return y()
def f():  
    #print(2)  
    return 2
x(f)  

résultat de l'opération :

1  
2  

Analyse : étant donné que f dans x(f) à la ligne 9 n'a pas de parenthèses et que f n'est qu'un paramètre ordinaire, le programme appelle et exécute simplement la fonction x(f) en premier. La fonction y() est également définie dans la fonction x(f), et la valeur de retour est la fonction y(), donc le programme appellera et exécutera la fonction y(). Dans la fonction y(), l'instruction print(1) est d'abord exécutée, produisant 1, puis l'instruction print(f()) est exécutée, donc le programme appellera et exécutera également la fonction f() à ce moment-là, sortie 2. Enfin, le programme génère successivement 1 et 2.

OK, c'est tout pour aujourd'hui. Bienvenue pour aimer et collectionner !

Je suppose que tu aimes

Origine blog.csdn.net/Rocky006/article/details/132963993
conseillé
Classement