Scilab et les booléens

Bonsoir à toutes et à tous,

une question me taraude, je fais des heures en ECS/ECE et mes collègues donnent aux étudiants %T=1 et %F=0 en scilab, j'en suis un peu choqué, scilab est fortement typé alors qu'en python il est clair que c'est réalisé ({True,1}=={1} est interprété en True/ l'ensemble est purgé d'un doublon quand on exécute la ligne),
ai-je totalement tort? (j'ai, bien sûr, renvoyé les élèves au cours de leur enseignant et considéré la réponse comme correcte en m'alignant sagement sur mes collègues)

Amicalement,

F.D.

Réponses

  • Personnellement, je ne parle pas de booléens en ECS.
  • Non, Python est fortement typé dans le sens où tout objet a un type et qu'il plante à l'exécution quand il y a des problèmes de type (par exemple 3 + 'coucou'). Il y a par contre un typage dynamique (le type d'une variable peut changer au cours du temps).

    Le type de True est 'bool' et le type de 1 est 'int', pour Python ce ne sont pas les mêmes objets. Il faut bien comprendre que A == B ne teste pas une égalité formelle mais fait appel à la méthode == de la classe de l'objet A.

    La méthode == de la classe 'bool' a été programmée de telle sorte que True == 1 renvoie True, mais ça ne dit absolument pas que True et 1 c'est la même chose ! Et d'ailleurs c'est faux puisque qu'ils n'ont pas le même type.

    Pour tester l'égalité formelle de A et B, il faut faire A is B. Quand on fait True is 1, Python renvoie False.

    Pour le coup de {True,1} qui donne {True}, c'est tout simplement dû au fait que Python pour réduire les ensembles teste avec == (et non pas avec is).

    C'est quand même une mauvaise habitude d'utiliser 0 et 1 pour les booléens alors qu'il y a une classe toute faite pour cela !

    Je ne connais pas trop Scilab mais j'aurais tendance à dire la même chose.
  • Le code Scilab suivant marche chez moi.
    mode(0)
    
    Lettre = %f;
    //Lettre = %t;
    
    // façon 1
    if (Lettre == %t) then
        printf("Lettre A\n");
    elseif (Lettre == %f) then
        printf("Lettre B\n");
    end
    
    // plus conventionnellement
    if Lettre then
        printf("Lettre A\n");
    else
        printf("Lettre B\n");
    end
    
  • Bonsoir,

    pardon, oui, bien sûr, n'étant pas informaticien de formation j'ai confondu "faiblement typé" et "à typage dynamique", désolé, j'ai tapé le message avec 2 neurones, un par doigt sur le clavier!!!

    C'est vrai que j'ai confondu les méthodes "is" et "==" car je ne programme pas assez, toutefois, il n'est pas interdit d'utiliser une ligne de code comme:
    L=(i for i in range(10000) if i%2)
    

    à avoir un spécialiste, puis-je te demander comment est testée la condition? ((i%2==0)==True)? (source de l'astuce cours fun-MOOC Python 3 avancé)
    Par contre, ça semble contraire au Zen 20 de Python, non?

    merci à tous pour vos précisions,

    amicalement,

    F.D.
  • Je ne suis pas spécialiste mais comme la doc dit "[the if statement] selects exactly one of the suites by evaluating the expressions one by one until one is found to be true", je pense que la condition est d'abord convertie en booléen (méthode __bool__).

    Qu'entends-tu par "le Zen 20" ? chez moi "import this" renvoie 19 phrases.
  • Bonsoir,

    PEP 20 -- The Zen of Python | Python.org

    j'ai commis un raccourci entre Zen of Python et "PEP20" :)

    J'utilise trop peu les classes pour avoir une vision claire des méthodes associées à __bool__ par exemple, il me faut vraiment m'y remettre de plus près. (Un MOOC à me conseiller?)

    Merci pour vos remarques,

    amicalement,

    F.D.
  • Bonsoir,

    Sauf excès d'âneries de ma part : __bool__ est une méthode, implémentée ou non selon les objets, pouvant aussi être appelée sous le nom de la fonction bool. Exemples : 3.__bool__ et bool(3) s'évaluent à True, et 0.__bool__ et bool(0) s'évaluent à False ; si L est un conteneur, L.__bool__ et bool(L) s'évaluent à True si L est non vide, et à False sinon.
  • skilveg,
    0.__bool__ et 0.__bool__() ne fonctionnent pas chez moi.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonsoir,
    il me semble qu'un petit "import bool" s'impose pour profiter de la vastitude bravitée de la classe bool et la syntaxe approuvée par Python 3.7 est bool(objet) (False si vide, True sinon)

    Amicalement,
    F.D.
Connectez-vous ou Inscrivez-vous pour répondre.