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.
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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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:
à 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.
Qu'entends-tu par "le Zen 20" ? chez moi "import this" renvoie 19 phrases.
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.
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.
0.__bool__ et 0.__bool__() ne fonctionnent pas chez moi.
-- Schnoebelen, Philippe
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.