首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:基本模块- 911 % 11 == 0返回true

Python:基本模块- 911 % 11 == 0返回true
EN

Stack Overflow用户
提问于 2017-09-22 11:18:33
回答 3查看 116关注 0票数 0

我今天刚开始学习编程,遇到了一个问题。(这是一种鼓励自己的方式。)

但既然这是很基本的,也许有人能很快解释一下这里发生了什么

我有一个简单的if声明,给我一个课程

代码语言:javascript
复制
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)

这还真了两次,这当然是不对的。我做了两次检查

代码语言:javascript
复制
print(number_911 / divisible_by_11)

的正确结果

代码语言:javascript
复制
82.81818181818181

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

它与int/float有关吗?如果是这样的话,我如何才能强制将该数字作为浮点数处理?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-22 11:21:13

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

代码语言:javascript
复制
>>> number_583 = 583
>>> divisible_by_11 = 11
>>> [number_583 % divisible_by_11 == 0]
[True]
>>> type([number_583 % divisible_by_11 == 0])
<class 'list'>

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

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

代码语言:javascript
复制
>>> number_911 = 911
>>> [number_911 % divisible_by_11 == 0]
[False]
>>> bool([number_911 % divisible_by_11 == 0])
True

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

去掉这些方括号:

代码语言:javascript
复制
if number_583 % divisible_by_11 == 0:
    is_583_divisible_by_11 = True
else:
    is_583_divisible_by_11 = False

代码语言:javascript
复制
if number_911 % divisible_by_11 == 0:
    is_911_divisible_by_11 = True
else:
   is_911_divisible_by_11 = False

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

代码语言:javascript
复制
is_583_divisible_by_11 = number_583 % divisible_by_11 == 0
is_911_divisible_by_11 = number_911 % divisible_by_11 == 0

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

代码语言:javascript
复制
is_583_divisible_by_11 = (number_583 % divisible_by_11 == 0)
is_911_divisible_by_11 = (number_911 % divisible_by_11 == 0)

但在这里他们是多余的。

票数 1
EN

Stack Overflow用户

发布于 2017-09-22 11:21:03

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

代码语言:javascript
复制
if number_583 % divisible_by_11 == 0:
   ...
代码语言:javascript
复制
>>> bool([False])
True
票数 1
EN

Stack Overflow用户

发布于 2017-09-22 11:22:01

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

代码语言:javascript
复制
>>> [number_911 % divisible_by_11 == 0]
[False]

一个非空的列表被认为是True的布尔用途。

代码语言:javascript
复制
if [False]:
    print('True')
else:
    print('False')

会印上“真”。

您可以简单地删除[]以避免创建列表,从而更正代码。

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

代码语言:javascript
复制
>>> 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 (棋盘尺寸)等事物中使用常量是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46363496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档