[python] Utilisation d'expressions génératives


  Les compréhensions, également appelées dérivation, sont une méthode d'expression concise pour générer des données régulières en Python.Comment utiliser la génération d'une ligne de code pour déduire les données requises est une question souvent rencontrée dans les entretiens.
  Remarque : la génération de liste est la génération la plus basique en python, et d'autres générations peuvent être converties en fonction de la génération de liste .

1. Formule de génération de chaînes

Les générateurs de chaînes peuvent être implémentés via des générateurs de listes :

>>> string = "".join([chr(i) for i in range(97,123)]) 
>>> string
'abcdefghijklmnopqrstuvwxyz'

Ou il peut être utilisé avec la fonction ord :

>>> "".join([chr(i) for i in range(ord("A"), ord("Z")+1)]) 
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

2. Formule de génération de tuples

Les générateurs de tuples sont également implémentés via des générateurs de listes :

>>> tup = tuple([i for i in range(5)]) 
>>> tup
(0, 1, 2, 3, 4)
>>> type(tup)
<class 'tuple'>

3. Génération de liste

3.1 Générer

Les générateurs de listes peuvent être générés à l'aide de générateurs (tels que plage, etc.) ou d'autres objets itérables :

>>> [i**2 for i in [0,1,2,3,4]]
[0, 1, 4, 9, 16]
>>> [i**2 for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3.2 si déclaration

Le générateur de liste peut également être utilisé avec la fonction if :
si la fonction if vient après, cela signifie filtrer les résultats du parcours :

>>> [i for i in range(10) if i%2==1]
[1, 3, 5, 7, 9]

3.3 instruction if-else

Si la fonction if vient en premier, cela signifie effectuer différentes opérations sur les résultats du parcours de for. Dans ce cas, une instruction else doit être ajoutée :

# 奇变偶不变
>>> [i**2 if i%2==1 else i for i in range(10)] 
[0, 1, 2, 9, 4, 25, 6, 49, 8, 81]

Cette situation peut être comprise comme l'exécution d'une opération ternaire sur le résultat de for traversal, elle peut donc également être implémentée à l'aide de la fonction lambda :

>>> [(lambda x:x**2 if x%2==1 else x)(i) for i in range(10)] 
[0, 1, 2, 9, 4, 25, 6, 49, 8, 81]

Les compréhensions de listes peuvent également être implémentées à l'aide de générateurs :

>>> list(map(lambda x:x**2 if x%2==1 else x, range(10)))        
[0, 1, 2, 9, 4, 25, 6, 49, 8, 81]

4. Définir la formule de génération

Remplacez simplement le symbole extérieur de la production par "{} :

>>> [i for i in range(10) if i%2==1]
[1, 3, 5, 7, 9]

Bien entendu, il peut également être converti à partir de la génération de liste :

>>> set([i for i in range(10) if i%2==0]) 
{
    
    0, 2, 4, 6, 8}

Enfin, il peut également être obtenu à partir de la transformation générative :

>>> set(i for i in range(10) if i%2==0) 
{
    
    0, 2, 4, 6, 8}

5. Formule de génération de dictionnaire

Il est également généré directement à l'aide de "{}", mais la paire clé-valeur "k:v" est placée à l'intérieur :

>>> {
    
    i:i**2 for i in range(10)} 
{
    
    0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

Vous pouvez également extraire des données d'une liste pour générer un dictionnaire :

>>> {
    
    i:j for (i,j) in [(1,1),(2,4),(3,9)]}  
{
    
    1: 1, 2: 4, 3: 9}

6. Autres formules de génération d'objets

Pour les classes simples, une génération simple peut également être réalisée via des expressions génératives.
Définir une classe Personne :

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

Générez une liste de classes :

names = ["张三", "李四", "王二", "麻子"]
ages = [34, 23, 56, 17]
person_list = [Person(names[i], ages[i]) for i in range(len(names))]

Affichez les éléments de classe dans la liste :

for person in person_list:
    print(f"name:{
      
      person.name}, age:{
      
      person.age}")
# name:张三, age:34
# name:李四, age:23
# name:王二, age:56
# name:麻子, age:17

Vous ne parvenez pas à faire la différence entre une formule générative et un générateur ?
Pour plus de méthodes d'utilisation et d'applications de python, veuillez prêter attention aux mises à jour ultérieures ~

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44844635/article/details/131378272
conseillé
Classement