14. Преговор
Типове
- int
- str
- bool
- float
- none
- object
- callable
- type(something)
Списъци (list)
>>> x = [1, 2, 3] >>> x.append(5) [1, 2, 3, 5] >>> del x[2] >>> len(x) >>> 2 in x # True
Речници (dict)
>>> x = {'a': 10, 'b': 20} >>> x['c'] = 40 >>> 'c' in x # True >>> 40 in x # False >>> del x['c'] >>> x.update({'z': 1000, 'b': 21}) >>> x {'a': 10, 'b': 21, 'c': 40, 'z': 1000}
Сетове (set)
>>> x = {1, 5, 'Hello', False} >>> x.add(4) >>> x.add(5) >>> x.remove('Hello') >>> x {1, 5, False, 4}
Tuples
>>> x = (1,2,3) >>> x[1] 2
и толкоз - не могат да се променят
Mutable vs immutable
- Immutable са стойностите, които не могат да бъдат променяни.
а = 5 а += 2 # 7
Този код не променя стойноста на 5, а кара а да сочи към друга стойност (7). Числата са immutable.
а = [1,2,3] a.append(4)
Този код променя списъка, към който сочи a. Списъците са mutable.
- Immutable са числа, низове, tuples, True, False, None, дата/час (datetime), класове и функции.
- Всичко останало е mutable.
- Като ключ на dict или елемент на set могат да се ползват само immutable стойности.
Контролни структури
if a > 5: # do something elif a > 2: # do other else: # do third thing for e in my_list: print(e) for i in range(0, 100): print(i ** i) while a > 5: a -= 1 print("a is now " + a)
Функции
def my_func(a, b, *args, **kwargs): print(type(args)) # list print(type(kwargs)) # dict my_func(*[1,2,3])
Анонимни фуннкции
>>> operation = lambda x, y: x * y >>> print(operation(6, 7)) 42
map и filter
>>> list(map(lambda x: x ** 2, range(1, 10))) [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> list(filter(lambda x: x % 2, range(1, 10))) [1, 3, 5, 7, 9]
list comprehensions
[израз for променлива in поредица if условие]
>>> [x * x for x in range(0, 10) if x % 2] [1, 9, 25, 49, 81]
>>> nums = range(0, 10) >>> [(x, y) for x in nums for y in nums if (x + y) == 13] [(4, 9), (5, 8), (6, 7), (7, 6), (8, 5), (9, 4)]
set и dict comprehensions
>>> {x % 8 for x in range(0, 20) if (x % 2) == 0} {0, 2, 4, 6} >>> {x: x**2 for x in range(0, 5)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Unit testing
class MyUnitTest(unittest.TestCase): def test_first_feature(self): # създаваме среда за теста self.assertTrue(нещо) self.assertEqual(едно, друго) self.failIf(нещо, което трябва да е False) def test_second_feature(self): ... if __name__ == "__main__": unittest.main()
Видове тестове
- Unit tests - проверяват дали дадено парче код/клас работи правилно в изолация
- Integration tests - проверяват дали няколко модула си общуват правилно
- Functional tests - проверяват дали крайната функционалност е както се очаква
Test-Driven Developmnt
- Първо пишем тест, после код, който да удовлетвори теста
- Подход за писане на код
- Дизайна е базиран върху обратна връзка, не гадаене
- Спестява излишен код -- пишете само каквото ви трябва
- Спестява излишна функционалност
- Продуктивност!
Изключения
Всички класове на изключения наследяват Exception и се казват НещоError
def myfunc(): raise DairyException("OUT OF CHEESE ERROR.") try: myfunc() catch DairyException e: print("Seomthing went wrong: " + e) finally: print("Program finished")
Генератори (yield)
Функция, която се държи като итератор
def primes(): number = 2 while True: if all([number % divisor for divisor in range(2, number)]): yield number number += 1
Итератори
iterator = iter([1,2,3]) while True: try: x = next(iterator) print(x) catch StopIteration: break
Класове
class Accumulator(SomeBaseClass): def __init__(self, value): self.value = value def get_value(self): return self.value def increment(self, a = 1): self.value += a
Статични методи
class Person: people = [] @staticmethod def register(name): Person.people.append(name) print(len(Person.people), "people are registered now") >>> Person.register("Mityo the Python") 1 people are registered now >>> Person.register("Pooh") 2 people are registered now
Класови методи
class Something: @classmethod def greet(cls, someone): print(someone, "was greeted from", cls) >>> Something.greet("Mityo") Mityo was greeted from <class '__main__.Something'>
Специални методи
- __repr__(self)
- __str__(self)
- __doc__
- __dir__(self)
Специални методи
- __getattribute__(self, name)
- __getattr__(self, name)
- __setattr__(self, name, value)
- __delattr__(self, name)
- __dir__(self)
Декоратори
def memoize(func): memory = {} def memoized(*args): if args in memory: return memory[args] result = func(*args) memory[args] = result return result return memoized
Декоратори в действие
@memoized def fibonacci(x): if x in [0,1]: return 1 return fibonacci(x-1) + fibonacci(x-2)
Декоратори с аргументи
def accepts(*types): def accepter(f): def decorated(*args): for (i, (arg, t)) in enumerate(zip(args, types)): if not isinstance(arg, t): raise TypeError("""Argument #{0} of '{1}' should \ have been of type {2}".format(i, f.__name__, t.__name__)) return f(*args) return decorated
Още въпроси?
- Пишете ни на fmi@py-bg.net
- Страница на курса: http://fmi.py-bg.net/
- Форуми на курса: http://fmi.py-bg.net/topics
- Курсът в Twitter: http://twitter.com/pyfmi
- Курсът във Facebook: http://www.facebook.com/group.php?gid=104970619536589