2014-10-28 83 views
3

我正在写一个游戏大酒杯的代码,其中输出将打印每个值为0-51的列表,然后是游戏大酒杯中的对应值。我的代码看起来是这样的:功能不能返回我想要的

#cards.py 
def cardInfo(cardNumber): 
    if cardNumber == 0 or 13 or 26 or 39: #if the card is an ace 
     bjValue = 11      #the value is 11 of whatever suit 
    elif 1 <= cardNumber <= 8:    #if card is 2-9 
     bjValue = cardNumber + 1   #the value is itself of clubs 
    elif 9 <= cardNumber <= 12:    #if card is 10-king 
     bjValue = 10      #value is 10 of clubs 
    elif 14 <= cardNumber <= 21:   #the same as above for the rest 
     bjValue = cardNumber - 12   #with respect to higher suits 
    elif 22 <= cardNumber <= 25: 
     bjValue = 10 
    elif 27 <= cardNumber <= 34: 
     bjValue = cardNumber - 25 
    elif 35 <= cardNumber <= 38: 
     bjValue = 10 
    elif 40 <= cardNumber <= 47: 
     bjValue = cardNumber - 38 
    elif 48 <= cardNumber <= 51: 
     bjValue = 10 
    total = (cardNumber, bjValue) 
    return total 

def main(): 
    for cardValue in range(0,52): 
     stuff = cardInfo(cardValue) 
     print (stuff) 

main() 

当我运行程序时,它输出作为它应该第一个数字,并给出(0,11)(1,11)等等。

问题是根据cardInfo函数中的ifelif语句,第二个值没有返回,而是为每次迭代提供相同的值。它应该返回与if语句中指定的值相对应的值,但它只是返回第一个if语句中给出的值。任何人都可以解释为什么这是或如何解决它?

回答

2

if cardNumber == 0 or 13 or 26 or 39:永远是True所以你永远不会达成任何elif

如果你将它与写或者,这将是:

if cardNumber == 0 or cardNumber == 13 or cardNumber == 26 or cardNumber== 39: 

但它会更好,以测试membership和使用在if cardNumber in {0, 13 , 26, 39}

使用set{0, 13 , 26, 39}测试成员资格是O(1)

In [6]: i = 10 

In [7]: if i == 0 or 1 or 2: # if 1 evaluates to True 
    ...:  print(True) 
    ...:  
True 
1

你的说法if cardNumber == 0 or 13 or 26 or 39相当于if (cardNumber == 0) or (13) or (26) or (39)其中括号围绕逻辑值放。

在Python中,与空列表,字符串,字典,0等不同的东西被认为是True。因此,您的if cardNumber == 0 or 13 or 26 or 39相当于if cardNumber == 0 or True or True or Trueif True

也许你想写if cardNumber in [0, 13, 26, 39](或者等效但稍快if cardNumber in {0, 13, 26, 39})。或者,更长的文本if cardNumber == 0 or cardNumber == 13 or cardNumber == 26 or cardNumber = 39