Générez des nombres de Fibonacci avec des fermetures, des itérateurs et des générateurs Python

Écrivons le code pour générer le nombre de Fibonacci en utilisant la fermeture, l'itérateur et le générateur de Python.

Tout d'abord, la fermeture.

Python


def fibonacci_closure():
    values = []
    def fibonacci():
        if not values:
            values.append(0)
            return values[0]
        elif len(values) == 1:
            values.append(1)
            return values[1]
        else:
            next_fib = sum(values)
            values[0], values[1] = values[1], next_fib
            return next_fib
    return fibonacci

next_fibonacci = fibonacci_closure()

for i in range(17):
    fib = next_fibonacci()
    print fib,

résultat


 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Vient ensuite l'itérateur.

Python


class FibonacciIterator(object):
    def __init__(self):
        self.values = []
    def __iter__(self):
        return self
    def next(self):
        if not self.values:
            self.values.append(0)
            return self.values[0]
        elif len(self.values) == 1:
            self.values.append(1)
            return self.values[1]
        else:
            next_fib = sum(self.values)
            self.values[0], self.values[1] = self.values[1], next_fib
            return next_fib

for fib in FibonacciIterator():
    if fib > 1000:
        break
    print fib,

résultat


 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Enfin le générateur.

Python


def fibonacci_generator():
    values = [0, 1]
    yield 0
    yield 1
    while True:
        next_fib = sum(values)
        values[0], values[1] = values[1], next_fib
        yield next_fib

for fib in fibonacci_generator():
    if fib > 1000:
        break
    print fib,

résultat


 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Le générateur peut être écrit de manière très concise.

Cependant, il est préférable d'en faire un conteneur car il existe une dépendance inattendue à l'écriture du générateur de cette manière.

Python


class FibonacciGenerator(object):
    def __iter__(self):
        values = [0, 1]
        yield 0
        yield 1
        while True:
            next_fib = sum(values)
            values[0], values[1] = values[1], next_fib
            yield next_fib

for fib in FibonacciGenerator():
    if fib > 1000:
        break
    print fib,

résultat


 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Plus d'informations à ce sujet dans un autre article.

Enjoy!

Recommended Posts

Générez des nombres de Fibonacci avec des fermetures, des itérateurs et des générateurs Python
Itérateur et générateur Python
Génération de deux nombres pseudo-aléatoires corrélés (avec exemple Python)
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
Générer n nombres pseudo-aléatoires corrélés (avec l'exemple Python)
Programmation avec Python et Tkinter
Python et matériel - Utilisation de RS232C avec Python -
Générer du XML (RSS) avec Python
Juger les nombres premiers avec python
Implémentation de Fibonacci et des nombres premiers (python)
Notation et générateur d'inclusion de liste Python
python avec pyenv et venv
Fonctionne avec Python et R
Passons en revue les spécifications du langage autour des itérateurs et des générateurs Python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Tri avec un mélange de chiffres et de lettres
Jouez des nombres manuscrits avec Python Partie 1
Robot fonctionnant avec Arduino et python
Tester avec des nombres aléatoires en Python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Scraping avec Node, Ruby et Python
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
J'ai joué avec PyQt5 et Python3
[Python] Générer un mot de passe avec Slackbot
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Communiquez entre Elixir et Python avec gRPC
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Surveiller les pannes de Mojo avec Python et Skype
Jouez des nombres manuscrits avec python, partie 2 (identifier)
Modulation et démodulation FM avec Python Partie 3
Installation de Python et gestion des packages avec pip
Générer des données de test japonais avec Python Faker
Utilisation de Python et MeCab avec Azure Databricks
POSTER diversement avec Python et recevoir avec Flask
Capturer des images avec Pupil, python et OpenCV
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Utilisez PIL ou Pillow avec Cygwin Python
Créer et décrypter du code César avec python
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Lire et écrire des fichiers JSON avec Python
Gérer les "années et mois" en Python
J'ai installé et utilisé Numba avec Python3.5
Analyse des tweets avec Python, Mecab et CaboCha
Lier Python et JavaScript avec le notebook Jupyter
Calculer la séquence de Fibonacci avec générateur et itérateur
Modulation et démodulation FM avec Python Partie 2