In [2]:
import collections

In [10]:
Card = collections.namedtuple('Card',['rank','suit'])
class FrechDeck():
    ranks = [str(n) for n in range(2,11)] + list('JKQA')
    suits = 'spades diamonds clubs hearts'.split()
    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
    def __len__(self):
        return len(self._cards)
    def __getitem__(self,postion):
        return self._cards[postion]

In [11]:
beer_card = Card('7','diamonds')
beer_card


Out[11]:
Card(rank='7', suit='diamonds')

In [12]:
deck = FrechDeck()
len(deck)


Out[12]:
52

In [13]:
deck[0]


Out[13]:
Card(rank='2', suit='spades')

In [14]:
deck[-1]


Out[14]:
Card(rank='A', suit='hearts')

In [15]:
from random import choice
choice(deck)


Out[15]:
Card(rank='9', suit='diamonds')

In [16]:
choice(deck)


Out[16]:
Card(rank='4', suit='spades')

In [17]:
choice(deck)


Out[17]:
Card(rank='3', suit='clubs')

In [18]:
deck[:3]


Out[18]:
[Card(rank='2', suit='spades'),
 Card(rank='3', suit='spades'),
 Card(rank='4', suit='spades')]

In [19]:
deck[12::13]


Out[19]:
[Card(rank='A', suit='spades'),
 Card(rank='A', suit='diamonds'),
 Card(rank='A', suit='clubs'),
 Card(rank='A', suit='hearts')]

In [20]:
for card in deck:
    print(card)


Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')
Card(rank='5', suit='spades')
Card(rank='6', suit='spades')
Card(rank='7', suit='spades')
Card(rank='8', suit='spades')
Card(rank='9', suit='spades')
Card(rank='10', suit='spades')
Card(rank='J', suit='spades')
Card(rank='K', suit='spades')
Card(rank='Q', suit='spades')
Card(rank='A', suit='spades')
Card(rank='2', suit='diamonds')
Card(rank='3', suit='diamonds')
Card(rank='4', suit='diamonds')
Card(rank='5', suit='diamonds')
Card(rank='6', suit='diamonds')
Card(rank='7', suit='diamonds')
Card(rank='8', suit='diamonds')
Card(rank='9', suit='diamonds')
Card(rank='10', suit='diamonds')
Card(rank='J', suit='diamonds')
Card(rank='K', suit='diamonds')
Card(rank='Q', suit='diamonds')
Card(rank='A', suit='diamonds')
Card(rank='2', suit='clubs')
Card(rank='3', suit='clubs')
Card(rank='4', suit='clubs')
Card(rank='5', suit='clubs')
Card(rank='6', suit='clubs')
Card(rank='7', suit='clubs')
Card(rank='8', suit='clubs')
Card(rank='9', suit='clubs')
Card(rank='10', suit='clubs')
Card(rank='J', suit='clubs')
Card(rank='K', suit='clubs')
Card(rank='Q', suit='clubs')
Card(rank='A', suit='clubs')
Card(rank='2', suit='hearts')
Card(rank='3', suit='hearts')
Card(rank='4', suit='hearts')
Card(rank='5', suit='hearts')
Card(rank='6', suit='hearts')
Card(rank='7', suit='hearts')
Card(rank='8', suit='hearts')
Card(rank='9', suit='hearts')
Card(rank='10', suit='hearts')
Card(rank='J', suit='hearts')
Card(rank='K', suit='hearts')
Card(rank='Q', suit='hearts')
Card(rank='A', suit='hearts')

In [21]:
for card in reversed(deck):
    print(card)


Card(rank='A', suit='hearts')
Card(rank='Q', suit='hearts')
Card(rank='K', suit='hearts')
Card(rank='J', suit='hearts')
Card(rank='10', suit='hearts')
Card(rank='9', suit='hearts')
Card(rank='8', suit='hearts')
Card(rank='7', suit='hearts')
Card(rank='6', suit='hearts')
Card(rank='5', suit='hearts')
Card(rank='4', suit='hearts')
Card(rank='3', suit='hearts')
Card(rank='2', suit='hearts')
Card(rank='A', suit='clubs')
Card(rank='Q', suit='clubs')
Card(rank='K', suit='clubs')
Card(rank='J', suit='clubs')
Card(rank='10', suit='clubs')
Card(rank='9', suit='clubs')
Card(rank='8', suit='clubs')
Card(rank='7', suit='clubs')
Card(rank='6', suit='clubs')
Card(rank='5', suit='clubs')
Card(rank='4', suit='clubs')
Card(rank='3', suit='clubs')
Card(rank='2', suit='clubs')
Card(rank='A', suit='diamonds')
Card(rank='Q', suit='diamonds')
Card(rank='K', suit='diamonds')
Card(rank='J', suit='diamonds')
Card(rank='10', suit='diamonds')
Card(rank='9', suit='diamonds')
Card(rank='8', suit='diamonds')
Card(rank='7', suit='diamonds')
Card(rank='6', suit='diamonds')
Card(rank='5', suit='diamonds')
Card(rank='4', suit='diamonds')
Card(rank='3', suit='diamonds')
Card(rank='2', suit='diamonds')
Card(rank='A', suit='spades')
Card(rank='Q', suit='spades')
Card(rank='K', suit='spades')
Card(rank='J', suit='spades')
Card(rank='10', suit='spades')
Card(rank='9', suit='spades')
Card(rank='8', suit='spades')
Card(rank='7', suit='spades')
Card(rank='6', suit='spades')
Card(rank='5', suit='spades')
Card(rank='4', suit='spades')
Card(rank='3', suit='spades')
Card(rank='2', suit='spades')

In [22]:
Card('Q','hearts') in deck


Out[22]:
True

In [23]:
Card('7','beasts') in deck


