B1 · 第12集 · 4:12

Python布尔值与浮点数比较

本集讲解Python中布尔值的使用、比较运算符(如!=、==),以及浮点数比较的陷阱和安全做法。

来源:jmbarbier / peertube.solidev.net · 许可:CC BY-SA 4.0

字幕

  1. Voilà, mais pour que ce soit plus rapide, le Python a.

    好了,但为了让操作更快,Python 有……

  2. Une manière d'écrire 3

    一种写法是:3

  3. point d'exclamation égal 2, c'est

    加感叹号再加等号,即 "!="

  4. pour dire est différent de.

    表示“不等于”

  5. Est- ce que 3 est différent de 2, la réponse doit être vrai.

    那么,“3 是否不等于 2?”答案应为“真”

  6. Donc là, on a en fait tout ça qui vont permettre de faire des comparaisons à

    因此,我们实际上拥有所有这些运算符,

  7. l'intérieur de nos différentes. . .

    用来在各类数据中进行比较。

  8. Est- ce que des nombres sont égaux, est- ce que des nombres sont

    比如:两个数是否相等?

  9. plus grands, plus petits.

    两个数是否一大一小?

  10. Et le truc que vous allez oublier, c'est l'égalité, c'est un double égal.

    而你们最容易忘记的,是表示“相等”的符号——它要用两个等号

  11. Alors juste petite précision,

    这里稍作说明:

  12. qu'est- ce qui se passe par exemple quand on compare un nombre entier avec un

    例如,当我们比较一个整数和一个

  13. nombre. Décimal.

    小数时?

  14. Est- ce que 2 est égal à 2 avec une virgule?

    2 是否等于带小数点的 2?

  15. Et la réponse est oui.

    答案是:是的

  16. Le Python va essayer de comparer les valeurs en les rapprochant,

    Python 会尝试将数值对齐后比较,

  17. les mettant au même type.

    也就是把它们转换成同一类型。

  18. Ce qui peut de temps en temps poser problème, puisque voilà,

    这有时会引发问题,因为——

  19. si vous faites une comparaison avec un nombre entier,

    如果你用整数做比较,

  20. un nombre entier il est exact,

    整数是精确的,

  21. un nombre à virgule il est potentiellement pas exactement le même.

    而小数却可能并不完全精确。

  22. Et je vous rappelle l'exemple qu'on a vu dans le cours, print,

    还记得课程中那个例子吗?print 函数:

  23. est- ce que 0, 3 est égal à 0, 1 plus 0, 2?

    0.3 是否等于 0.1 加 0.2?

  24. Et la réponse, elle est fausse,

    结果是:错误(False)

  25. d'accord? Pourquoi?

    对吧?为什么呢?

  26. Si je vous rappelle ici, si j'affiche 03 d'un côté.

    如果我在这里提醒大家,一边显示0.3。

  27. Et 0, 1 plus 0, 2 de l'autre côté,

    另一边显示0.1加0.2,

  28. on a ici. Le fait que 0, 3 il est là, et en fait le 0, 1 plus 0,

    我们就会发现:0.3确实存在,而实际上0.1加0.2,

  29. 2, à cause du fait que c'est des nombres qui ont été convertis en binaire avec des

    由于这些数字是以二进制形式带小数点转换的,

  30. virgules, etc. , eh bien on a quelque chose qui n'est pas un calcul exact.

    结果就不是精确计算。

  31. c'est bien quand on convertit un nombre en binaire on peut avoir des suites de

    因为把一个数字转成二进制时,

  32. nombres qui ne s'arrêtent jamais une conversion qui s'arrête jamais et qu'on est

    可能出现无限循环的数字序列,

  33. bien obligé d'arrêter à un moment et ça ça entraîne des erreurs de calcul donc

    即转换过程永不停止,我们不得不在某个时刻截断,

  34. l'exemple typique zéro un plus zéro deux n'est pas égal à zéro trois

    这就会导致计算误差。因此典型例子是:0.1加0.2不等于0.3。

  35. alors que je vous rassure print

    不过请放心,

  36. Trois est égal à un plus deux.

    print(3) 等于 print(1+2)。

  37. ça fonctionne, ok?

    这样是可行的,明白了吗?

  38. Donc voilà, donc petit rappel ici sur le fait que les nombres.

    所以这里简单回顾一下:关于浮点数,

  39. Faire une égalité avec des nombres à virgule, c'est quelque chose de dangereux.

    用小数进行相等判断,是一件危险的事。

  40. Pour ça qu'en fait elles sont même pour être à fond

    正因如此,这种做法

  41. très fortement.

    被强烈反对。

  42. Déconseillé. Donc on va utiliser des supérieurs, des inférieurs,

    因此,我们应使用大于、小于等比较方式,

  43. ça n'a pas de problème, mais une égalité avec des nombres flottants,

    它们没有问题;但对浮点数直接用相等判断,

  44. l'idée c'est niet, jamais.

    这个想法,不行,绝对不行。

  45. Donc si vraiment on veut tester si deux nombres flottants sont proches les uns des

    所以,如果真要检验两个浮点数是否足够接近,

  46. autres, par exemple ici, est- ce que 0, 1 et plus 0, 2 vaut 0,

    比如这里:0.1加0.2是否等于0.3,

  47. 3, eh bien on va l'écrire mieux.

    那我们就该换一种更稳妥的写法。

  48. On va écrire par exemple print

    例如,我们可以写:print(

  49. 0, 3 moins 0, 1 plus 0, 2 et on va regarder si ce truc- là est inférieur à une

    0.3减去(0.1加0.2),再检查这个差值是否小于某个阈值,

  50. certaine valeur, par exemple 0, 0001.

    比如0.0001。

  51. Et là, ça sera bon.

    这时就完成了。

  52. D'accord? Donc, comme on n'a pas des calculs qui sont forcément exacts,

    明白吗?由于我们的计算结果未必完全精确,

  53. on va aller plutôt que faire une égalité avec des nombres flottants,

    我们不应直接用浮点数做相等判断,

  54. on va aller soustraire par exemple les deux résultats qu'on a,

    而应先计算两个结果的差值,

  55. on va vérifier si l'écart qu'il y a entre les deux est inférieur à une certaine

    再检查二者之间的差距是否小于某个预设阈值,

  56. limite qu'on peut se fixer.

    这个阈值由我们自己确定。

  57. Voilà pour les boulets.

    以上就是关于‘浮点数陷阱’的内容。

  58. Et voilà normalement le plus loin qu'on est allé en classe avec au moins le groupe

    接下来这部分内容,正常情况下是我们课堂上至少第一组学到的最远知识点。

  59. 1. Et je crois que le groupe 2 on n'était pas allé jusque là.

    而第二组好像还没讲到这里。

  60. Donc voilà, donc révision pour certains, vision pour d'autres,

    所以,对部分同学来说是复习,对另一些同学则是初次了解。

  61. prenez le temps de compléter éventuellement votre cours, de le réécrire,

    请大家花时间补充、重写自己的笔记,

  62. et on va passer à la suite.

    然后我们进入下一环节。