【问题标题】:Weird bug with ' > ' in Python [duplicate]Python中带有'>'的奇怪错误[重复]
【发布时间】:2020-11-04 04:55:40
【问题描述】:

学了一点Python,我在Kaggle做练习。

基本上我的问题减少到两个int 之间的> 比较器不能按我的意愿工作。

问题是写一个比较两个黑杰克手(字符串列表)的函数

我首先写了一个函数,它给了我一手牌的价值

def hand_val(hand):
        
    ace_count=0
        
    for i in range(len(hand)) :
        val_hand=hand
        if ((hand[i] == 'J') | (hand[i] == 'Q') | (hand[i] == 'K')):
            val_hand[i]=10
        elif (hand[i] == 'A'):
            val_hand[i]=11
            ace_count+=1
        else :
            val_hand[i]=int(hand[i])
        
    value=0
    
    for i in val_hand :
        value = value + i
    for i in range(ace_count) :
        if value>21 :
            value=value-10
            
    return value

然后是另一个比较两只不同的手

def blackjack_hand_greater_than(hand_1, hand_2):
    if (hand_val(hand_1)>21):
        return False
    elif (hand_val(hand_2)>21):
        return True
    elif (hand_val(hand_1)>hand_val(hand_2)):
        return True
    else:
        return False

(我知道我应该以return ((hand_val(hand_1)<22) and ((hand_val(hand_1)>hand_val(hand_2))or(hand_val(hand_2)>21))) 执行此操作,但单独的条件更易读)

使用这两只特定的手,第二个功能无法按预期工作。我想我已经设法将问题追溯到第一个 elif 这是我写的调试代码

hand_1=['3', '2', '6', '8']
hand_2=['8', 'A', '5']
print(hand_val(hand_1))
print(hand_val(hand_2))
print(type(hand_val(hand_1)))
print(type(hand_val(hand_2)))
print(hand_val(hand_1)>21)
print(hand_val(hand_2)>21)   ############# WHY??? OH WHY??
print(14>21)
print(hand_val(hand_1)>hand_val(hand_2))

这是输出

19
14
<class 'int'>
<class 'int'>
False
True
False
False

看到了 print(hand_val(hand_2)&gt;21) 返回 Trueprint(14&gt;21) 返回 False 应该是这样吗?

有人可以帮忙吗?

【问题讨论】:

  • val_hand=hand 不是副本。你的 hand_val 改变了它的输入,所以当你第二次调用它时的结果不是 14 第二次。
  • 只是一个建议:使用or 而不是|if (hand[i] == 'J') or (hand[i] == 'Q') or (hand[i] == 'K'): 你甚至可以使用这个:if hand[i] in ['J', 'Q', 'K']:

标签: python comparator


【解决方案1】:

正确的写法:

def blackjack_hand_greater_than(hand_1, hand_2):
    return and_val(hand_1) < 22 and (hand_val(hand_1) > hand_val(hand_2) or hand_val(hand_2) > 21)

分成多行是:

def blackjack_hand_greater_than(hand_1, hand_2):
    if and_val(hand_1) < 22:
        if hand_val(hand_1) > hand_val(hand_2):
            return True
        elif hand_val(hand_2) > 21:
            return True
        else:
            return False
    else:
        return False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多