14. Преговор

Типове

Списъци (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

         а = 5
         а += 2 # 7
    

Този код не променя стойноста на 5, а кара а да сочи към друга стойност (7). Числата са immutable.

         а = [1,2,3]
         a.append(4)
    

Този код променя списъка, към който сочи a. Списъците са mutable.

Контролни структури

         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()
    

Видове тестове

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'>
    

Специални методи

Специални методи

Декоратори

         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
    
h2 |

Още въпроси?