├── .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 |
4 |
5 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
--------------------------------------------------------------------------------