Out[23]:
False

In [31]:
suit_values = dict(spades=3,hearts=2,diamonds=1,clubs=0)
def spades_high(card):
    rank_value = FrechDeck.ranks.index(card.rank)
    return rank_value * len(suit_values) + suit_values[card.suit]

In [32]:
for card in sorted(deck,key=spades_high):
    print(card)


Card(rank='2', suit='clubs')
Card(rank='2', suit='diamonds')
Card(rank='2', suit='hearts')
Card(rank='2', suit='spades')
Card(rank='3', suit='clubs')
Card(rank='3', suit='diamonds')
Card(rank='3', suit='hearts')
Card(rank='3', suit='spades')
Card(rank='4', suit='clubs')
Card(rank='4', suit='diamonds')
Card(rank='4', suit='hearts')
Card(rank='4', suit='spades')
Card(rank='5', suit='clubs')
Card(rank='5', suit='diamonds')
Card(rank='5', suit='hearts')
Card(rank='5', suit='spades')
Card(rank='6', suit='clubs')
Card(rank='6', suit='diamonds')
Card(rank='6', suit='hearts')
Card(rank='6', suit='spades')
Card(rank='7', suit='clubs')
Card(rank='7', suit='diamonds')
Card(rank='7', suit='hearts')
Card(rank='7', suit='spades')
Card(rank='8', suit='clubs')
Card(rank='8', suit='diamonds')
Card(rank='8', suit='hearts')
Card(rank='8', suit='spades')
Card(rank='9', suit='clubs')
Card(rank='9', suit='diamonds')
Card(rank='9', suit='hearts')
Card(rank='9', suit='spades')
Card(rank='10', suit='clubs')
Card(rank='10', suit='diamonds')
Card(rank='10', suit='hearts')
Card(rank='10', suit='spades')
Card(rank='J', suit='clubs')
Card(rank='J', suit='diamonds')
Card(rank='J', suit='hearts')
Card(rank='J', suit='spades')
Card(rank='K', suit='clubs')
Card(rank='K', suit='diamonds')
Card(rank='K', suit='hearts')
Card(rank='K', suit='spades')
Card(rank='Q', suit='clubs')
Card(rank='Q', suit='diamonds')
Card(rank='Q', suit='hearts')
Card(rank='Q', suit='spades')
Card(rank='A', suit='clubs')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='hearts')
Card(rank='A', suit='spades')

In [34]:
from math import hypot
class Vector:
    def __init__(self, x=0,y=0):
        self.x = x
        self.y =y
    def __repr__(self):
        return f'Vector({self.x},{self.y})'
    def __abs__(self):
        return hypot(self.x, self.y)
    def __bool__(self):
        return book(abs(self))
    def __add__(self,other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x,y)
    def __mul__(self,scalar):
        return Vector(self.x * scalar, self.y * scalar)

In [35]:
v1 = Vector(2,4)
v2=Vector(2,1)
v1+v2


Out[35]:
Vector(4,5)

In [36]:
v=Vector(3,4)
abs(v)


Out[36]:
5.0

In [37]:
v*3


Out[37]:
Vector(9,12)

In [38]:
abs(v*3)


Out[38]:
15.0

In [39]:
from collections import namedtuple
City = namedtuple('City','name country population coordinates')
tokyo = City('Tokyo','JP',36.933,(35.689722,139.691667))
tokyo


Out[39]:
City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722, 139.691667))

In [40]:
tokyo.population


Out[40]:
36.933

In [41]:
tokyo[1]


Out[41]:
'JP'

In [42]:
City._fields


Out[42]:
('name', 'country', 'population', 'coordinates')

In [44]:
LatLong = namedtuple('LatLong','lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.808889))
delhi = City._make(delhi_data)
delhi._asdict()


Out[44]:
OrderedDict([('name', 'Delhi NCR'),
             ('country', 'IN'),
             ('population', 21.935),
             ('coordinates', LatLong(lat=28.613889, long=77.808889))])

In [45]:
for key,value in delhi._asdict().items():
    print(key + ':', value)


name: Delhi NCR
country: IN
population: 21.935
coordinates: LatLong(lat=28.613889, long=77.808889)

In [46]:
board = [['_'] * 3 for i in range(3)]
board


Out[46]:
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

In [47]:
board[1][2] = 'X'
board


Out[47]:
[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

In [57]:
board = []
for i in range(3):
    row = ['_'] * 3
    board.append(row)
board


Out[57]:
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

In [58]:
board[1][2] = 'X'
board


Out[58]:
[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

In [59]:
weird_board = [['_'] * 3]  * 3
weird_board


Out[59]:
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

In [60]:
weird_board[1][2] = 'X'
weird_board


Out[60]:
[['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

In [62]:
row = ['_'] * 3
weird_board = []
for i in range(3):
    weird_board.append(row)
weird_board[1][2] = 'X'
weird_board


Out[62]:
[['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

In [63]:
l = [1,2,3]
id(l)


Out[63]:
1668423538888

In [64]:
l *= 2
l


Out[64]:
[1, 2, 3, 1, 2, 3]

In [65]:
id(l)


Out[65]:
1668423538888

In [66]:
t=(1,2,3)
id(t)


Out[66]:
1668424795192

In [67]:
t *= 2
t


Out[67]:
(1, 2, 3, 1, 2, 3)

In [68]:
id(t)


Out[68]:
1668419378152

In [69]:
import dis
dis.dis('s[a] += b')


  1           0 LOAD_NAME                0 (s)
              2 LOAD_NAME                1 (a)
              4 DUP_TOP_TWO
              6 BINARY_SUBSCR
              8 LOAD_NAME                2 (b)
             10 INPLACE_ADD
             12 ROT_THREE
             14 STORE_SUBSCR
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

In [ ]: