“and”和“or”的操作顺序是什么?

2024-04-24 22:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中是这样的:

def blackjack_check(hand): # hand is a tuple
    winning_cards = [10,'Jack','Queen','King']
    if hand[0] in winning_cards and hand[1] == 'Ace':
        return True
    elif hand[0] == 'Ace' and hand[1] in winning_cards:
        return True
    else:
        return False

和这个一样。。。?你知道吗

def blackjack_check(hand): # hand is a tuple
    winning_cards = [10,'Jack','Queen','King']
    if (hand[0] in winning_cards and hand[1]=='Ace' or 
        hand[0] == 'Ace' and hand[1] in winning_cards):
        return True
    else:
        return False

我能用第二个代码块代替第一个吗?它将消除一个额外的elif语句,而且看起来更干净。 我关心的是“and”和“or”操作符是如何工作的。“and”和“or”是分开的吗?“and”和“or”是否有操作顺序? 我运行了代码,它是双向的,但我想确保我确切地了解操作符是如何工作的。你知道吗


Tags: orandintruereturnisdefcheck
3条回答

是的,第二个代码块相当于第一个代码块。根据the documentationor的优先级低于and。这意味着if语句的计算结果是

if ((hand[0] in winning_cards and hand[1] == 'Ace') or 
    (hand[0] == 'Ace' and hand[1] in winning_cards)):

这就是你想要的。你知道吗

您可以返回该布尔表达式的结果以缩短代码:

def blackjack_check(hand):
    winning_cards = [10, 'Jack', 'Queen', 'King']
    return (hand[0] in winning_cards and hand[1] == 'Ace' or 
            hand[0] == 'Ace' and hand[1] in winning_cards)

vaultah's answer完美地解决了你的实际问题——他们值得投票和打勾。你知道吗

但是我认为用你正在学习的每种语言编写21点程序是更好地理解它的一个很好的方法,所以我把代码放在一起展示了实现21点测试的不同方法。更多的是出于教育目的,而不是真正回答你的问题:

# Note: sometimes an Ace should be 1, but when checking for blackjack you can always 
#   consider it 11
def card_value(c):
    if isinstance(c, int):
        return c
    elif c in ['Jack', 'Queen', 'King']:
        return 10
    elif c == 'Ace':
        return 11

def blackjack_check(hand):
    hand_value = sum(card_value(c) for c in hand)
    return hand_value == 21

print(blackjack_check((2, 10)))             # False
print(blackjack_check((10, 10)))            # False
print(blackjack_check((2, 'Ace')))          # False
print(blackjack_check(('King', 'Jack')))    # False
print(blackjack_check(('King', 'Ace')))     # True
print(blackjack_check(('Ace', 'Queen')))    # True

如果我今天实现的话,卡片和手就是类,并且会有一个Hand.is_blackjack()方法,比如:

import random

class Card:
    NAMES = {1: 'Ace', 11:'Jack', 12:'Queen', 13:'King'}
    def __init__(self, pips, suit):
        self.pips = pips
        self.suit = suit

    def __repr__(self):
        name = Card.NAMES.get(self.pips, "%d" % self.pips)
        return "%s of %s" % (name, self.suit)

    def value(self, ace_hi=True):
        # Handle Ace
        if self.pips == 1:
            return 11 if ace_hi else 1
        return min(self.pips, 10)

class Hand(list):
    def is_blackjack(self):
        hand_value = sum(c.value() for c in self)
        return hand_value == 21

CARDS = [Card(p,s) for p in range(1,14) for s in ['Spades', 'Hearts', 'Clubs', 'Diamonds']]

h = Hand(random.sample(CARDS, 2))

print("Hand:")
for c in h:
    print("  %s" % c)

print("Blackjack? %s" % h.is_blackjack())

示例:

Hand:
  Jack of Spades
  Ace of Spades
Blackjack? True

Hand:
  Queen of Spades
  9 of Diamonds
Blackjack? False

抱歉愚蠢的不回答,但这些只是不同的想法考虑。别担心如果他们在你头上,你会到的。你知道吗

通常的建议是,如果你不知道,那么你的读者可能也不知道,如果你使用括号,对每个人都更好。你知道吗

if ((hand[0] in winning_cards and hand[1]=='Ace') or 
    (hand[0] == 'Ace' and hand[1] in winning_cards)):

尽管你可以尝试其他的配方,比如

if (any(card == 'Ace' for card in hand) and
    any(card in winning_cards for card in hand)):

或者编写助手函数并使用

if hascard(hand, ('Ace',)) and hascard(hand, winning_cards):

相关问题 更多 >