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
** 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
** 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