#list examples
l = [123, "Hello", 3.14]
len(l)
l[0]
l[1]
l[2]
l[:-1]
help(l)
l + [3, 4, 5]
l
l.append("World")
l
l.pop(3)
values = [3, 1, 4, 1, 5]
values.sort()
values
values.reverse()
values
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
m[2]
m[2][0]

#list comprehensions
col2 = [row[1] for row in m]
col2
col2plus1 = [row[1] + 1 for row in m]
col2plus1
mPlus1 = [[col + 1 for col in row] for row in m]
mPlus1
mDiag = [m[i][i] for i in range(len(m))]
mDiag
mTrans = [[m[c][r] for c in range(len(m))] for r in range(len(m[0]))]
mTrans

#iterator (generator) examples
g = (m[i][i] for i in range(len(m)))
next(g)
next(g)
g = iter(range(2, 4))
next(g)
next(g)

#map over list
sum([1, 2, 3])
sums = [sum(row) for row in m]
sums
map(sum, m)
list(map(sum, m))

#sets
{m[i][j] for j in range(len(m[i])) for i in range(len(m))}
evens = {i for i in range(0, 10) if i % 2 == 0}
{m[i][j] for j in range(len(m[i])) for i in range(len(m)) if m[i][j] % 2 == 0}
{ch for ch in "testing 1 2 3"}
{ord(ch) for ch in "testing 1 2 3"}

#dictionaries
d = {ch : ord(ch) for ch in "testing 1 2 3"}
for key in sorted(d):
    print(key, "=>", d[key])
d = {}
d['num'] = 42
d['list'] = [1, 2, 3]
d['dict'] = {'a':1, 'b':2, 'c':3}
d
d['num'] += 100
d['list'].append(4)
d['dict']['d'] = 4
if not 'foo' in d:
    print('bar')
print(d.get('foo', 'barnone'))
print(d.get('foo') if 'foo' in d else 'barnone')
#tuple - like list that is immutable
t = (3, 1, 4)
help(t)

#files
f = open('test.txt', 'w')
f.write('testing ...\n')
for i in range(1, 4):
    f.write('{0}\n'.format(i))
f.close()
f = open('test.txt', 'r')
words = [word for line in f.readlines() for word in line.split()]

#functions
def plusOne(n):
    return n + 1

list(map(plusOne, [0, 2, 4]))

#objects
class BankAccount:
    def __init__(self, name='none', amount=0):
        self.name = name
        self.amount = amount

    def deposit(self, amount):
        self.amount += amount

    def withdraw(self, amount):
        self.amount -= amount

    def __str__(self):
        return "BankAccount[name={0},amount={1}]".format(self.name, self.amount)

ba = BankAccount('Ann', 1000000)
print(ba)
ba.deposit(1)
print(ba)
ba.withdraw(1000000)
print(ba)

