1. Portée au niveau du bloc
Pensez-y, y aura-t-il une sortie lors de l'exécution du programme suivant à ce moment-là ? L'exécution sera-t-elle réussie ?
#块级作用域
if 1 == 1:
name = "lzl"
print(name)
for i in range(10):
age = i
print(age)
Copier après la connexion
Jetons d'abord un coup d'œil aux résultats de l'exécution
C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py
lzl
9
Copier après la connexion
Processus terminé avec le code de sortie 0
Le code a été exécuté avec succès, pas de problème en Java ; /C# Dans , l'exécution du code ci-dessus indiquera que le nom et l'âge ne sont pas définis, mais dans Python, il peut être exécuté avec succès car il n'y a pas de portée au niveau du bloc. Python. La variable peut être appelée en externe, afin qu'elle puisse s'exécuter avec succès
2. Portée locale
En rappelant les connaissances apprises auparavant, nous apprenons le <.> fonction
Lorsque la fonction est une portée distincte. Il n'y a pas de portée au niveau du bloc en Python, mais il existe une portée locale ; regardez le code suivant #Portée locale
Exécutez cette section Code, demandez-vous s'il y aura une sortie ?
def func():
name = "lzl"
print(name)
Copier après la connexion
Erreur d'exécution, je pense que tout le monde peut comprendre cela, la variable name ne prend effet que dans la fonction func(), elle ne peut donc pas être appelée globalement, faites un simple ajustement au code ci-dessus, voyons voir ; quel est le résultat ?
Traceback (most recent call last):
File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
print(name)
NameError: name 'name' is not defined
Copier après la connexion
Copier après la connexion
Ajouter une ligne de code au code précédent. Avant que le nom de la variable ne soit imprimé, une fonction est exécutée. L'impression changera-t-elle à ce moment-là ?
#局部作用域
def func():
name = "lzl"
func() #执行函数
print(name)
Copier après la connexion
L'exécution rapporte toujours une erreur, revenons à la phrase tout à l'heure : même si la fonction est exécutée, la portée de name est uniquement à l'intérieur de la fonction, et elle ne peut toujours pas être appelée de l'extérieur ; rappelez-vous les deux premiers points de connaissance Attendez, commençons ensuite le mouvement d'amplification
Traceback (most recent call last):
File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
print(name)
NameError: name 'name' is not defined
Copier après la connexion
Copier après la connexion
3. Chaîne de portée
Effectuer des ajustements à la fonction et voir comment le code suivant s'exécute ?
Après avoir appris les fonctions, vous devez savoir que Snor sera affiché après l'exécution de f1(). Rappelons d'abord un concept. Il existe une chaîne de portée en Python. Les variables seront recherchées de l'intérieur. l'extérieur. Allez d'abord chez vous. En cherchant la lunette, je ne suis pas allé voir les supérieurs pour la chercher jusqu'à ce que je ne la trouve pas et que j'ai signalé une erreur
#作用域链
name = "lzl"
def f1():
name = "Eric"
def f2():
name = "Snor"
print(name)
f2()
f1()
Copier après la connexion
4. La version ultime de la lunette.
D'accord, assez de préparation, la version ultime est ici~~
Réfléchissez à la question de savoir si le résultat final de l'exécution de f2() doit imprimer "lzl" ou "eric" ? N'oubliez pas votre réponse. Au lieu de publier la réponse maintenant, jetez un œil au code suivant :
#终极版作用域
name = "lzl"
def f1():
print(name)
def f2():
name = "eric"
f1()
f2()
Copier après la connexion
Le résultat de l'exécution est "lzl". Analysez le code ci-dessus et le résultat de l'exécution de f2() est La mémoire. adresse de la fonction f1, c'est-à-dire ret=f1 ; exécuter ret() équivaut à exécuter f1(), cela n'a rien à voir avec f2() et f1(). dans la même chaîne de portée s'il n'y a pas de variable à l'intérieur de la fonction, elle regardera à l'extérieur, donc la valeur du nom de la variable à ce moment est "lzl" si vous comprenez cela, alors vous connaissez également la réponse au code ultime ; que la réponse n'a pas été donnée tout à l'heure
#终极版作用域
name = "lzl"
def f1():
print(name)
def f2():
name = "eric"
return f1
ret = f2()
ret()
#输出:lzl
Copier après la connexion
Oui, la sortie est "lzl", rappelez-vous qu'avant l'exécution de la fonction, la portée a été formée et la chaîne de portée a également été générée
#终极版作用域
name = "lzl"
def f1():
print(name)
def f2():
name = "eric"
f1()
f2()
# 输出:lzl
Copier après la connexion
5. Questions d'entretien avec Sina
Jugement Quel type de li ? De quel type sont les éléments de li ?
li = [lambda :x for x in range(10)]
Copier après la connexion
Vous pouvez voir que li est un type de liste et que les éléments de la liste sont des fonctions. Imprimez ensuite la valeur de retour du premier élément de la liste. Quelle est la valeur de retour à ce moment ?
print(type(li))
print(type(li[0]))
# <class 'list'>
# <class 'function'>
Copier après la connexion
li La valeur de retour de la première
#lambada 面试题
li = [lambda :x for x in range(10)]
res = li[0]()
print(res)
#输出:9
Copier après la connexion
fonction
est 9 et non 0. N'oubliez pas : le code interne ne sera pas exécuté avant que la fonction ne soit exécutée ; le blog par vous-même Pratiquez et approfondissez votre impression
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!