From 9d3c30c2db020fdd76a0a563e86927a481e9c5c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kn=C3=BCttel?= Date: Wed, 21 Nov 2018 16:30:46 +0100 Subject: [PATCH] added fifth week --- ex_17.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ex_18.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ ex_19.py | 44 ++++++++++++++++++++++++++++++++++++++++++ ex_20.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 211 insertions(+) create mode 100644 ex_17.py create mode 100644 ex_18.py create mode 100644 ex_19.py create mode 100644 ex_20.py diff --git a/ex_17.py b/ex_17.py new file mode 100644 index 0000000..ed3e0e9 --- /dev/null +++ b/ex_17.py @@ -0,0 +1,59 @@ + + +class Person(object): + def __init__(self, name, age, birthplace): + self.name = name + self.age = age + self.birthplace = birthplace + + def about_myself(self): + print("I am {name}, {age} years old and was born in {birthplace}".format(**self.__dict__)) + +class Student(Person): + def __init__(self, name, age, birthplace, semester, studium): + Person.__init__(self, name, age, birthplace) + self.semester = semester + self.studium = studium + def about_myself(self): + Person.about_myself(self) + print("Also I am a student and I study {studium} in semester {semester}".format(**self.__dict__)) + +class Musician(Person): + def __init__(self, name, age, birthplace, instrument): + Person.__init__(self, name, age, birthplace) + self.instrument = instrument + def about_myself(self): + Person.about_myself(self) + print("Also I am a musician and I play {instrument}".format(**self.__dict__)) + +class FootballPlayer(Person): + def __init__(self, name, age, birthplace, football_team): + Person.__init__(self, name, age, birthplace) + self.football_team = football_team + def about_myself(self): + Person.about_myself(self) + print("Also I am a football player and I play in the {football_team}".format(**self.__dict__)) + +class StudenWhoHappensToPlayFootball(Student, FootballPlayer): + def __init__(self, name, age, birthplace, semester, studium, football_team): + Student.__init__(self, name, age, birthplace, semester, studium,) + FootballPlayer.__init__(self, name, age, birthplace, football_team) + + def about_myself(self): + Student.about_myself(self) + print("Also I am a football player and I play in the {football_team}".format(**self.__dict__)) + + +if( __name__ == "__main__"): + p = Person("Emil", 12, "Dresden") + s = Student("Thomas", 22, "Duggendorf", 3, "Bachelor of Dye") + m = Musician("Gandalf", 3612, "Mittelerde", "Picolo") + f = FootballPlayer("Özil", 30, "Anatolien", "FC BAYERN") + sf = StudenWhoHappensToPlayFootball("Peter", 54, "Pentling", 10, "Philosopy", "FC Hinterdupfingen") + + l = [p, s, m, f, sf] + for i in l: + i.about_myself() + + + diff --git a/ex_18.py b/ex_18.py new file mode 100644 index 0000000..b2455bc --- /dev/null +++ b/ex_18.py @@ -0,0 +1,50 @@ +from cmath import exp + +class PolarComplex(object): + def __init__(self, r, phi): + self._r = r + self._phi = phi + + def __repr__(self): + return "{}({}, {})".format(PolarComplex.__name__, self._r, self._phi) + def __abs__(self): + return abs(self._r) + def __mul__(self, other): + if(isinstance(other, (int, float))): + return PolarComplex(self._r * other, self._phi) + if(isinstance(other, PolarComplex)): + return PolarComplex(self._r * other._r, self._phi + other._phi) + raise TypeError("*: cannot multiply {} and {}".format(type(other), type(self))) + def __truediv__(self, other): + if(isinstance(other, (int, float))): + return PolarComplex(self._r / other, self._phi) + if(isinstance(other, PolarComplex)): + return PolarComplex(self._r / other._r, self._phi - other._phi) + raise TypeError("/: cannot divide {} and {}".format(type(other), type(self))) + + def __str__(self): + return str(self._r * exp(1j * self._phi)) + + def __rmul__(self): + if(isinstance(other, (int, float))): + return PolarComplex(self._r * other, self._phi) + if(isinstance(other, PolarComplex)): + return PolarComplex(self._r * other._r, self._phi + other._phi) + raise TypeError("*: cannot multiply {} and {}".format(type(other), type(self))) + + def __rtruediv__(self, other): + if(isinstance(other, (int, float))): + return PolarComplex(other / self._r, -self._phi) + if(isinstance(other, PolarComplex)): + return PolarComplex(other._r / self._r, other._phi - self._phi) + raise TypeError("/: cannot divide {} and {}".format(type(other), type(self))) + +if( __name__ == "__main__"): + c = PolarComplex(3, 0.3) + print(repr(c)) + print(str(c)) + print(repr(c / 3)) + print(repr(c * 3)) + z = PolarComplex(2, 0.2) + print(repr(c * z)) + print(repr(c / z)) diff --git a/ex_19.py b/ex_19.py new file mode 100644 index 0000000..9684866 --- /dev/null +++ b/ex_19.py @@ -0,0 +1,44 @@ + +class ext_int(int): + def __new__(cls, *args, **kwargs): + return int.__new__(cls, *args, **kwargs) + + def is_prime(self): + if(abs(self) in (1, 0)): + return False + for i in range(2, abs(self)//2 + 1): + if(not self % i): + return False + return True + + def is_positive(self): + return self > 0 + def is_even(self): + return not self % 2 + def is_odd(self): + return not self.is_even() + def get_inverse(self): + return 1 / self + +class shitty_list(list): + def __new__(cls, *args, **kwargs): + return list.__new__(cls, *args, **kwargs) + + def divide(self): + return (self[:len(self)//2], self[len(self)//2:]) + + +if( __name__ == "__main__"): + print(ext_int(3).is_prime()) + print(ext_int(4).is_prime()) + print(ext_int(2).is_positive()) + print(ext_int(-2).is_positive()) + print(ext_int(2).is_even()) + print(ext_int(3).is_even()) + print(ext_int(2).is_odd()) + print(ext_int(3).is_odd()) + print(ext_int(2).get_inverse()) + + print() + print(shitty_list("abcdefg").divide()) + diff --git a/ex_20.py b/ex_20.py new file mode 100644 index 0000000..9f87ca8 --- /dev/null +++ b/ex_20.py @@ -0,0 +1,58 @@ + + +class FibonacciIterator(object): + def __init__(self, max_n): + self._precalculated = {0: 1, 1: 1, 2: 2, 3: 3, 4: 5} + self._biggest = 4 + self._max_n = max_n + self._i = 0 + + def get_biggest_pair(self): + return ((self._biggest - 1, self._precalculated[self._biggest - 1]) + , (self._biggest, self._precalculated[self._biggest])) + def fibonacci_element(self, n): + if(not isinstance(n, int)): + raise TypeError("n must be integer") + if(0 <= n <= self._biggest): + return self._precalculated[n] + + (n_start_minus_one, b), (n_start, a) = self.get_biggest_pair() + + for i in range(n_start, n): + swp = a + a += b + b = swp + self._precalculated[n] = a + + self._biggest = n + return a + + def __contains__(self, n): + if(n > self._max_n): + raise IndexError("{} > max_n({})".format(n, self._max_n)) + return n <= self._biggest + + def __getitem__(self, n): + if(n > self._max_n): + raise IndexError("{} > max_n({})".format(n, self._max_n)) + return self.fibonacci_element(n) + + def __iter__(self): + self._i = -1 + return self + + def __next__(self): + if(self._i > self._max_n): + raise StopIteration() + self._i += 1 + return self.fibonacci_element(self._i) + +if( __name__ == "__main__"): + i = FibonacciIterator(20) + + for j in i: + print(j) + + print(15 in i) + print(i[14]) +