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