TypeError: 'NoneType' object is not iterable

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

je suis en ce moment en train de coder un programme pour trouver les attributs d'une série statistique (médiane, étendue, quartile, etc.).

Après un peu de temps j'arrive enfin à la fin mais lors de mes tests il apparait l'erreur

1
TypeError: 'NoneType' object is not iterable

je ne comprends pas cette erreur donc je demande votre aide. Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class statSerie(object):
    def __init__(self, serie):
        self.serie = serie.sort()
        self.refresh()

    def __repr__(self):
        to_return = "; ".join(self.serie)
        to_return += "\nétendue = %d; mediane = %d; q1 = %d; q2 = %d; moyenne = %d"\
            %(self.etendue, self.mediane, self.q1, self.q2, self.moyenne)
        return to_return

    def cal_etendue(self):
        self.etendue = max(self.serie) - min(self.serie)

    def cal_mediane(self):
        nbr_valeur = self.serie.len()
        if (nbr_valeur%2):
            self.mediane = self.serie[int(nbr_valeur/2) + 1]
        else:
            self.mediane = (self.serie[nbr_valeur/2] + \
                            self.serie[nbr_valeur/2 + 1])/2

    def cal_q1(self):
        q1_index = int(self.serie.len()/4) + 1
        self.q1 = self.serie[q1_index]

    def cal_q3(self):
        q3_index = int(self.serie.len()/4*3) + 1
        self.q3 = self.serie[q3_index]

    def cal_moyenne(self):
        self.moyenne = sum(self.serie)/self.serie.len()

    def refresh(self):
        self.cal_etendue()
        self.cal_mediane()
        self.cal_q1()
        self.cal_q2()
        self.cal_moyenne()

    def append(self, to_append):
        try:
            self.serie.append(float(to_append))
            self.refresh()
        except TypeError:
            print("error : no numeric variable")

Merci d'avance de votre aide :)

+0 -0

Oh oui excuse-moi. Voilà l'erreur en complet

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>>> import statserie as stat
>>> myserie = stat.statSerie([1, 3, 5, 7, 9, 2, 4, 6, 8, 10])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ludovic/workspace/python/projets/statsolver/statserie.py", line 4, in __init__
    self.refresh()
  File "/home/ludovic/workspace/python/projets/statsolver/statserie.py", line 35, in refresh
    self.cal_etendue()
  File "/home/ludovic/workspace/python/projets/statsolver/statserie.py", line 13, in cal_etendue
    self.etendue = max(self.serie) - min(self.serie)
TypeError: 'NoneType' object is not iterable
>>> 
+0 -0

Ah, j'ai trouvé ! La fonction sort() des listes ne renvois pas d'objet, elle ne fait que trier l'objet courant. Tu dois utiliser la fonction sorted() pour renvoyer la liste triée et la stocker dans self.serie. Ou bien (mieux en terme de mémoire) tu le fais en deux fois :

1
2
serie.sort()
self.serie = serie

PS: même en python 2, utilise format() et pas % pour les chaines de caractères formatées ;)

+0 -0

ok merci pour ça mais j'ai un autre probleme avec la fonction str.join()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import statserie as stat
>>> myserie = stat.statSerie([1, 3, 5, 7, 9, 2, 4, 6, 8, 10])
>>> print(myserie)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ludovic/workspace/python/projets/statsolver/statserie.py", line 8, in __repr__
    to_return = "; ".join(self.serie)
TypeError: sequence item 0: expected str instance, int found
+0 -0

Essaie ça :

1
to_return = "; ".join([str(x) for x in self.serie])

QuentinC

Il serait préférable dans le cas présent de retirer les crochets et d'écrire plus simplement

1
to_return = "; ".join(str(x) for x in self.serie)

En effet, l'itérable n'est utile que le temps de la construction de la chaîne, nous n'avons besoin que d'itérer une fois dessus, donc un générateur est plus approprié (il ne consomme presque pas de mémoire).

Il serait préférable dans le cas présent de retirer les crochets et d'écrire plus simplement: …

Merci. j'avais un doute si les crochets étaient nécessaires ou facultatifs et si ça chengeait quelque chose de les mettre ou pas. ME voilà fixé. Je suis moi-mêm en train de me mettre à python en venant de Java et C++, donc ce genre de détail m'échappe encore.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte