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.14159
、ROWS = 8
、COLS = 8
(棋盘尺寸)等事物使用常量是有意义的。
今天刚开始学编程,运行遇到了一个问题。多么鼓励自己的方式:)
但由于它是如此基础,也许有人可以快速向我解释这里发生了什么
我有一个简单的 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.14159
、ROWS = 8
、COLS = 8
(棋盘尺寸)等事物使用常量是有意义的。