├── .idea ├── .gitignore ├── beginner_python_projects.iml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── main.py ├── projects ├── 001_income_calculator │ └── main.py ├── 002_expense_splitter │ └── main.py ├── 003_word_frequency │ └── main.py ├── 004_tkinter_notepad │ └── main.py ├── 005_website_status │ └── main.py ├── 006_currency_converter │ ├── main.py │ └── rates.json ├── 007_password_generator │ └── main.py ├── 008_text_analyser │ ├── main.py │ └── note.txt ├── 009_morse_code_converter │ └── main.py └── 010_chat_bot │ └── main.py └── readme.md /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/beginner_python_projects.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import this 2 | -------------------------------------------------------------------------------- /projects/001_income_calculator/main.py: -------------------------------------------------------------------------------- 1 | # 1. Create a function to calculate finances 2 | def calculate_finances(monthly_income: float, tax_rate: float, currency: str) -> None: 3 | # 2. Do the math for each field 4 | yearly_salary: float = monthly_income * 12 5 | monthly_tax: float = monthly_income * (tax_rate / 100) 6 | yearly_tax: float = monthly_tax * 12 7 | monthly_net_income: float = monthly_income - monthly_tax 8 | yearly_net_income: float = yearly_salary - yearly_tax 9 | 10 | # 3. Format the information nicely for the user 11 | print('--------------------------------') 12 | print(f'Monthly income: {currency}{monthly_income:,.2f}') 13 | print(f'Tax rate: {tax_rate:,.0f}%') 14 | print(f'Monthly tax: {currency}{monthly_tax:,.2f}') 15 | print(f'Monthly net income: {currency}{monthly_net_income:,.2f}') 16 | print(f'Yearly salary: {currency}{yearly_salary:,.2f}') 17 | print(f'Yearly tax paid: {currency}{yearly_tax:,.2f}') 18 | print(f'Yearly net income: {currency}{yearly_net_income:,.2f}') 19 | print('--------------------------------') 20 | 21 | 22 | # 4. Create a main entry point for the program 23 | def main() -> None: 24 | # 5. Gather user input 25 | monthly_income: float = float(input('Enter your monthly income: ')) 26 | tax_rate: float = float(input('Enter your tax rate (%): ')) 27 | 28 | # 6. Call the function 29 | calculate_finances(monthly_income, tax_rate, currency='KR') 30 | 31 | 32 | # 7. Run the script 33 | if __name__ == "__main__": 34 | main() 35 | 36 | """ 37 | Homework: 38 | 1. Edit the script so that users can also enter their expenses (eg. rent, food, gym memberships) so they 39 | can see how much they have left over each month. 40 | 2. Recreate the user input section to safely handle users inserting the wrong type without 41 | crashing the program. 42 | 43 | """ 44 | -------------------------------------------------------------------------------- /projects/002_expense_splitter/main.py: -------------------------------------------------------------------------------- 1 | 2 | # 1. Create the function 3 | def calculate_split(total_amount: float, number_of_people: int, currency: str) -> None: 4 | # 2. Validate the amount of people 5 | if number_of_people < 1: 6 | raise ValueError('Number of people must be greater than one.') 7 | 8 | # 3. Perform the calculation 9 | share_per_person: float = total_amount / number_of_people 10 | 11 | # 4. Format the results and display them 12 | print(f'Total expense: {currency}{total_amount:,.2f}') 13 | print(f'Number of people: {number_of_people}') 14 | print(f'Each person should pay: {currency}{share_per_person:,.2f}') 15 | 16 | 17 | # 5. Create a main entry point 18 | def main() -> None: 19 | # 6. Try to get the user input and perform the calculation 20 | try: 21 | total_amount: float = float(input('Enter the total amount of the expense: ')) 22 | number_of_people: int = int(input('Enter the number of people sharing the expense: ')) 23 | 24 | # Call the function to calculate and display expenses 25 | calculate_split(total_amount, number_of_people, currency='€') 26 | 27 | except ValueError as e: 28 | print(f'Error: {e}') 29 | 30 | 31 | # 7. Run the script 32 | if __name__ == '__main__': 33 | main() 34 | 35 | 36 | """ 37 | Homework: 38 | 1. Edit the script to give the user the option to enter uneven splits, such as 20%, 40%, 40%. 39 | 2. Make it so that if the user encounters an error, the program nicely asks them to try again with 40 | a proper value. 41 | 42 | """ -------------------------------------------------------------------------------- /projects/003_word_frequency/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import the necessary functionality 2 | from collections import Counter 3 | import re 4 | 5 | 6 | # 2. Create a function for getting the word frequency in text 7 | def get_frequency(text: str) -> list[tuple[str, int]]: 8 | # 3. Convert text to lowercase to ensure case-insensitivity 9 | lowered_text: str = text.lower() 10 | 11 | # 4. Use regular expression to find all words (alphanumeric and underscore) 12 | words: list[str] = re.findall(r'\b\w+\b', lowered_text) 13 | 14 | # 5. Count word frequencies using Counter 15 | word_counts: Counter = Counter(words) 16 | 17 | # 6. Return the most common words as a tuple 18 | return word_counts.most_common() 19 | 20 | 21 | # 7. Create a main entry point 22 | def main() -> None: 23 | # 8. Get that user input 24 | text: str = input('Enter your text: ') 25 | word_frequencies: list[tuple[str, int]] = get_frequency(text) 26 | 27 | # 9. Display the results 28 | for word, count in word_frequencies: 29 | print(f'{word}: {count}') 30 | 31 | 32 | # 10. Run the script 33 | if __name__ == "__main__": 34 | main() 35 | 36 | """ 37 | Homework: 38 | 1. Create a function that allows the user to read a file directly (such as a txt) 39 | so the user doesn't have to copy and paste text. 40 | 41 | """ 42 | -------------------------------------------------------------------------------- /projects/004_tkinter_notepad/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import necessary functionality 2 | import tkinter as tk 3 | from tkinter import filedialog 4 | from tkinter import Tk, Text, Frame, Button 5 | 6 | 7 | # 2. Create a class 8 | class SimpleNotepad: 9 | # 3. Initialize the class with all the UI 10 | def __init__(self, root: Tk) -> None: 11 | self.root = root 12 | self.root.title('Bob\'s Notepad') 13 | 14 | # Create a text widget for entering the content 15 | self.text_area: Text = Text(self.root, wrap='word') 16 | self.text_area.pack(expand=True, fill='both') 17 | 18 | # Create a frame to hold the buttons 19 | self.button_frame: Frame = Frame(self.root) 20 | self.button_frame.pack() 21 | 22 | # Create and pack the save button 23 | self.save_button: Button = Button(self.button_frame, text='Save', command=self.save_file) 24 | self.save_button.pack(side=tk.LEFT) 25 | 26 | # Create and pack the load button 27 | self.load_button: Button = Button(self.button_frame, text='Load', command=self.load_file) 28 | self.load_button.pack(side=tk.LEFT) 29 | 30 | # 4. Create a function that saves files 31 | def save_file(self) -> None: 32 | file_path: str = filedialog.asksaveasfilename(defaultextension='.txt', 33 | filetypes=[('Text files', '*.txt')]) 34 | # 4.5 Save the file 35 | with open(file_path, 'w') as file: 36 | file.write(self.text_area.get(1.0, tk.END)) 37 | 38 | print(f'File saved to: {file_path}') 39 | 40 | # 5. Create a function that loads files 41 | def load_file(self) -> None: 42 | file_path: str = filedialog.askopenfilename(defaultextension='.txt', 43 | filetypes=[('Text files', '*.txt')]) 44 | # 5.5 Load the file 45 | with open(file_path, 'r') as file: 46 | content: str = file.read() 47 | self.text_area.delete(1.0, tk.END) # Clear existing content 48 | self.text_area.insert(tk.INSERT, content) # Insert new content 49 | 50 | print(f'File loaded from: {file_path}') 51 | 52 | # 6. Create a function that runs the program 53 | def run(self) -> None: 54 | self.root.mainloop() 55 | 56 | 57 | # 7. Create the main entry point 58 | def main() -> None: 59 | root: Tk = tk.Tk() 60 | app: SimpleNotepad = SimpleNotepad(root=root) 61 | app.run() 62 | 63 | 64 | # 8. Run the script 65 | if __name__ == '__main__': 66 | main() 67 | 68 | 69 | """ 70 | Homework: 71 | 1. Make it so that the save button saves the text to the current file if it already exists, instead 72 | of asking the user to create a new file each time. 73 | 74 | """ 75 | -------------------------------------------------------------------------------- /projects/005_website_status/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import necessary functionality 2 | import requests 3 | from requests import Response, RequestException 4 | from requests.structures import CaseInsensitiveDict 5 | 6 | 7 | # 2. Create a function that checks the status of any URL 8 | def check_status(url: str) -> None: 9 | try: 10 | response: Response = requests.get(url) 11 | 12 | # 3. Extract information from the response 13 | status_code: int = response.status_code 14 | headers: CaseInsensitiveDict[str] = response.headers 15 | content_type: str = headers.get('Content-Type', 'Unknown') 16 | server: str = headers.get('Server', 'Unknown') 17 | response_time: float = response.elapsed.total_seconds() 18 | 19 | # 4. Display the information regarding the URL 20 | print(f'URL: {url}') 21 | print(f'Status Code: {status_code}') 22 | print(f'Content Type: {content_type}') 23 | print(f'Server: {server}') 24 | print(f'Response Time: {response_time:.2f} seconds') 25 | except RequestException as e: 26 | print(f'ERROR: {e}') 27 | 28 | 29 | # 5. Create a main entry point 30 | def main() -> None: 31 | url_to_check: str = 'https://www.indently.io' 32 | check_status(url_to_check) 33 | 34 | 35 | # 6. Run the script 36 | if __name__ == '__main__': 37 | main() 38 | -------------------------------------------------------------------------------- /projects/006_currency_converter/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import necessary functionality 2 | import json 3 | 4 | 5 | # 2. Load the rates from a JSON file 6 | def load_rates(json_file: str) -> dict[str, dict]: 7 | with open(json_file, 'r') as file: 8 | return json.load(file) 9 | 10 | 11 | # 3. Create the function 12 | def convert(amount: float, base: str, to: str, rates: dict[str, dict]) -> float: 13 | # 4. Make sure the user input is lowered 14 | base = base.lower() 15 | to = to.lower() 16 | 17 | # 5. Get the dictionaries 18 | from_rates: dict | None = rates.get(base) 19 | to_rates: dict | None = rates.get(to) 20 | 21 | # 6. Return the rates 22 | if base == 'eur': 23 | return amount * to_rates['rate'] # type: ignore 24 | else: 25 | return amount * (to_rates['rate'] / from_rates['rate']) # type: ignore 26 | 27 | 28 | # 7. Create a main entry point 29 | def main() -> None: 30 | # 8. Load the rates 31 | rates: dict[str, dict] = load_rates('rates.json') 32 | 33 | # 9. Get the result 34 | result: float = convert(amount=75, base='eur', to='dkk', rates=rates) 35 | print(result) 36 | 37 | 38 | # 10. Run the script 39 | if __name__ == '__main__': 40 | main() 41 | 42 | """ 43 | Homework: 44 | 1. Right now it works fine if you insert a rate that exists, but make it so that if the user 45 | enters a rate that doesn't exist, the program tells them that the currency is invalid, then 46 | show them a list of all the valid currency options. 47 | 2. Edit the script so that the "to" currency can also be specified as euro. 48 | 3. [Hard] Instead of loading the data from a local JSON file, try loading the data from an API. 49 | This task will require you to search online for a free API for currency exchange rates, and to make 50 | a request to it so that you can load that data in this script. 51 | 52 | """ 53 | -------------------------------------------------------------------------------- /projects/006_currency_converter/rates.json: -------------------------------------------------------------------------------- 1 | { 2 | "aed": { 3 | "code": "AED", 4 | "alphaCode": "AED", 5 | "numericCode": "784", 6 | "name": "U.A.E Dirham", 7 | "rate": 3.99661076844, 8 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 9 | "inverseRate": 0.25021200660737 10 | }, 11 | "ars": { 12 | "code": "ARS", 13 | "alphaCode": "ARS", 14 | "numericCode": "032", 15 | "name": "Argentine Peso", 16 | "rate": 1005.9824797844, 17 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 18 | "inverseRate": 0.00099405309743999 19 | }, 20 | "aud": { 21 | "code": "AUD", 22 | "alphaCode": "AUD", 23 | "numericCode": "036", 24 | "name": "Australian Dollar", 25 | "rate": 1.6274342650329, 26 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 27 | "inverseRate": 0.61446414241485 28 | }, 29 | "bob": { 30 | "code": "BOB", 31 | "alphaCode": "BOB", 32 | "numericCode": "068", 33 | "name": "Bolivian Boliviano", 34 | "rate": 7.4643899999999, 35 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 36 | "inverseRate": 0.13396942014016 37 | }, 38 | "brl": { 39 | "code": "BRL", 40 | "alphaCode": "BRL", 41 | "numericCode": "986", 42 | "name": "Brazilian Real", 43 | "rate": 6.0882604830224, 44 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 45 | "inverseRate": 0.16425052817444 46 | }, 47 | "cad": { 48 | "code": "CAD", 49 | "alphaCode": "CAD", 50 | "numericCode": "124", 51 | "name": "Canadian Dollar", 52 | "rate": 1.4937473609641, 53 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 54 | "inverseRate": 0.66945724968819 55 | }, 56 | "chf": { 57 | "code": "CHF", 58 | "alphaCode": "CHF", 59 | "numericCode": "756", 60 | "name": "Swiss Franc", 61 | "rate": 0.96732343770653, 62 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 63 | "inverseRate": 1.0337803892883 64 | }, 65 | "clp": { 66 | "code": "CLP", 67 | "alphaCode": "CLP", 68 | "numericCode": "152", 69 | "name": "Chilean Peso", 70 | "rate": 1029.5710344828, 71 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 72 | "inverseRate": 0.00097127829601615 73 | }, 74 | "cop": { 75 | "code": "COP", 76 | "alphaCode": "COP", 77 | "numericCode": "170", 78 | "name": "Colombian Peso", 79 | "rate": 4390.8176470588, 80 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 81 | "inverseRate": 0.00022774801423827 82 | }, 83 | "crc": { 84 | "code": "CRC", 85 | "alphaCode": "CRC", 86 | "numericCode": "188", 87 | "name": "Costa Rican Col\u00f3n", 88 | "rate": 575.06856702619, 89 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 90 | "inverseRate": 0.0017389230734193 91 | }, 92 | "czk": { 93 | "code": "CZK", 94 | "alphaCode": "CZK", 95 | "numericCode": "203", 96 | "name": "Czech Koruna", 97 | "rate": 25.226908648484, 98 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 99 | "inverseRate": 0.039640211725272 100 | }, 101 | "dkk": { 102 | "code": "DKK", 103 | "alphaCode": "DKK", 104 | "numericCode": "208", 105 | "name": "Danish Krone", 106 | "rate": 7.4620021593089, 107 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 108 | "inverseRate": 0.13401229035461 109 | }, 110 | "dop": { 111 | "code": "DOP", 112 | "alphaCode": "DOP", 113 | "numericCode": "214", 114 | "name": "Dominican Peso", 115 | "rate": 64.409267408749, 116 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 117 | "inverseRate": 0.015525716100043 118 | }, 119 | "dzd": { 120 | "code": "DZD", 121 | "alphaCode": "DZD", 122 | "numericCode": "012", 123 | "name": "Algerian Dinar", 124 | "rate": 146.27454438565, 125 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 126 | "inverseRate": 0.0068364595097524 127 | }, 128 | "gbp": { 129 | "code": "GBP", 130 | "alphaCode": "GBP", 131 | "numericCode": "826", 132 | "name": "U.K. Pound Sterling", 133 | "rate": 0.84257323592627, 134 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 135 | "inverseRate": 1.1868404517984 136 | }, 137 | "hkd": { 138 | "code": "HKD", 139 | "alphaCode": "HKD", 140 | "numericCode": "344", 141 | "name": "Hong Kong Dollar", 142 | "rate": 8.4979052346366, 143 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 144 | "inverseRate": 0.11767605926271 145 | }, 146 | "htg": { 147 | "code": "HTG", 148 | "alphaCode": "HTG", 149 | "numericCode": "332", 150 | "name": "Haitian gourde", 151 | "rate": 143.3529863645, 152 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 153 | "inverseRate": 0.0069757877066983 154 | }, 155 | "idr": { 156 | "code": "IDR", 157 | "alphaCode": "IDR", 158 | "numericCode": "360", 159 | "name": "Indonesian Rupiah", 160 | "rate": 17772.357142857, 161 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 162 | "inverseRate": 5.6267156458867e-5 163 | }, 164 | "ils": { 165 | "code": "ILS", 166 | "alphaCode": "ILS", 167 | "numericCode": "376", 168 | "name": "Israeli New Sheqel", 169 | "rate": 3.9667910209808, 170 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 171 | "inverseRate": 0.25209293726614 172 | }, 173 | "inr": { 174 | "code": "INR", 175 | "alphaCode": "INR", 176 | "numericCode": "356", 177 | "name": "Indian Rupee", 178 | "rate": 91.029146341466, 179 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 180 | "inverseRate": 0.010985492451493 181 | }, 182 | "jpy": { 183 | "code": "JPY", 184 | "alphaCode": "JPY", 185 | "numericCode": "392", 186 | "name": "Japanese Yen", 187 | "rate": 171.35881542699, 188 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 189 | "inverseRate": 0.0058357079413055 190 | }, 191 | "krw": { 192 | "code": "KRW", 193 | "alphaCode": "KRW", 194 | "numericCode": "410", 195 | "name": "South Korean Won", 196 | "rate": 1514.0750507099, 197 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 198 | "inverseRate": 0.000660469241291 199 | }, 200 | "mxn": { 201 | "code": "MXN", 202 | "alphaCode": "MXN", 203 | "numericCode": "484", 204 | "name": "Mexican Peso", 205 | "rate": 19.659169322341, 206 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 207 | "inverseRate": 0.050866849133018 208 | }, 209 | "myr": { 210 | "code": "MYR", 211 | "alphaCode": "MYR", 212 | "numericCode": "458", 213 | "name": "Malaysian Ringgit", 214 | "rate": 5.0986270491803, 215 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 216 | "inverseRate": 0.19613123108519 217 | }, 218 | "nok": { 219 | "code": "NOK", 220 | "alphaCode": "NOK", 221 | "numericCode": "578", 222 | "name": "Norwegian Krone", 223 | "rate": 11.885592815515, 224 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 225 | "inverseRate": 0.084135475236425 226 | }, 227 | "pab": { 228 | "code": "PAB", 229 | "alphaCode": "PAB", 230 | "numericCode": "590", 231 | "name": "Panamanian Balboa", 232 | "rate": 1.0881034985423, 233 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 234 | "inverseRate": 0.91903022216148 235 | }, 236 | "pen": { 237 | "code": "PEN", 238 | "alphaCode": "PEN", 239 | "numericCode": "604", 240 | "name": "Peruvian Nuevo Sol", 241 | "rate": 4.0877920285648, 242 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 243 | "inverseRate": 0.24463084056433 244 | }, 245 | "php": { 246 | "code": "PHP", 247 | "alphaCode": "PHP", 248 | "numericCode": "608", 249 | "name": "Philippine Peso", 250 | "rate": 63.48890022965, 251 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 252 | "inverseRate": 0.015750784725879 253 | }, 254 | "pyg": { 255 | "code": "PYG", 256 | "alphaCode": "PYG", 257 | "numericCode": "600", 258 | "name": "Paraguayan Guaran\u00ed", 259 | "rate": 8202.6263736263, 260 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 261 | "inverseRate": 0.00012191217232755 262 | }, 263 | "rub": { 264 | "code": "RUB", 265 | "alphaCode": "RUB", 266 | "numericCode": "643", 267 | "name": "Russian Rouble", 268 | "rate": 95.648257303943, 269 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 270 | "inverseRate": 0.010454973547738 271 | }, 272 | "sar": { 273 | "code": "SAR", 274 | "alphaCode": "SAR", 275 | "numericCode": "682", 276 | "name": "Saudi Riyal", 277 | "rate": 4.0812656511422, 278 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 279 | "inverseRate": 0.24502203127114 280 | }, 281 | "sek": { 282 | "code": "SEK", 283 | "alphaCode": "SEK", 284 | "numericCode": "752", 285 | "name": "Swedish Krona", 286 | "rate": 11.624602877966, 287 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 288 | "inverseRate": 0.086024444060401 289 | }, 290 | "sgd": { 291 | "code": "SGD", 292 | "alphaCode": "SGD", 293 | "numericCode": "702", 294 | "name": "Singapore Dollar", 295 | "rate": 1.4638268915111, 296 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 297 | "inverseRate": 0.68314088626131 298 | }, 299 | "thb": { 300 | "code": "THB", 301 | "alphaCode": "THB", 302 | "numericCode": "764", 303 | "name": "Thai Baht", 304 | "rate": 39.582087177855, 305 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 306 | "inverseRate": 0.025263953250031 307 | }, 308 | "tnd": { 309 | "code": "TND", 310 | "alphaCode": "TND", 311 | "numericCode": "788", 312 | "name": "Tunisian Dinar", 313 | "rate": 3.3764978355174, 314 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 315 | "inverseRate": 0.29616485740965 316 | }, 317 | "try": { 318 | "code": "TRY", 319 | "alphaCode": "TRY", 320 | "numericCode": "949", 321 | "name": "Turkish Lira", 322 | "rate": 35.933134357098, 323 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 324 | "inverseRate": 0.027829467645715 325 | }, 326 | "twd": { 327 | "code": "TWD", 328 | "alphaCode": "TWD", 329 | "numericCode": "901", 330 | "name": "New Taiwan Dollar ", 331 | "rate": 35.632948252816, 332 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 333 | "inverseRate": 0.028063914130961 334 | }, 335 | "usd": { 336 | "code": "USD", 337 | "alphaCode": "USD", 338 | "numericCode": "840", 339 | "name": "U.S. Dollar", 340 | "rate": 1.0881034985423, 341 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 342 | "inverseRate": 0.91903022216148 343 | }, 344 | "uyu": { 345 | "code": "UYU", 346 | "alphaCode": "UYU", 347 | "numericCode": "858", 348 | "name": "Uruguayan Peso", 349 | "rate": 43.890104074792, 350 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 351 | "inverseRate": 0.022784179283237 352 | }, 353 | "ves": { 354 | "code": "VES", 355 | "alphaCode": "VES", 356 | "numericCode": "928", 357 | "name": "Venezuelan Bolivar", 358 | "rate": 39.735906308224, 359 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 360 | "inverseRate": 0.025166155573329 361 | }, 362 | "vnd": { 363 | "code": "VND", 364 | "alphaCode": "VND", 365 | "numericCode": "704", 366 | "name": "Vietnamese Dong", 367 | "rate": 27645.888888889, 368 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 369 | "inverseRate": 3.6171743437843e-5 370 | }, 371 | "zar": { 372 | "code": "ZAR", 373 | "alphaCode": "ZAR", 374 | "numericCode": "710", 375 | "name": "South African Rand", 376 | "rate": 19.89495988699, 377 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 378 | "inverseRate": 0.050263986742388 379 | }, 380 | "bgn": { 381 | "code": "BGN", 382 | "alphaCode": "BGN", 383 | "numericCode": "975", 384 | "name": "Bulgarian Lev", 385 | "rate": 1.9543059485149, 386 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 387 | "inverseRate": 0.51169060850472 388 | }, 389 | "cny": { 390 | "code": "CNY", 391 | "alphaCode": "CNY", 392 | "numericCode": "156", 393 | "name": "Chinese Yuan", 394 | "rate": 7.9096889640629, 395 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 396 | "inverseRate": 0.12642722166996 397 | }, 398 | "huf": { 399 | "code": "HUF", 400 | "alphaCode": "HUF", 401 | "numericCode": "348", 402 | "name": "Hungarian Forint", 403 | "rate": 390.60184617305, 404 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 405 | "inverseRate": 0.0025601517499151 406 | }, 407 | "isk": { 408 | "code": "ISK", 409 | "alphaCode": "ISK", 410 | "numericCode": "352", 411 | "name": "Icelandic Krona", 412 | "rate": 149.58281441424, 413 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 414 | "inverseRate": 0.0066852599606173 415 | }, 416 | "nzd": { 417 | "code": "NZD", 418 | "alphaCode": "NZD", 419 | "numericCode": "554", 420 | "name": "New Zealand Dollar", 421 | "rate": 1.8066898392003, 422 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 423 | "inverseRate": 0.55349843581487 424 | }, 425 | "pln": { 426 | "code": "PLN", 427 | "alphaCode": "PLN", 428 | "numericCode": "985", 429 | "name": "Polish Zloty", 430 | "rate": 4.2822501816527, 431 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 432 | "inverseRate": 0.23352208712244 433 | }, 434 | "ron": { 435 | "code": "RON", 436 | "alphaCode": "RON", 437 | "numericCode": "946", 438 | "name": "Romanian New Leu", 439 | "rate": 4.9673808123521, 440 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 441 | "inverseRate": 0.2013133354933 442 | }, 443 | "xaf": { 444 | "code": "XAF", 445 | "alphaCode": "XAF", 446 | "numericCode": "950", 447 | "name": "Central African CFA Franc", 448 | "rate": 655.56421968983, 449 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 450 | "inverseRate": 0.0015254035683539 451 | }, 452 | "xof": { 453 | "code": "XOF", 454 | "alphaCode": "XOF", 455 | "numericCode": "952", 456 | "name": "West African CFA Franc", 457 | "rate": 655.56421968983, 458 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 459 | "inverseRate": 0.0015254035683539 460 | }, 461 | "ngn": { 462 | "code": "NGN", 463 | "alphaCode": "NGN", 464 | "numericCode": "566", 465 | "name": "Nigerian Naira", 466 | "rate": 1724.0999934403, 467 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 468 | "inverseRate": 0.00058001276248752 469 | }, 470 | "bdt": { 471 | "code": "BDT", 472 | "alphaCode": "BDT", 473 | "numericCode": "050", 474 | "name": "Bangladeshi taka", 475 | "rate": 129.7532391956, 476 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 477 | "inverseRate": 0.007706936691519 478 | }, 479 | "byn": { 480 | "code": "BYN", 481 | "alphaCode": "BYN", 482 | "numericCode": "933", 483 | "name": "Belarussian Ruble", 484 | "rate": 3.5608811677025, 485 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 486 | "inverseRate": 0.28082936579577 487 | }, 488 | "pkr": { 489 | "code": "PKR", 490 | "alphaCode": "PKR", 491 | "numericCode": "586", 492 | "name": "Pakistani Rupee", 493 | "rate": 306.66787961228, 494 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 495 | "inverseRate": 0.0032608566676898 496 | }, 497 | "amd": { 498 | "code": "AMD", 499 | "alphaCode": "AMD", 500 | "numericCode": "051", 501 | "name": "Armenia Dram", 502 | "rate": 433.18671923545, 503 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 504 | "inverseRate": 0.0023084733570894 505 | }, 506 | "azn": { 507 | "code": "AZN", 508 | "alphaCode": "AZN", 509 | "numericCode": "944", 510 | "name": "Azerbaijan Manat", 511 | "rate": 1.8485783493317, 512 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 513 | "inverseRate": 0.54095624367857 514 | }, 515 | "egp": { 516 | "code": "EGP", 517 | "alphaCode": "EGP", 518 | "numericCode": "818", 519 | "name": "Egyptian Pound", 520 | "rate": 52.487807150784, 521 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 522 | "inverseRate": 0.019052043784707 523 | }, 524 | "gel": { 525 | "code": "GEL", 526 | "alphaCode": "GEL", 527 | "numericCode": "981", 528 | "name": "Georgian lari", 529 | "rate": 3.124556708334, 530 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 531 | "inverseRate": 0.32004539950667 532 | }, 533 | "iqd": { 534 | "code": "IQD", 535 | "alphaCode": "IQD", 536 | "numericCode": "368", 537 | "name": "Iraqi dinar", 538 | "rate": 1461.9578342255, 539 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 540 | "inverseRate": 0.0006840142558077 541 | }, 542 | "irr": { 543 | "code": "IRR", 544 | "alphaCode": "IRR", 545 | "numericCode": "364", 546 | "name": "Iranian rial", 547 | "rate": 46871.594558468, 548 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 549 | "inverseRate": 2.1334883300217e-5 550 | }, 551 | "kgs": { 552 | "code": "KGS", 553 | "alphaCode": "KGS", 554 | "numericCode": "417", 555 | "name": "Kyrgyzstan Som", 556 | "rate": 96.473534369122, 557 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 558 | "inverseRate": 0.010365537103408 559 | }, 560 | "kzt": { 561 | "code": "KZT", 562 | "alphaCode": "KZT", 563 | "numericCode": "398", 564 | "name": "Kazakhstani Tenge", 565 | "rate": 517.13271034705, 566 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 567 | "inverseRate": 0.0019337395991232 568 | }, 569 | "lyd": { 570 | "code": "LYD", 571 | "alphaCode": "LYD", 572 | "numericCode": "434", 573 | "name": "Libyan Dinar", 574 | "rate": 5.4413961694995, 575 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 576 | "inverseRate": 0.1837763634277 577 | }, 578 | "mad": { 579 | "code": "MAD", 580 | "alphaCode": "MAD", 581 | "numericCode": "504", 582 | "name": "Moroccan Dirham", 583 | "rate": 11.122347288492, 584 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 585 | "inverseRate": 0.089909078907712 586 | }, 587 | "mdl": { 588 | "code": "MDL", 589 | "alphaCode": "MDL", 590 | "numericCode": "498", 591 | "name": "Moldova Lei", 592 | "rate": 19.309193458824, 593 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 594 | "inverseRate": 0.051788802164754 595 | }, 596 | "rsd": { 597 | "code": "RSD", 598 | "alphaCode": "RSD", 599 | "numericCode": "941", 600 | "name": "Serbian Dinar", 601 | "rate": 119.49698527529, 602 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 603 | "inverseRate": 0.0083684119536259 604 | }, 605 | "tjs": { 606 | "code": "TJS", 607 | "alphaCode": "TJS", 608 | "numericCode": "972", 609 | "name": "Tajikistan Ruble", 610 | "rate": 11.900759141374, 611 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 612 | "inverseRate": 0.084028252998028 613 | }, 614 | "tmt": { 615 | "code": "TMT", 616 | "alphaCode": "TMT", 617 | "numericCode": "934", 618 | "name": "New Turkmenistan Manat", 619 | "rate": 3.9060000068106, 620 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 621 | "inverseRate": 0.25601638460225 622 | }, 623 | "uah": { 624 | "code": "UAH", 625 | "alphaCode": "UAH", 626 | "numericCode": "980", 627 | "name": "Ukrainian Hryvnia", 628 | "rate": 45.157600345086, 629 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 630 | "inverseRate": 0.022144666509252 631 | }, 632 | "uzs": { 633 | "code": "UZS", 634 | "alphaCode": "UZS", 635 | "numericCode": "860", 636 | "name": "Uzbekistan Sum", 637 | "rate": 14014.192108868, 638 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 639 | "inverseRate": 7.1356236037838e-5 640 | }, 641 | "jod": { 642 | "code": "JOD", 643 | "alphaCode": "JOD", 644 | "numericCode": "400", 645 | "name": "Jordanian Dinar", 646 | "rate": 0.77154323006327, 647 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 648 | "inverseRate": 1.2961036543837 649 | }, 650 | "lbp": { 651 | "code": "LBP", 652 | "alphaCode": "LBP", 653 | "numericCode": "422", 654 | "name": "Lebanese Pound", 655 | "rate": 99615.875291545, 656 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 657 | "inverseRate": 1.0038560591606e-5 658 | }, 659 | "afn": { 660 | "code": "AFN", 661 | "alphaCode": "AFN", 662 | "numericCode": "971", 663 | "name": "Afghan afghani", 664 | "rate": 76.87304176188, 665 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 666 | "inverseRate": 0.01300846144605 667 | }, 668 | "all": { 669 | "code": "ALL", 670 | "alphaCode": "ALL", 671 | "numericCode": "008", 672 | "name": "Albanian lek", 673 | "rate": 99.685829523691, 674 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 675 | "inverseRate": 0.010031516061792 676 | }, 677 | "ang": { 678 | "code": "ANG", 679 | "alphaCode": "ANG", 680 | "numericCode": "532", 681 | "name": "Neth. Antillean Guilder", 682 | "rate": 1.9549366833689, 683 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 684 | "inverseRate": 0.51152551819567 685 | }, 686 | "aoa": { 687 | "code": "AOA", 688 | "alphaCode": "AOA", 689 | "numericCode": "973", 690 | "name": "Angolan kwanza", 691 | "rate": 958.32295996953, 692 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 693 | "inverseRate": 0.0010434895559967 694 | }, 695 | "awg": { 696 | "code": "AWG", 697 | "alphaCode": "AWG", 698 | "numericCode": "533", 699 | "name": "Aruban florin", 700 | "rate": 1.9629417151067, 701 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 702 | "inverseRate": 0.50943947663043 703 | }, 704 | "bam": { 705 | "code": "BAM", 706 | "alphaCode": "BAM", 707 | "numericCode": "977", 708 | "name": "Bosnia and Herzegovina convertible mark", 709 | "rate": 1.9496658674699, 710 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 711 | "inverseRate": 0.51290839968272 712 | }, 713 | "bbd": { 714 | "code": "BBD", 715 | "alphaCode": "BBD", 716 | "numericCode": "052", 717 | "name": "Barbadian Dollar", 718 | "rate": 2.1900589383422, 719 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 720 | "inverseRate": 0.45660871609098 721 | }, 722 | "bhd": { 723 | "code": "BHD", 724 | "alphaCode": "BHD", 725 | "numericCode": "048", 726 | "name": "Bahrain Dinar", 727 | "rate": 0.40885605483267, 728 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 729 | "inverseRate": 2.4458485772194 730 | }, 731 | "bif": { 732 | "code": "BIF", 733 | "alphaCode": "BIF", 734 | "numericCode": "108", 735 | "name": "Burundian franc", 736 | "rate": 3123.3190466943, 737 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 738 | "inverseRate": 0.00032017222225773 739 | }, 740 | "bnd": { 741 | "code": "BND", 742 | "alphaCode": "BND", 743 | "numericCode": "096", 744 | "name": "Brunei Dollar", 745 | "rate": 1.454985444117, 746 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 747 | "inverseRate": 0.68729209906759 748 | }, 749 | "bsd": { 750 | "code": "BSD", 751 | "alphaCode": "BSD", 752 | "numericCode": "044", 753 | "name": "Bahamian Dollar", 754 | "rate": 1.0881034985423, 755 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 756 | "inverseRate": 0.91903022216148 757 | }, 758 | "bwp": { 759 | "code": "BWP", 760 | "alphaCode": "BWP", 761 | "numericCode": "072", 762 | "name": "Botswana Pula", 763 | "rate": 14.65631679074, 764 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 765 | "inverseRate": 0.068229966251264 766 | }, 767 | "bzd": { 768 | "code": "BZD", 769 | "alphaCode": "BZD", 770 | "numericCode": "084", 771 | "name": "Belize dollar", 772 | "rate": 2.1864673898346, 773 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 774 | "inverseRate": 0.4573587535077 775 | }, 776 | "cdf": { 777 | "code": "CDF", 778 | "alphaCode": "CDF", 779 | "numericCode": "976", 780 | "name": "Congolese franc", 781 | "rate": 3076.0301498085, 782 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 783 | "inverseRate": 0.00032509434280489 784 | }, 785 | "cup": { 786 | "code": "CUP", 787 | "alphaCode": "CUP", 788 | "numericCode": "192", 789 | "name": "Cuban peso", 790 | "rate": 1.0881034985423, 791 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 792 | "inverseRate": 0.91903022216148 793 | }, 794 | "cve": { 795 | "code": "CVE", 796 | "alphaCode": "CVE", 797 | "numericCode": "132", 798 | "name": "Cape Verde escudo", 799 | "rate": 110.24428469727, 800 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 801 | "inverseRate": 0.0090707650083266 802 | }, 803 | "djf": { 804 | "code": "DJF", 805 | "alphaCode": "DJF", 806 | "numericCode": "262", 807 | "name": "Djiboutian franc", 808 | "rate": 193.1308595258, 809 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 810 | "inverseRate": 0.0051778364289133 811 | }, 812 | "ern": { 813 | "code": "ERN", 814 | "alphaCode": "ERN", 815 | "numericCode": "232", 816 | "name": "Eritrean nakfa", 817 | "rate": 16.352831804463, 818 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 819 | "inverseRate": 0.06115148813107 820 | }, 821 | "etb": { 822 | "code": "ETB", 823 | "alphaCode": "ETB", 824 | "numericCode": "230", 825 | "name": "Ethiopian birr", 826 | "rate": 62.649835797127, 827 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 828 | "inverseRate": 0.015961733774342 829 | }, 830 | "fjd": { 831 | "code": "FJD", 832 | "alphaCode": "FJD", 833 | "numericCode": "242", 834 | "name": "Fiji Dollar", 835 | "rate": 2.4175282285723, 836 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 837 | "inverseRate": 0.41364563531511 838 | }, 839 | "ghs": { 840 | "code": "GHS", 841 | "alphaCode": "GHS", 842 | "numericCode": "936", 843 | "name": "Ghanaian Cedi", 844 | "rate": 16.757477681793, 845 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 846 | "inverseRate": 0.059674851966924 847 | }, 848 | "gip": { 849 | "code": "GIP", 850 | "alphaCode": "GIP", 851 | "numericCode": "292", 852 | "name": "Gibraltar pound", 853 | "rate": 0.83511858318672, 854 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 855 | "inverseRate": 1.1974347357762 856 | }, 857 | "gmd": { 858 | "code": "GMD", 859 | "alphaCode": "GMD", 860 | "numericCode": "270", 861 | "name": "Gambian dalasi", 862 | "rate": 74.98161366932, 863 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 864 | "inverseRate": 0.01333660281586 865 | }, 866 | "gnf": { 867 | "code": "GNF", 868 | "alphaCode": "GNF", 869 | "numericCode": "324", 870 | "name": "Guinean franc", 871 | "rate": 9335.7851592655, 872 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 873 | "inverseRate": 0.00010711471857378 874 | }, 875 | "gtq": { 876 | "code": "GTQ", 877 | "alphaCode": "GTQ", 878 | "numericCode": "320", 879 | "name": "Guatemalan Quetzal", 880 | "rate": 8.4101198852442, 881 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 882 | "inverseRate": 0.11890436921768 883 | }, 884 | "gyd": { 885 | "code": "GYD", 886 | "alphaCode": "GYD", 887 | "numericCode": "328", 888 | "name": "Guyanese dollar", 889 | "rate": 226.93903286087, 890 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 891 | "inverseRate": 0.0044064698231664 892 | }, 893 | "hnl": { 894 | "code": "HNL", 895 | "alphaCode": "HNL", 896 | "numericCode": "340", 897 | "name": "Honduran Lempira", 898 | "rate": 26.866837643478, 899 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 900 | "inverseRate": 0.037220606804193 901 | }, 902 | "jmd": { 903 | "code": "JMD", 904 | "alphaCode": "JMD", 905 | "numericCode": "388", 906 | "name": "Jamaican Dollar", 907 | "rate": 169.97823975236, 908 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 909 | "inverseRate": 0.0058831059873127 910 | }, 911 | "kes": { 912 | "code": "KES", 913 | "alphaCode": "KES", 914 | "numericCode": "404", 915 | "name": "Kenyan shilling", 916 | "rate": 141.28734039091, 917 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 918 | "inverseRate": 0.0070777749601148 919 | }, 920 | "khr": { 921 | "code": "KHR", 922 | "alphaCode": "KHR", 923 | "numericCode": "116", 924 | "name": "Cambodian riel", 925 | "rate": 4453.5008536371, 926 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 927 | "inverseRate": 0.00022454245162731 928 | }, 929 | "kmf": { 930 | "code": "KMF", 931 | "alphaCode": "KMF", 932 | "numericCode": "174", 933 | "name": "\tComoro franc", 934 | "rate": 491.30053175774, 935 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 936 | "inverseRate": 0.0020354140395946 937 | }, 938 | "kwd": { 939 | "code": "KWD", 940 | "alphaCode": "KWD", 941 | "numericCode": "414", 942 | "name": "Kuwaiti Dinar", 943 | "rate": 0.33158881591895, 944 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 945 | "inverseRate": 3.0157832592413 946 | }, 947 | "lak": { 948 | "code": "LAK", 949 | "alphaCode": "LAK", 950 | "numericCode": "418", 951 | "name": "Lao kip", 952 | "rate": 23968.841672946, 953 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 954 | "inverseRate": 4.1720831304448e-5 955 | }, 956 | "lkr": { 957 | "code": "LKR", 958 | "alphaCode": "LKR", 959 | "numericCode": "144", 960 | "name": "Sri Lanka Rupee", 961 | "rate": 329.60860767803, 962 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 963 | "inverseRate": 0.0030339013505886 964 | }, 965 | "lrd": { 966 | "code": "LRD", 967 | "alphaCode": "LRD", 968 | "numericCode": "430", 969 | "name": "Liberian dollar", 970 | "rate": 211.21058503883, 971 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 972 | "inverseRate": 0.0047346111929767 973 | }, 974 | "lsl": { 975 | "code": "LSL", 976 | "alphaCode": "LSL", 977 | "numericCode": "426", 978 | "name": "Lesotho loti", 979 | "rate": 19.679215026681, 980 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 981 | "inverseRate": 0.050815034982046 982 | }, 983 | "mga": { 984 | "code": "MGA", 985 | "alphaCode": "MGA", 986 | "numericCode": "969", 987 | "name": "Malagasy ariary", 988 | "rate": 4892.7222681014, 989 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 990 | "inverseRate": 0.00020438519605325 991 | }, 992 | "mkd": { 993 | "code": "MKD", 994 | "alphaCode": "MKD", 995 | "numericCode": "807", 996 | "name": "Macedonian denar", 997 | "rate": 61.20640716415, 998 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 999 | "inverseRate": 0.016338158802854 1000 | }, 1001 | "mmk": { 1002 | "code": "MMK", 1003 | "alphaCode": "MMK", 1004 | "numericCode": "104", 1005 | "name": "Myanma Kyat", 1006 | "rate": 2277.8717660354, 1007 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1008 | "inverseRate": 0.00043900627546759 1009 | }, 1010 | "mnt": { 1011 | "code": "MNT", 1012 | "alphaCode": "MNT", 1013 | "numericCode": "496", 1014 | "name": "Mongolian togrog", 1015 | "rate": 3690.7039946232, 1016 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1017 | "inverseRate": 0.00027095101678619 1018 | }, 1019 | "mop": { 1020 | "code": "MOP", 1021 | "alphaCode": "MOP", 1022 | "numericCode": "446", 1023 | "name": "Macanese pataca", 1024 | "rate": 8.7284243408026, 1025 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1026 | "inverseRate": 0.11456821540233 1027 | }, 1028 | "mru": { 1029 | "code": "MRU", 1030 | "alphaCode": "MRU", 1031 | "numericCode": "929", 1032 | "name": "Mauritanian ouguiya", 1033 | "rate": 43.139067925017, 1034 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1035 | "inverseRate": 0.023180843910169 1036 | }, 1037 | "mur": { 1038 | "code": "MUR", 1039 | "alphaCode": "MUR", 1040 | "numericCode": "480", 1041 | "name": "Mauritian Rupee", 1042 | "rate": 50.490577725258, 1043 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1044 | "inverseRate": 0.019805675534977 1045 | }, 1046 | "mvr": { 1047 | "code": "MVR", 1048 | "alphaCode": "MVR", 1049 | "numericCode": "462", 1050 | "name": "Maldivian rufiyaa", 1051 | "rate": 16.770651799467, 1052 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1053 | "inverseRate": 0.05962797462838 1054 | }, 1055 | "mwk": { 1056 | "code": "MWK", 1057 | "alphaCode": "MWK", 1058 | "numericCode": "454", 1059 | "name": "Malawian kwacha", 1060 | "rate": 1881.1524769772, 1061 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1062 | "inverseRate": 0.00053158901909264 1063 | }, 1064 | "mzn": { 1065 | "code": "MZN", 1066 | "alphaCode": "MZN", 1067 | "numericCode": "943", 1068 | "name": "Mozambican metical", 1069 | "rate": 69.26061392507, 1070 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1071 | "inverseRate": 0.014438220271652 1072 | }, 1073 | "nad": { 1074 | "code": "NAD", 1075 | "alphaCode": "NAD", 1076 | "numericCode": "516", 1077 | "name": "Namibian dollar", 1078 | "rate": 19.688296344183, 1079 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1080 | "inverseRate": 0.050791596312775 1081 | }, 1082 | "nio": { 1083 | "code": "NIO", 1084 | "alphaCode": "NIO", 1085 | "numericCode": "558", 1086 | "name": "Nicaraguan C\u00f3rdoba", 1087 | "rate": 39.94806945491, 1088 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1089 | "inverseRate": 0.025032498782669 1090 | }, 1091 | "npr": { 1092 | "code": "NPR", 1093 | "alphaCode": "NPR", 1094 | "numericCode": "524", 1095 | "name": "Nepalese Rupee", 1096 | "rate": 145.0681338927, 1097 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1098 | "inverseRate": 0.0068933126329429 1099 | }, 1100 | "omr": { 1101 | "code": "OMR", 1102 | "alphaCode": "OMR", 1103 | "numericCode": "512", 1104 | "name": "Omani Rial", 1105 | "rate": 0.4170735439449, 1106 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1107 | "inverseRate": 2.3976586731958 1108 | }, 1109 | "pgk": { 1110 | "code": "PGK", 1111 | "alphaCode": "PGK", 1112 | "numericCode": "598", 1113 | "name": "Papua New Guinean kina", 1114 | "rate": 4.2473407842552, 1115 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1116 | "inverseRate": 0.23544143283886 1117 | }, 1118 | "qar": { 1119 | "code": "QAR", 1120 | "alphaCode": "QAR", 1121 | "numericCode": "634", 1122 | "name": "Qatari Rial", 1123 | "rate": 3.9555477635679, 1124 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1125 | "inverseRate": 0.25280948676954 1126 | }, 1127 | "rwf": { 1128 | "code": "RWF", 1129 | "alphaCode": "RWF", 1130 | "numericCode": "646", 1131 | "name": "Rwandan franc", 1132 | "rate": 1420.2575958004, 1133 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1134 | "inverseRate": 0.00070409762493574 1135 | }, 1136 | "sbd": { 1137 | "code": "SBD", 1138 | "alphaCode": "SBD", 1139 | "numericCode": "090", 1140 | "name": "Solomon Islands dollar", 1141 | "rate": 9.2187852588254, 1142 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1143 | "inverseRate": 0.10847416139156 1144 | }, 1145 | "scr": { 1146 | "code": "SCR", 1147 | "alphaCode": "SCR", 1148 | "numericCode": "690", 1149 | "name": "Seychelles rupee", 1150 | "rate": 14.855340591171, 1151 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1152 | "inverseRate": 0.067315858149649 1153 | }, 1154 | "sdg": { 1155 | "code": "SDG", 1156 | "alphaCode": "SDG", 1157 | "numericCode": "938", 1158 | "name": "Sudanese pound", 1159 | "rate": 651.36699508158, 1160 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1161 | "inverseRate": 0.0015352328373266 1162 | }, 1163 | "sos": { 1164 | "code": "SOS", 1165 | "alphaCode": "SOS", 1166 | "numericCode": "706", 1167 | "name": "Somali shilling", 1168 | "rate": 619.94388517645, 1169 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1170 | "inverseRate": 0.0016130492193102 1171 | }, 1172 | "srd": { 1173 | "code": "SRD", 1174 | "alphaCode": "SRD", 1175 | "numericCode": "968", 1176 | "name": "Surinamese dollar", 1177 | "rate": 32.618148454009, 1178 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1179 | "inverseRate": 0.030657779407988 1180 | }, 1181 | "ssp": { 1182 | "code": "SSP", 1183 | "alphaCode": "SSP", 1184 | "numericCode": "728", 1185 | "name": "South Sudanese pound", 1186 | "rate": 1705.2173532311, 1187 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1188 | "inverseRate": 0.0005864355051895 1189 | }, 1190 | "stn": { 1191 | "code": "STN", 1192 | "alphaCode": "STN", 1193 | "numericCode": "930", 1194 | "name": "S\u00e3o Tom\u00e9 and Pr\u00edncipe Dobra", 1195 | "rate": 24.604693297488, 1196 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1197 | "inverseRate": 0.040642652517929 1198 | }, 1199 | "svc": { 1200 | "code": "SVC", 1201 | "alphaCode": "SVC", 1202 | "numericCode": "222", 1203 | "name": "Salvadoran colon", 1204 | "rate": 9.4957796968271, 1205 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1206 | "inverseRate": 0.10530994103982 1207 | }, 1208 | "syp": { 1209 | "code": "SYP", 1210 | "alphaCode": "SYP", 1211 | "numericCode": "760", 1212 | "name": "Syrian pound", 1213 | "rate": 14080.705669255, 1214 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1215 | "inverseRate": 7.101916789465e-5 1216 | }, 1217 | "szl": { 1218 | "code": "SZL", 1219 | "alphaCode": "SZL", 1220 | "numericCode": "748", 1221 | "name": "Swazi lilangeni", 1222 | "rate": 19.679215026681, 1223 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1224 | "inverseRate": 0.050815034982046 1225 | }, 1226 | "top": { 1227 | "code": "TOP", 1228 | "alphaCode": "TOP", 1229 | "numericCode": "776", 1230 | "name": "Tongan pa\u02bbanga", 1231 | "rate": 2.5457687318959, 1232 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1233 | "inverseRate": 0.39280865833216 1234 | }, 1235 | "ttd": { 1236 | "code": "TTD", 1237 | "alphaCode": "TTD", 1238 | "numericCode": "780", 1239 | "name": "Trinidad Tobago Dollar", 1240 | "rate": 7.3635723468835, 1241 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1242 | "inverseRate": 0.13580364976291 1243 | }, 1244 | "tzs": { 1245 | "code": "TZS", 1246 | "alphaCode": "TZS", 1247 | "numericCode": "834", 1248 | "name": "Tanzanian shilling", 1249 | "rate": 2880.7925845944, 1250 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1251 | "inverseRate": 0.00034712669192072 1252 | }, 1253 | "ugx": { 1254 | "code": "UGX", 1255 | "alphaCode": "UGX", 1256 | "numericCode": "800", 1257 | "name": "Ugandan shilling", 1258 | "rate": 4009.8250167146, 1259 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1260 | "inverseRate": 0.0002493874410558 1261 | }, 1262 | "vuv": { 1263 | "code": "VUV", 1264 | "alphaCode": "VUV", 1265 | "numericCode": "548", 1266 | "name": "Vanuatu vatu", 1267 | "rate": 130.00346815115, 1268 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1269 | "inverseRate": 0.007692102481738 1270 | }, 1271 | "wst": { 1272 | "code": "WST", 1273 | "alphaCode": "WST", 1274 | "numericCode": "882", 1275 | "name": "Samoan tala", 1276 | "rate": 2.9582955330636, 1277 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1278 | "inverseRate": 0.33803248824312 1279 | }, 1280 | "xcd": { 1281 | "code": "XCD", 1282 | "alphaCode": "XCD", 1283 | "numericCode": "951", 1284 | "name": "East Caribbean Dollar", 1285 | "rate": 2.9385314538084, 1286 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1287 | "inverseRate": 0.34030603916252 1288 | }, 1289 | "xpf": { 1290 | "code": "XPF", 1291 | "alphaCode": "XPF", 1292 | "numericCode": "953", 1293 | "name": "CFP Franc", 1294 | "rate": 118.77986073622, 1295 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1296 | "inverseRate": 0.0084189356158677 1297 | }, 1298 | "yer": { 1299 | "code": "YER", 1300 | "alphaCode": "YER", 1301 | "numericCode": "886", 1302 | "name": "Yemeni rial", 1303 | "rate": 271.42018053212, 1304 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1305 | "inverseRate": 0.0036843244228911 1306 | }, 1307 | "zmw": { 1308 | "code": "ZMW", 1309 | "alphaCode": "ZMW", 1310 | "numericCode": "967", 1311 | "name": "Zambian kwacha", 1312 | "rate": 28.292134070188, 1313 | "date": "Sat, 20 Jul 2024 00:55:11 GMT", 1314 | "inverseRate": 0.03534551326242 1315 | } 1316 | } -------------------------------------------------------------------------------- /projects/007_password_generator/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import necessary functionality 2 | import secrets 3 | import string 4 | 5 | 6 | # 2. Create a class 7 | class Password: 8 | # 3. Initialize our class 9 | def __init__(self, length: int = 12, uppercase: bool = True, symbols: bool = True) -> None: 10 | self.length = length 11 | self.use_uppercase = uppercase 12 | self.use_symbols = symbols 13 | 14 | # 4. Get characters from the string module 15 | self.base_characters: str = string.ascii_lowercase + string.digits 16 | 17 | # 5. Add symbols and uppercases characters if the user wants them 18 | if self.use_uppercase: 19 | self.base_characters += string.ascii_uppercase 20 | if self.use_symbols: 21 | self.base_characters += string.punctuation 22 | 23 | # 6. Create a method to generate the password 24 | def generate(self) -> str: 25 | password: list[str] = [] 26 | 27 | for i in range(self.length): 28 | password.append(secrets.choice(self.base_characters)) 29 | 30 | return ''.join(password) 31 | 32 | 33 | # 7. Create the main entry point 34 | def main() -> None: 35 | password: Password = Password(length=20, uppercase=True, symbols=True) 36 | for i in range(10): 37 | generated: str = password.generate() 38 | print(f'{generated} ({len(generated)} chars)') 39 | 40 | 41 | # 8. Run the script 42 | if __name__ == '__main__': 43 | main() 44 | 45 | """ 46 | Homework: 47 | 1. Create a method in the Password class which checks the passwords strength. 48 | - check that the password is more than 16 characters long 49 | - check that the password both contains uppercase characters and symbols 50 | 51 | """ 52 | -------------------------------------------------------------------------------- /projects/008_text_analyser/main.py: -------------------------------------------------------------------------------- 1 | # 1. Create a function that handles opening files 2 | def open_file(path: str) -> str: 3 | with open(path, 'r') as file: 4 | text: str = file.read() 5 | return text 6 | 7 | 8 | # 2. Create a function that analyses any string 9 | def analyse(text: str) -> dict[str, int]: 10 | result: dict[str, int] = { 11 | 'total_chars_incl_spaces': len(text), 12 | 'total_chars_excl_spaces': len(text.replace(' ', '')), 13 | 'total_spaces': text.count(' '), 14 | 'total_words': len(text.split()) 15 | } 16 | 17 | return result 18 | 19 | 20 | # 3. Create a main entry point 21 | def main() -> None: 22 | text: str = open_file(path='note.txt') 23 | analysis: dict[str, int] = analyse(text) 24 | 25 | # 4. Display the information 26 | for key, value in analysis.items(): 27 | print(f'{key}: {value}') 28 | 29 | 30 | # 5. Run the script 31 | if __name__ == '__main__': 32 | main() 33 | 34 | 35 | """ 36 | Homework: 37 | 1. Create a much more user friendly message regarding the analysis (eg. "This text file contains..."). 38 | 2. Add the top 5 most common words to the analysis message. 39 | 40 | """ -------------------------------------------------------------------------------- /projects/008_text_analyser/note.txt: -------------------------------------------------------------------------------- 1 | The red fox jumped over the blue river. -------------------------------------------------------------------------------- /projects/009_morse_code_converter/main.py: -------------------------------------------------------------------------------- 1 | # 1. Create the data that translates morse code (for a complete table, search on Google) 2 | morse_code_dict: dict[str, str] = { 3 | 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 4 | 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 5 | 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 6 | 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 7 | 'Y': '-.--', 'Z': '--..', 8 | '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', 9 | '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----', 10 | ' ': '/' 11 | } 12 | 13 | 14 | # 2. Create a function that converts the text and returns it as morse code 15 | def convert_to_morse(text: str) -> str: 16 | return ' '.join(morse_code_dict.get(char.upper(), '') for char in text) 17 | 18 | 19 | # 3. Create a main entry point 20 | def main() -> None: 21 | # 4. Get that sexy user input 22 | user_input: str = input('Enter text: ') 23 | output: str = convert_to_morse(user_input) 24 | 25 | # 5. Display the output in the console 26 | print(output) 27 | 28 | 29 | # 6. Run the script 30 | if __name__ == "__main__": 31 | main() 32 | 33 | """ 34 | Homework: 35 | 1. Edit the program so that it also works with symbols, you're going to have 36 | to do some research online and edit the dictionary. 37 | 2. Create a function that can convert the morse code back into regular text. 38 | 39 | """ 40 | -------------------------------------------------------------------------------- /projects/010_chat_bot/main.py: -------------------------------------------------------------------------------- 1 | # 1. Import necessary functionality 2 | from difflib import SequenceMatcher 3 | from datetime import datetime 4 | 5 | 6 | # 2. Create a ChatBot class 7 | class ChatBot: 8 | 9 | # 3. Initialize the class 10 | def __init__(self, name: str, responses: dict[str, str]) -> None: 11 | self.name = name 12 | self.responses = responses # Store predefined responses 13 | 14 | # 4. Create a function to check the similarity of the user input to the predefined responses 15 | @staticmethod 16 | def calculate_similarity(input_sentence: str, response_sentence: str) -> float: 17 | sequence: SequenceMatcher = SequenceMatcher(a=input_sentence, b=response_sentence) 18 | return sequence.ratio() 19 | 20 | # 5. Create a function that grabs the best response 21 | def get_best_response(self, user_input: str) -> tuple[str, float]: 22 | highest_similarity: float = 0.0 23 | best_match: str = 'Sorry, I didn\'t understand that.' # Will only trigger if there's a 0% match 24 | 25 | # 6. Iterate over all predefined responses 26 | for response in self.responses: 27 | # 7. Calculate similarity between user input and predefined response 28 | similarity: float = self.calculate_similarity(user_input, response) 29 | # 8. Update the highest similarity and best match if current similarity is higher 30 | if similarity > highest_similarity: 31 | highest_similarity = similarity 32 | best_match = self.responses[response] 33 | 34 | return best_match, highest_similarity 35 | 36 | # 9. Create the main function of the class 37 | def run(self) -> None: 38 | print(f'Hello! My name is {self.name}, how can I help you today?') 39 | while True: 40 | user_input: str = input('You: ') 41 | response, similarity = self.get_best_response(user_input) 42 | 43 | # 10. In case the user asks for the time 44 | if response == 'GET_TIME': 45 | response = f'The time is: {datetime.now():%H:%M}' 46 | 47 | print(f'{self.name}: {response} (Similarity: {similarity:.2%})') 48 | 49 | 50 | # 11. Create a main entry point 51 | def main() -> None: 52 | responses: dict[str, str] = { 53 | 'hello': 'Hello! How are you today?', 54 | 'how are you': 'Great, thanks! What about you?', 55 | 'what time is it': 'GET_TIME', 56 | 'bye': 'Goodbye! Have a great day!' 57 | } 58 | 59 | # 12. Create a ChatBot instance and start chatting 60 | chatbot: ChatBot = ChatBot(name='Bob', responses=responses) 61 | chatbot.run() 62 | 63 | 64 | # 13. Run the script 65 | if __name__ == '__main__': 66 | main() 67 | 68 | """ 69 | Homework: 70 | 1. Add more responses. 71 | 2. Add a way to exit the program through the chat. 72 | 3. Add some cool features, like checking for the weather forecast. 73 | 4. Make it so that if the accuracy falls below 50%, it returns a default response. 74 | 75 | """ 76 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | This repository contains the source code to the 10 projects from my Udemy course. 2 | 3 | To really progress in Python, remember to do the homework! 4 | --------------------------------------------------------------------------------