为什么这个字符串总是最高的数字

时间:2011-02-13 20:43:00

标签: python

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是最高数字的事实,但==意味着等于对吗?)

6 个答案:

答案 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)

两件事:

  1. 您正在使用独立ifs(if,if,if),因此每次都会尝试使用它们。如果您使用级联ifs(if,elif,elif),则总是会返回month1 = 0,因为:

  2. 您的比较不是您的想法! '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

如果xTrue,则表达式返回x。当x是布尔值时,这直观有意义 - 如果xTrue则返回True。如果xFalse,则会返回y。当y是布尔值时,这很直观。如果xFalseyTrue,则您的True表达式的值为or

然而,当x不是布尔值,或者x是Falsey不是布尔值时,事情会变得棘手。在您的情况下,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中工作仍然很有用。