61A Lecture 22 Announcements Linked Lists Recursive Lists Can - - PowerPoint PPT Presentation

61a lecture 22 announcements linked lists recursive lists
SMART_READER_LITE
LIVE PREVIEW

61A Lecture 22 Announcements Linked Lists Recursive Lists Can - - PowerPoint PPT Presentation

61A Lecture 22 Announcements Linked Lists Recursive Lists Can Change Attribute assignment statements can change first and rest attributes of a Link 4 Recursive Lists Can Change Attribute assignment statements can change first and rest


slide-1
SLIDE 1

61A Lecture 22

slide-2
SLIDE 2

Announcements

slide-3
SLIDE 3

Linked Lists

slide-4
SLIDE 4

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

slide-5
SLIDE 5

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list

slide-6
SLIDE 6

>>> s = Link(1, Link(2, Link(3)))

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list

slide-7
SLIDE 7

>>> s = Link(1, Link(2, Link(3)))

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list

Rest First

1

s Rest First

2

Global frame Rest First

3

slide-8
SLIDE 8

>>> s = Link(1, Link(2, Link(3)))

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

Rest First

1

s Rest First

2

Global frame Rest First

3

slide-9
SLIDE 9

>>> s = Link(1, Link(2, Link(3)))

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-10
SLIDE 10

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-11
SLIDE 11

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-12
SLIDE 12

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-13
SLIDE 13

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s >>> s.first

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-14
SLIDE 14

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s >>> s.first 5

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-15
SLIDE 15

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s >>> s.first 5 >>> s.rest.rest.rest.rest.rest.first

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-16
SLIDE 16

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s >>> s.first 5 >>> s.rest.rest.rest.rest.rest.first 2

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-17
SLIDE 17

>>> s = Link(1, Link(2, Link(3))) >>> s.first = 5 >>> t = s.rest >>> t.rest = s >>> s.first 5 >>> s.rest.rest.rest.rest.rest.first 2

Recursive Lists Can Change

Attribute assignment statements can change first and rest attributes of a Link

4

Rest First

5

s Rest First

2

t Global frame

The rest of a linked list can contain the linked list as a sub-list Note: The actual environment diagram is much more complicated.

slide-18
SLIDE 18

Environment Diagrams

slide-19
SLIDE 19

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] Return Value Return Value Return Value

slide-20
SLIDE 20

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski Return Value Return Value Return Value [parent=G]

slide-21
SLIDE 21

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value [parent=G]

slide-22
SLIDE 22

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value [parent=G]

slide-23
SLIDE 23

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] [parent=G]

slide-24
SLIDE 24

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] [parent=G]

slide-25
SLIDE 25

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal [parent=G]

slide-26
SLIDE 26

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal [parent=f1] [parent=G]

slide-27
SLIDE 27

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal [parent=f1] berk 2 [parent=G]

slide-28
SLIDE 28

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-29
SLIDE 29

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-30
SLIDE 30

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-31
SLIDE 31

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-32
SLIDE 32

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-33
SLIDE 33

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-34
SLIDE 34

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-35
SLIDE 35

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-36
SLIDE 36

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-37
SLIDE 37

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 [parent=G]

slide-38
SLIDE 38

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=G]

slide-39
SLIDE 39

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] [parent=G]

slide-40
SLIDE 40

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk [parent=G]

slide-41
SLIDE 41

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk [parent=G]

slide-42
SLIDE 42

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk [parent=G]

slide-43
SLIDE 43

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk f4: λ [parent=G]

slide-44
SLIDE 44

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk f4: λ [parent=f2] [parent=G]

slide-45
SLIDE 45

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk f4: λ [parent=f2] ley 2 [parent=G]

slide-46
SLIDE 46

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk f4: λ [parent=f2] ley 2 [parent=G]

slide-47
SLIDE 47

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk f4: λ [parent=f2] ley 2 [parent=G]

slide-48
SLIDE 48

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] ley 2 [parent=G]

slide-49
SLIDE 49

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] list 1

2

ley 2 [parent=G]

slide-50
SLIDE 50

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] list 1

2

ley 2 [parent=G]

slide-51
SLIDE 51

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] list 1

2

ley 2 [parent=G]

slide-52
SLIDE 52

Go Bears!

6

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] list 1

2

ley 2 [parent=G]

[2, [3, 1]]

slide-53
SLIDE 53

Objects

slide-54
SLIDE 54

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

slide-55
SLIDE 55

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker:

slide-56
SLIDE 56

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir'

slide-57
SLIDE 57

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker

slide-58
SLIDE 58

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work'

slide-59
SLIDE 59

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting

slide-60
SLIDE 60

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker):

slide-61
SLIDE 61

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon'

slide-62
SLIDE 62

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth'

slide-63
SLIDE 63

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam'

slide-64
SLIDE 64

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john)

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam'

slide-65
SLIDE 65

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john)

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' <class Worker> greeting: 'Sir'

slide-66
SLIDE 66

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john)

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon'

slide-67
SLIDE 67

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon'

slide-68
SLIDE 68

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' elf: john <Bourgeoisie>

slide-69
SLIDE 69

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-70
SLIDE 70

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-71
SLIDE 71

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-72
SLIDE 72

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-73
SLIDE 73

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-74
SLIDE 74

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-75
SLIDE 75

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() 'Maam, I work' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-76
SLIDE 76

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() 'Maam, I work' >>> john.work() <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-77
SLIDE 77

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() 'Maam, I work' >>> john.work() Peon, I work 'I gather wealth' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-78
SLIDE 78

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() 'Maam, I work' >>> john.work() Peon, I work 'I gather wealth' >>> john.elf.work(john) <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-79
SLIDE 79

>>> Worker().work() >>> jack >>> jack.work() >>> john.work() >>> john.elf.work(john) jack <Worker> elf:

Land Owners

Instance attributes are found before class attributes; class attributes are inherited

8

class Worker: greeting = 'Sir' def __init__(self): self.elf = Worker def work(self): return self.greeting + ', I work' def __repr__(self): return Bourgeoisie.greeting class Bourgeoisie(Worker): greeting = 'Peon' def work(self): print(Worker.work(self)) return 'I gather wealth' jack = Worker() john = Bourgeoisie() jack.greeting = 'Maam' >>> Worker().work() 'Sir, I work' >>> jack Peon >>> jack.work() 'Maam, I work' >>> john.work() Peon, I work 'I gather wealth' >>> john.elf.work(john) 'Peon, I work' <class Worker> greeting: 'Sir' <class Bourgeoisie> greeting: 'Peon' greeting: 'Maam' elf: john <Bourgeoisie>

slide-80
SLIDE 80

Trees

slide-81
SLIDE 81

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

slide-82
SLIDE 82

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ...

slide-83
SLIDE 83

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly

slide-84
SLIDE 84

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

slide-85
SLIDE 85

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

slide-86
SLIDE 86

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): ....

slide-87
SLIDE 87

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): ....

slide-88
SLIDE 88

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... decode('.', t)

slide-89
SLIDE 89

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... decode('.', t)

slide-90
SLIDE 90

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? decode('.', t)

slide-91
SLIDE 91

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' decode('.', t)

slide-92
SLIDE 92

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' decode('.', t)

slide-93
SLIDE 93

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' decode('.', t)

slide-94
SLIDE 94

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e' decode('.', t)

slide-95
SLIDE 95

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e'

slide-96
SLIDE 96

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e' '-'

slide-97
SLIDE 97

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e' '-' 'a'

slide-98
SLIDE 98

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e' '-' 'a' '-' ...

slide-99
SLIDE 99

Morse Code

Morse code is a signaling protocol that transmits messages by sequences of signals

10

A: B: C: D: E: ... Problem: Implement morse so that decode works correctly abcde = {'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.'}

def decode(signals, tree): """Decode signals into a letter. >>> t = morse(abcde) >>> [decode(s, t) for s in ['-..', '.', '-.-.', '.-', '-..', '.']] ['d', 'e', 'c', 'a', 'd', 'e'] """ for signal in signals: tree = [b for b in tree.branches if b.root == signal][0] leaves = [b for b in tree.branches if b.is_leaf()] assert len(leaves) == 1 return leaves[0].root

def morse(code): .... ? '.' 'e' '-' 'a' '-' ... (Demo)