2
votes

L'expression d'affectation peut-elle créer des séries de Fibonacci en utilisant la compréhension de liste?

Avec l'expression d'affectation, j'ai pensé que je pourrais essayer la compréhension de liste pour créer Fibonacci . Je initialise d'abord une liste de Fibonacci de 5 éléments f = [1,2,3,4,5] avec les deux premières valeurs étant les graines. Le test exécuté ci-dessous montre que l'expression d'affectation fonctionne.

[f[n] := f[n-1] + f[n-2] for n in range(2,6)] 

Mais le vrai Fibonacci a échoué à f [n] où un marqueur rouge apparaît dans le shell Python.

[y := f[n-1] + f[n-2] for n in range(2,6)] 
[3, 5, 7, 9]

Est-ce parce que f [n] n'est pas un nom de variable valide?
Cela signifie-t-il que l'expression d'affectation pourrait ne pas aider à la compréhension de la liste pour Fibonacci?


5 commentaires

Des expressions d'affectation ont été ajoutées récemment dans Python 3.8. Assurez-vous que le niveau de langue de votre IDE est défini sur ceci.


Votre expression fibonacci n'est pas correcte, il semble que vous ne générez que des nombres impairs. Essayez s = [0, 1]; result = s + [(s := [s[1], s[0] + s[1]]) and s[1] for k in range(10)]


Avez-vous regardé le message d'erreur que vous avez reçu? Il dit "SyntaxError: impossible d'utiliser des expressions d'affectation avec indice". Ainsi, vous ne pouvez pas utiliser d'expressions d'affectation pour mettre à jour un élément d'une liste, lorsque vous essayez.


Je voudrais faire valoir qu'il ne s'agit pas d' un doublon tel que défini actuellement, car il s'agit d'une question sur l'opérateur d'affectation, plutôt que sur la séquence de Fibonacci. Ce dernier est plus un exemple.


Merci pour toutes vos réponses. Comme @ cs95 l'a suggéré, f = [0, 1]; f += [(f := [f[1], f[0] + f[1]]) and f[1] for n in range(10)] fonctionne sans avoir besoin de f [n]: =. À propos, j'utilise l'IDE PyCharm avec Python3.8, lorsque j'ai survolé le marqueur rouge, il a montré 'identifiant attendu'. Comment obtenir le message d'erreur "SyntaxError ..."?


3 Réponses :


1
votes

L'utilisation de [f[n] := ... aboutit à SyntaxError: cannot use assignment expressions with subscript , donc clairement cette restriction empêche de le faire de cette façon. Ceci est mentionné dans la PEP 572 dans une section intitulée Différences entre les expressions d'affectation et les instructions d'affectation où est dit

  • Les cibles d'attribution unique autres qu'un seul NAME ne sont pas prises en charge.

0 commentaires

0
votes

Juste pour montrer quelques méthodes de génération d'une série Fibonacci.py que je connais:

class   Fib:

    def __init__(self, *f01):
        self.f0, self.f1 = f01

    # Calculate the n-th item of the Fibonacci series
    def fibRecursive(self, n):
        if n == 0:
            return self.f0
        elif n == 1:
            return self.f1
        return self.fibRecursive(n-2) + self.fibRecursive(n-1)

    def fibAppend(self, n):
        f = [self.f0, self.f1]
        for i in range(2, n):
            f.append(f[i-2]+f[i-1])
        return f

    def fibYield(self, n):
        x, y = self.f0, self.f1
        for _ in range(n):
            yield x
            x, y = y, x + y

    def fibIncremental(self, n):
        x, y = self.f0, self.f1
        f = [x, y]
        for i in range(2, n):
            x, y = y, x + y
            f.append(y)
        return f

    def fibLCAE(self, n):   # LC with Assignment expression
        f = [self.f0, self.f1]
        f += [(f := [f[1], f[0] + f[1]]) and f[1] for i in range(2,n)]
        return f

if  __name__ == '__main__':
    n = int(input("How many numbers in the Fibonacci sequence?   "))
    fd = Fib.__dict__
    for f in [Fib(0, 1), Fib(3, -3), Fib(-50, 100)]:
        print(f'Fibonacci initial two numbers : {f.f0}, {f.f1}')
        for func in [fd['fibAppend'], fd['fibIncremental'], fd['fibLCAE']]:
            print(func(f, n))
        print([f.fibRecursive(i) for i in range(n)])
        print(list(f.fibYield(n)))
        print()

>>> python.exe Fibonacci.py
How many numbers in the Fibonacci sequence?   13
Fibonacci initial two numbers : 0, 1
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
....
Fibonacci initial two numbers : 3, -3
[3, -3, 0, -3, -3, -6, -9, -15, -24, -39, -63, -102, -165]
....
Fibonacci initial two numbers : -50, 100
[-50, 100, 50, 150, 200, 350, 550, 900, 1450, 2350, 3800, 6150, 9950]
....


0 commentaires

0
votes

Que diriez-vous de deux compréhensions de liste, ou de construire une liste de base, puis de calculer?

Générer un tableau de base fibonacci,

fb[0:13]: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
fib(fb,13-1) = 144

Calculer fib (13), (want: [f [n]: = f [n-1] + f [n-2] for n in range (2,20)])

def fib(f,n):
    if n > 1:
        f[n] = f[n-1] + f[n-2]
    return f[n]

Où fib (f, n) est:

f = [ fib(fb,n) for n in range(2,20) ]

Séquence de Fibonacci:

fb = [n for n in range(0,21)]
# or
fb = [0] + [1] * 20


0 commentaires