diff --git a/.gitignore b/.gitignore index c4234ab74..5bb64fa54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ + node_modules testoutput.txt + +.venv/ +__pycache__/ +*.pyc diff --git a/Spring 5 exercises/checktype.py b/Spring 5 exercises/checktype.py new file mode 100644 index 000000000..26d42da0f --- /dev/null +++ b/Spring 5 exercises/checktype.py @@ -0,0 +1,33 @@ +def open_account(balances, name, amount): + balances[name] = amount + +def sum_balances(accounts): + total = 0 + for name, pence in accounts.items(): + print(f"{name} had balance {pence}") + total += pence + return total + +def format_pence_as_string(total_pence): + if total_pence < 100: + return f"{total_pence}p" + pounds = int(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}") + + # i amended three errors from original code from prep, line 28 function name is format_pence-as_string rather than format_pence_as_str, line 24 ad 25, supposed + # three arguments instead of 2, so i add balances when we call open_account and also call open_account amount should be integer rather than string or decimal \ No newline at end of file diff --git a/Spring 5 exercises/class.py b/Spring 5 exercises/class.py new file mode 100644 index 000000000..ff384ce93 --- /dev/null +++ b/Spring 5 exercises/class.py @@ -0,0 +1,22 @@ +class Person: + def __init__(self, name: str, age: int, preferred_operating_system: str,address:str): + self.name = name + self.age = age + self.preferred_operating_system = preferred_operating_system + self.address=address + +imran = Person("Imran", 22, "Ubuntu", "23 main raod") +print(imran.name) + +eliza = Person("Eliza", 34, "Arch Linux","32 divert way") +print(eliza.name) + +def is_adult(person: Person) -> bool: + return person.age >= 18 + +print(is_adult(imran)) + +def home_address(person :Person): + return person.address + +print(home_address(eliza)) diff --git a/Spring 5 exercises/dataclass.py b/Spring 5 exercises/dataclass.py new file mode 100644 index 000000000..44e265958 --- /dev/null +++ b/Spring 5 exercises/dataclass.py @@ -0,0 +1,28 @@ +from dataclasses import dataclass +from datetime import date + +@dataclass +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 + +imaran= Person("Imaran", date(2011,11,23), "Ubuntun") +imara2= Person("Imaran", date(2011,11,23), "Ubuntun") + +print(imaran) +print(imara2) +print(imaran==imara2) +print(imaran.is_adult()) + + + diff --git a/Spring 5 exercises/generics.py b/Spring 5 exercises/generics.py new file mode 100644 index 000000000..0c5f4be20 --- /dev/null +++ b/Spring 5 exercises/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=5, children=[]) +aisha = Person(name="Aisha", age= 1, children=[]) + +imran = Person(name="Imran",age = 32, 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/Spring 5 exercises/inheritance.py b/Spring 5 exercises/inheritance.py new file mode 100644 index 000000000..9b70e7967 --- /dev/null +++ b/Spring 5 exercises/inheritance.py @@ -0,0 +1,36 @@ +class Parent: + def __init__(self, first_name: str, last_name: str): + self.first_name = first_name + self.last_name = last_name + + def get_full_name(self) -> str: + return f"{self.first_name} {self.last_name}" + + def change_last_name(self, last_name: str) -> None: + self.last_name = 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(person1.get_full_name()) +person1.change_last_name("Tyurina") +print(person1.get_full_name()) + +person2 = Parent("Elizaveta", "Alekseeva") +print(person2.get_full_name()) +person2.change_last_name("Tyurina") +print(person2.get_full_name()) \ No newline at end of file diff --git a/Spring 5 exercises/methods.py b/Spring 5 exercises/methods.py new file mode 100644 index 000000000..e2013be6d --- /dev/null +++ b/Spring 5 exercises/methods.py @@ -0,0 +1,29 @@ + # Think of the advantages of using methods instead of free functions: + # Better organization, More readable code, Easier maintenance,Better editor support (autocomplete),Code reuse across all instances of the class + # Ease of documentation: Related data and behavior are grouped together, making the class easier to understand. + # Encapsulation: The implementation can change without affecting the rest of the program, as long as the method's interface stays the same. + +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): + 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 + +imaran = Person("Imaran",date(2003,1,5), "Ubuntun") +eliza = Person("Eliza",date(2012,11,25), "Ubuntun") + +print(imaran.is_adult()) +print(eliza.is_adult()) \ No newline at end of file diff --git a/Spring 5 exercises/operation.py b/Spring 5 exercises/operation.py new file mode 100644 index 000000000..cbe61103a --- /dev/null +++ b/Spring 5 exercises/operation.py @@ -0,0 +1,89 @@ +from dataclasses import dataclass +from enum import Enum +from typing import List +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), +] + + +# Read name +name = input("Enter your name: ") + +# Read and convert age +try: + age = int(input("Enter your age: ")) +except ValueError: + print("Error: age must be a whole number.", file=sys.stderr) + sys.exit(1) + +# Read and convert operating system +print("Choose an operating system:") +print("- Ubuntu") +print("- Arch Linux") +print("- macOS") + +os_input = input("Preferred operating system: ") + +try: + preferred_os = OperatingSystem(os_input) +except ValueError: + print("Error: invalid operating system.", file=sys.stderr) + sys.exit(1) + +# Create the person +person = Person(name, age, preferred_os) + +# Find matching laptops +matching = [ + laptop + for laptop in laptops + if laptop.operating_system == person.preferred_operating_system +] + +print( + f"\nThe library has {len(matching)} laptop(s) running " + f"{person.preferred_operating_system.value}." +) + +# Count laptops for each operating system +counts = {} + +for laptop in laptops: + os = laptop.operating_system + counts[os] = counts.get(os, 0) + 1 + +best_os = max(counts, key=counts.get) + +if best_os != person.preferred_operating_system: + print( + f"If you're willing to accept {best_os.value}, " + f"there are {counts[best_os]} laptops available." + ) \ No newline at end of file diff --git a/Spring 5 exercises/refactor.py b/Spring 5 exercises/refactor.py new file mode 100644 index 000000000..c3798bb5e --- /dev/null +++ b/Spring 5 exercises/refactor.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass +from typing import List + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_system: str + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: List [str] + + +def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]: + possible_laptops = [] + for laptop in laptops: + if laptop.operating_system == person.preferred_operating_system: + possible_laptops.append(laptop) + return possible_laptops + + +people = [ + Person(name="Imran", age=22, preferred_operating_system="Ubuntu"), + Person(name="Eliza", age=34, preferred_operating_system="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 diff --git a/Spring 5 exercises/type_exaple.py b/Spring 5 exercises/type_exaple.py new file mode 100644 index 000000000..c166df9ab --- /dev/null +++ b/Spring 5 exercises/type_exaple.py @@ -0,0 +1,17 @@ +def double(number): + return number * 3 + +print(double(10)) + +# Because double conflicts with multipying 3 so we can change function name to 'triple' or '*2' + +def triple(number): + return number * 3 + +print(triple(10)) + + +def double(number): + return number * 2 + +print(double(10))