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 :

calculer le double de manière pythonnesque


Sujet :

Python

  1. #1
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut calculer le double de manière pythonnesque
    Bonjour,
    J'apprend le Python. J'ai fait la fonction ci-dessous (qui tente de calculer le double de n'importe quoi ou presque). Bien que pas encore habitué au style Python, je ne trouve pas ce que j'ai écrit très 'pythonesque'. Y-a-t'il y moyen de faire ça mieux (les exemples à tester sont dans la docstring) ?
    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
    39
    40
    41
    42
    43
    #!/usr/bin python3
    # -*- coding: utf-8 -*-
     
    """ démontre comment doubler tout ce qui est numérique (ou pas)
     
        Probèmatique : on veut une fonction qui accepte aussi bien des données
        unaire (int, double) que des listes ou des générateurs
    """
     
    def tout_doubler(x):
        """retourne le double de x
     
        Si x est itérable, retourne une liste, chaque élément étant le double de l'élément correspondant dans x
        Si x n'est pas itérable, retourne 2x
        
        :Example:
        >>> tout_doubler(2)
        4
        >>> tout_doubler('a')
        'aa'
        >>> tout_doubler([1,2])
        [2, 4]
        >>> tout_doubler(range(10))
        [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
        >>> tout_doubler('abc')
        'aabbcc'
        >>> tout_doubler(['abc', [1,2]])
        ['aabbcc', [2, 4]]
        """
     
        if type(x) is str:
            return ''.join([u*2 for u in x])
        try:
            if len(x)==1:
                return 2*x
            else:
                return [tout_doubler(u) for u in x]
        except:
            return 2*x
     
    if __name__ == "__main__":
        import doctest
        doctest.testmod()
    Merci de vos lumières

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    doubler les try ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def tout_doubler(entree):
        try:
            return ''.join([ 2*e for e in entree ])
        except:
            try:
                return [ tout_doubler(e) for e in entree ]
            except:
                return 2 * entree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> tout_doubler(5)
    10
    >>> 
    >>> 
    >>> tout_doubler('abc')
    'aabbcc'
    >>> 
    >>> 
    >>> tout_doubler((1, 'ab', [2,3]))
    [2, 'aabb', [4, 6]]
    >>>

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    une tournure peut-être plus fonctionnelle que pythonesque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> map(lambda x:x*2, [1,2])
    [2, 4]
    >>> map(lambda x:x*2, range(10))
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    >>> map(lambda x:x*2, ['abc', [1, 2]])
    ['abcabc', [1, 2, 1, 2]]

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    une tournure peut-être plus fonctionnelle que pythonesque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> map(lambda x:x*2, ['abc', [1, 2]])
    ['abcabc', [1, 2, 1, 2]]
    mais qui ne répond pas au besoin du PO : dans son cas doubler 'abcd' c'est obtenir 'aabbccdd'

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/06/2012, 13h56
  2. Réponses: 0
    Dernier message: 08/06/2011, 15h09
  3. Faire un calcul en double
    Par contremaitre dans le forum Débuter
    Réponses: 12
    Dernier message: 19/04/2008, 17h48
  4. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 17h46

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