Метод Python в классе

#python #class #methods

#python #класс #методы

Вопрос:

Я пытаюсь начать правильно использовать объекты, я собрал колоду карт, которая является моим объектом. Я хочу иметь возможность перетасовывать и сдавать карты из него. Однако я не могу понять, как заставить метод shuffle работать правильно или даже если это лучший способ сделать это.

 import itertools
import random

class Deck:
    '''Deck of cards to be used in a card game'''
    def __init__(self):
        self.faces = ['A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4','3', '2']
        self.suits = ['c', 'd', 'h', 's']
        self.cards = set(itertools.product(self.faces, self.suits))

    def shuffle(self):
        self.cards = random.shuffle(self.cards)

    def deal(self):
        card = self.cards.pop()
        return card[0]   card[1]
  

Использование;

 deck = Deck()
deck.shuffle()
deck.deal()
  

Комментарии:

1. Следует использовать list вместо set .

2. random.shuffle изменяет список на месте; он возвращает None , а не перетасованный список.

3. Перечисление и перетасовка на месте работают. Спасибо, ребята

Ответ №1:

Sets не упорядочены, вы могли бы использовать list() для получения упорядоченной колоды. Кроме того, random.shuffle(l) действует непосредственно на список и возвращает None , поэтому вы перезаписываете список с помощью None .

 import itertools
import random

class Deck:
    '''Deck of cards to be used in a card game'''
    def __init__(self):
        self.faces = ['A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4','3', '2']
        self.suits = ['c', 'd', 'h', 's']
        self.cards = list(itertools.product(self.faces, self.suits))  # ordered deck
        # self.cards = set(itertools.product(self.faces, self.suits))  # unordered deck

    def shuffle(self):
        random.shuffle(self.cards)

    def deal(self):
        card = self.cards.pop()
        return card[0]   card[1]
  

Комментарии:

1. set Вообще в этом нет необходимости , поскольку product не будет создаваться никаких дубликатов, которые необходимо удалять.

2. ему нужен только один между list или set . В этом не было необходимости list(set( ... )) , спасибо, что указали на это