Python >> Tutoriel Python >  >> Python

Appel de fonction Python dans la compréhension de liste

Question :Est-il possible d'appeler une fonction à l'intérieur d'une instruction de compréhension de liste ?


Contexte :la compréhension de liste est une manière compacte de créer des listes. La formule simple est [expression + context] .

  • Expression : Que faire de chaque élément de la liste ?
  • Contexte : Quels éléments sélectionner ? Le contexte consiste en un nombre arbitraire de for et if déclarations.

Par exemple, le code [x**2 for x in range(3)] crée la liste des nombres carrés [0, 1, 4] à l'aide de l'expression x**2 .

Article connexe : Compréhension de liste en Python - Un guide illustré utile


Alors, pouvez-vous utiliser une fonction avec ou sans valeur de retour comme expression dans une compréhension de liste ?

Répondre :Vous pouvez utiliser n'importe quelle expression dans la compréhension de la liste, y compris les fonctions et les méthodes. Une expression peut être un entier 42 , un calcul numérique 2+2 (=4) , ou même un appel de fonction np.sum(x) sur tout x itérable . Toute fonction sans valeur de retour, renvoie None par défaut. C'est pourquoi vous pouvez même appeler des fonctions avec des effets secondaires dans une instruction de compréhension de liste.

Voici un exemple :

[print('hi') for _ in range(10)]
'''
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi
'''

Vous utilisez le trait de soulignement jetable _ parce que vous voulez exécuter la même fonction dix fois. Si vous souhaitez imprimer les 10 premiers chiffres sur le shell, le code suivant fait l'affaire :

[print(i) for i in range(10)]
'''
0
1
2
3
4
5
6
7
8
9
'''

Examinons le contenu de la liste que vous venez de créer :

lst = [print(i) for i in range(10)]
print(lst)
# [None, None, None, None, None, None, None, None, None, None]

La liste contient dix None valeurs parce que la valeur de retour du print() la fonction est None . L'effet secondaire de l'exécution de la fonction d'impression dans l'instruction de compréhension de liste est que les dix premières valeurs de 0 à 9 apparaissent sur votre sortie standard.

Opérateur de morse

Python 3.8 a introduit l'opérateur morse, également connu sous le nom d'expression d'affectation. Cet opérateur est utile si l'exécution d'une certaine fonction a des effets secondaires que vous ne voulez pas. Par exemple, si vous avez une méthode de création de chaîne dans l'instruction de compréhension de liste, conditionnée par un critère de filtrage dans le suffixe if. Sans l'opérateur morse, Python exécuterait cette même routine plusieurs fois, même si cela est hautement redondant. Vous pouvez éviter cette redondance en l'affectant à une variable s une fois en utilisant l'opérateur de morse et en réutilisant cette variable exacte dans l'expression.

import random


def get_random_string():
    return f'sss {random.randrange(0, 100)}'

# Goal: Print all random strings that contain 42

# WRONG
lst = [get_random_string() for _ in range(1000) if '42' in get_random_string()]
print(lst)
# ['sss 74', 'sss 13', 'sss 76', 'sss 13', 'sss 92', 'sss 96', 'sss 27', 'sss 43', 'sss 80']


# CORRECT
lst = [s for _ in range(1000) if '42' in (s := get_random_string())]
print(lst)
# ['sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42', 'sss 42']

Avec l'opérateur morse s := get_random_string() , vous stockez le résultat de l'appel de la fonction dans la variable s et récupérez-le dans la partie expression de la compréhension de la liste. Tout cela se passe à l'intérieur de la déclaration de compréhension de la liste.

J'enseigne ces concepts dans mon académie de messagerie exclusive FINXTER. Rejoignez-nous, c'est gratuit !

Vidéo connexe :Compréhension de la liste