Python >> Tutoriel Python >  >> Python

Générateur de ligne Python

Une fonction génératrice est une manière Pythonique de créer un itérable sans le stocker explicitement en mémoire. Cela réduit l'utilisation de la mémoire de votre code sans entraîner de coûts supplémentaires.

Le code suivant montre une fonction get_numbers(n) qui renvoie une liste de n nombres aléatoires.

import random


# NOT A GENERATOR!
# Create and return a list of numbers
def get_numbers(n):
    numbers = []
    for i in range(n):
        numbers.append(random.random())

    # List of n elements exists in memory
    return numbers


# Sum up 1000 random numbers
s = 0
for x in get_numbers(1000):
    s += x
print(s)

Cependant, ce n'est pas un code très efficace car vous créez une liste à l'avance sans besoin. Et si vous aviez 1 000 000 000 numéros ? Votre mémoire se remplirait rapidement !

Une meilleure façon est d'utiliser une fonction de générateur avec le yield mot-clé qui crée dynamiquement les nombres aléatoires au fur et à mesure qu'ils sont itérés :

import random


# GENERATOR
# Generate numbers one by one
def generate_numbers(n):
    for i in range(n):
        yield random.random()


# Sum up 1000 random numbers
s = 0
for x in generate_numbers(1000):
    s += x
print(s)

Il y a deux gros avantages à utiliser un générateur :

  • (1) Vous n'avez pas besoin de créer d'abord une énorme liste et de la stocker en mémoire, mais de générer l'élément suivant au fur et à mesure que vous l'itérez.
  • (2) C'est plus court et plus concis.

Cependant, ce n'est peut-être pas assez concis pour vous! 😉 Alors, voici le problème abordé dans cet article :


Problème :Peut-on écrire un générateur à une ligne ?

Plongeons-nous dans différentes méthodes pour y parvenir !

Méthode 1 :Fonction de générateur à une ligne

print(sum(random.random() for i in range(1000)))

Le code se compose des parties suivantes :

  • Le print() La fonction affiche le résultat de l'expression dans le shell.
  • Le sum() la fonction additionne toutes les valeurs dans l'itérable suivant.
  • L'expression génératrice random.random() for i in range(1000) génère 1000 nombres aléatoires et les alimente dans la fonction externe sum() sans les créer tous à la fois.

De cette façon, nous ne stockons toujours pas la liste complète des 1000 numéros en mémoire mais les créons dynamiquement.

Méthode 2 :exec()

La méthode suivante n'est pas jolie, mais elle résout le problème de créer un générateur en une seule ligne de code.

exec('def g(n):\n    for i in range(n):\n        yield random.random()')

Le exec() La fonction peut être utilisée pour unifier chaque extrait de code Python sous le soleil. Passez simplement le code que vous souhaitez exécuter sous forme de chaîne et remplacez toutes les nouvelles lignes par le caractère de nouvelle ligne '\n' . De cette façon, vous pouvez créer une fonction génératrice g(n) qui crée dynamiquement n nombres aléatoires. Vous pouvez maintenant les itérer à l'aide de l'extrait de code standard :

s = 0
for x in g(1000):
    s += x
print(s)
# 488.318368852096

Parce que les nombres sont aléatoires, la sortie sera différente pour vous. Vous pouvez l'essayer vous-même dans notre shell interactif :

Exercice  :Quel est le résultat pour vous ? Pourquoi est-il différent du nôtre ?

Livre Python One-Liners :maîtrisez d'abord la ligne unique !

Les programmeurs Python amélioreront leurs compétences en informatique avec ces lignes utiles.

Python One-Liners vous apprendra à lire et à écrire des « lignes simples » :des déclarations concises de fonctionnalités utiles regroupées dans une seule ligne de code. Vous apprendrez à décompresser et à comprendre systématiquement n'importe quelle ligne de code Python, et à écrire du Python éloquent et puissamment compressé comme un expert.

Les cinq chapitres du livre couvrent (1) les trucs et astuces, (2) les expressions régulières, (3) l'apprentissage automatique, (4) les principaux sujets de science des données et (5) les algorithmes utiles.

Des explications détaillées des one-liners introduisent les concepts clés de l'informatique etdéveloppez vos compétences en matière de codage et d'analyse . Vous découvrirez les fonctionnalités Python avancées telles que la compréhension de liste , tranchage , fonctions lambda , expressions régulières , carte et réduire fonctions et affectations de tranches .

Vous apprendrez également à :

  • Exploiter les structures de données pour résoudre des problèmes réels , comme utiliser l'indexation booléenne pour trouver des villes avec une pollution supérieure à la moyenne
  • Utiliser les bases de NumPy comme tableau , forme , axe , tapez , diffusion , indexation avancée , tranchage , tri , recherche , agrégation , et statistiques
  • Calculer des statistiques de base de tableaux de données multidimensionnels et les algorithmes K-Means pour l'apprentissage non supervisé
  • Créer davantage d'expressions régulières avancées en utilisant le regroupement et groupes nommés , anticipations négatives , caractères échappés , espaces blancs, jeux de caractères (et jeux de caractères négatifs ) et opérateurs gourmands/non gourmands
  • Comprendre un large éventail de sujets informatiques , y compris les anagrammes , palindromes , surensembles , permutations , factorielles , nombres premiers , Fibonacci chiffres, obscurcissement , recherche , et tri algorithmique

À la fin du livre, vous saurez comment écrire Python dans sa forme la plus raffinée , et créez de belles pièces concises d'"art Python" en une seule ligne.

Obtenez vos Python One-Liners sur Amazon !!