diff --git a/sprint5/Exercise1.py b/sprint5/Exercise1.py new file mode 100644 index 000000000..898aab966 --- /dev/null +++ b/sprint5/Exercise1.py @@ -0,0 +1,28 @@ +def open_account(balances: dict[str,int], name: str, amount: int) -> None: + balances[name] = amount + +def sum_balances(accounts: dict[str, int]) -> int: + for name, pence in accounts.items(): + print(f"{name} had balance {pence}") + return sum(accounts.values()) + +def format_pence_as_string(total_pence: int) -> str: + if total_pence < 100: + return f"{total_pence}p" + pounds = total_pence // 100 + pence = total_pence % 100 + return f"£{pounds}.{pence:02d}" + +balances = { + "Sima": 700, + "Linn": 545, + "Georg": 831, +} + +open_account(balances, "Tobi", 913) +open_account(balances, "Olya", 713) + +total_pence = sum_balances(balances) +total_string = format_pence_as_string(total_pence) + +print(f"The bank accounts total {total_string}") \ No newline at end of file diff --git a/sprint5/Exercise2.py b/sprint5/Exercise2.py new file mode 100644 index 000000000..71e2f8a2e --- /dev/null +++ b/sprint5/Exercise2.py @@ -0,0 +1,22 @@ +class Person: + def __init__(self, name: str, age: int, preferred_operating_system: str): + self.name = name + self.age = age + self.preferred_operating_system = preferred_operating_system + +imran = Person("Imran", 22, "Ubuntu") +print(imran.name) +print(imran.age) +print(imran.preferred_operating_system) + + +eliza = Person("Eliza", 34, "Arch Linux") +print(eliza.name) + +def is_adult(person: Person) -> bool: + return person.age >= 18 + +print(is_adult(imran)) + + def get_address(person: Person) -> str: #this returns an error + return person.address diff --git a/sprint5/Inheritance.py b/sprint5/Inheritance.py new file mode 100644 index 000000000..c80f5448f --- /dev/null +++ b/sprint5/Inheritance.py @@ -0,0 +1,38 @@ +class Parent: + def __init__(self, first_name: str, last_name: str): + self.first_name = first_name + self.last_name = last_name + + def get_name(self) -> str: + return f"{self.first_name} {self.last_name}" + + +class Child(Parent): + def __init__(self, first_name: str, last_name: str): + super().__init__(first_name, last_name) + self.previous_last_names = [] + + def change_last_name(self, last_name) -> None: + self.previous_last_names.append(self.last_name) + self.last_name = last_name + + def get_full_name(self) -> str: + suffix = "" + if len(self.previous_last_names) > 0: + suffix = f" (née {self.previous_last_names[0]})" + return f"{self.first_name} {self.last_name}{suffix}" + +person1 = Child("Elizaveta", "Alekseeva") +print("1",person1.get_name()) # It should print "Elizaveta Alekseeva" +print("2",person1.get_full_name()) # It should print "Elizaveta Alekseeva" +person1.change_last_name("Tyurina") # Changes the last name to "Tyurina" +print("3",person1.get_name())# It should print "Elizaveta Alekseeva" # I was wrong here because the child's last_name has been changed to "Tyurina". +print("4",person1.get_full_name())# I thought it would print "Elizaveta Alekseeva (née Tyurina)" +# I was wrong here again because I misunderstood how last_name and previous_last_names work. + +person2 = Parent("Elizaveta", "Alekseeva") +print("5",person2.get_name()) # It should print "Elizaveta Alekseeva" +print("6",person2.get_full_name()) # Returns an error because Parent doesn't have a get_full_name() method. +person2.change_last_name("Tyurina") # Returns an error because Parent doesn't have a change_last_name() method. +print("7",person2.get_name()) # It should print "Elizaveta Alekseeva" +print(person2.get_full_name()) # returns an error again because Parent doesn't have a get_full_name() method. \ No newline at end of file diff --git a/sprint5/Methods.py b/sprint5/Methods.py new file mode 100644 index 000000000..32bf47c14 --- /dev/null +++ b/sprint5/Methods.py @@ -0,0 +1,29 @@ +from datetime import date + + +class Person: + def __init__(self, name: str, date_of_birth: date, preferred_operating_system: str): + self.name = name + self.date_of_birth = date_of_birth + self.preferred_operating_system = preferred_operating_system + + def is_adult(self) -> bool: + today = date.today() + + age = today.year - self.date_of_birth.year + + if (today.month, today.day) < ( + self.date_of_birth.month, + self.date_of_birth.day + ): + age -= 1 + + return age >= 18 + +imran = Person( + "Imran", + date(2000, 5, 10), + "Ubuntu" +) + +print(imran.is_adult()) \ No newline at end of file diff --git a/sprint5/dataclasses-example.py b/sprint5/dataclasses-example.py new file mode 100644 index 000000000..a1f77f7dd --- /dev/null +++ b/sprint5/dataclasses-example.py @@ -0,0 +1,32 @@ +from dataclasses import dataclass +from datetime import date + + +@dataclass(frozen=True) +class Person: + name: str + date_of_birth: date + preferred_operating_system: str + + def is_adult(self) -> bool: + today = date.today() + + age = today.year - self.date_of_birth.year + + if (today.month, today.day) < ( + self.date_of_birth.month, + self.date_of_birth.day, + ): + age -= 1 + + return age >= 18 + + +imran = Person( + "Imran", + date(2000, 5, 10), + "Ubuntu" +) + +print(imran) +print(imran.is_adult()) \ No newline at end of file diff --git a/sprint5/enums.py b/sprint5/enums.py new file mode 100644 index 000000000..9e8259c1d --- /dev/null +++ b/sprint5/enums.py @@ -0,0 +1,84 @@ +from dataclasses import dataclass +from enum import Enum +import sys + + +class OperatingSystem(Enum): + MACOS = "macOS" + ARCH = "Arch Linux" + UBUNTU = "Ubuntu" + + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_system: OperatingSystem + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: OperatingSystem + + + +laptops = [ + Laptop(1, "Dell", "XPS", 13, OperatingSystem.ARCH), + Laptop(2, "Dell", "XPS", 15, OperatingSystem.UBUNTU), + Laptop(3, "Dell", "XPS", 15, OperatingSystem.UBUNTU), + Laptop(4, "Apple", "MacBook", 13, OperatingSystem.MACOS), +] + + +name = input("What is your name? ") + +try: + age = int(input("What is your age? ")) +except ValueError: + print("Age must be a number.", file=sys.stderr) + sys.exit(1) + + +try: + operating_system = input("What operating system do you prefer? ") + preferred_operating_system = OperatingSystem(operating_system) +except ValueError: + print("That is not a valid operating system.", file=sys.stderr) + sys.exit(1) + + +person = Person( + name, + age, + preferred_operating_system +) + +number_of_laptops = 0 + +for laptop in laptops: + if laptop.operating_system == person.preferred_operating_system: + number_of_laptops += 1 + + +print( + f"There are {number_of_laptops} " + f"{person.preferred_operating_system.value} laptops available." +) + +for operating_system in OperatingSystem: + number_available = 0 + + for laptop in laptops: + if laptop.operating_system == operating_system: + number_available += 1 + + if number_available > number_of_laptops: + print( + f"You are more likely to get a laptop if you " + f"are willing to use {operating_system.value}." + ) + diff --git a/sprint5/generics.py b/sprint5/generics.py new file mode 100644 index 000000000..e660ec7c7 --- /dev/null +++ b/sprint5/generics.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass +from typing import List + +@dataclass(frozen=True) +class Person: + name: str + age: int + children: List["Person"] + +fatma = Person(name="Fatma", age=10, children=[]) +aisha = Person(name="Aisha", age=5 ,children=[]) + +imran = Person(name="Imran", age=40, children=[fatma, aisha]) + +def print_family_tree(person: Person) -> None: + print(person.name) + for child in person.children: + print(f"- {child.name} ({child.age})") + +print_family_tree(imran) \ No newline at end of file diff --git a/sprint5/type-guided-refactorings.py b/sprint5/type-guided-refactorings.py new file mode 100644 index 000000000..784ad68f4 --- /dev/null +++ b/sprint5/type-guided-refactorings.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass +from typing import List + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_systems: List[str] + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: str + + +def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]: + possible_laptops = [] + for laptop in laptops: + if laptop.operating_system in person.preferred_operating_systems: + possible_laptops.append(laptop) + return possible_laptops + + +people = [ + Person(name="Imran", age=22, preferred_operating_systems=["Ubuntu", "Arch Linux"]), + Person(name="Eliza", age=34, preferred_operating_systems=["Arch Linux"]), +] + +laptops = [ + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system="Arch Linux"), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system="Ubuntu"), + Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system="ubuntu"), + Laptop(id=4, manufacturer="Apple", model="macBook", screen_size_in_inches=13, operating_system="macOS"), +] + +for person in people: + possible_laptops = find_possible_laptops(laptops, person) + print(f"Possible laptops for {person.name}: {possible_laptops}") \ No newline at end of file