Maison > développement back-end > Tutoriel Python > Lorsque vous écrivez des scripts Python, assurez-vous d'ajouter ceci !

Lorsque vous écrivez des scripts Python, assurez-vous d'ajouter ceci !

PHPz
Libérer: 2023-04-14 19:40:01
avant
1396 Les gens l'ont consulté

Les personnes qui utilisent Python écrivent souvent des scripts Que ce soit pour améliorer l'efficacité du travail ou pour répondre à certains besoins spécifiques, les scripts Python sont une chose courante et utile.

Cependant, j'ai récemment découvert un problème que je n'avais jamais remarqué auparavant, à savoir s'il faut ajouter if __name__ == "__main__":
Cette déclaration a en fait un grand impact sur l'utilisation du script, et il y a bien d'autres choses dedans. Grande connaissance.

Malentendus courants

De nombreux amis sont plus décontractés lorsqu'ils écrivent des scripts simples. Les scripts simples sont écrits directement sans fonctions et exécutés séquentiellement. Pour les scripts plus complexes, des fonctions peuvent être ajoutées. Cette façon d'écrire est moins lisible et les utilisateurs ne peuvent souvent pas trouver d'un seul coup d'œil l'entrée et la séquence d'exécution du programme.

La méthode d'écriture recommandée par la communauté Python consiste à ajouter la déclaration suivante lors de l'écriture d'un script :

def main():
# do something
print("do something.")

if __name__ == "__main__":
main()
Copier après la connexion

La plupart des gens diront quand ils verront cela, qu'est-ce que cela signifie ? Ce n'est pas si important de l'ajouter ou non !

Ne soyez pas trop occupé et dédaigneux, regardons de plus près !

À quoi ça sert ?

Avant d'expliquer la fonction de if __name__ == '__main__' en détail, ressentons-la intuitivement à partir d'un exemple simple.

# const.py
 
PI = 3.14
 
def train():
print("PI:", PI)
 
train()
Copier après la connexion
# area.py
 
from const import PI
 
def calc_round_area(radius):
return PI * (radius ** 2)
 
def calculate():
print("round area: ", calc_round_area(2))
 
calculate()
Copier après la connexion

Jetons un coup d'œil aux résultats d'exécution de Area.py : La variable PI de

PI: 3.14
round area:12.56
Copier après la connexion

, lors de l'exécution, l'impression dans la fonction train()
dans const.py est également importée, mais nous ne référençons que le variable et non une fonction de référence, c'est donc quelque chose que nous ne voulons pas voir.

La solution à ce problème est également très simple. Il suffit d'ajouter une phrase à const.py :

PI = 3.14

def train():
 print("PI:", PI)

if __name__ == "__main__":
 train()
Copier après la connexion

Exécutez à nouveau area.py, le résultat de sortie est le suivant :

round area:12.56
Copier après la connexion

C'est le résultat que nous attendions. .

Entrée en cours d'exécution du programme

À partir des exemples ci-dessus, nous pouvons constater que s'il n'y a pas de if __name__=="__main__":, lors de l'importation du fichier sous Area.py, tous les codes de const.py
seront exécutés, et après l'avoir ajouté, exécutez uniquement la partie importée du code.

C'est l'effet évident de if __name__=="__main__":. En fait, if __name__=="__main__": est équivalent à l'entrée du programme de
Simulation Python. Puisque les modules se réfèrent les uns aux autres, différents modules peuvent avoir de telles définitions, mais il ne peut y avoir qu'un seul programme d'entrée. Le programme d'entrée sélectionné dépend de la valeur de __name__.

Regardons à nouveau un petit programme :

print("look here")
print(__name__)
 
if __name__ == '__main__':
print("I'm test.py")
Copier après la connexion

Les résultats d'exécution du programme sont les suivants :

look here
__main__
I'm test.py
Copier après la connexion

On peut constater que la valeur de la variable __name__ est __main__ à ce moment, donc "Je suis
test .py" est imprimé. Si vous exécutez d'autres fichiers et appelez ce fichier via le fichier en cours d'exécution, l'instruction ne sera pas imprimée car l'entrée du programme est incorrecte et l'instruction ne sera pas exécutée.

Spécification du code

Avec if __name__=="__main__": équivalent à Python
Le programme a également une fonction d'entrée Nous pouvons clairement savoir où commence la logique du programme. Bien sûr, nous devons également changer consciemment le. logique du programme. La logique de départ est toute placée ici. En fait, c'est aussi l'approche recommandée par PyCharm
.

Pourquoi de nombreux excellents langages de programmation, tels que C, Java, Golang et C++, ont-ils une fonction d'entrée principale. Je pense qu'une raison très importante est que l'entrée du programme est unifiée et facile à lire ?

Les scénarios multi-processus sont très utiles

Si vous utilisez plusieurs processus pour le calcul parallèle, codez comme ceci :

import multiprocessing as mp

def useful_function(x):
return x * x

print("processing in parallel")
with mp.Pool() as p:
results = p.map(useful_function, [1, 2, 3, 4])
print(results)
Copier après la connexion

Exécutez ce code, la console continuera à imprimer :

processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
Copier après la connexion

Et le programme continuera à signaler RuntimeError .

Si vous ajoutez if __name__=="__main__": , le programme se déroulera comme prévu :

import multiprocessing as mp

def useful_function(x):
return x * x

if __name__ == '__main__':
print("processing in parallel")
with mp.Pool() as p:
results = p.map(useful_function, [1, 2, 3, 4])
print(results)
Copier après la connexion
Le multi-programme de Python consiste à démarrer plusieurs interpréteurs Python, et chaque interpréteur Python importera votre script, copiera une copie du fichier global variables et fonctions pour le processus enfant. S'il y a if

__name__=="__main__":, alors le code derrière celui-ci ne sera pas importé et ne sera pas exécuté à plusieurs reprises. Sinon, le code qui crée plusieurs processus sera
importé et exécuté, créant ainsi des processus enfants de manière infiniment récursive

Résumé

if __name__=="__main__": Bien que ce ne soit pas obligatoire, j'insiste là-dessus Il est recommandé suivez cette spécification lors de l’écriture de scripts.

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!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal