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 :

Perplexité du débutant autodidacte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Perplexité du débutant autodidacte
    Bonjour,

    [1:] est bien un slice qui supprime le premier élément d'une liste.
    Comment son usage se justifie-t-il dans une boucle comme la suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    numbers = [3, 2, 5, 8, 4, 7, 9, 1, 6, -12]
    minimum = numbers[0]
     
    for i in numbers[1:] :  # <---
        if i < minimum:
            minimum = i
     
    print('Le minimum est', minimum)
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in numbers[0:] :
    donne le même résultat.

    Merci pour votre explication.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    Je suis un bricoleur en Python, donc ma réponse n'est pas forcément bonne.
    De manière générale, quand une nouvelle variable apparaît, il est assez sain de l'initialiser : minimum = number0[0]
    C'est fait, minimum a une valeur, et on peut maintenant comparer numbers[1] avec minimum.

    Dans la 2ème proposition, minimum apparaît pour la première fois quand on compare numbers[0] avec minimum ; autrement dit, on compare numbers[0] avec un truc qui n'existe pas encore.

    Dans certains langages, ça peut se passer correctement. Peut-être que ça se passe correctement avec la version actuelle de Python, et que ça ne marchera plus dans une nouvelle version ?
    Par sécurité, un bon programmeur va préférer initialiser minimum (minimum=numbers[0]) avant de l'utiliser.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par vincent.steiner Voir le message
    [1:] est bien un slice qui supprime le premier élément d'une liste.
    Oui et non (je pense que tu as compris mais mal formulé). Le slice ne supprime rien (sinon la liste serait dénaturée après utilisation), il extrait juste une sous-partie.

    Citation Envoyé par vincent.steiner Voir le message
    Comment son usage se justifie-t-il dans une boucle comme la suivante...alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in numbers[0:] :
    donne le même résultat.
    Oui, même résultat (et dans ce cas, même plus besoin de slice => for i in numbers). Mais ce n'est pas parce que le résultat (visible) est identique que ça se passe pareil en interne.
    Dans ton 2° cas tu compares numbers[0] alors qu'il a déjà été traité.

    Citation Envoyé par tbc92 Voir le message
    De manière générale, quand une nouvelle variable apparaît, il est assez sain de l'initialiser : minimum = number0[0]
    C'est même obligatoire (impossible en Python de créer une variable sans en même temps lui donner une valeur)...

    Citation Envoyé par tbc92 Voir le message
    Dans la 2ème proposition, minimum apparaît pour la première fois quand on compare numbers[0] avec minimum ; autrement dit, on compare numbers[0] avec un truc qui n'existe pas encore.
    Je pense que dans sa seconde proposition, la ligne 3 minimum = numbers[0] n'a pas disparu. Le PO veut juste savoir la différence entre for i in numbers[1:] et for i in numbers[0:] dans un contexte où ce qui a été écrit en amont ne change évidemment pas. Et la réponse c'est juste "une itération de plus".

    Citation Envoyé par tbc92 Voir le message
    Dans certains langages, ça peut se passer correctement. Peut-être que ça se passe correctement avec la version actuelle de Python, et que ça ne marchera plus dans une nouvelle version ?
    Non, si la variable "minimum" n'existe pas, Python indique qu'il ne peut pas effectuer la comparaison et renvoie une exception NameError

    En revanche, ce qui a changé entre P2 et P3 c'est que sous P2, on pouvait initialiser minimum à None (qui est l'initialisation neutre) et comparer quand-même les éléments avec ce minimum. P2 acceptait la comparaison if i < minimum bien que "i" contienne un int alors que minimum contient un NoneType.
    Sous P3 ce n'est plus possible. Celui qui veut utiliser None doit alors ensuite le tester spécifiquement (et surtout en premier)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    numbers = [3, 2, 5, 8, 4, 7, 9, 1, 6, -12]
    minimum = None
     
    for i in numbers:
        if minimum is None or i < minimum:
            minimum = i
     
    print('Le minimum est', minimum)

    Citation Envoyé par tbc92 Voir le message
    Par sécurité, un bon programmeur va préférer initialiser minimum (minimum=numbers[0]) avant de l'utiliser.
    Ce n'est même pas une question de sécurité, c'est carrément une question de logique. Quel que soit le langage (y compris les langages qui acceptent des variables sans qu'elles soient initialisées comme par exemple le C), on ne peut pas utiliser une variable si on ne lui a pas mis auparavant une valeur à utiliser. D'où ce précepte C (valable aussi en Python): ne jamais regarder le contenu d'une variable sans l'avoir remplie auparavant. Et cet autre précepte (moins obligatoire mais qu'on peut quand-même citer): ne jamais remplir deux fois une variable sans l'avoir lue (ou avoir eu possibilité de la lire) au-moins une fois entre temps.
    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
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    C'est même obligatoire (impossible en Python de créer une variable sans en même temps lui donner une valeur)...
    Pas tout à fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Python 3.8.10 (default, Mar 15 2022, 12:22:08) 
    [GCC 9.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = int()
    >>>
    Bon, évidemment:
    Ceci s'explique par le fait que, stricto sensu, il n'y a pas de variable en Python (dans le sens; petite-boîte-contenant-une-valeur-pouvant-varier).

    Notez que l'on peut créer une variable référence à la volée. Donc la créer lors de son utilisation.
    https://docs.python.org/3/whatsnew/3.8.html

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour,

    Pas compris ce que tu voulais dire puisque ici tu donnes bien une valeur , simplement elle n'est pas explicite dans ton code
    int(), str(), list() retournent des objets vides mais pas None
    D'autres constructeurs et des fonctions(procédures) ne retournent "rien", mais ici aussi python va assigner l'objet None donc une certaine valeur

    Citation Envoyé par VinsS Voir le message
    pas de variable en Python (dans le sens; petite-boîte-contenant-une-valeur-pouvant-varier).
    pas bien compris...
    - il faut juste ajouter "une référence vers une petite boîte..." donc ne change pas grand chose pour le commum des pythonneux
    - une variable en python est toujours un objet qui est une "petite-boîte-contenant-une-valeur-pouvant-varier"

    Citation Envoyé par VinsS Voir le message
    Notez que l'on peut créer une variable référence à la volée. Donc la créer lors de son utilisation.
    https://docs.python.org/3/whatsnew/3.8.html
    Tu parles de morse ? en fait il n'y a pas de différence avec une boucle for, on assigne explicitement une valeur à une variable (ici locale au block for/if/while)

    ------------


    Sve@r a bien précisé "créer" une variable ! Sans parler de creer, il y a une syntaxe particulière en python de plus en plus employée avec les types
    "machin" est bien déclarée comme une variable mais pas créée

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Bon, évidemment:
    Ben voilà, en écrivant a=int() tu donnes (affectes) bien une valeur à la variable "a". Ce n'est pas parce que tu appelles l'objet int() sans lui spécifier toi de valeur particulière que celui-ci n'en contient quand-même pas une (par défaut dans la méthode __init__).

    Citation Envoyé par papajoker Voir le message
    machin: str.
    "machin" est bien déclarée comme une variable mais pas créée
    Exact, l'instruction n'est pas refusée (ce qui m'étonne). Mais ensuite print(machin) renvoie quand-même un NameError (et là je suis tout de suite plus rassuré vis à vis de mes certitudes)
    Si on rajoute qu'en plus les annotations (le : type mis après) n'est suivi d'aucune obligation (bien qu'ayant spécifié "str" tu as tout à fait le droit d'écrire ensuite machin=3.1416) je me demande l'action réelle de cette instruction. Peut-être est-elle traitée comme un pass...
    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]

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    je dirais qu'en fait, c'est de savoir comment on interprète/parle de None, est une valeur ou non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def truc():
        pass
    variable = truc()
    print(type(variable), variable)
    dans la doc
    L'objet Python None, exprimant l'absence de valeur.
    Donc on a un objet avec une valeur(None) mais cette valeur "exprime" : pas de valeur

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    je dirais qu'en fait, c'est de savoir comment on interprète/parle de None, est une valeur ou non...
    Jusqu'à présent on ne parlait pas de None qui effectivement joue un peu le rôle de cheveu dans la soupe.

    Alors None est un peu particulier. Déjà on ne le compare pas de la même façon que le reste. La PEP8 indique qu'il faut utiliser "is" => if var is None (vs if var == None).
    Par ailleurs, comme je l'ai dit plus haut, la gestion du None a un peu changé entre P2 et P3. Par exemple None < 5 est autorisé sous P2 mais ne l'est plus sous P3.
    On peut donc pas vraiment parler de "valeur" au sens numérique du terme (interdit par exemple de demander None+1) mais son existence permet quand-même la création d'une variable "neutre" justement pour respecter cette obligation d'affecter une valeur quand on veut créer une variable.

    Citation Envoyé par papajoker Voir le message
    Donc on a un objet avec une valeur(None) mais cette valeur "exprime" : pas de valeur
    Exactement. Mais cela n'est pas vraiment plus compliqué à comprendre que les entiers naturels, ensemble inventé à l'origine pour compter les choses ; mais dans lequel est arrivé ensuite le 0, élément permettant d'indiquer qu'il n'y a rien à compter.
    En informatique, le "rien" n'est pas possible (impossible de dire "je veux que cette variable ne contienne rien") mais est parfois nécessaire. Donc il a bien fallu trouver un symbole signifiant "rien" (NULL en C, NUL en SQL, et None en Python).
    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
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in numbers[1:] :  # for i in [2, 5, 8, ...]
    for i in numbers[0:] :  # for i in [3, 2, 5, 8, ...]
    numbers[0] c'est 3, ça n'est pas strictement plus petit que lui même.
    les seuls à être strictement inférieur à minimum c'est 2, 1 et -12 (et le dernier trouvé en parcourant la liste c'est -12), donc on obtient le même résultat dans les deux cas.

Discussions similaires

  1. [N-Tier] Débutant - Besoin d'aide sur un petit projet à visée autodidacte
    Par glamdrick dans le forum Autres
    Réponses: 3
    Dernier message: 11/02/2015, 11h31
  2. Réponses: 17
    Dernier message: 11/11/2008, 12h17
  3. Réponses: 0
    Dernier message: 01/08/2008, 00h18
  4. Débutant autodidact access
    Par papy50 dans le forum Modélisation
    Réponses: 1
    Dernier message: 02/07/2007, 10h10
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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