2016-08-03 25 views
1

はこれです:このよう'and'と 'or'の操作の順序は何ですか? 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 

最初のコードブロックの代わりに2番目のコードブロックを使用できますか?それは余分なエリフの声明を排除し、ちょうどきれいに見えます。 私の関心事は、 'and'と 'or'演算子の働きです。 2つの 'と'の比較は分かれていますか? 'and'と 'or'の操作順序はありますか? 私はコードを実行し、それは両方の方法で動作しますが、私はオペレータがどのように動作するかを正確に理解したいと思います。

+0

「エース」が手元にあり、任意の(xは手に入れた[0:2])x –

答えて

4

を使用するなど、他の製剤を、試すかもしれませんが。 the documentationによれば、orは、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) 
0

あなたが知らない場合、あなたの読者はどちらかを知らないかもしれないし、括弧を使用すると誰にとっても良いでしょう。

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)): 

かはい、2番目のコードブロックは最初のものと同等であるヘルパー関数を書き、

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

vaultah's answerは完全にあなたの実際の質問に対処する - 彼らはupvoteとチェックマークに値します。

しかし、あなたが学んでいるすべての言語でブラックジャックをプログラミングすることは、それをよりよく理解するための優れた方法だと思うので、ブラックジャックテストを実装する別の方法を示すコードをまとめました。同様に、

# 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 

、これらは考えるだけでさまざまなアイデアです。彼らがあなたの頭の上にいるかどうか心配しないでください、あなたはそこに着くでしょう。

+0

ありがとう、本当にありがとう、本当に役に立ちました。私はあなたのクラスをどのように使っているのか不思議でした。あなたのprintステートメントのためにPython3を使用しているように見えます... Cardクラスを定義すると、あとに括弧で囲まれた引数がないことに気付きます。それはpython2と3の違いでしょうか?また、Handクラスの引数としてlistを使用します...そのクラスにリストオブジェクトを渡すことを計画していますか? – Chris

+0

私は参照してください... random.sample()は、Handクラスに渡すことができるリストオブジェクトを返します。 – Chris

+0

@Chrisあなたは 'class Card:'行を意味しますか?つまり、 'Card'が拡張されるはずの明示的なスーパークラスがないということです。一方、 'Hand'は標準の' list'クラスを拡張しています。私はPython 3でこれを書いていました。Python 2では、 'class Card(object):'を良い習慣として使用したいと思うかもしれませんが、それは必要ではないと思います。あなたの2番目の質問では、 'class Hand(list):'は、私が定義した場合を除いて 'Hand'がリスト(indexing、' append() 'メソッドなどと全く同じように動作するようにすることを意味します。ここでは、クラスにis_blackjack()メソッドを追加しました。そのメソッドを除いて、 'Hand'インスタンス... – jedwards

関連する問題