TypeError: 'NoneType' object is not iterable

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 :)

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0
Auteur du sujet

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
>>> 

« La Nature est un livre écrit en langage mathématique », Galilée

+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 ;)

Édité par pierre_24

Doctorant et assistant en chimie à l'Université de NamurEx-dev' pour ZdS (a aidé à réaliser la ZEP-12 !) • Carniste cis (y parait que c'est une injure)

+0 -0
Auteur du sujet

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

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0
Auteur du sujet

C'est bon, merci de votre aide.

j'ai encore un peu de difficulté à penser en python, j'avais pas penser au liste de compréhension

« La Nature est un livre écrit en langage mathématique », Galilée

+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.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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