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 :

(1 and [a] or [b])[0], quelle utilité ? Y'en a sûrement une..


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut (1 and [a] or [b])[0], quelle utilité ? Y'en a sûrement une..
    Salut tout le monde,

    en parcourant le forum, je suis tombé sur ce lien :
    http://python.developpez.com/cours/D...ion/and_or.php

    J'ai lu les astuces and-or, et les ai presque toutes captées, la seule dont je n'arrives pas voir l'utilité est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = ""
    >>> b = "second"
    >>> (1 and [a] or [b])[0]
    ''
    Puisque peu importe la valeur de a ou b, a sera toujours retourné, dès lors quel intérêt ?!?

    Je me dis que l'auteur n'a pas écrit ça pour rien, ça doit forcément servir à quelque chose...

    Donc si vous savez ou voyez l'utilité de cette astuce, pourriez-vous éclairer ma lanterne s'il-vous plait (par un exemple, si possible )

  2. #2
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    T'as bien lu la suite?
    On peut penser que cette astuce apporte plus de complication que d’avantages. Après tout, on peut obtenir le même résultat avec une instruction if, alors pourquoi s’embarasser de tout ces problèmes ? Mais dans de nombreux cas, le choix se fait entre deux valeurs constantes et donc vous pouvez utiliser cette syntaxe plus simple sans vous inquiéter puisque vous savez que a vaudra toujours vrai. Et même si vous devez utiliser la version sûre plus complexe, il y a parfois de bonnes raisons de le faire, il y a des cas en Python où les instructions if ne sont pas autorisées, comme dans les fonctions lambda.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zabibof Voir le message
    T'as bien lu la suite?
    Il ne te demande pas l'utilité du and-or qu'il dit avoir bien pigé, il te demande l'utilité du and-or dans ce cas précis où la condition est toujours vraie... (et moi aussi par la même occasion)...
    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]

  4. #4
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    C'est donc moi qui n'a pas bien lu

    La véritable astuce cachée derrière l’astuce and-or, c’est de s’assurer que a ne vaut jamais faux. Une manière habituelle de le faire est de changer a en [a] et b en [b] et de prendre le premier élément de la liste retournée, qui sera soit a soit b.
    Bon, si j'ai bien compris, l'expression:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (1 and [a] or [b])
    retourne la liste [a,b]
    et
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (0 and [a] or [b])
    retourne la liste [b,a]
    donc,
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (1 and [a] or [b])[0]
    et
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (0 and [a] or [b])[0]
    retournent respectivement a et b

    Bon, j'ai pas essayé mais ça doit être ça

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En fait, cette forme est une simulation astucieuse du "if then else monoligne" qui existe dans certains langages (genre: (cond ? si-oui : si-non)) mais pas dans Python avant la version 2.5.

    Comment ça marche?

    on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (cond1 and cond2 or cond3)
    et cond2 et cond3 doivent être à True (donc jamais à 0).

    and et or ayant le même niveau de priorité seront exécutés de gauche à droite. Par ailleurs, si (cond1 and cond2) vaut True, le 'or' ne sera jamais exécuté.

    donc, si cond1 est vrai ainsi que cond2, renvoi de cond2. Sinon, le or est exécuté et cond3 est renvoyé.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x=1
    y=2
    print (x<y and x or y)  # affiche 1
    print (x>y and x or y)  # affiche 2
    Mais dans cette forme, si x=0, ça ne marche plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print (x<y and x or y)  # affiche 2 au lieu de 0
    En effet, pour que ça marche, il ne faut pas que cond2 puisse être évalué à False (donc à 0). D'où l'astuce de passer par une liste qui sera toujours True (essayez: même [False] sera évalué à True!).

    Avec l'exemple ci-dessus x=0 et y=2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print (x<y and [x] or [y])[0]  # affiche 0
    print (x>y and [x] or [y])[0]  # affiche 2
    Et, effectivement, cette forme astucieuse peut être utilisée dans une fonction lambda alors qu'un if serait interdit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    est_pair = lambda x: ((x%2==0) and ['oui'] or ['non'])[0]
    print est_pair(10)  # affiche 'oui'
    print est_pair(11)  # affiche 'non'
    Avec Python 2.5, on a enfin un "if then else monoligne", même s'il n'est pas facile à trouver dans le manuel. Exemple, avec x=0 et y=2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print (x if x<y else y)  # affiche 0
    print (x if x>y else y)  # affiche 2
    Voir aussi la pep 308: http://www.python.org/dev/peps/pep-0308/

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ah.... tout de suite ça a plus de sens ! Merci

    Donc même si la forme est juste dans
    le fait de mettre un argument à valeur constante en premier rend le tout inutile, pour que ça garde toute son utilité, il faut que -ici- 1 soit remplacer par une variable ou une comparaison (ou toute autre chose susceptible de changer de valeur bool)...Je résume juste pour voir si bien compris...

    EDIT: Juste parceque j'aime bien taquiner en cherchant la petite bête
    Et, effectivement, cette forme astucieuse peut être utilisée dans une fonction lambda alors qu'un if serait interdit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    est_pair = lambda x: ((x%2==0) and ['oui'] or ['non'])[0]
    print est_pair(10)  # affiche 'oui'
    print est_pair(11)  # affiche 'non'
    Heu... ici cette forme n'est pas vraiment nécessaire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    est_pair=lambda x: (x%2 is 0) and 'oui' or 'non'
    Cette dernière suffit ...

  7. #7
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par N.tox Voir le message
    Salut tout le monde,

    en parcourant le forum, je suis tombé sur ce lien :
    http://python.developpez.com/cours/D...ion/and_or.php

    J'ai lu les astuces and-or, et les ai presque toutes captées, la seule dont je n'arrives pas voir l'utilité est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = ""
    >>> b = "second"
    >>> (1 and [a] or [b])[0]
    ''
    Puisque peu importe la valeur de a ou b, a sera toujours retourné, dès lors quel intérêt ?!?

    Je me dis que l'auteur n'a pas écrit ça pour rien, ça doit forcément servir à quelque chose...

    Donc si vous savez ou voyez l'utilité de cette astuce, pourriez-vous éclairer ma lanterne s'il-vous plait (par un exemple, si possible )
    Salut,

    condition and A or B veut dire : si condition est vrai retourner A, sinon retourner B. Voilà l'usage de cette syntaxe.

    Sauf que pour le cas précis que tu donnes, cela ne marche pas :

    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> a = ""
    >>> b = "b"
    >>> 0 and a or b
    'b'
    >>> 1 and a or b
    'b'
    Dans le premier cas

    On pense : si 0 est vrai (non) retourner a sinon retourner b. On s'attend à ce que le code retourner b est c'est bien ce qu'on a.

    Dans le deuxième cas on pense : si 1 est vrai (oui) alors retourner a sinon retourner b. On s'attend à ce que ça retourne a cette fois, mais non ! puisque a est vide, ça retourne b.

    Pour éviter que ça retourne b, on utilises donc l'astuce donné par l'auteur, pour que quelque soit la valeur de a (qu'elle s'évalue à False ou pas), on retourne à chaque fois sa valeur quand la condition est vrai.

    D'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> a = ""
    >>> b = "b"
    >>> (1 and [a] or [b])[0]
    ''
    retournera bien la valeur de a, comme on le voulait, et non celle de b.

    zabibof, les codes que tu as donné sont faux.

  8. #8
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par N.tox
    Ah.... tout de suite ça a plus de sens ! Merci

    Donc même si la forme est juste dans
    Code :

    (1 and [a] or [b])[0]

    le fait de mettre un argument à valeur constante en premier rend le tout inutile, pour que ça garde toute son utilité, il faut que -ici- 1 soit remplacer par une variable ou une comparaison (ou toute autre chose susceptible de changer de valeur bool)...Je résume juste pour voir si bien compris...
    Bien sûr, c'est l'expression à tester.

  9. #9
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par yacinechaouche
    zabibof, les codes que tu as donné sont faux.
    Je viens de comprendre à quel point je me suis planté, désolé

  10. #10
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Exemple concret d'utilisation en 6 lignes : chercher une mot dans un fichier et afficher le numéro de la ligne et la ligne elle même où le mot à trouvé. Sinon afficher "mot non trouvé"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    trouve = 0
    mot = "wireless"
    fichier = "/var/log/syslog"
     
    def egg(ligne,numeroLigne):
        trouve = 1
        print "trouve %s a la ligne numero %s : %s " % (mot,numeroLigne,ligne)
     
    for numeroLigne,ligne in enumerate(open(fichier,'r').xreadlines()):mot in ligne and egg(ligne,numeroLigne)
     
    if not trouve: print "non trouve"


    Exercice pour le lecteur :

    La ligne for numeroLigne,ligne in enumerate(open(fichier,'r').xreadlines()):mot in ligne and egg(ligne,numeroLigne) est celle qui effectue tout le boulot. Ici, j'ai utilisé la fonction egg uniquement parce que mettre le print directement générait une erreur de syntaxe.

    Exercice : essayez de vous passez de la fonction egg et de tout écrire en une seule ligne.

    PS : pour rendre l'exercice moins difficile, il est inutile d'afficher "mot non trouvé" dans le cas où il est absent du fichier.

    L'objectif est de faire marcher ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for numeroLigne,ligne in enumerate(file('/var/log/syslog').xreadlines()): 'wireless' in ligne and print "trouvé wireless à la ligne %s : %s" % (numeroLigne,ligne)

  11. #11
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    L'essentiel est que tu ais compris

    En tous cas encore merci à toi Tyrtamos pour ton explication, et merci à toi Yacinechaouche pour cette petite phrase :
    condition and A or B veut dire : si condition est vrai retourner A, sinon retourner B. Voilà l'usage de cette syntaxe.
    Qui conclut parfaitement les explications données

    PS : merci aussi aux autres quand même

    EDIT:
    L'objectif est de faire marcher ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for numeroLigne,ligne in enumerate(file('/var/log/syslog').xreadlines()): 'wireless' in ligne and print "trouvé wireless à la ligne %s : %s" % (numeroLigne,ligne)
    Comme tu l'as dit plus haut print lève une exception donc voici ce que j'ai fait:

    mot='haha'
    contenu=open('d:/toto.txt','r').readlines()
    def egg(string,*args):print string % tuple([arg for arg in args])
    for ligne in range(len(contenu)): mot in contenu[ligne] and egg("%s trouve, ligne %i",mot,ligne+1)

    4 lignes, encore qu'on aurait pu se passer des deux premières...

  12. #12
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par N.tox Voir le message
    L'essentiel est que tu ais compris

    En tous cas encore merci à toi Tyrtamos pour ton explication, et merci à toi Yacinechaouche pour cette petite phrase :
    Qui conclut parfaitement les explications données

    PS : merci aussi aux autres quand même

    EDIT: Comme tu l'as dit plus haut print lève une exception donc voici ce que j'ai fait:

    mot='haha'
    contenu=open('d:/toto.txt','r').readlines()
    def egg(string,*args):print string % tuple([arg for arg in args])
    for ligne in range(len(contenu)): mot in contenu[ligne] and egg("%s trouve, ligne %i",mot,ligne+1)

    4 lignes, encore qu'on aurait pu se passer des deux premières...
    Salut,

    Bel essai, mais le but est de le faire en une ligne si possible.

    En passant, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def egg(string,*args):print string % tuple([arg for arg in args])
    Peut être simplifiée en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def egg(string,*args):print string % args

  13. #13
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par yacinechaouche Voir le message
    En passant, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def egg(string,*args):print string % tuple([arg for arg in args])
    Peut être simplifiée en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def egg(string,*args):print string % args
    Très juste, hmmmmmmm... en une seule ligne.... en utilisant print je vois pas, sauf à utiliser un "vrai if cond else faux", mais je suppose que le but est de rester avec and-or donc... je dirais tout simplement ceci (mais sans print...)

    mot='haha'
    contenu=['hihi','haha']
    for ligne in range(len(contenu)):mot in contenu[ligne] and "%s trouve, ligne %i" % (mot,ligne+1) or None


    J'ai laisser la déclaration des variables mot et contenu, juste pour une question de lisibilité

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par tyrtamos
    and et or ayant le même niveau de priorité seront exécutés de gauche à droite.
    Euh, non je crois pas, or a une priorité plus faible que and (de même que + a une priorité plus faible que *), donc c'est toujours le and qui sera evalué en premier. Dans ce cas-ci, ça ne change rien, mais il vaut mieux le savoir.

    J'ai toujours trouvé ce "hack" (utiliser and et or pour simuler une expression conditionnelle) contraire à l'esprit de Python; c'est pas très lisible et dangereux si on ne fait pas attention. Si vous êtes sous Python 2.5 ou +, vous n'avez aucune excuse de ne pas utiliser "a if b else c"...

    Pour le code en une ligne, ce ne sera pas possible avec print, donc faut trouver autre chose:
    sys.stdout.write
    .

  15. #15
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour dividee,

    Citation Envoyé par dividee Voir le message
    Euh, non je crois pas, or a une priorité plus faible que and (de même que + a une priorité plus faible que *), donc c'est toujours le and qui sera evalué en premier. Dans ce cas-ci, ça ne change rien, mais il vaut mieux le savoir.
    Tu as raison!

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  16. #16
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par dividee Voir le message
    Pour le code en une ligne, ce ne sera pas possible avec print, donc faut trouver autre chose:
    sys.stdout.write
    .
    Perdu ! c'est bien possible avec print, voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "\n".join(["trouvé wireless à la ligne %s : %s" % (numeroLigne,ligne) for numeroLigne,ligne in enumerate(file('/var/log/syslog').xreadlines()) if 'wireless' in ligne ])

  17. #17
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Mais ! Mais... y'a pas de and/or là d'dans !

    Donc, (merci Dividee ), sauf erreur (toujours probables):
    for ligne in range(len(open('d:/toto.txt','r').read().split('\n'))):'haha' in open('d:/toto.txt','r').read().split('\n')[ligne] and sys.stdout.write("%s trouve, ligne %i" % (mot,ligne+1)) or None


    ou alors, on modifie un poil ta soluce:
    print "\n".join(['wireless' in ligne and "trouvé wireless à la ligne %s : %s" % (numeroLigne,ligne) or '' for numeroLigne,ligne in enumerate(file('/var/log/syslog').xreadlines()) ])


    Dailleurs ça fait plusieurs fois que je vois xreadlines(), mais c'est quoi la différence avec readlines() ?

  18. #18
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    readlines te renvoi une liste de lignes, donc sur un gros fichier cela demande beaucoup de mémoire. xreadlines te renvoi un itérateur sur les lignes, donc 1 ligne et seulement une est stockée en mémoire, la prochaine ligne du fichier prendra sa place. xreadlines est donc bien plus efficace.

    Dans la même veine, il faut toujours préférer xrange à range si on a pas besoin de se souvenir des valeurs précédentes.

    Hop hop hop ! j'ai jamais dit qu'il fallait qu'il y ait du and/or dedans ! j'ai juste dit qu'il fallait que le code marche en une ligne

  19. #19
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    hmmm... ok, donc si j'ai bien compris comment fonctionne xreadlines, je dirais que c'est l'équivalent d'un readline(), sauf qu'on l'utilise là où readline ne fonctionnerait pas comme on s'y attenderait, style une boucle for... d'ailleurs xreadline ne fonctionnerait-il pas uniquement dans des boucles ?

  20. #20
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Salut,

    Je viens de m'appercevoir que xreadlines est un placebo :

    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
    38
     
    chaouche@bughunter:/usr/lib/python2.4$ ipython
    Python 2.5.1 (r251:54863, Mar  7 2008, 04:10:12) 
    Type "copyright", "credits" or "license" for more information.
     
    IPython 0.8.1 -- An enhanced Interactive Python.
    ?       -> Introduction to IPython's features.
    %magic  -> Information about IPython's 'magic' % functions.
    help    -> Python's own help system.
    object? -> Details about 'object'. ?object also works, ?? prints more.
     
    In [1]: f = file("/var/log/syslog")
     
    In [2]: f
    Out[2]: <open file '/var/log/syslog', mode 'r' at 0xb771f848>
     
    In [3]: xrl = file("/var/log/syslog").xreadlines()
     
    In [4]: xrl
    Out[4]: <open file '/var/log/syslog', mode 'r' at 0xb79b0728>
     
    In [5]: f.
    f.__class__         f.__hash__          f.__repr__          f.fileno            f.next              f.softspace         
    f.__delattr__       f.__init__          f.__setattr__       f.flush             f.read              f.tell              
    f.__doc__           f.__iter__          f.__str__           f.isatty            f.readinto          f.truncate          
    f.__enter__         f.__new__           f.close             f.mode              f.readline          f.write             
    f.__exit__          f.__reduce__        f.closed            f.name              f.readlines         f.writelines        
    f.__getattribute__  f.__reduce_ex__     f.encoding          f.newlines          f.seek              f.xreadlines        
     
    In [6]: xrl.
    xrl.__class__         xrl.__hash__          xrl.__repr__          xrl.fileno            xrl.next              xrl.softspace         
    xrl.__delattr__       xrl.__init__          xrl.__setattr__       xrl.flush             xrl.read              xrl.tell              
    xrl.__doc__           xrl.__iter__          xrl.__str__           xrl.isatty            xrl.readinto          xrl.truncate          
    xrl.__enter__         xrl.__new__           xrl.close             xrl.mode              xrl.readline          xrl.write             
    xrl.__exit__          xrl.__reduce__        xrl.closed            xrl.name              xrl.readlines         xrl.writelines        
    xrl.__getattribute__  xrl.__reduce_ex__     xrl.encoding          xrl.newlines          xrl.seek              xrl.xreadlines        
     
    In [6]: xrl.
    En réalité, pas la peine d'utiliser aucune méthode quand on parcours un fichier, il suffit de faire for ligne in fichier et c'est tout !

    Le code devient donc encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "\n".join(["trouvé wireless à la ligne %s : %s" % (numeroLigne,ligne) for numeroLigne,ligne in enumerate(file('/var/log/syslog')) if 'wireless' in ligne ])
    Quant à la différence entre xreadlines et readline, effectivement c'est la notion d'itérateur : readline retourne une seule ligne, donc boucler sur un readline reviens à boucler sur les caractères de cette ligne, et xreadlines renvoi une nouvelle ligne à chaque appel, donc faire une boucle dessus reviens à faire une boucle sur le fichier.

    Je ne sais pas s'il est possible d'utiliser xreadlines autre part que dans une boucle...

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

Discussions similaires

  1. Le multitouch - quelle utilité?
    Par leyee dans le forum Débats sur le développement - Le Best Of
    Réponses: 13
    Dernier message: 14/05/2009, 18h18
  2. les interfaces; quelle utilité?
    Par noubigh dans le forum C#
    Réponses: 9
    Dernier message: 30/07/2008, 09h18
  3. Site Semi-dynamique quelle utilité ?
    Par ljp200250 dans le forum WebDev
    Réponses: 1
    Dernier message: 17/07/2008, 19h58
  4. (adodbconnection) quelles utilité?
    Par doogybreton dans le forum VBA Access
    Réponses: 5
    Dernier message: 20/01/2008, 12h24
  5. [DataWareHouse] Quelle utilité des clés de substitution ?
    Par alpachico dans le forum Alimentation
    Réponses: 3
    Dernier message: 23/03/2006, 13h41

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