Python: 基本模 - 911 % 11 == 0 returns 真

Python: Basic modulo - 911 % 11 == 0 returns true

今天刚开始学编程,运行遇到了一个问题。多么鼓励自己的方式:)

但由于它是如此基础,也许有人可以快速向我解释这里发生了什么

我有一个简单的 if 语句,是在课程中教给我的

divisible_by_11 = 11

is_583_divisible_by_11 = None
is_911_divisible_by_11 = None

number_583 = 583

if [number_583 % divisible_by_11 == 0]:  #that line is added by me
    is_583_divisible_by_11 = True
else:
    is_583_divisible_by_11 = False


is_911_divisible_by_11 = None
number_911 = 911

if [number_911 % divisible_by_11 == 0]:  #that line is added by me
    is_911_divisible_by_11 = True
else:
   is_911_divisible_by_11 = False

print(is_583_divisible_by_11)
print(is_911_divisible_by_11)

并且返回了两次 True,这当然是不正确的。 为了仔细检查,我做了

print(number_911 / divisible_by_11)

并且返回

的正确结果
82.81818181818181

在这种情况下,为什么会发生“ if [number_911 % divisible_by_11 == 0]” returns true 即使在同一个程序中我们可以检查和这是不正确的。

和int/float有关系吗?如果是这样,我怎样才能强制将该数字视为浮点数?

不要将表达式放在列表中。一个非空列表总是 truthy,即使它的内容都是 falsy。去掉方括号:

if number_583 % divisible_by_11 == 0:
   ...

>>> bool([False])
True

你不应该使用 [...] 括号;创建一个列表对象

>>> number_583 = 583
>>> divisible_by_11 = 11
>>> [number_583 % divisible_by_11 == 0]
[True]
>>> type([number_583 % divisible_by_11 == 0])
<class 'list'>

因为您有一个包含至少一个元素的列表,所以在布尔上下文中总是为真;见 truth value testing documentation.

== 操作产生 False 结果时,这很重要,就像在您的 911 测试中:

>>> number_911 = 911
>>> [number_911 % divisible_by_11 == 0]
[False]
>>> bool([number_911 % divisible_by_11 == 0])
True

bool() returns 与 if 测试的结果相同。

完全删除那些方括号:

if number_583 % divisible_by_11 == 0:
    is_583_divisible_by_11 = True
else:
    is_583_divisible_by_11 = False

if number_911 % divisible_by_11 == 0:
    is_911_divisible_by_11 = True
else:
   is_911_divisible_by_11 = False

你可以直接分配结果 ,因为 == 已经给你一个布尔值:

is_583_divisible_by_11 = number_583 % divisible_by_11 == 0
is_911_divisible_by_11 = number_911 % divisible_by_11 == 0

如果确实需要对表达式进行分组,则需要使用 (...) 圆括号:

is_583_divisible_by_11 = (number_583 % divisible_by_11 == 0)
is_911_divisible_by_11 = (number_911 % divisible_by_11 == 0)

不过这里是多余的

这是因为您的 if 语句无意中构造了一个 1 元素列表:

>>> [number_911 % divisible_by_11 == 0]
[False]

出于布尔目的,非空列表被视为 True,例如

if [False]:
    print('True')
else:
    print('False')

将打印 "True"。

您只需删除 [] 即可更正您的代码,以避免创建列表。

顺便说一句,没有必要也不希望初始化结果变量。也可以完全不使用 if 语句。这相当于:

>>> is_583_divisible_by_11 = 583 % 11 == 0
>>> is_583_divisible_by_11
True

>>> is_911_divisible_by_11 = 911 % 11 == 0
>>> is_911_divisible_by_11
False

最后,将文字值绑定到变量的名称只是简单地重复值,例如 number_911。直接用号就行了

对诸如 G = 9.8'(重力加速度)、PI = 3.14159ROWS = 8COLS = 8(棋盘尺寸)等事物使用常量是有意义的。