在if语句中执行错误的块

时间:2013-07-28 05:37:48

标签: python python-2.7 if-statement

clothes_total = tot1 + tot2 + tot3 + tot4+ tot5
tot_price = tax * (clothes_total + shipping + gift_number)
tot_price1 = tax * (clothes_total * 0.85 + shipping + gift_number)
tot_price2 = tax * (clothes_total * 0.85 + shipping + gift_number - 30)
print "<h4>Original Price: $ %s </h4>" % clothes_total
if clothes_total < 150:
    print "<h4> TOTAL : %s </h4>" % tot_price
elif clothes_total > 150:
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
elif clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2

即使clothes_total号码大于200,elif clothes_total >200中的值也不会显示。你能告诉我为什么它没有显示出来吗?在elif clothes_total > 150中,即使数字大于200,一切都很好地显示出来。但是我做错了吗?

4 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您的程序执行在考虑elif clothes_total > 150之前会经过elif clothes_total > 200。以下是if语句的工作原理:

此:

if condition1:
    do thing1
elif condition2:
    do thing2
elif condition2:
    do thing3

与此相同:

if condition1:
    do thing1
else:
    if condition2:
        do thing2
    else:
        if condition2:
            do thing3

如果您想执行if clothes_total > 150if clothes_total > 200内的内容,有四种选择:

选项1 (只需将所有内容添加到另一个中):

if clothes_total < 150:
    print "<h4> TOTAL : %s </h4>" % tot_price
elif 150 < clothes_total < 200: # define a maximum as well
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2
elif clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2

选项2 (嵌套if语句):

if clothes_total < 150:
    print "<h4> TOTAL : %s </h4>" % tot_price
elif 150 < clothes_total:
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
    if clothes_total > 200:
        print "15% Discount + $30 off: $"
        print 0.85 * (clothes_total - 30)
        print "<h4> THIRTY: $ %s </h4>" % tot_price2
elif clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2

选项3 (没有else,只有if s):

if clothes_total < 150:
    print "<h4> TOTAL : %s </h4>" % tot_price
if 150 < clothes_total
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
if clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2

这将执行最后两个if块,这可能不是您想要的。但请注意,在执行所有if-statments条件时,运行时会丢失,尤其是在条件复杂的情况下

选项4 (范围条件):

if clothes_total < 150:
    print "<h4> TOTAL : %s </h4>" % tot_price
elif 150 < clothes_total < 200: # define the bounds of the range of acceptable values
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
elif clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2

这使您可以缩短所需的if语句,并保证在任何给定时间只输入一个块。

希望这有帮助

答案 1 :(得分:1)

这是因为if-elif-else条件短路,如果第一个elif条件为True,则不会检查第二个条件。

来自if-suite上的docs

if_stmt ::=  "if" expression ":" suite
             ( "elif" expression ":" suite )*
             ["else" ":" suite]
  

它通过评估表达式1来精确选择其中一个套件   一个直到一个被发现是真的;然后该套件被执行(和   没有执行或评估if语句的其他部分)。我摔倒   表达式为false, else 子句的套件(如果存在)是   执行。

如果您想要执行所有条件,请使用所有if

if clothes_total < 150:
    ...
if clothes_total > 150:
    ...
if clothes_total > 200:
  ...

另一种选择是:

if clothes_total < 150:
    ...
elif 150 <= clothes_total <= 200:  #this is True if clothes_total is between 150 and 200(both inclusive)
    ...
elif clothes_total > 200:          #True if clothes_total is greater than 200
  ...

答案 2 :(得分:0)

您知道可以汇总列表吗?

clothes_total = sum([tot1, tot2, tot3, tot4, tot5])

但我相信你有一个你的总变量列表,在这种情况下你可以这样做:

clothes_total = sum(totals_list)

答案 3 :(得分:0)

正如其他人所指出的,一旦total>150条件为真,total>200甚至不会被评估。

尝试颠倒像这样的语句的顺序......

if clothes_total > 200:
    print "15% Discount + $30 off: $"
    print 0.85 * (clothes_total - 30)
    print "<h4> THIRTY: $ %s </h4>" % tot_price2
elif clothes_total > 150:
    print "15% Discount: $"
    print clothes_total * 0.85
    print "<h4> FIFTEEN: $ %s </h4>" % tot_price1
else:
    print "<h4> TOTAL : %s </h4>" % tot_price

另请注意,在您的原始代码中,除非您将<更改为<=,否则将错过150的值。