IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

résultat -> liste [Python 2.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut résultat -> liste
    Bonjour,

    Je suis assez nouveau sur le langage python.
    je travailler sur un projet d'automatisation de données.

    J'ai une fonction qui me retourne les numéros des items d'un host.

    Il me les retourne de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    24320
    24337
    24315
    24326
    24328
    24331
    24313
    (je fais exprès de ne pas utiliser le mots liste)

    Donc j'ai en sortie les items, malheureusement il y a un "mais". J'utilise cette sortie pour retrouver la valeur associé à chaque items. Sauf que python considère que la sortie est un seul objet et non plusieurs.
    J'aimerais donc savoir comment placer cette sortie dans une liste(un tableau) pour pouvoir l'utiliser dans une boucle.

    donc en gros, il faudrait que le résultat sois intégré dans une liste, comme ceci: (pour être utilisable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ["24320","24337",....,"24313"]
    Si vous avez une solution à me proposer, je suis preneur.

    Cordialement,

    Chattam

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    Pour répondre il faudrait voir ce qu'est cette fonction qui "retourne les numéros des items d'un host"

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    Citation Envoyé par chattam Voir le message
    Sauf que python considère que la sortie est un seul objet et non plusieurs.
    J'aimerais donc savoir comment placer cette sortie dans une liste(un tableau) pour pouvoir l'utiliser dans une boucle.
    En supposant que l'"objet" est un ensemble de "lignes", on pourrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> data='''24320
    ... 24337
    ... 24315
    ... 24326
    ... 24328
    ... 24331
    ... 24313'''
    >>> data.splitlines()
    ['24320', '24337', '24315', '24326', '24328', '24331', '24313']
    >>>
    Mais ce ne sont que des suppositions....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Voici mon script, cela va peut être vous aider à comprendre. J'interroge un serveur zabbix.

    Je m'authentifie. Puis je récupère les items(itemid pour être plus précis) de mon host.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/lib/env python
     
    import urllib2
    import json
     
    """fonction authentification """
     
    def authenticate(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
     
            values = {'jsonrpc': '2.0','method': 'user.authenticate','params': {'user': username,'password': password},'id': '0'}
     
            data = json.dumps(values)
            req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
            response = urllib2.urlopen(req, data)
            output = json.loads(response.read())
            return output['result']
     
     
    """ fonction de recuperation des items"""
    def get_item(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
     
            values = {'jsonrpc': '2.0','method': 'item.get','params': {'output':'extend','host':'srv018'},'auth': auth,'id': '0'}
     
            data = json.dumps(values)
            req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
            response = urllib2.urlopen(req, data)
            output = json.loads(response.read())
     
            nbr = len(output['result'])
            print nbr
     
            for i in range(nbr):
                    print output['result'][i]["itemid"]
     
    """test fct item"""
    print get_item()
    j'ai déjà essayer splitlines et tout la tripoté de split à vrai dire, sans grand succès. La raison est que j'ai un none en fin de "liste" après mes items

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "test_item.py", line 37, in <module>
        print get_item().splitlines()
    AttributeError: 'NoneType' object has no attribute 'splitlines'

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    et ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    items = [i["itemid"] for i in output['result']]
    print items
    ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Alors VinSs, voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [u'24329', u'24342', u'24317', u'24330', u'24655', u'24650', u'24340', u'24318', u'24334', u'24651', u'24312', u'24327', u'24333', u'24341', u'24649', u'24653', u'24332', u'24314', u'24324', u'24648', u'24319', u'24339', u'24316', u'24647', u'24311', u'24654', u'24325', u'24336', u'24656', u'24321', u'25097', u'24323', u'24320', u'24337', u'24315', u'24326', u'24328', u'24331', u'24313', u'24338', u'24652', u'24335', u'24322']
    None
    Si on pouvait supprimer ce none, ça serait nickel.
    J'ai fait une simple boucle pour voir si je pouvais utiliser le résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i in get_item():
            print i
     
    résultat:
    TypeError: 'NoneType' object is not iterable
    Je ne sais pas si c'est possible?

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Ce None n'est pas dans la liste !

    d'ou sort-il ?

    ...

    Cherche plus, la liste est printée dans la fonction mais la fonction elle, elle retourne None.

    Alors fait-lui retourner la liste.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chattam Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def get_item(url = "https://toto.straton-it.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
    ...
            for i in range(nbr):
                    print output['result'][i]["itemid"]
    # get_item()
     
    """test fct item"""
    print get_item()
    Bonjour
    VinsS a trouvé.
    Ton premier print affiche la liste. Ton second print, lui, affiche ce que renvoie la fonction (donc None puisqu'elle ne renvoie rien)

    Rajoute return [x["itemid"] for x in output['result']] en fin de fonction et t'auras plus de soucis...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Merci pour vos réponses qui m'ont aidé.

    J'ai donc pu utiliser ma liste d'item pour retrouver leur valeur associé: (je n'ai pas remis la fonction auth, juste ma fonction item et history(valeur))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    """ fonction de recuperation des items"""
    def get_item(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
     
            values = {'jsonrpc': '2.0','method': 'item.get','params': {'output':'extend','host':'srv018'},'auth': auth,'id': '0'}
     
            data = json.dumps(values)
            req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
            response = urllib2.urlopen(req, data)
            output = json.loads(response.read())
     
    		return [x["itemid"] for x in output['result']]#,[x["name"] for x in output['result']]
     
     
     
    """fonction de recuperation des valeurs"""
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            item = get_item(url, username, password)
     
     
            for i in item:
     
                    values = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':i,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(values)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    if not output['result'] == []:
                            print i,output['result'][0]['value']
                    else:
                            print i
     
    """test fct history"""
    print get_history()
    Ce qui me donne ce résultat( certains items n'ont pas de valeur, c'est normal, c'est du au paramètre que j'ai indiqué):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    24325 99.4949
    24315
    24326
    24328 0.0000
    24331 0.0167
    24313
    24335 0.0000
    24322
    None
    Et oui, j'ai encore un "None". je vais encore vous embêté pour ça. J'ai encore utiliser print.
    Malheuresement, si je fais un return. la boucle va s'arreter au 1er item. D'ou la raison de l'utilisation du print et donc je suppose de la présence du None

    Comment utiliser return sans empêcher le for?

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut propos limite grossiéreté
    Citation Envoyé par chattam Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    print get_history()
    Et oui, j'ai encore un "None". je vais encore vous embêté pour ça. J'ai encore utiliser print.
    Dans ton post précédent tu faisais un print get_item(), une fonction qui ne retournant rien, te renvoyait alors rien (None).
    On te dit de rajouter un return dans cette fonction pour qu'elle renvoie quelque chose. Ainsi, elle ne renvoie plus "None".

    Et ici tu fais un print get_history(), une autre fonction qui, elle-aussi, ne renvoie rien et tu nous dit "oh c'est bizarre j'ai encore un none". Et t'es incapable de faire le rapprochement entre ce cas ci et le cas précédent ???
    Ben là aussi c'est pareil (mêmes causes=mêmes effets) => fais-lui renvoyer quelque chose et t'auras plus de None. Sauf si tu fais un print d'une 3° fonction qui elle-aussi ne renvoie rien quoi !!!

    Citation Envoyé par chattam Voir le message
    Malheuresement, si je fais un return. la boucle va s'arreter au 1er item.
    Ben si tu fais un return dans le for, effectivement ta fonction s'arrête à la première itération. Donc effectivement faut pas faire de return dans le for mais en dehors du for, et renvoyer alors un item qui aura été construit dans le for !!!

    Citation Envoyé par chattam Voir le message
    Comment utiliser return sans empêcher le for?
    Tu as aussi une seconde possibilité: le yield.
    Il s'agit d'une nouvelle notion qu'on ne retrouve pas partout (je l'ai vue pour l'instant uniquement en C# et en Python). Ca permet de renvoyer une valeur tout en maintenant la position courante dans ta fonction. Et lors de l'appel suivant à la fonction, le code de la fonction reprend là où il s'était arrêté.

    On s'en sert typiquement pour créer des générateurs

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def gen(chaine):
        for x in chaine: yield x
    # gen()
     
    for lettre in gen("abcdefghi"):
        print lettre

    Ca produit à l'écran exactement la même chose que le code suivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def gen(chaine):
        ret=""
        for x in chaine: ret+=x
        return ret
    # gen()
     
    for lettre in gen("abcdefghi"):
        print lettre

    La seule différence, c'est qu'avec le générateur tu ne renvoies qu'un élément à la fois mais tu appelles le générateur autant de fois qu'il y a d'éléments à traiter ; et avec la méthode classique tu n'appelles le générateur qu'une seule fois et lui il renvoie tous les éléments d'un coup (plus de mémoire quoi)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    j'ai suivi l'idée du yield:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    """ fonction de recuperation des items"""
    def get_item(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
     
            values = {'jsonrpc': '2.0','method': 'item.get','params': {'output':'extend','host':'srvstit018'},'auth': auth,'id': '0'}
     
            data = json.dumps(values)
            req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
            response = urllib2.urlopen(req, data)
            output = json.loads(response.read())
     
            return [x["itemid"] for x in output['result']]#,[x["name"] for x in output['result']]
     
     
    """fonction de recuperation des valeurs"""
     
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            item = get_item(url, username, password)
     
            for i in item:
                    values = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':i,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(values)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    yield [x["value"] for x in output['result']]
     
     
    """test fct history"""
    item = get_item()
    history=get_history()
    for i in range(len(item)):
            print history.next()
    Ce qui me retourne ceci pour les 5 premiers items de ma liste(pour certains items il n'y a pas de valeurs, c'est normal.):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [u'0.0083']
    []
    []
    [u'0.0917']
    []
    Alors plusieurs questions:Sver avait parlé de mettre le return dans la fonction:
    Donc effectivement faut pas faire de return dans le for mais en dehors du for, et renvoyer alors un item qui aura été construit dans le for
    Pour être franc, je n'ai pas compris ce qu'il voulait dire. Mettre le return en dehors du for, ok. Mais après je n'ai pas saisi. C'était peut etre beaucoup plus simple ... Donc du coup je suis passé au yield. Mais j'aimerais savoir quand même la manière dont tu aurais fait.

    Ma deuxième question est la suivante: J'aimerais que les valeurs des items sois une liste comme pour les items:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [u'24329', u'24342', u'24317', u'24330', u'24655', u'24650', u'24340', u'24318', u'24334', u'24651', u'24312', u'24327', u'24333', u'24341', u'24649', u'24653', u'24332', u'24314', u'24324', u'24648', u'24319', u'24339', u'24316', u'24647', u'24311', u'24654', u'24325', u'24336', u'24656', u'24321', u'25097', u'24323', u'24320', u'24337', u'24315', u'24326', u'24328', u'24331', u'24313', u'24338', u'24652', u'24335', u'24322']
    Comment faire? Merci d'avance

  12. #12
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Tu réécris inutilement la même chose, c'est beaucoup plus simple que cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    URL = "https://toto.net/zabbix/api_jsonrpc.php"
    USERNAME = "titi"
    PSWD = "tata"
     
    def get_item(url, username, password):
            auth = authenticate(url, username, password)
     
            values = {'jsonrpc': '2.0', 'method': 'item.get',
                        'params': {'output':'extend','host':'srvstit018'},
                        'auth': auth,'id': '0'}
     
            data = json.dumps(values)
            req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
            response = urllib2.urlopen(req, data)
            output = json.loads(response.read())
     
            items = [x["itemid"] for x in output['result']]#,[x["name"] for x in output['result']]
            for item in items:
                yield item
     
    generator = get_item(URL, USERNAME, PSWD)
    while 1:
        try:
            print generator.next()
        except StopIteration:
            print 'Terminé'

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    La partie du code pour les items fonctionnait, c'était pour la partie sur la fonction get_history (il faut dérouler un peu le code, on le voit pas directement).

    La fonction get_item me retourne la liste des items comme je le souhaite et donc je n'ai pas de raisons d'y toucher.

    C'est la fonction get_history qui m’embête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    """fonction de recuperation des valeurs"""
     
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            item = get_item(url, username, password)
     
            for i in item:
                    values = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':i,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(values)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    yield [x["value"] for x in output['result']]
     
     
    """test fct history"""
    item = get_item()
    history=get_history()
    for i in range(len(item)):
            print history.next()
    J'aimerais que le résultat sois une liste (de la même manière que pour les items. J'ai mis les screens pour visualiser dans mon message précédent).

    Et autre demande: Sver avait parler de mieux placer le return dans cette fonction (sans utilisé yield), et je voulais savoir comment le faire car je n'avais pas compris.
    Je me suis peut être mal exprimé et je m'en excuse

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chattam Voir le message
    Sver avait parlé de mettre le return dans la fonction:
    Ben oui, si ta fonction doit renvoyer quelque chose il faut bien le dire quoi !!!

    Citation Envoyé par chattam Voir le message
    Pour être franc, je n'ai pas compris ce qu'il voulait dire. Mettre le return en dehors du for, ok. Mais après je n'ai pas saisi.
    Ben si tu mets une boucle, c'est pour une raison bien précise: faire en sorte que la fonction accomplisse son travail. Et son travail c'est quoi ? Généralement c'est de créer quelque chose pour le renvoyer à la fin.
    Donc il est quasiment certain que le quelque chose sera construit au fur et à mesure que la fonction avance et travaille avant d'être renvoyé.

    Prenons un exemple simple: une fonction qui renvoie les carrés de 1 à n (inclus)

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def carre(n):
        ret=[]
        for i in range(1, n+1):
            ret.append(i*i)
        # for
        return ret
    # carre()
     
    print carre(10)

    Il est clair que si on met le return dans le for, on arrête la fonction à la première itération. Donc bien évidemment le return se met à la fin du travail, une fois celui-ci terminé.
    Et on renvoie quoi ? Ben un truc qui aura été construit par la fonction (ici une liste). Après-tout, la fonction (ses boucles, ses tests, bref son algo) a bien été écrite uniquement dans ce but là quoi !!!

    Donc c'est ce que je disais: tout le corps de la fonction n'est là que pour créer l'élément qu'on renvoie à la fin.

    Citation Envoyé par chattam Voir le message
    C'est la fonction get_history qui m’embête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    """fonction de recuperation des valeurs"""
     
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            item = get_item(url, username, password)
     
            for i in item:
                    values = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':i,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(values)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    yield [x["value"] for x in output['result']]
     
     
    """test fct history"""
    item = get_item()
    history=get_history()
    for i in range(len(item)):
            print history.next()
    Donc ici ton générateur renvoie une liste à chaque itération. Ce qui m'embête un petit peu, c'est que tu utilises le nombre d'items pour traiter les différents history. C'est pas que ça ne marche pas, c'est plutôt que tu as là un lien caché (il faut analyser le code pour le comprendre qu'à chaque item sera associé différents history). Ca traduit généralement une erreur de conception. Si les items et les history sont liés, tu dois alors les regrouper ensemble.

    Prenons un exemple plus simple: si je veux faire des stats sur le mondial qui vient de se finir (équipes/résultats), je créerais une entité qui regroupe l'équipe et ses résultats (soit un dico, soit une liste de listes). Je ne mettrai pas d'un coté la liste des équipes et de l'autre la liste des résultats en laissant au lecteur le soin de comprendre que les deux vont ensembles...

    Citation Envoyé par chattam Voir le message
    J'aimerais que le résultat sois une liste (de la même manière que pour les items).
    Et qu'est-ce qui t'empêche de le faire ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Merci pour tes infos Sver.
    J'ai arrêté yield, je n'aime pas la facon d'appeller la fonction. Pas très pratique à mon sens si je veux réutiliser la fonction.

    je me suis donc inspiré de ton exemple pour corriger ma fonction get_history:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    """fonction de recuperation des vlauers"""
     
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            items = get_item(url, username, password)
     
            values = []  #declaration de la liste
     
            for item in items:
                    result = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':item,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(result)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    print output['result']  #test pour voir ce que me donne result
     
                    nbr = len(output['result'])
                    for y in range(nbr):
     
                            values.append(output['result'][y]['value'])
            return values
     
    """test fct history"""
    print get_history()
    C'est plus simple ensuite pour l'appel de fonction.
    Voici le résultat: (j'ai remis en 1er la liste d'item utilisé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [u'24329', u'24342', u'24317', u'24330'] #liste des items
    #affichage de output['result']
    [{u'itemid': u'24329', u'ns': u'511947592', u'value': u'0.0250', u'clock': u'1405524209'}]
    []
    []
    [{u'itemid': u'24330', u'ns': u'526969986', u'value': u'0.0667', u'clock': u'1405524210'}]
    #le résultat de la fonction
    [u'0.0250', u'0.0667']
    Ce qui me pose problème est qu'il n'y a pas les valeurs nulle dans le résultat. Pourquoi ne les prend il pas en compte?(à cause d'append?) Il y a un moyen de remédier à cela?

    je veux ceci : [u'0.0250', '', '', u'0.0667'] (j'ai mis les valeurs nulles de cette manière, je ne sais pas si c'est comme ca)

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chattam Voir le message
    Ce qui me pose problème est qu'il n'y a pas les valeurs nulle dans le résultat. Pourquoi ne les prend il pas en compte?(à cause d'append?) Il y a un moyen de remédier à cela?
    Ben tu as écrit
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nbr = len(output['result'])
    for y in range(nbr):
        values.append(output['result'][y]['value'])
    Ca signifie que tu ne traites que les valeurs concrètes de output["result"] et que celui-ci ne contient pas de ce que tu nommes "valeurs nulles". D'ailleurs c'est logique: ce résultat est issu d'une requête donc la requête ne retourne que les valeurs qui répondent et non celles qui ne "répondent pas"...

    Citation Envoyé par chattam Voir le message
    je veux ceci : [u'0.0250', '', '', u'0.0667'] (j'ai mis les valeurs nulles de cette manière, je ne sais pas si c'est comme ca)
    C'est faisable mais perso, je te conseillerais plutôt ceci: [u'0.0250', None, None, u'0.0667']. Enfin c'est juste ma préférence quoi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Merci à Sver et autre personnes intervenantes pour m'avoir aidé et m'avoir donné des pistes de solutions.

    J'ai enfin ce que je désire, je vous mets le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def get_history(url = "https://toto.net/zabbix/api_jsonrpc.php", username = "titi", password = "tata"):
            auth = authenticate(url, username, password)
            items = get_item(url, username, password)
            resultat = []
            for item in items:
                    values = {'jsonrpc': '2.0','method': 'history.get','params': {'output':'extend','history':0,'itemids':item,'sortfield':'clock','sortorder':'DESC','limit':1},'auth':auth,'id': '0'}
                    data = json.dumps(values)
                    req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
                    response = urllib2.urlopen(req, data)
                    output = json.loads(response.read())
     
                    if not output['result'] == []:
                            resultat.append(output['result'][0]['value'])
                    else:
                            resultat.append("None")
            return resultat
    Le python commence à rentrer grâce à vous
    Maintenant je m'attaque aux tableaux dimensionnel, j'ai toute les listes qu'il me faut. On se verra peut être dans un autre post.

    Encore merci pour votre aide et votre patience.

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chattam Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    if not output['result'] == []:
                            resultat.append(output['result'][0]['value'])
                    else:
                            resultat.append("None")
    not ==??? T'as pas trouvé plus compliqué ???
    Et quand je parlais de "None", je parlais évidemment de "la valeur None" (valeur signifiant "rien") et non de "la chaine None" !!!

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    if output['result'] != []:
                            resultat.append(output['result'][0]['value'])
                    else:
                            resultat.append(None)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    J'avais déjà corriger la partie sur le None. Je me suis rendue compte lors de l'import de mes listes dans un csv.

    Pour le not, oui j'avoue il y avait plus simple. Mais au fond, le résultat est le même.
    Est-ce que ça peut impacter sur la vitesse du script?

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chattam Voir le message
    Mais au fond, le résultat est le même.
    Le résultat n'est pas le seul objectif d'un code Python. Faut aussi prendre en compte sa maintenance, son évolutivité, sa vitesse. Et n'oublie pas aussi qu'un code est 100 fois plus lu qu'écrit donc aussi penser à la relecture future. Mais ça tu le découvriras tout seul quand tu voudras reprendre tes propres codes plusieurs mois après...

    Citation Envoyé par chattam Voir le message
    Est-ce que ça peut impacter sur la vitesse du script?
    Dans l'absolu oui. Faire une égalité puis une inversion booléenne de son résultat prendra forcément plus de temps que faire une différence. Ensuite bien entendu ça dépend si ton test est dans une boucle ou pas (ça d'accord tu maitrises) mais aussi si la fonction elle-même est appelée elle aussi dans une boucle ou pas (et ça tu ne maitrises pas). Donc adage de base: mieux vaut éviter de présumer de quoi que ce soit et rester toujours le plus simple possible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Vxi3] Résultat partiel liste valeurs en invite
    Par samy37 dans le forum Webi
    Réponses: 9
    Dernier message: 24/11/2015, 09h59
  2. Recherche retournant plusieurs résultats dans liste déroulante
    Par Akhlan dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/01/2013, 05h02
  3. Recherche retournant plusieurs résultats dans liste déroulante.
    Par Yann56 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/01/2010, 02h49
  4. Résultats de List<>
    Par punisher999 dans le forum C#
    Réponses: 1
    Dernier message: 23/01/2009, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo