if month == 1 or 10:
month1 = 0
if month == 2 or 3 or 11:
month1 = 3
if month == 4 or 7:
month1 = 6
if month == 5:
month1 = 1
if month == 6:
month1 = 4
if month == 8:
month1 = 2
if month == 9 or 12:
month1 = 5
此代码始终返回month1
等于5
。我对编程很陌生,我做错了什么? (我想这涉及12是最高数字的事实,但==
意味着等于对吗?)
答案 0 :(得分:6)
if month == 1 or 10:
# ...
相当于
if (month == 1) or 10:
# ...
所以...
总是被执行。
您可以使用
if month in (1, 10):
month1 = 0
甚至更好
a = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]
month1 = a[month - 1]
或
d = {1: 0, 2: 3, 3: 3, 4: 6, 5: 1, 6: 4,
7: 6, 8: 2, 9: 5, 10: 0, 11: 3, 12: 5}
month1 = d[month]
代替。
获得相同结果的另一种方法是使用datetime
模块:
from datetime import datetime
month1 = (datetime(2011, month, 1) - datetime(2011, 1, 1)).days % 7
答案 1 :(得分:5)
当你写:
if month == 9 or 12:
month1 = 5
实际上意味着:
if (month == 9) or (12):
month1 = 5
你想拥有的是:
if (month == 9) or (month == 12):
month1 = 5
答案 2 :(得分:1)
此外,我认为您需要elif
而不仅仅是if
:
if month == 1 or month == 10:
month1 = 0
elif month == 2 or month == 3 or month == 11:
month1 = 3
elif month == 4 or month == 7:
month1 = 6
elif month == 5:
month1 = 1
elif month == 6:
month1 = 4
elif month == 8:
month1 = 2
elif month == 9 or month == 12:
month1 = 5
如果第一个条件(月份是1或10)为真,它将跳过其他条件。
答案 3 :(得分:1)
不完全被问到什么,但我建议使用dict作为快速查找表重新实现。例如:
month_lut = {
1 : 0,
10 : 0,
2 : 3,
3 : 3,
11 : 3,
4 : 6,
7 : 6,
# more ...
}
month1 = month_lut[month]
它不仅看起来更直观(对我而言),如果KeyError
无效,则会得到month
异常(可以正确处理),而不是以静默方式失败并以未定义方式结束month1
。
答案 4 :(得分:1)
两件事:
您正在使用独立ifs(if,if,if),因此每次都会尝试使用它们。如果您使用级联ifs(if,elif,elif),则总是会返回month1 = 0,因为:
您的比较不是您的想法! 'month == 1或10'将始终返回True或10.如果month为1,则month == 1为True,则True或10为True,并且if语句的主体将运行。在所有其他情况下,月份== 1为False,False或10为10,这是“truthy”,因此if语句会运行!
答案 5 :(得分:0)
关于python or
运算符如何工作的注释:
表达式x or y
:
如果x
为True
,则表达式返回x
。当x是布尔值时,这直观有意义 - 如果x
为True
则返回True
。如果x
为False
,则会返回y
。当y
是布尔值时,这很直观。如果x
为False
且y
为True
,则您的True
表达式的值为or
。
然而,当x
不是布尔值,或者x是False
而y
不是布尔值时,事情会变得棘手。在您的情况下,month == 1
是一个布尔值。与上面的规则一样,如果为false,则返回or
表达式的后半部分。由于10
不是布尔值,而是整数,因此只返回它。
month1
始终等于5的原因是,在最后两行中,您遇到了这样的问题。在你的陈述中
if month == 9 or 12:
python首先检查or语句返回的内容。在这里,它将返回True
(如果月份实际为9)或者月份不是9,因为12不是布尔值,它将返回12.这两个值都是True
和`12)使if语句通过,并在其后面的行进行评估,将month1设置为12.s
我会注意到其他答案解释了此代码的更好方法。但是,了解布尔运算符如何在python中工作仍然很有用。