Élément de mémo Python efficace 18 Utilisez des arguments de position de longueur variable pour rendre l'apparence plus propre

Il s'agit d'un mémo écrit du livre efficace python d'O'Reilly Japan. https://www.oreilly.co.jp/books/9784873117560/ P42~44

Utilisez l'argument étoile (* arg) pour le rendre net

** Considérez une fonction qui enregistre un journal des informations de débogage **

def log(massage, values):
    if not values:
        print(massage)
    else:
        values_str = ', '.join(str(x) for x in values)
        print('%s: %s' % (massage, values_str))

log('My numbers are', [1, 2])
log('Hi there', [])

>>>
My numbers are: 1, 2
Hi there

Dans ce cas, le paramètre de la fonction de journal doit recevoir une liste s'il y a des nombres, mais une liste vide doit être donnée même s'il n'y a pas de nombres. Je veux sauver ce problème, et s'il n'y a pas de numéro, je ne veux donner aucun argument

Par conséquent, nous introduisons un argument de longueur variable appelé ** argument étoile ** avec l'opérateur `*` devant l'argument.

def log2(massage, *values):
    if not values:
        print(massage)
    else:
        values_str = ', '.join(str(x) for x in values)
        print('%s: %s' % (massage, values_str))

log2('My numbers are', [1, 2])
log2('Hi there') #Aucune entrée pour le deuxième argument

>>>

My numbers are: [1, 2]
Hi there

En définissant l'argument étoile sur l'argument, il traite toute entrée et la considère comme absente. (S'il n'est pas défini comme argument étoile, il ne correspondra pas au nombre de paramètres de fonction et provoquera une erreur de type)

De plus, si vous avez déjà une liste, vous pouvez ajouter l'opérateur `` * '' à la liste et le donner aux paramètres de la fonction.


favorites = [7, 33, 99]
massage = 'Favorite colors'
log2(massage, *favorites)

>>>
Favorite colors: 7, 33, 99

À première vue, c'est pratique, mais cela pose en fait deux problèmes

** 1. Les arguments de longueur variable sont convertis en taples avant d'être passés à la fonction ** Si l'appelant de la fonction est un générateur, il itère sur tous les tapples et peut provoquer un crash de mémoire (surtout s'il y a beaucoup de données).

def my_generator():
    for i in range(10):
        yield i
        
def my_func(*args): #Ici, les arguments sont convertis en tuples
    print(args)
    
it = my_generator() #Générateur il est généré
my_func(*it)               #Le générateur converti en taple est sorti

>>>
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Il est souhaitable que le nombre de listes d'arguments acceptées par la fonction my_func soit petit.

** 2. Si la position de l'argument de longueur variable et la position de l'argument au moment de l'appel s'écartent, la sortie sera corrompue **

def log3(sequence, message, *values):
    if not values:
        print('%s: %s' %(sequence, massage))
    else:
        value_set = ', '.join(str(x) for x in values)
        print('%s: %s: %s' % (sequence, massage, value_set))

log3(1, 'Favorotes', 7, 33)
log3('Favorites', 7, 33)

>>>

1: Favorotes: 7, 33
Favorites: 7: 33

Dans ce cas, dans la première sortie, 7 et 33 sont traités correctement car le troisième argument et les suivants correspondent à l'argument de longueur variable de la fonction log3. Par contre, dans la deuxième sortie, 7 est utilisé comme paramètre pour le massage. Et dans ce cas, aucune exception ne se produira, et cela peut passer inaperçu. Pour vous en débarrasser, vous devez faire attention à la position de l'argument d'entrée et aux paramètres de la fonction.

Recommended Posts

Élément de mémo Python efficace 18 Utilisez des arguments de position de longueur variable pour rendre l'apparence plus propre
Élément de mémo Python efficace 19 Donner un comportement facultatif aux arguments de mot-clé
Élément de mémo Python efficace 11 Utilisez zip pour traiter les itérateurs en parallèle
Élément de mémo Python efficace 3
Élément de note Python efficace 20 Utilisez Aucun et la chaîne de documentation lors de la spécification d'arguments par défaut dynamiques
Mémo Python efficace Élément 10 Énumérer à partir de la plage
Élément de mémoire Python efficace 7 Utilisez la notation d'inclusion de liste au lieu de la carte et du filtre
Comment utiliser la bibliothèque C en Python
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Le moyen le plus simple d'utiliser OpenCV avec python
[Algorithm x Python] Comment utiliser la liste
Utilisez le framework Python "cocotb" pour tester Verilog.
Comment utiliser Raspeye Relay Module Python
Je voulais utiliser la bibliothèque Python de MATLAB
[Python] Comment utiliser la bibliothèque de création de graphes Altair
Spécifiez MinGW comme compilateur utilisé dans Python
[Introduction à Udemy Python3 + Application] 27. Comment utiliser le dictionnaire
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
Comment utiliser le modèle appris dans Lobe en Python
[Introduction à Udemy Python3 + Application] 52. Tapple d'arguments positionnels
Je veux utiliser le jeu de données R avec python
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
Facilitez la compréhension de l'affichage des exceptions du module Python
La première API à créer avec le framework Python Djnago REST
Élément de mémo Python efficace 9 Considérons une expression de générateur pour la notation d'inclusion de grande
Comment utiliser la méthode __call__ dans la classe Python
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
[Python] Je souhaite utiliser l'option -h avec argparse
Je ne savais pas comment utiliser l'instruction [python] for
[Introduction à Udemy Python3 + Application] 50. Arguments de position, arguments de mots-clés et arguments par défaut
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes