03. Работа с колекции

03. Работа с колекции

03. Работа с колекции

6 март 2013

Искаме да дефинираме клас за умен човек. Как ще го кръстим?

a) smart_person

b) SMART_PERSON

c) smartPerson

d) SmartPerson

Какво прави self?

Само чрез него методите имат достъп до полетата на обекта

Как можем да предефинираме държанието на >?

Като дефинираме метод __gt__(self, other)

Как можем да дефинирираме кастване към int?

Като дефинираме __int__(self)

Какво не можем да направим в тялото на lambda?

I've got 99 problems.

Когато не знаем какво да правим с данните, ги слагаме в колекции.

Какво е колекция?

range

range връща итеруемо

numbers = range(3)
iterator = iter(numbers)

next(iterator) # 0
next(iterator) # 1
next(iterator) # 2
next(iterator) # StopIteration

Заигравка с итеруеми

Итераторите могат да се итерират

numbers = [1, 2, 3]
iter(numbers) is iter(numbers) # False

iterator = iter(numbers)
iter(iterator) is iterator # True

Ако трябва да съм честен, говоря за неделя сутринта

Ако искате опашка (queue, FIFO buffer) можете да ползвате списък?

orders = []

def add_order(items):
    orders.append(items)

def get_order():
    return orders.pop(0)

add_order(('бира', 'шкембе'))
add_order(('цаца', 'картофки'))

print(get_order().join('; ')) # бира, шкембе

Влизат collections

52 пъти в годината

from collections import deque
orders = deque()

def add_order(items):
    orders.append(items)

def get_order():
    return orders.popleft()

add_order(('бира', 'шкембе'))
add_order(('цаца', 'картофки'))

print(get_order().join('; ')) # бира, шкембе

броим лоши думи

bad_words = ['x','y','z']

def count_bad_words(text):
    word_counts = {}
    for word in text.split(' '):
        if word in bad_words:
            if word in word_counts:
                word_counts[word] += 1
            else:
                word_counts[word] = 1

    return word_counts

defauldict

Речник със стойност по подразбиране

from collections import defaultdict
bad_words = ['x','y','z']

def count_bad_words(text):
    word_counts = defaultdict(int)
    for word in text.split(' '):
        word_counts[word] += 1

    return word_counts

Още по-лесно - collections.Counter.

map/filter/reduce

Comprehensions

List comprehension

[израз for променлива in поредица if условие]

>>> [x * x for x in range(0, 10)]
[1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> [x * x for x in range(0, 10) if x % 2]
[1, 9, 25, 49, 81]

List comprehension

Един list comprehension може да се вложи в друг

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Generator expression

Set comprehension

>>> import math
>>> {int(math.sqrt(x)) for x in range(1,100)}
{1, 2, 3, 4, 5, 6, 7, 8, 9}

Dict comprehension

>>> {i : chr(65+i) for i in range(10)}
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J'}

itertools

>>> import itertools
>>> help(itertools)

Въпроси?