30 Days of Python Notes ?
30 Days of Python Notes ?
PYTHON
Beginner to Advance Guide
By Skill Foundry
Welcome to your journey into the world of Python programming with Skill
Foundry. Over the next 30 days, you’ll explore one of the most popular and
beginner-friendly programming languages used across industries like web
development, data science, automation, and artificial intelligence.
Python is a high-level, interpreted, and general-purpose programming language.
Known for its simple and readable syntax, Python is widely used by both beginners
and professionals. It was created by Guido van Rossum and first released in 1991
with the goal of making code more understandable and accessible. Since then, it
has evolved into one of the most powerful tools in modern software development.
This course is structured to help you learn Python step by step — from the very
basics to real-world applications. Each day introduces a focused topic along with
clear explanations, practical examples, and hands-on exercises to help you apply
what you learn immediately.
Whether you're starting from scratch or coming back to coding after a break, this
course is designed to build your confidence and problem-solving skills with
Python. You’ll understand how to write clean code, think logically, and begin
creating useful programs on your own.
No prior experience is required — just your curiosity and commitment to learning
something new every day. By the end of this challenge, you’ll not only understand
how Python works but also have the foundation to explore more advanced areas
like automation, scripting, or data analysis.
Let’s begin.
Environment Setup
Installing Python
To run a python script you need to install python. Let's download python. If your
are a windows user. Click the button encircled in red.
As you can see from the terminal, I am using Python 3.7.5 version at the moment. Your version
of Python might be different from mine by but it should be 3.6 or above. If you mange to see
the python version, well done. Python has been installed on your machine. Continue to the next
section.
Python Shell
Python is an interpreted scripting language, so it does not need to be compiled. It means it
executes the code line by line. Python comes with a Python Shell (Python Interactive Shell). It is used
to execute a single python command and get the result.
Python Shell waits for the Python code from the user. When you enter the code, it interprets the
code and shows the result in the next line. Open your terminal or command prompt(cmd) and
write:
python
The Python interactive shell is opened and it is waiting for you to write Python code(Python
script). You will write your Python script next to this symbol >>> and then click Enter. Let us
write our very first script on the Python scripting shell.
Now, you know how to open the Python interactive shell and how to exit from it.
Python will give you results if you write scripts that Python understands, if not it returns errors.
Let's make a deliberate mistake and see what Python will return.
As you can see from the returned error, Python is so clever that it knows the mistake we made
and which was Syntax Error: invalid syntax. Using x as multiplication in Python is a syntax error
because (x) is not a valid syntax in Python. Instead of (x) we use asterisk (*) for multiplication.
The returned error clearly shows what to fix.
The process of identifying and removing errors from a program is called debugging. Let us debug
it by putting * in place of x.
The Python interactive shell is opened. Let us do some basic mathematical operations (addition,
subtraction, multiplication, division, modulus, exponential).
3 * 2 is 6
3 / 2 is 1.5
3 ** 2 is the same as 3 * 3
Before we move on to the next section, let us practice more on the Python interactive shell.
Close the opened shell by writing exit() on the shell and open it again and let us practice how to
write text on the Python shell.
Create a folder named 30DaysOfPython on your desktop. Then open it using visual studio code.
After a long day of coding, you want to close your code editor, right? This is how you will close
the opened project.
Python Indentation
An indentation is a white space in a text. Indentation in many languages is used to increase code
readability; however, Python uses indentation to create blocks of code. In other programming
languages, curly brackets are used to create code blocks instead of indentation. One of the
common bugs when writing Python code is incorrect indentation.
Comments
Comments play a crucial role in enhancing code readability and allowing developers to leave
notes within their code. In Python, any text preceded by a hash (#) symbol is considered a
comment and is not executed when the code runs.
Example: Single Line Comment
# This is the first comment
# This is the second comment
# Python is eating the world
Example: Multiline Comment
Triple quote can be used for multiline comment if it is not assigned to a variable
"""This is multiline comment
multiline comment takes multiple lines.
python is eating the world
"""
Data types
Number
Integer: Integer(negative, zero and positive) numbers Example: ... -3, -2, -1, 0, 1, 2, 3 ...
Float: Decimal number Example ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
Complex Example 1 + j, 2 + 4j
String
A collection of one or more characters under a single or double quote. If a string is more than
one sentence then we use a triple quote.
Example:
'Asabeneh'
'Finland'
'Python'
'I love teaching'
'I hope you are enjoying the first day of 30DaysOfPython
Challenge'
Booleans
A boolean data type is either a True or False value. T and F should be always uppercase.
Example:
True # Is the light on? If it is on, then the value is
True
False # Is the light on? If it is off, then the value is
False
List
Python list is an ordered collection which allows to store different data type items. A list is
similar to an array in JavaScript.
Example:
[0, 1, 2, 3, 4, 5] # all are the same data types - a list of
numbers
['Banana', 'Orange', 'Mango', 'Avocado'] # all the same data
types - a list of strings (fruits)
['Finland','Estonia', 'Sweden','Norway'] # all the same data
types - a list of strings (countries)
Dictionary
A Python dictionary object is an unordered collection of data in a key value pair format.
Example:
{
'first_name':'Asabeneh',
'last_name':'Yetayeh',
'country':'Finland',
'age':250,
'is_married':True,
'skills':['JS', 'React', 'Node', 'Python']
}
Tuple
A tuple is an ordered collection of different data types like list but tuples can not be modified
once they are created. They are immutable.
Example:
('Asabeneh', 'Pawel', 'Brook', 'Abraham', 'Lidiya') # Names
('Earth', 'Jupiter', 'Neptune', 'Mars', 'Venus', 'Saturn',
'Uranus', 'Mercury') # planets
Set
A set is a collection of data types similar to list and tuple. Unlike list and tuple, set is not an
ordered collection of items. Like in Mathematics, set in Python stores only unique items.
In later sections, we will go in detail about each and every Python data type.
Example:
{2, 4, 3, 5}
{3.14, 9.81, 2.7} # order is not important in set
Python File
First open your project folder, 30DaysOfPython. If you don't have this folder, create a folder
name called 30DaysOfPython. Inside this folder, create a file called helloworld.py. Now, let's do
what we did on python interactive shell using visual studio code.
The Python interactive shell was printing without using print but on visual studio code to see
our result we should use a built in function _print(). The print() built-in function takes one or
more arguments as follows print('arument1', 'argument2', 'argument3'). See the examples below.
Example:
print(2 + 3) # addition(+)
print(3 - 1) # subtraction(-)
print(2 * 3) # multiplication(*)
print(3 / 2) # division(/)
print(3 ** 2) # exponential(**)
print(3 % 2) # modulus(%)
print(3 // 2) # Floor division operator(//)
🌕 You are amazing. You have just completed day 1 challenge and you are on your way to
greatness. Now do some exercises for your brain and muscles.
o addition(+)
o subtraction(-)
o multiplication(*)
o modulus(%)
o division(/)
o exponential(**)
o floor division operator(//)
3. Write strings on the python interactive shell. The strings are the following:
o Your name
o Your country
o I am enjoying 30 days of python
o 3.14
o 4 - 4j
o ['Asabeneh', 'Python', 'Finland']
o Your name
🎉 CONGRATULATIONS ! 🎉
Built in functions
In Python we have lots of built-in functions. Built-in functions are globally available for your use
that mean you can make use of the built-in functions without importing or configuring. Some of
the most commonly used Python built-in functions are the
following: print(), len(), type(), int(), float(), str(), input(), list(), dict(), min(), max(), sum(), sorted(), open(), fil
e(), help(), and dir(). In the following table you will see an exhaustive list of Python built-in
functions taken from python documentation.
Let us open the Python shell and start using some of the most common built-in functions.
Variables
Variables store data in a computer memory. Mnemonic variables are recommended to use in
many programming languages. A mnemonic variable is a variable name that can be easily
remembered and associated. A variable refers to a memory address in which data is stored.
Number at the beginning, special character, hyphen are not allowed when naming a variable. A
variable can have a short name (like x, y, z), but a more descriptive name (firstname, lastname,
age, country) is highly recommended.
Python Variable Name Rules
# Variables in Python
first_name = 'Asabeneh'
last_name = 'Yetayeh'
country = 'Finland'
city = 'Helsinki'
age = 250
is_married = True
skills = ['HTML', 'CSS', 'JS', 'React', 'Python']
person_info = {
'firstname':'Asabeneh',
'lastname':'Yetayeh',
'country':'Finland',
'city':'Helsinki'
}
Let us use the print() and len() built-in functions. Print function takes unlimited number of
arguments. An argument is a value which we can be passed or put inside the function
parenthesis, see the example below.
Example:
# Printing the values stored in the variables
print(first_name)
print(age)
# int to float
num_int = 10
print('num_int',num_int) # 10
num_float = float(num_int)
print('num_float:', num_float) # 10.0
# int to str
num_int = 10
print(num_int) # 10
num_str = str(num_int)
print(num_str) # '10'
# str to list
first_name = 'Asabeneh'
print(first_name) # 'Asabeneh'
first_name_to_list = list(first_name)
print(first_name_to_list) # ['A', 's', 'a', 'b',
'e', 'n', 'e', 'h']
Numbers
Number data types in Python:
1. Integers: Integer(negative, zero and positive) numbers Example: ... -3, -2, -1, 0, 1, 2, 3 ...
2. Floating Point Numbers(Decimal numbers) Example: ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5
...
3. Complex Numbers Example: 1 + j, 2 + 4j, 1 - 1j
🌕 You are awesome. You have just completed day 2 challenges and you are two steps ahead on
your way to greatness. Now do some exercises for your brain and muscles.
1. Check the data type of all your variables using type() built-in function
2. Using the len() built-in function, find the length of your first name
3. Compare the length of your first name and your last name
🎉 CONGRATULATIONS ! 🎉
Boolean
A boolean data type represents one of the two values: True or False. The use of
these data types will be clear once we start using the comparison operator. The first
letter T for True and F for False should be capital unlike JavaScript. Example:
Boolean Values
print(True)
print(False)
Operators
Python language supports several types of operators. In this section, we will focus
on few of them.
Assignment Operators
Assignment operators are used to assign values to variables. Let us take = as an
example. Equal sign in mathematics shows that two values are equal, however in
Python it means we are storing a value in a certain variable and we call it
assignment or a assigning value to a variable. The table below shows the different
types of python assignment operators, taken from w3school.
Addition(+): a + b
Subtraction(-): a - b
Multiplication(*): a * b
Division(/): a / b
Modulus(%): a % b
Floor division(//): a // b
Exponentiation(**): a ** b
Example:Integers
print('Addition: ', 1 + 2) # 3
print('Subtraction: ', 2 - 1) # 1
print('Multiplication: ', 2 * 3) # 6
print ('Division: ', 4 / 2) # 2.0 Division in Python
gives floating number
print('Division: ', 6 / 2) # 3.0
print('Division: ', 7 / 2) # 3.5
print('Division without the remainder: ', 7 // 2) # 3,
gives without the floating number or without the remaining
print ('Division without the remainder: ',7 // 3) # 2
print('Modulus: ', 3 % 2) # 1, Gives the remainder
print('Exponentiation: ', 2 ** 3) # 9 it means 2 * 2 * 2
Example:Complex numbers
# Complex numbers
print('Complex number: ', 1 + 1j)
print('Multiplying complex numbers: ',(1 + 1j) * (1 - 1j))
Let's declare a variable and assign a number data type. I am going to use single
character variable but remember do not develop a habit of declaring such types of
variables. Variable names should be all the time mnemonic.
Example:
# Declaring the variable at the top first
# Arithmetic operations
total = num_one + num_two
diff = num_two - num_one
product = num_one * num_two
div = num_two / num_one
remainder = num_two % num_one
Example:
# Calculating area of a circle
radius = 10 # radius of a
circle
area_of_circle = 3.14 * radius ** 2 # two * sign means
exponent or power
print('Area of a circle:', area_of_circle)
Logical Operators
Unlike other programming languages python uses keywords and, or and not for
logical operators. Logical operators are used to combine conditional statements:
11. Calculate the value of y (y = x^2 + 6x + 9). Try to use different x values and
figure out at what x value y is going to be 0.
12. Find the length of 'python' and 'dragon' and make a falsy comparison
statement.
13. Use and operator to check if 'on' is found in both 'python' and 'dragon'
14. I hope this course is not full of jargon. Use in operator to check if jargon is in
the sentence.
15. There is no 'on' in both dragon and python
16. Find the length of the text python and convert the value to float and convert it
to string
17. Even numbers are divisible by 2 and the remainder is zero. How do you check
if a number is even or not using python?
21. Writ a script that prompts the user to enter hours and rate per hour. Calculate
pay of the person?
Enter hours: 40
Enter rate per hour: 28
Your weekly earning is 1120
22. Write a script that prompts the user to enter number of years. Calculate the
number of seconds a person can live. Assume a person can live hundred
years
Enter number of years you have lived: 100
You have lived for 3153600000 seconds.
23. Write a Python script that displays the following table
1 1 1 1 1
2 1 2 4 8
3 1 3 9 27
4 1 4 16 64
5 1 5 25 125
🎉 CONGRATULATIONS ! 🎉
Strings
Text is a string data type. Any data type written as text is a string. Any data under
single, double or triple quote are strings. There are different string methods and built-
in functions to deal with string data types. To check the length of a string use the
len() method.
Creating a String
letter = 'P' # A string could be a single
character or a bunch of texts
print(letter) # P
print(len(letter)) # 1
greeting = 'Hello, World!' # String could be made using a
single or double quote,"Hello, World!"
print(greeting) # Hello, World!
print(len(greeting)) # 13
sentence = "I hope you are enjoying 30 days of Python
Challenge"
print(sentence)
Multiline string is created by using triple single (''') or triple double quotes ("""). See
the example below.
multiline_string = '''I am a teacher and enjoy teaching.
I didn't find anything as rewarding as empowering people.
That is why I created 30 days of python.'''
print(multiline_string)
String Concatenation
We can connect strings together. Merging or connecting strings is called
concatenation. See the example below:
first_name = 'Asabeneh'
last_name = 'Yetayeh'
space = ' '
full_name = first_name + space + last_name
print(full_name) # Asabeneh Yetayeh
Now, let us see the use of the above escape sequences with examples.
print('I hope everyone is enjoying the Python Challenge.\nAre
you ?') # line break
print('Days\tTopics\tExercises') # adding tab space or 4
spaces
print('Day 1\t5\t5')
print('Day 2\t6\t20')
print('Day 3\t5\t23')
print('Day 4\t1\t35')
print('This is a backslash symbol (\\)') # To write a
backslash
print('In every programming language it starts with \"Hello,
World!\"') # to write a double quote inside a single quote
# output
I hope every one is enjoying the Python Challenge.
Are you ?
Days Topics Exercises
Day 1 5 5
Day 2 6 20
Day 3 5 23
Day 4 1 35
This is a backslash symbol (\)
In every programming language it starts with "Hello, World!"
# output
4 + 3 = 7
4 - 3 = 1
4 * 3 = 12
4 / 3 = 1.33
4 % 3 = 1
4 // 3 = 1
4 ** 3 = 64
Another new string formatting is string interpolation, f-strings. Strings start with f and
we can inject the data in their corresponding positions.
a = 4
b = 3
print(f'{a} + {b} = {a +b}')
print(f'{a} - {b} = {a - b}')
print(f'{a} * {b} = {a * b}')
print(f'{a} / {b} = {a / b:.2f}')
print(f'{a} % {b} = {a % b}')
print(f'{a} // {b} = {a // b}')
print(f'{a} ** {b} = {a ** b}')
Unpacking Characters
language = 'Python'
print(a) # P
print(b) # y
print(c) # t
print(d) # h
print(e) # o
print(f) # n
Accessing Characters in Strings by Index
In programming counting starts from zero. Therefore the first letter of a string is at
zero index and the last letter of a string is the length of a string minus one.
language = 'Python'
first_letter = language[0]
print(first_letter) # P
second_letter = language[1]
print(second_letter) # y
last_index = len(language) - 1
last_letter = language[last_index]
print(last_letter) # n
If we want to start from right end we can use negative indexing. -1 is the last index.
language = 'Python'
last_letter = language[-1]
print(last_letter) # n
second_last = language[-2]
Reversing a String
String Methods
There are many string methods which allow us to format strings. See some of the
string methods in the following example:
radius = 10
pi = 3.14
area = pi * radius ** 2
result = 'The area of a circle with radius {} is
{}'.format(str(radius), str(area))
challenge = '30DaysPython'
print(challenge.isalnum()) # True
isalpha(): Checks if all string elements are alphabet characters (a-z and A-Z)
challenge = 'thirty days of python'
print(challenge.isalpha()) # False, space is once again
excluded
challenge = 'ThirtyDaysPython'
print(challenge.isalpha()) # True
num = '123'
print(num.isalpha()) # False
isdecimal(): Checks if all characters in a string are decimal (0-9)
challenge = 'thirty days of python'
print(challenge.isdecimal()) # False
challenge = '123'
print(challenge.isdecimal()) # True
challenge = '\u00B2'
print(challenge.isdigit()) # False
🌕 You are an extraordinary person and you have a remarkable potential. You have
just completed day 4 challenges and you are four steps a head in to your way to
greatness. Now do some exercises for your brain and muscles.
💻 Exercises - Day 4
2. Concatenate the string 'Coding', 'For' , 'All' to a single string, 'Coding For All'.
5. Print the length of the company string using len() method and print().
10. Check if Coding For All string contains a word Coding using the method index,
find or other methods.
11. Replace the word coding in the string 'Coding For All' to Python.
12. Change Python for Everyone to Python for All using the replace method or
other methods.
13. Split the string 'Coding For All' using space as the separator (split()) .
14. "Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon" split the string at
the comma.
15. What is the character at index 0 in the string Coding For All.
16. What is the last index of the string Coding For All.
18. Create an acronym or an abbreviation for the name 'Python For Everyone'.
19. Create an acronym or an abbreviation for the name 'Coding For All'.
20. Use index to determine the position of the first occurrence of C in Coding For
All.
21. Use index to determine the position of the first occurrence of F in Coding For
All.
22. Use rfind to determine the position of the last occurrence of l in Coding For All
People.
25. Slice out the phrase 'because because because' in the following sentence:
'You cannot end a sentence with because because because is a conjunction'
26. Find the position of the first occurrence of the word 'because' in the following
sentence: 'You cannot end a sentence with because because because is a
conjunction'
27. Slice out the phrase 'because because because' in the following sentence:
'You cannot end a sentence with because because because is a conjunction'
28. Does ''Coding For All' start with a substring Coding?
30. ' Coding For All ' , remove the left and right trailing spaces in the given
string.
31. Which one of the following variables return True when we use the method
isidentifier():
o 30DaysOfPython
o thirty_days_of_python
32. The following list contains the names of some of python libraries: ['Django',
'Flask', 'Bottle', 'Pyramid', 'Falcon']. Join the list with a hash with space string.
33. Use the new line escape sequence to separate the following sentences.
I am enjoying this challenge.
I just wonder what is next.
34. Use a tab escape sequence to write the following lines.
Name Age Country City
Asabeneh 250 Finland Helsinki
35. Use the string formatting method to display the following:
radius = 10
area = 3.14 * radius ** 2
The area of a circle with radius 10 is 314 meters square.
36. Make the following using string formatting methods:
8 + 6 = 14
🎉 CONGRATULATIONS ! 🎉
Lists
There are four collection data types in Python :
List: is a collection which is ordered and changeable(modifiable). Allows
duplicate members.
Tuple: is a collection which is ordered and unchangeable or
unmodifiable(immutable). Allows duplicate members.
Set: is a collection which is unordered, un-indexed and unmodifiable, but we
can add new items to the set. Duplicate members are not allowed.
Dictionary: is a collection which is unordered, changeable(modifiable) and
indexed. No duplicate members.
A list is collection of different data types which is ordered and modifiable(mutable). A
list can be empty or it may have different data type items.
Lists with initial values. We use len() to find the length of a list.
output
Fruits: ['banana', 'orange', 'mango', 'lemon']
Number of fruits: 4
Vegetables: ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
Number of vegetables: 5
Animal products: ['milk', 'meat', 'butter', 'yoghurt']
Number of animal products: 4
Web technologies: ['HTML', 'CSS', 'JS', 'React', 'Redux',
'Node', 'MongDB']
Number of web technologies: 7
Countries: ['Finland', 'Estonia', 'Denmark', 'Sweden',
'Norway']
Number of countries: 5
Lists can have items of different data types
lst = ['Asabeneh', 250, True, {'country':'Finland',
'city':'Helsinki'}] # list containing different data types
# First Example
fruits = ['banana', 'orange', 'mango', 'lemon','lime','apple']
first_fruit, second_fruit, third_fruit, *rest = fruits
print(first_fruit) # banana
print(second_fruit) # orange
print(third_fruit) # mango
print(rest) # ['lemon','lime','apple']
# Second Example about unpacking list
first, second, third,*rest, tenth = [1,2,3,4,5,6,7,8,9,10]
print(first) # 1
print(second) # 2
print(third) # 3
print(rest) # [4,5,6,7,8,9]
print(tenth) # 10
# Third Example about unpacking list
countries = ['Germany',
'France','Belgium','Sweden','Denmark','Finland','Norway','Icel
and','Estonia']
gr, fr, bg, sw, *scandic, es = countries
print(gr)
print(fr)
print(bg)
print(sw)
print(scandic)
print(es)
Modifying Lists
List is a mutable or modifiable ordered collection of items. Lets modify the fruit list.
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits[0] = 'avocado'
print(fruits) # ['avocado', 'orange', 'mango', 'lemon']
fruits[1] = 'apple'
print(fruits) # ['avocado', 'apple', 'mango', 'lemon']
last_index = len(fruits) - 1
fruits[last_index] = 'lime'
print(fruits) # ['avocado', 'apple', 'mango', 'lime']
Checking Items in a List
Checking an item if it is a member of a list using in operator. See the example below.
fruits = ['banana', 'orange', 'mango', 'lemon']
does_exist = 'banana' in fruits
print(does_exist) # True
does_exist = 'lime' in fruits
print(does_exist) # False
Adding Items to a List
To add item to the end of an existing list we use the method append().
# syntax
lst = list()
lst.append(item)
fruits.pop(0)
print(fruits) # ['orange', 'mango']
Removing Items Using Del
The del keyword removes the specified index and it can also be used to delete items
within index range. It can also delete the list completely
# syntax
lst = ['item1', 'item2']
del lst[index] # only a single item
del lst # to delete the list completely
Joining Lists
There are several ways to join, or concatenate, two or more lists in Python.
positive_numbers = [1, 2, 3, 4, 5]
zero = [0]
negative_numbers = [-5,-4,-3,-2,-1]
integers = negative_numbers + zero + positive_numbers
print(integers) # [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']
vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion',
'Carrot']
fruits_and_vegetables = fruits + vegetables
print(fruits_and_vegetables ) # ['banana', 'orange', 'mango',
'lemon', 'Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
Joining using extend() method The extend() method allows to append list in a
list. See the example below.
# syntax
list1 = ['item1', 'item2']
list2 = ['item3', 'item4', 'item5']
list1.extend(list2)
num1 = [0, 1, 2, 3]
num2= [4, 5, 6]
num1.extend(num2)
print('Numbers:', num1) # Numbers: [0, 1, 2, 3, 4, 5, 6]
negative_numbers = [-5,-4,-3,-2,-1]
positive_numbers = [1, 2, 3,4,5]
negative_numbers.extend(zero)
negative_numbers.extend(positive_numbers)
print('Integers:', negative_numbers) # Integers: [-5, -4, -3,
-2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']
vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion',
'Carrot']
fruits.extend(vegetables)
print('Fruits and vegetables:', fruits ) # Fruits and
vegetables: ['banana', 'orange', 'mango', 'lemon', 'Tomato',
'Potato', 'Cabbage', 'Onion', 'Carrot']
Counting Items in a List
The count() method returns the number of times an item appears in a list:
# syntax
lst = ['item1', 'item2']
lst.count(item)
Reversing a List
Example:
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.sort()
print(fruits) # sorted in alphabetical order,
['banana', 'lemon', 'mango', 'orange']
fruits.sort(reverse=True)
print(fruits) # ['orange', 'mango', 'lemon', 'banana']
ages = [22, 19, 24, 25, 26, 24, 25, 24]
ages.sort()
print(ages) # [19, 22, 24, 24, 24, 25, 25, 26]
ages.sort(reverse=True)
print(ages) # [26, 25, 25, 24, 24, 24, 22, 19]
sorted(): returns the ordered list without modifying the original list Example:
fruits = ['banana', 'orange', 'mango', 'lemon']
print(sorted(fruits)) # ['banana', 'lemon', 'mango',
'orange']
# Reverse order
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits = sorted(fruits,reverse=True)
print(fruits) # ['orange', 'mango', 'lemon', 'banana']
🌕 You are diligent and you have already achieved quite a lot. You have just
completed day 5 challenges and you are 5 steps a head in to your way to greatness.
Now do some exercises for your brain and muscles.
Exercises: Level 1
1. Declare an empty list
4. Get the first item, the middle item and the last item of the list
5. Declare a list called mixed_data_types, put your(name, age, height, marital
status, address)
20. Slice out the middle IT company or companies from the list
Exercises: Level 2
Add the min age and the max age again to the list
Find the median age (one middle item or two middle items divided by two)
Find the average age (sum of all items divided by their number )
🎉 CONGRATULATIONS ! 🎉
Tuples
A tuple is a collection of different data types which is ordered and unchangeable
(immutable). Tuples are written with round brackets, (). Once a tuple is created, we
cannot change its values. We cannot use add, insert, remove methods in a tuple
because it is not modifiable (mutable). Unlike list, tuple has few methods. Methods
related to tuples:
Creating a Tuple
Empty tuple: Creating an empty tuple
# syntax
empty_tuple = ()
# or using the tuple constructor
empty_tuple = tuple()
Tuple with initial values
# syntax
tpl = ('item1', 'item2','item3')
fruits = ('banana', 'orange', 'mango', 'lemon')
Tuple length
# Syntax
tpl = ('item1', 'item2', 'item3')
first_item = tpl[0]
second_item = tpl[1]
# Syntax
tpl = ('item1', 'item2', 'item3','item4')
first_item = tpl[-4]
second_item = tpl[-3]
Slicing tuples
Joining Tuples
Deleting Tuples
It is not possible to remove a single item in a tuple but it is possible to delete the
tuple itself using del.
# syntax
tpl1 = ('item1', 'item2', 'item3')
del tpl1
🌕 You are so brave, you made it to this far. You have just completed day 6
challenges and you are 6 steps a head in to your way to greatness. Now do some
exercises for your brain and for your muscle.
Exercises: Level 1
1. Create an empty tuple
2. Create a tuple containing names of your sisters and your brothers (imaginary
siblings are fine)
5. Modify the siblings tuple and add the name of your father and mother and
assign it to family_members
Exercises: Level 2
4. Slice out the middle item or items from the food_stuff_tp tuple or food_stuff_lt
list.
5. Slice out the first three items and the last three items from food_staff_lt list
Creating a Set
We use the set() built-in function.
Checking an Item
To check if an item exist in a list we use in membership operator.
# syntax
st = {'item1', 'item2', 'item3', 'item4'}
Once a set is created we cannot change any items and we can also add additional
items.
Example:
Example:
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.clear()
print(fruits) # set()
Deleting a Set
If we want to delete the set itself we use del operator.
# syntax
st = {'item1', 'item2', 'item3', 'item4'}
del st
Example:
fruits = {'banana', 'orange', 'mango', 'lemon'}
del fruits
Joining Sets
If two sets do not have a common item or items we call them disjoint sets. We can
check if two sets are joint or disjoint using isdisjoint() method.
# syntax
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
st2.isdisjoint(st1) # False
Example:
even_numbers = {0, 2, 4 ,6, 8}
odd_numbers = {1, 3, 5, 7, 9}
even_numbers.isdisjoint(odd_numbers) # True, because no common
item
🌕 You are a rising star . You have just completed day 7 challenges and you are 7
steps ahead in to your way to greatness. Now do some exercises for your brain and
muscles.
Exercises: Level 1
Exercises: Level 2
1. Join A and B
2. Find A intersection B
3. Is A subset of B
4. Are A and B disjoint sets
Exercises: Level 3
1. Convert the ages to a set and compare the length of the list and the set, which
one is bigger?
2. Explain the difference between the following data types: string, list, tuple and
set
3. I am a teacher and I love to inspire and teach people. How many unique
words have been used in the sentence? Use the split methods and set to get
the unique words.
🎉 CONGRATULATIONS ! 🎉
Creating a Dictionary
To create a dictionary we use curly brackets, {} or the dict() built-in function.
# syntax
empty_dict = {}
# Dictionary with data values
dct = {'key1':'value1', 'key2':'value2', 'key3':'value3',
'key4':'value4'}
Example:
person = {
'first_name':'Asabeneh',
'last_name':'Yetayeh',
'age':250,
'country':'Finland',
'is_marred':True,
'skills':['JavaScript', 'React', 'Node', 'MongoDB',
'Python'],
'address':{
'street':'Space street',
'zipcode':'02210'
}
}
The dictionary above shows that a value could be any data types:string, boolean, list,
tuple, set or a dictionary.
Dictionary Length
Example:
person = {
'first_name':'Asabeneh',
'last_name':'Yetayeh',
'age':250,
'country':'Finland',
'is_marred':True,
'skills':['JavaScript', 'React', 'Node', 'MongoDB',
'Python'],
'address':{
'street':'Space street',
'zipcode':'02210'
}
}
person['job_title'] = 'Instructor'
person['skills'].append('HTML')
print(person)
Modifying Items in a Dictionary
Clearing a Dictionary
If we don't want the items in a dictionary we can clear them using clear() method
# syntax
dct = {'key1':'value1', 'key2':'value2', 'key3':'value3',
'key4':'value4'}
print(dct.clear()) # None
Deleting a Dictionary
Copy a Dictionary
🎉 CONGRATULATIONS ! 🎉
If Condition
In python and other programming languages the key word if is used to check if a
condition is true and to execute the block code. Remember the indentation after the
colon.
# syntax
if condition:
this part of code runs for truthy conditions
Example: 1
a = 3
if a > 0:
print('A is a positive number')
# A is a positive number
As you can see in the example above, 3 is greater than 0. The condition was true
and the block code was executed. However, if the condition is false, we do not see
the result. In order to see the result of the falsy condition, we should have another
block, which is going to be else.
If Else
If condition is true the first block will be executed, if not the else condition will run.
# syntax
if condition:
this part of code runs for truthy conditions
else:
this part of code runs for false conditions
Example:
If Elif Else
In our daily life, we make decisions on daily basis. We make decisions not by
checking one or two conditions but multiple conditions. As similar to life,
programming is also full of conditions. We use elif when we have multiple conditions.
# syntax
if condition:
code
elif condition:
code
else:
code
Example:
a = 0
if a > 0:
print('A is a positive number')
elif a < 0:
print('A is a negative number')
else:
print('A is zero')
Short Hand
# syntax
code if condition else code
Example:
a = 3
print('A is positive') if a > 0 else print('A is negative') #
first condition met, 'A is positive' will be printed
Nested Conditions
Example:
user = 'James'
access_level = 3
🌕 You are doing great.Never give up because great things take time. You have just
completed day 9 challenges and you are 9 steps a head in to your way to greatness.
Now do some exercises for your brain and muscles.
Exercises: Level 1
1. Get user input using input(“Enter your age: ”). If user is 18 or older, give
feedback: You are old enough to drive. If below 18 give feedback to wait for
the missing amount of years. Output:
Enter your age: 30
You are old enough to learn to drive.
Output:
Enter your age: 15
You need 3 more years to learn to drive.
2. Compare the values of my_age and your_age using if … else. Who is older
(me or you)? Use input(“Enter your age: ”) to get the age as input. You can
use a nested condition to print 'year' for 1 year difference in age, 'years' for
bigger differences, and a custom text if my_age = your_age. Output:
Enter your age: 30
You are 5 years older than me.
3. Get two numbers from the user using input prompt. If a is greater than b
return a is greater than b, if a is less b return a is smaller than b, else a is
equal to b. Output:
Enter number one: 4
Enter number two: 3
4 is greater than 3
Exercises: Level 2
1. Write a code which gives grade to students according to theirs scores:
80-100, A
70-89, B
60-69, C
50-59, D
0-49, F
2. Check if the season is Autumn, Winter, Spring or Summer. If the user input is:
September, October or November, the season is Autumn. December, January
or February, the season is Winter. March, April or May, the season is Spring
June, July or August, the season is Summer
Exercises: Level 3
🎉 CONGRATULATIONS ! 🎉
1. while loop
2. for loop
While Loop
We use the reserved word while to make a while loop. It is used to execute a block
of statements repeatedly until a given condition is satisfied. When the condition
becomes false, the lines of code after the loop will be continued to be executed.
# syntax
while condition:
code goes here
Example:
count = 0
while count < 5:
print(count)
count = count + 1
#prints from 0 to 4
In the above while loop, the condition becomes false when count is 5. That is when
the loop stops. If we are interested to run block of code once the condition is no
longer true, we can use else.
# syntax
while condition:
code goes here
else:
code goes here
Example:
count = 0
while count < 5:
print(count)
count = count + 1
else:
print(count)
The above loop condition will be false when count is 5 and the loop stops, and
execution starts the else statement. As a result 5 will be printed.
Continue: With the continue statement we can skip the current iteration, and
continue with the next:
# syntax
while condition:
code goes here
if another_condition:
continue
Example:
count = 0
while count < 5:
if count == 3:
count = count + 1
continue
print(count)
count = count + 1
The above while loop only prints 0, 1, 2 and 4 (skips 3).
For Loop
A for keyword is used to make a for loop, similar with other programming languages,
but with some syntax differences. Loop is used for iterating over a sequence (that is
either a list, a tuple, a dictionary, a set, or a string).
Example:
language = 'Python'
for letter in language:
print(letter)
for i in range(len(language)):
print(language[i])
For loop with tuple
# syntax
for iterator in tpl:
code goes here
Example:
numbers = (0, 1, 2, 3, 4, 5)
for number in numbers:
print(number)
For loop with dictionary Looping through a dictionary gives you the key of the
dictionary.
# syntax
for iterator in dct:
code goes here
Example:
person = {
'first_name':'Asabeneh',
'last_name':'Yetayeh',
'age':250,
Loops in set
# syntax
for iterator in st:
code goes here
Example:
it_companies = {'Facebook', 'Google', 'Microsoft', 'Apple',
'IBM', 'Oracle', 'Amazon'}
for company in it_companies:
print(company)
Example:
numbers = (0,1,2,3,4,5)
for number in numbers:
print(number)
if number == 3:
break
Example:
numbers = (0,1,2,3,4,5)
for number in numbers:
print(number)
if number == 3:
continue
print('Next number should be ', number + 1) if number != 5
else print("loop's end") # for short hand conditions need both
if and else statements
print('outside the loop')
In the example above, if the number equals 3, the step after the condition (but inside
the loop) is skipped and the execution of the loop continues if there are any iterations
left.
lst = list(range(0,11,2))
print(lst) # [0, 2, 4, 6, 8, 10]
st = set(range(0,11,2))
print(st) # {0, 2, 4, 6, 8, 10}
# syntax
for iterator in range(start, end, step):
Example:
person = {
'first_name': 'Asabeneh',
'last_name': 'Yetayeh',
'age': 250,
'country': 'Finland',
'is_marred': True,
'skills': ['JavaScript', 'React', 'Node', 'MongoDB',
'Python'],
'address': {
'street': 'Space street',
'zipcode': '02210'
}
}
for key in person:
if key == 'skills':
for skill in person['skills']:
print(skill)
For Else
If we want to execute some message when the loop ends, we use else.
# syntax
for iterator in range(start, end, step):
do something
else:
print('The loop ended')
Pass
In python when statement is required (after semicolon), but we don't like to execute
any code there, we can write the word pass to avoid errors. Also we can use it as a
placeholder, for future statements.
Example:
for number in range(6):
pass
🌕 You established a big milestone, you are unstoppable. Keep going! You have just
completed day 10 challenges and you are 10 steps a head in to your way to
greatness. Now do some exercises for your brain and muscles.
Exercises: Level 1
1. Iterate 0 to 10 using for loop, do the same using while loop.
8. Use for loop to iterate from 0 to 100 and print only odd numbers
Exercises: Level 2
2. This is a fruit list, ['banana', 'orange', 'mango', 'lemon'] reverse the order using
loop.
ii. Find the ten most spoken languages from the data
🎉 CONGRATULATIONS ! 🎉
Defining a Function
A function is a reusable block of code or programming statements designed to
perform a certain task. To define or declare a function, Python provides
the def keyword. The following is the syntax for defining a function. The function
block of code is executed only if the function is called or invoked.
In a function we can pass different data types(number, string, boolean, list, tuple,
dictionary or set) as a parameter
Single Parameter: If our function takes a parameter we should call our
function with an argument
# syntax
# Declaring a function
def function_name(parameter):
codes
codes
# Calling function
print(function_name(argument))
Example:
def greetings (name):
print(greetings('Asabeneh'))
def add_ten(num):
ten = 10
return num + ten
print(add_ten(90))
def square_number(x):
return x * x
print(square_number(2))
def sum_of_numbers(n):
total = 0
for i in range(n+1):
total+=i
print(total)
print(sum_of_numbers(10)) # 55
print(sum_of_numbers(100)) # 5050
Two Parameter: A function may or may not have a parameter or parameters. A
function may also have two or more parameters. If our function takes
parameters we should call it with arguments. Let us check a function with two
parameters:
# syntax
# Declaring a function
def function_name(para1, para2):
codes
codes
# Calling function
print(function_name(arg1, arg2))
Example:
def generate_full_name (first_name, last_name):
space = ' '
full_name = first_name + space + last_name
return full_name
print('Full Name: ', generate_full_name('Asabeneh','Yetayeh'))
If we pass the arguments with key and value, the order of the arguments does not
matter.
# syntax
# Declaring a function
def function_name(para1, para2):
codes
codes
# Calling function
print(function_name(para1 = 'John', para2 = 'Doe')) # the
order of arguments does not matter here
Example:
def print_fullname(firstname, lastname):
space = ' '
full_name = firstname + space + lastname
print(full_name)
print(print_fullname(firstname = 'Asabeneh', lastname =
'Yetayeh'))
Example:
def add_two_numbers (num1, num2):
total = num1 + num2
return total
print(add_two_numbers(2, 3))
Example:
def greetings (name = 'Peter'):
message = name + ', welcome to Python for Everyone!'
return message
print(greetings())
print(greetings('Asabeneh'))
print(generate_full_name())
print(generate_full_name('David','Smith'))
Example:
def sum_all_nums(*nums):
total = 0
for num in nums:
total += num # same as total = total + num
return total
print(sum_all_nums(2, 3, 5)) # 10
🌕 You achieved quite a lot so far. Keep going! You have just completed day 11
challenges and you are 11 steps a head in to your way to greatness. Now do some
exercises for your brain and muscles.
Testimony
💻 Exercises: Day 11
Exercises: Level 1
1. Declare a function add_two_numbers. It takes two parameters and it returns a
sum.
2. Area of a circle is calculated as follows: area = π x r x r. Write a function that
calculates area_of_circle.
11. Declare a function named add_item. It takes a list and an item parameters. It
returns a list with the item added at the end.
food_staff = ['Potato', 'Tomato', 'Mango', 'Milk']
print(add_item(food_staff, 'Meat')) # ['Potato', 'Tomato',
'Mango', 'Milk','Meat']
numbers = [2, 3, 7, 9]
print(add_item(numbers, 5)) [2, 3, 7, 9, 5]
Exercises: Level 2
1. Declare a function named evens_and_odds . It takes a positive integer as
parameter and it counts number of evens and odds in the number.
print(evens_and_odds(100))
# The number of odds are 50.
# The number of evens are 51.
1. Call your function factorial, it takes a whole number as a parameter and it
return a factorial of the number
2. Call your function is_empty, it takes a parameter and it checks if it is empty or
not
3. Write different functions which take lists. They should calculate_mean,
calculate_median, calculate_mode, calculate_range, calculate_variance,
calculate_std (standard deviation).
Exercises: Level 3
2. Write a functions which checks if all items are unique in the list.
🎉 CONGRATULATIONS !
What is a Module
A module is a file containing a set of codes or a set of functions which can be
included to an application. A module could be a file containing a single variable, a
function or a big code base.
Creating a Module
To create a module we write our codes in a python script and we save it as a .py file.
Create a file named mymodule.py inside your project folder. Let us write some code
in this file.
# mymodule.py file
def generate_full_name(firstname, lastname):
return firstname + ' ' + lastname
Create main.py file in your project directory and import the mymodule.py file.
Importing a Module
To import the file we use the import keyword and the name of the file only.
# main.py file
import mymodule
print(mymodule.generate_full_name('Asabeneh', 'Yetayeh')) #
Asabeneh Yetayeh
We can have many functions in a file and we can import all the functions differently.
# main.py file
from mymodule import generate_full_name, sum_two_nums, person,
gravity
print(generate_full_name('Asabneh','Yetayeh'))
print(sum_two_nums(1,9))
mass = 100;
weight = mass * gravity
print(weight)
print(person['firstname'])
OS Module
Using python os module it is possible to automatically perform many operating
system tasks. The OS module in Python provides functions for creating, changing
current working directory, and removing a directory (folder), fetching its contents,
changing and identifying the current directory.
# import the module
import os
# Creating a directory
os.mkdir('directory_name')
# Changing the current directory
os.chdir('path')
# Getting current working directory
os.getcwd()
# Removing directory
os.rmdir()
Sys Module
The sys module provides functions and variables used to manipulate different parts
of the Python runtime environment. Function sys.argv returns a list of command line
arguments passed to a Python script. The item at index 0 in this list is always the
name of the script, at index 1 is the argument passed from the command line.
Statistics Module
The statistics module provides functions for mathematical statistics of numeric data.
The popular statistical functions which are defined in this
module: mean, median, mode, stdev etc.
from statistics import * # importing all the statistics
modules
ages = [20, 20, 4, 24, 25, 22, 26, 20, 23, 22, 26]
print(mean(ages)) # ~22.9
print(median(ages)) # 23
print(mode(ages)) # 20
print(stdev(ages)) # ~2.3
Math Module
A string module is a useful module for many purposes. The example below shows
some use of the string module.
import string
print(string.ascii_letters) #
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits) # 0123456789
print(string.punctuation) # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Random Module
🌕 You are going far. Keep going! You have just completed day 12 challenges and
you are 12 steps a head in to your way to greatness. Now do some exercises for
your brain and muscles.
Exercises: Level 1
1. Writ a function which generates a six digit/character random_user_id.
print(random_user_id());
'1ee33d'
2. Modify the previous task. Declare a function named user_id_gen_by_user. It
doesn’t take any parameters but it takes two inputs using input(). One of the
inputs is the number of characters and the second input is the number of IDs
which are supposed to be generated.
print(user_id_gen_by_user()) # user input: 5 5
#output:
#kcsy2
#SMFYb
#bWmeq
#ZXOYh
#2Rgxf
print(user_id_gen_by_user()) # 16 5
#1GCSgPLMaBAVQZ26
#YD7eFwNQKNs7qXaT
#ycArC5yrRupyG00S
#UbGxOFI7UXSWAyKN
#dIV0SSUTgAdKwStr
3. Write a function named rgb_color_gen. It will generate rgb colors (3 values
ranging from 0 to 255 each).
print(rgb_color_gen())
# rgb(125,244,255) - the output should be in this form
Exercises: Level 2
1. Write a function list_of_hexa_colors which returns any number of hexadecimal
colors in an array (six hexadecimal numbers written after #. Hexadecimal
numeral system is made out of 16 symbols, 0-9 and first 6 letters of the
alphabet, a-f. Check the task 6 for output examples).
2. Write a function list_of_rgb_colors which returns any number of RGB colors in
an array.
3. Write a function generate_colors which can generate any number of hexa or
rgb colors.
generate_colors('hexa', 3) #
['#a3e12f','#03ed55','#eb3d2b']
generate_colors('hexa', 1) # ['#b334ef']
🎉 CONGRATULATIONS ! 🎉
List Comprehension
List comprehension in Python is a compact way of creating a list from a sequence. It
is a short way to create a new list. List comprehension is considerably faster than
processing a list using the for loop.
# syntax
[i for i in iterable if expression]
Example:1
For instance if you want to change a string to a list of characters. You can use a
couple of methods. Let's see some of them:
# One way
language = 'Python'
lst = list(language) # changing the string to list
print(type(lst)) # list
print(lst) # ['P', 'y', 't', 'h', 'o', 'n']
Example:2
# Generating numbers
numbers = [i for i in range(11)] # to generate numbers from 0
to 10
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10]
Lambda Function
Lambda function is a small anonymous function without a name. It can take any
number of arguments, but can only have one expression. Lambda function is similar
to anonymous functions in JavaScript. We need it when we want to write an
anonymous function inside another function.
Example:
print(add_two_nums(2, 3)) # 5
# Lets change the above function to a lambda function
add_two_nums = lambda a, b: a + b
print(add_two_nums(2,3)) # 5
square = lambda x : x ** 2
print(square(3)) # 9
cube = lambda x : x ** 3
print(cube(3)) # 27
# Multiple variables
multiple_variable = lambda a, b, c: a ** 2 - 3 * b + 4 * c
print(multiple_variable(5, 5, 3)) # 22
🌕 Keep up the good work. Keep the momentum going, the sky is the limit! You
have just completed day 13 challenges and you are 13 steps a head in to your way
to greatness. Now do some exercises for your brain and muscles.
💻 Exercises: Day 13
output
[1, 2, 3, 4, 5, 6, 7, 8, 9]
🎉 CONGRATULATIONS ! 🎉
Function as a Parameter
def sum_numbers(nums): # normal function
return sum(nums) # a sad function abusing the built-in
sum function :<
result = higher_order_function('square')
print(result(3)) # 9
result = higher_order_function('cube')
print(result(3)) # 27
result = higher_order_function('absolute')
print(result(-3)) # 3
You can see from the above example that the higher order function is returning
different functions depending on the passed parameter
Python Closures
Python allows a nested function to access the outer scope of the enclosing function.
This is is known as a Closure. Let us have a look at how closures work in Python. In
Python, closure is created by nesting a function inside another encapsulating
function and then returning the inner function. See the example below.
Example:
def add_ten():
ten = 10
def add(num):
return num + ten
return add
closure_result = add_ten()
print(closure_result(5)) # 15
print(closure_result(10)) # 20
Python Decorators
A decorator is a design pattern in Python that allows a user to add new functionality
to an existing object without modifying its structure. Decorators are usually called
before the definition of a function you want to decorate.
Creating Decorators
Example:
# Normal function
def greeting():
return 'Welcome to Python'
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
g = uppercase_decorator(greeting)
print(g()) # WELCOME TO PYTHON
# First Decorator
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
# Second decorator
def split_string_decorator(function):
def wrapper():
func = function()
return wrapper
@split_string_decorator
@uppercase_decorator # order with decorators is important
in this case - .upper() function does not work with lists
def greeting():
return 'Welcome to Python'
print(greeting()) # WELCOME TO PYTHON
@decorator_with_parameters
def print_full_name(first_name, last_name, country):
print("I am {} {}. I love to teach.".format(
first_name, last_name, country))
print_full_name("Asabeneh", "Yetayeh",'Finland')
The map() function is a built-in function that takes a function and iterable as
parameters.
# syntax
map(function, iterable)
Example:1
numbers = [1, 2, 3, 4, 5] # iterable
def square(x):
Example:3
names = ['Asabeneh', 'Lidiya', 'Ermias', 'Abraham'] #
iterable
def change_to_upper(name):
return name.upper()
Example:1
# Lets filter only even nubers
numbers = [1, 2, 3, 4, 5] # iterable
def is_odd(num):
if num % 2 != 0:
return True
return False
💻 Exercises: Day 14
2. Explain the difference between higher order function, closure and decorator
Exercises: Level 2
1. Use map to create a new list by changing each country to uppercase in the
countries list
2. Use map to create a new list by changing each number to its square in the
numbers list
10. Use reduce to sum all the numbers in the numbers list.
11. Use reduce to concatenate all the countries and to produce this sentence:
Estonia, Finland, Sweden, Denmark, Norway, and Iceland are north European
countries
12. Declare a function called categorize_countries that returns a list of countries
with some common pattern (you can find the countries list in this repository as
countries.js(eg 'land', 'ia', 'island', 'stan')).
🎉 CONGRATULATIONS ! 🎉
Let us see the most common error types one by one. First let us open our Python
interactive shell. Go to your you computer terminal and write 'python'. The python
interactive shell will be opened.
SyntaxError
Example 1: SyntaxError
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> print 'hello world'
File "<stdin>", line 1
print 'hello world'
^
SyntaxError: Missing parentheses in call to 'print'. Did you
mean print('hello world')?
>>>
As you can see we made a syntax error because we forgot to enclose the string with
parenthesis and Python already suggests the solution. Let us fix it.
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> print 'hello world'
File "<stdin>", line 1
print 'hello world'
^
SyntaxError: Missing parentheses in call to 'print'. Did you
mean print('hello world')?
>>> print('hello world')
NameError
Example 1: NameError
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> print(age)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'age' is not defined
>>>
As you can see from the message above, name age is not defined. Yes, it is true that
we did not define an age variable but we were trying to print it out as if we had had
declared it. Now, lets fix this by declaring it and assigning with a value.
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> print(age)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'age' is not defined
>>> age = 25
>>> print(age)
25
>>>
The type of error was a NameError. We debugged the error by defining the variable
name.
IndexError
ModuleNotFoundError
Example 1: ModuleNotFoundError
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> import maths
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'maths'
>>>
In the example above, I added an extra s to math deliberately
and ModuleNotFoundError was raised. Lets fix it by removing the extra s from math.
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> import maths
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'maths'
>>> import math
>>>
We fixed it, so let's use some of the functions from the math module.
KeyError
Example 1: KeyError
TypeError
Example 1: TypeError
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> 4 + '3'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>>
In the example above, a TypeError is raised because we cannot add a number to a
string. First solution would be to convert the string to int or float. Another solution
ImportError
Example 1: TypeError
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> from math import power
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'power' from 'math'
>>>
There is no function called power in the math module, it goes with a different
name: pow. Let's correct it:
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> from math import power
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'power' from 'math'
>>> from math import pow
>>> pow(2,3)
8.0
>>>
We have covered some of the python error types, if you want to check more about it
check the python documentation about python error types. If you are good at reading
the error types then you will be able to fix your bugs fast and you will also become a
better programmer.
🌕 You are excelling. You made it to half way to your way to greatness. Now do
some exercises for your brain and for your muscle.
💻 Exercises: Day 15
1. Open you python interactive shell and try all the examples covered in this
section.
Python datetime
Python has got datetime module to handle date and time.
import datetime
print(dir(datetime))
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__',
'__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', 'date', 'datetime',
'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone',
'tzinfo']
With dir or help built-in commands it is possible to know the available functions in a
certain module. As you can see, in the datetime module there are many functions,
but we will focus on date, datetime, time and timedelta. Let se see them one by one.
Formatting date time using strftime method and the documentation can be
found here.
time: 01:05:01
time one: 12/05/2019, 01:05:01
time two: 05/12/2019, 01:05:01
Here are all the strftime symbols we use to format time. An example of all the
formats for this module.
output
a = 00:00:00
b = 10:30:50
c = 10:30:50
d = 10:30:50.200555
🌕 You are an extraordinary. You are 16 steps a head to your way to greatness. Now
do some exercises for your brain and muscles.
1. Get the current day, month, year, hour, minute and timestamp from datetime
module
6. Think, what can you use the datetime module for? Examples:
🎉 CONGRATULATIONS ! 🎉
Exception Handling
Python uses try and except to handle errors gracefully. A graceful exit (or graceful
handling) of errors is a simple programming idiom - a program detects a serious
error condition and "exits gracefully", in a controlled manner as a result. Often the
program prints a descriptive error message to a terminal or log as part of the graceful
exit, this makes our application more robust. The cause of an exception is often
external to the program itself. An example of exceptions could be an incorrect input,
wrong file name, unable to find a file, a malfunctioning IO device. Graceful handling
of errors prevents our applications from crashing.
We have covered the different Python error types in the previous section. If we
use try and except in our program, then it will not raise errors in those blocks.
try:
code in this block if things go well
except:
code in this block run if things go wrong
Example:
try:
name = input('Enter your name:')
year_born = input('Year you were born:')
age = 2019 - year_born
print(f'You are {name}. And your age is {age}.')
except:
print('Something went wrong')
In the above example, the exception block will run and we do not know exactly the
problem. To analyze the problem, we can use the different error types with except.
In the following example, it will handle the error and will also tell us the kind of error
raised.
try:
name = input('Enter your name:')
year_born = input('Year you were born:')
age = 2019 - year_born
print(f'You are {name}. And your age is {age}.')
except TypeError:
print('Type error occured')
except ValueError:
print('Value error occured')
except ZeroDivisionError:
print('zero division error occured')
try:
name = input('Enter your name:')
year_born = input('Year you born:')
age = 2019 - int(year_born)
print(f'You are {name}. And your age is {age}.')
except Exception as e:
print(e)
* for tuples
** for dictionaries
Let us take as an example below. It takes only arguments but we have list. We can
unpack the list and changes to argument.
Unpacking
Unpacking Lists
def sum_of_five_nums(a, b, c, d, e):
lst = [1, 2, 3, 4, 5]
print(sum_of_five_nums(lst)) # TypeError: sum_of_five_nums()
missing 4 required positional arguments: 'b', 'c', 'd', and
'e'
When we run the this code, it raises an error, because this function takes numbers
(not a list) as arguments. Let us unpack/destructure the list.
def sum_of_five_nums(a, b, c, d, e):
return a + b + c + d + e
lst = [1, 2, 3, 4, 5]
print(sum_of_five_nums(*lst)) # 15
We can also use unpacking in the range built-in function that expects a start and an
end.
numbers = range(2, 7) # normal call with separate arguments
print(list(numbers)) # [2, 3, 4, 5, 6]
args = [2, 7]
numbers = range(*args) # call with arguments unpacked from a
list
print(numbers) # [2, 3, 4, 5,6]
Unpacking Dictionaries
def unpacking_person_info(name, country, city, age):
return f'{name} lives in {country}, {city}. He is {age}
year old.'
dct = {'name':'Asabeneh', 'country':'Finland',
'city':'Helsinki', 'age':250}
print(unpacking_person_info(**dct)) # Asabeneh lives in
Finland, Helsinki. He is 250 years old.
Packing
Packing Lists
def sum_all(*args):
s = 0
for i in args:
s += i
return s
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5, 6, 7)) # 28
Packing Dictionaries
def packing_person_info(**kwargs):
# check the type of kwargs and it is a dict type
# print(type(kwargs))
# Printing dictionary items
for key in kwargs:
print(f"{key} = {kwargs[key]}")
return kwargs
print(packing_person_info(name="Asabeneh",
country="Finland", city="Helsinki", age=250))
name = Asabeneh
country = Finland
city = Helsinki
age = 250
{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki',
'age': 250}
Spreading in Python
Like in JavaScript, spreading is possible in Python. Let us check it in an example
below:
lst_one = [1, 2, 3]
lst_two = [4, 5, 6, 7]
lst = [0, *lst_one, *lst_two]
print(lst) # [0, 1, 2, 3, 4, 5, 6, 7]
country_lst_one = ['Finland', 'Sweden', 'Norway']
country_lst_two = ['Denmark', 'Iceland']
nordic_countries = [*country_lst_one, *country_lst_two]
print(nordic_countries) # ['Finland', 'Sweden', 'Norway',
'Denmark', 'Iceland']
Enumerate
Zip
Sometimes we would like to combine lists when looping through them. See the
example below:
fruits = ['banana', 'orange', 'mango', 'lemon', 'lime']
vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot']
fruits_and_veges = []
for f, v in zip(fruits, vegetables):
fruits_and_veges.append({'fruit':f, 'veg':v})
print(fruits_and_veges)
🌕 You are determined. You are 17 steps a head to your way to greatness. Now do
some exercises for your brain and muscles.
🎉 CONGRATULATIONS ! 🎉
The re Module
Match
# syntac
re.match(substring, string, re.I)
# substring is a string or a pattern, string is the text we
look for a pattern , re.I is case ignore
import re
As you can see from the example above, the pattern we are looking for (or the
substring we are looking for) is I love to teach. The match function returns an
object only if the text starts with the pattern.
import re
The string does not string with I like to teach, therefore there was no match and the
match method returned None.
Search
# syntax
re.match(substring, string, re.I)
# substring is a pattern, string is the text we look for a
pattern , re.I is case ignore flag
import re
# It return a list
matches = re.findall('language', txt, re.I)
print(matches) # ['language', 'language']
As you can see, the word language was found two times in the string. Let us practice
some more. Now we will look for both Python and python words in the string:
txt = '''Python is the most beautiful language that a human
being has ever created.
I recommend python for a first programming language'''
# It returns list
matches = re.findall('python', txt, re.I)
print(matches) # ['Python', 'python']
Since we are using re.I both lowercase and uppercase letters are included. If we do
not have the re.I flag, then we will have to write our pattern differently. Let us check it
out:
txt = '''Python is the most beautiful language that a human
being has ever created.
I recommend python for a first programming language'''
#
matches = re.findall('[Pp]ython', txt)
print(matches) # ['Python', 'python']
Replacing a Substring
txt = '''Python is the most beautiful language that a human
being has ever created.
I recommend python for a first programming language'''
regex_pattern = r'apple'
txt = 'Apple and banana are fruits. An old cliche says an
apple a day a doctor way has been replaced by a banana a day
keeps the doctor far far away. '
matches = re.findall(regex_pattern, txt)
print(matches) # ['apple']
o [a-c] means, a or b or c
o [0-3] means, 0 or 1 or 2 or 3
o \d means: match where the string contains digits (numbers from 0-9)
^: starts with
$: ends with
o r'substring$' eg r'love$', sentence that ends with a word love
|: Either or
o r'apple|banana' means either apple or a banana
Period(.)
regex_pattern = r'[a].' # this square bracket means a and .
means any character except new line
txt = '''Apple and banana are fruits'''
matches = re.findall(regex_pattern, txt)
print(matches) # ['an', 'an', 'an', 'a ', 'ar']
Zero or many times. The pattern could may not occur or it can occur many times.
regex_pattern = r'[a].*' # . any character, * any character
zero or more times
txt = '''Apple and banana are fruits'''
Zero or one time. The pattern may not occur or it may occur once.
Quantifier in RegEx
We can specify the length of the substring we are looking for in a text, using a curly
bracket. Let us imagine, we are interested in a substring with a length of 4
characters:
txt = 'This regular expression example was made on December 6,
2019 and revised on July 8, 2021'
regex_pattern = r'\d{4}' # exactly four times
matches = re.findall(regex_pattern, txt)
print(matches) # ['2019', '2021']
Cart ^
Starts with
txt = 'This regular expression example was made on December 6,
2019 and revised on July 8, 2021'
Exercises: Level 1
1. What is the most frequent word in the following paragraph?
paragraph = 'I love teaching. If you do not love teaching
what else can you love. I love Python if you do not love
something which can give you all the capabilities to develop
an application what else can you love.
[
(6, 'love'),
(5, 'you'),
(3, 'can'),
(2, 'what'),
(2, 'teaching'),
(2, 'not'),
(2, 'else'),
(2, 'do'),
(2, 'I'),
(1, 'which'),
(1, 'to'),
(1, 'the'),
(1, 'something'),
(1, 'if'),
(1, 'give'),
(1, 'develop'),
(1, 'capabilities'),
(1, 'application'),
(1, 'an'),
(1, 'all'),
(1, 'Python'),
(1, 'If')
]
2. The position of some particles on the horizontal x-axis are -12, -4, -3 and -1 in
the negative direction, 0 at origin, 4 and 8 in the positive direction. Extract
these numbers from this whole text and find the distance between the two
furthest particles.
points = ['-12', '-4', '-3', '-1', '0', '4', '8']
sorted_points = [-12, -4, -3, -1, -1, 0, 2, 4, 8]
distance = 8 -(-12) # 20
print(clean_text(sentence));
I am a teacher and I love teaching There is nothing as more
rewarding as educating and empowering people I found teaching
more interesting than any other jobs Does this motivate you to
be a teacher
🎉 CONGRATULATIONS ! 🎉
"a" - Append - Opens a file for appending, creates the file if it does not exist
"w" - Write - Opens a file for writing, creates the file if it does not exist
"x" - Create - Creates the specified file, returns an error if the file exists
# output
<class 'str'>
This is an example to show how to open a file and read.
This is the second line of the text.
Instead of printing all the text, let us print the first 10 characters of the text file.
f = open('./files/reading_file_example.txt')
txt = f.read(10)
print(type(txt))
print(txt)
f.close()
# output
<class 'str'>
This is an
readline(): read only the first line
f = open('./files/reading_file_example.txt')
line = f.readline()
print(type(line))
print(line)
f.close()
# output
<class 'str'>
This is an example to show how to open a file and read.
readlines(): read all the text line by line and returns a list of lines
f = open('./files/reading_file_example.txt')
lines = f.readlines()
print(type(lines))
print(lines)
f.close()
# output
<class 'list'>
['This is an example to show how to open a file and read.\n',
'This is the second line of the text.']
# output
<class 'list'>
['This is an example to show how to open a file and read.',
'This is the second line of the text.']
After we open a file, we should close it. There is a high tendency of forgetting to
close them. There is a new way of opening files using with - closes the files by itself.
Let us rewrite the the previous example with the with method:
with open('./files/reading_file_example.txt') as f:
lines = f.read().splitlines()
print(type(lines))
print(lines)
# output
<class 'list'>
['This is an example to show how to open a file and read.',
'This is the second line of the text.']
"a" - append - will append to the end of the file, if the file does not it creates a
new file.
"w" - write - will overwrite any existing content, if the file does not exist it
creates.
Deleting Files
File Types
# output
<class 'dict'>
{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki',
'skills': ['JavaScrip', 'React', 'Python']}
Asabeneh
To change a dictionary to a JSON we use dumps method from the json module.
import json
# python dictionary
person = {
"name": "Asabeneh",
"country": "Finland",
"city": "Helsinki",
"skills": ["JavaScrip", "React", "Python"]
}
# let's convert it to json
person_json = json.dumps(person, indent=4) # indent could be
2, 4, 8. It beautifies the json
print(type(person_json))
print(person_json)
# output
# when you print it, it does not have the quote, but actually
it is a string
# JSON does not have type, it is a string type.
<class 'str'>
{
"name": "Asabeneh",
In the code above, we use encoding and indentation. Indentation makes the json file
easy to read.
File with csv Extension
CSV stands for comma separated values. CSV is a simple file format used to store
tabular data, such as a spreadsheet or database. CSV is a very common data format
in data science.
Example:
"name","country","city","skills"
"Asabeneh","Finland","Helsinki","JavaScript"
Example:
import csv
with open('./files/csv_example.csv') as f:
# output:
Column names are :name, country, city, skills
Asabeneh is a teacher. He lives in Finland, Helsinki.
Number of lines: 2
For more information on how to read an XML file check the documentation
# output
Root tag: person
Attribute: {'gender': 'male'}
field: name
field: country
field: city
field: skills
🌕 You are making a big progress. Maintain your momentum, keep the good work.
Now do some exercises for your brain and muscles.
Exercises: Level 1
1. Write a function which count number of lines and number of words in a text.
All the files are in the data the folder: a) Read obama_speech.txt file and
count number of lines and words b) Read michelle_obama_speech.txt file and
count number of lines and words c) Read donald_speech.txt file and count
number of lines and words d) Read melina_trump_speech.txt file and count
number of lines and words
2. Read the countries_data.json data file in data directory, create a function that
finds the ten most spoken languages
# Your output should look like this
print(most_spoken_languages(filename='./data/countries_data.js
on', 10))
[(91, 'English'),
(45, 'French'),
(25, 'Arabic'),
(24, 'Spanish'),
(9, 'Russian'),
(9, 'Portuguese'),
(8, 'Dutch'),
(7, 'German'),
(5, 'Chinese'),
(4, 'Swahili'),
(4, 'Serbian')]
3. Read the countries_data.json data file in data directory, create a function that
creates a list of the ten most populated countries
# Your output should look like this
print(most_populated_countries(filename='./data/countries_data
.json', 10))
[
{'country': 'China', 'population': 1377422166},
{'country': 'India', 'population': 1295210000},
{'country': 'United States of America', 'population':
323947000},
{'country': 'Indonesia', 'population': 258705000},
print(most_populated_countries(filename='./data/countries_data
.json', 3))
[
{'country': 'China', 'population': 1377422166},
{'country': 'India', 'population': 1295210000},
{'country': 'United States of America', 'population':
323947000}
]
Exercises: Level 2
4. Extract all incoming email addresses as a list from the
email_exchange_big.txt file.
5. Find the most common words in the English language. Call the name of your
function find_most_common_words, it will take two parameters - a string or a
file and a positive integer, indicating the number of words. Your function will
return an array of tuples in descending order. Check the output
# Your output should look like this
print(find_most_common_words('sample.txt', 10))
[(10, 'the'),
(8, 'be'),
(6, 'to'),
(6, 'of'),
(5, 'and'),
(4, 'a'),
(4, 'in'),
(3, 'that'),
(2, 'have'),
(2, 'I')]
[(10, 'the'),
(8, 'be'),
(6, 'to'),
(6, 'of'),
🎉 CONGRATULATIONS ! 🎉
What is PIP ?
PIP stands for Preferred installer program. We use pip to install different Python
packages. Package is a Python module that can contain one or more modules or
other packages. A module or modules that we can install to our application is a
package. In programming, we do not have to write every utility program, instead we
install packages and import them to our applications.
Installing PIP
If you did not install pip, let us install it now. Go to your terminal or command prompt
and copy and paste this:
asabeneh@Asabeneh:~$ pip install pip
Check if pip is installed by writing
pip –version
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> import numpy
>>> numpy.version.version
'1.20.1'
>>> lst = [1, 2, 3,4, 5]
>>> np_arr = numpy.array(lst)
>>> np_arr
array([1, 2, 3, 4, 5])
>>> len(np_arr)
5
>>> np_arr * 2
array([ 2, 4, 6, 8, 10])
>>> np_arr + 2
array([3, 4, 5, 6, 7])
>>>
Pandas is an open source, BSD-licensed library providing high-performance, easy-
to-use data structures and data analysis tools for the Python programming language.
Let us install the big brother of numpy, pandas:
asabeneh@Asabeneh:~$ pip install pandas
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> import pandas
This section is not about numpy nor pandas, here we are trying to learn how to install
packages and how to import them. If it is needed, we will talk about different
packages in other sections.
Let us import a web browser module, which can help us to open any website. We do
not need to install this module, it is already installed by default with Python 3. For
instance if you like to open any number of websites at any time or if you like to
schedule something, this webbrowser module can be used.
import webbrowser # web browser module to open websites
Uninstalling Packages
If you do not like to keep the installed packages, you can remove them using the
following command.
pip uninstall packagename
List of Packages
To see the installed packages on our machine. We can use pip followed by list.
pip list
Show Package
PIP Freeze
Generate installed Python packages with their version and the output is suitable to
use it in a requirements file. A requirements.txt file is a file that should contain all the
installed Python packages in a Python project.
asabeneh@Asabeneh:~$ pip freeze
docutils==0.11
Jinja2==2.7.2
MarkupSafe==0.19
Pygments==1.6
Sphinx==1.2.2
The pip freeze gave us the packages used, installed and their version. We use it with
requirements.txt file for deployment.
get(): to open a network and fetch data from url - it returns a response object
status_code: After we fetched data, we can check the status of the operation
(success, error, etc)
headers: To check the header types
<Response [200]>
200
{'date': 'Sun, 08 Dec 2019 18:00:31 GMT', 'last-modified':
'Fri, 07 Nov 2003 05:51:11 GMT', 'etag': '"17e9-
3cb82080711c0;50c0b26855880-gzip"', 'accept-ranges': 'bytes',
'cache-control': 'max-age=31536000', 'expires': 'Mon, 07 Dec
2020 18:00:31 GMT', 'vary': 'Accept-Encoding', 'content-
encoding': 'gzip', 'access-control-allow-origin': '*',
'content-length': '1616', 'content-type': 'text/plain',
'strict-transport-security': 'max-age=15552000;
includeSubdomains; preload', 'content-security-policy':
'upgrade-insecure-requests'}
<Response [200]>
200
[{'alpha2Code': 'AF',
'alpha3Code': 'AFG',
'altSpellings': ['AF', 'Afġānistān'],
'area': 652230.0,
'borders': ['IRN', 'PAK', 'TKM', 'UZB', 'TJK', 'CHN'],
'callingCodes': ['93'],
'capital': 'Kabul',
'cioc': 'AFG',
'currencies': [{'code': 'AFN', 'name': 'Afghan afghani',
'symbol': '؋'}],
'demonym': 'Afghan',
'flag': 'https://restcountries.eu/data/afg.svg',
'gini': 27.8,
'languages': [{'iso639_1': 'ps',
'iso639_2': 'pus',
'name': 'Pashto',
'nativeName': '}'پښتو,
{'iso639_1': 'uz',
'iso639_2': 'uzb',
'name': 'Uzbek',
'nativeName': 'Oʻzbek'},
{'iso639_1': 'tk',
'iso639_2': 'tuk',
'name': 'Turkmen',
'nativeName': 'Türkmen'}],
'latlng': [33.0, 65.0],
'name': 'Afghanistan',
'nativeName': ''افغانستان,
'numericCode': '004',
'population': 27657145,
'region': 'Asia',
'regionalBlocs': [{'acronym': 'SAARC',
We use json() method from response object, if the we are fetching JSON data. For
txt, html, xml and other file formats we can use text.
Creating a Package
# mypackage/greet.py
# greet.py
def greet_person(firstname, lastname):
return f'{firstname} {lastname}, welcome to 30DaysOfPython
Challenge!'
The folder structure of your package should look like this:
─ mypackage
├── __init__.py
├── arithmetic.py
└── greet.py
Now let's open the python interactive shell and try the package we have created:
asabeneh@Asabeneh:~/Desktop/30DaysOfPython$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> from mypackage import arithmetics
>>> arithmetics.add_numbers(1, 2, 3, 5)
11
>>> arithmetics.subtract(5, 3)
2
>>> arithmetics.multiple(5, 3)
15
>>> arithmetics.division(5, 3)
1.6666666666666667
>>> arithmetics.remainder(5, 3)
2
>>> arithmetics.power(5, 3)
125
>>> from mypackage import greet
>>> greet.greet_person('Asabeneh', 'Yetayeh')
'Asabeneh Yetayeh, welcome to 30DaysOfPython Challenge!'
>>>
Database
Web Development
HTML Parser
o Beautiful Soup - HTML/XML parser designed for quick turnaround
projects like screen-scraping, will accept bad markup.
pip install beautifulsoup4
o PyQuery - implements jQuery in Python; faster than BeautifulSoup,
apparently.
XML Processing
o ElementTree - The Element type is a simple but flexible container
object, designed to store hierarchical data structures, such as
simplified XML infosets, in memory. --Note: Python 2.5 and up has
ElementTree in the Standard Library
GUI
o PyQt - Bindings for the cross-platform Qt framework.
Network:
o requests: is a package which we can use to send requests to a
server(GET, POST, DELETE, PUT)
🌕 You are always progressing and you are a head of 20 steps to your way to
greatness. Now do some exercises for your brain and muscles.
🎉 CONGRATULATIONS ! 🎉
We have been working with classes and objects right from the beginning of this
challenge unknowingly. Every element in a Python program is an object of a class.
Let us check if everything in python is a class:
asabeneh@Asabeneh:~$ python
Python 3.9.6 (default, Jun 28 2021, 15:26:21)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> num = 10
>>> type(num)
<class 'int'>
>>> string = 'string'
>>> type(string)
<class 'str'>
>>> boolean = True
>>> type(boolean)
<class 'bool'>
>>> lst = []
>>> type(lst)
<class 'list'>
>>> tpl = ()
>>> type(tpl)
<class 'tuple'>
>>> set1 = set()
>>> type(set1)
<class 'set'>
>>> dct = {}
>>> type(dct)
<class 'dict'>
p = Person('Asabeneh')
print(p.name)
print(p)
# output
Asabeneh
<__main__.Person object at 0x2abf46907e80>
# output
Asabeneh
Yetayeh
250
Finland
Helsinki
Object Methods
Objects can have methods. The methods are functions which belong to the object.
Example:
class Person:
def __init__(self, firstname, lastname, age, country,
city):
self.firstname = firstname
self.lastname = lastname
self.age = age
self.country = country
self.city = city
def person_info(self):
return f'{self.firstname} {self.lastname} is
{self.age} years old. He lives in {self.city}, {self.country}'
# output
Example:
class Person:
def __init__(self, firstname='Asabeneh',
lastname='Yetayeh', age=250, country='Finland',
city='Helsinki'):
self.firstname = firstname
self.lastname = lastname
self.age = age
self.country = country
self.city = city
def person_info(self):
return f'{self.firstname} {self.lastname} is
{self.age} years old. He lives in {self.city},
{self.country}.'
p1 = Person()
print(p1.person_info())
p2 = Person('John', 'Doe', 30, 'Nomanland', 'Noman city')
print(p2.person_info())
# output
Asabeneh Yetayeh is 250 years old. He lives in Helsinki,
Finland.
John Doe is 30 years old. He lives in Noman city, Nomanland.
class Person:
def person_info(self):
return f'{self.firstname} {self.lastname} is
{self.age} years old. He lives in {self.city},
{self.country}.'
def add_skill(self, skill):
self.skills.append(skill)
p1 = Person()
print(p1.person_info())
p1.add_skill('HTML')
p1.add_skill('CSS')
p1.add_skill('JavaScript')
p2 = Person('John', 'Doe', 30, 'Nomanland', 'Noman city')
print(p2.person_info())
print(p1.skills)
print(p2.skills)
# output
Asabeneh Yetayeh is 250 years old. He lives in Helsinki,
Finland.
John Doe is 30 years old. He lives in Noman city, Nomanland.
['HTML', 'CSS', 'JavaScript']
[]
Inheritance
Using inheritance we can reuse parent class code. Inheritance allows us to define a
class that inherits all the methods and properties from parent class. The parent class
or super or base class is the class which gives all the methods and properties. Child
class is the class that inherits from another or parent class. Let us create a student
class by inheriting from person class.
class Student(Person):
pass
print(s2.person_info())
s2.add_skill('Organizing')
s2.add_skill('Marketing')
s2.add_skill('Digital Marketing')
print(s2.skills)
output
Eyob Yetayeh is 30 years old. He lives in Helsinki, Finland.
['JavaScript', 'React', 'Python']
Lidiya Teklemariam is 28 years old. He lives in Espoo,
Finland.
['Organizing', 'Marketing', 'Digital Marketing']
We did not call the init() constructor in the child class. If we didn't call it then we can
still access all the properties from the parent. But if we do call the constructor we can
access the parent properties by calling super.
We can add a new method to the child or we can override the parent class methods
by creating the same method name in the child class. When we add the init()
function, the child class will no longer inherit the parent's init() function.
print(s2.person_info())
s2.add_skill('Organizing')
s2.add_skill('Marketing')
s2.add_skill('Digital Marketing')
print(s2.skills)
We can use super() built-in function or the parent name Person to automatically
inherit the methods and properties from its parent. In the example above we override
the parent method. The child method has a different feature, it can identify, if the
gender is male or female and assign the proper pronoun(He/She).
🌕 Now, you are fully charged with a super power of programming. Now do some
exercises for your brain and muscles.
Exercises: Level 1
1. Python has the module called statistics and we can use this module to do all
the statistical calculations. However, to learn how to make function and reuse
function let us try to develop a program, which calculates the measure of
central tendency of a sample (mean, median, mode) and measure of
variability (range, variance, standard deviation). In addition to those
measures, find the min, max, count, percentile, and frequency distribution of
the sample. You can create a class called Statistics and create all the
functions that do statistical calculations as methods for the Statistics class.
Check the output below.
ages = [31, 26, 34, 37, 27, 26, 32, 32, 26, 27, 27, 24, 32,
33, 27, 25, 26, 38, 37, 31, 34, 24, 33, 29, 26]
print('Count:', data.count()) # 25
print('Sum: ', data.sum()) # 744
print('Min: ', data.min()) # 24
print('Max: ', data.max()) # 38
print('Range: ', data.range() # 14
print('Mean: ', data.mean()) # 30
print('Median: ', data.median()) # 29
print('Mode: ', data.mode()) # {'mode': 26, 'count': 5}
print('Standard Deviation: ', data.std()) # 4.2
print('Variance: ', data.var()) # 17.5
print('Frequency Distribution: ', data.freq_dist()) # [(20.0,
26), (16.0, 27), (12.0, 32), (8.0, 37), (8.0, 34), (8.0, 33),
(8.0, 31), (8.0, 24), (4.0, 38), (4.0, 29), (4.0, 25)]
Web scraping is the process of extracting and collecting data from websites and
storing it on a local machine or in a database.
In this section, we will use beautifulsoup and requests package to scrape data. The
package version we are using is beautifulsoup 4.
# Lets use the requests get method to fetch the data from url
response = requests.get(url)
# lets check the status
status = response.status_code
print(status) # 200 means the fetching was successful
200
response = requests.get(url)
content = response.content # we get all the content from the
website
soup = BeautifulSoup(content, 'html.parser') # beautiful soup
will give a chance to parse
print(soup.title) # <title>UCI Machine Learning Repository:
Data Sets</title>
print(soup.title.get_text()) # UCI Machine Learning
Repository: Data Sets
print(soup.body) # gives the whole page on the website
print(response.status_code)
If you run this code, you can see that the extraction is half done. You can continue
doing it because it is part of exercise 1. For reference check the beautifulsoup
documentation
🌕 You are so special, you are progressing everyday. You are left with only eight
days to your way to greatness. Now do some exercises for your brain and muscles.
1. Scrape the following website and store the data as json file(url =
'http://www.bu.edu/president/boston-university-facts-stats/').
🎉 CONGRATULATIONS ! 🎉
For Windows:
C:\Users\User\Documents\30DaysOfPython\flask_project>python -m
venv venv
I prefer to call the new project venv, but feel free to name it differently. Let us check if
the the venv was created by using ls (or dir for windows command prompt)
command.
asabeneh@Asabeneh:~/Desktop/30DaysOfPython/flask_project$ ls
venv/
Let us activate the virtual environment by writing the following command at our
project folder.
For Mac/Linux:
asabeneh@Asabeneh:~/Desktop/30DaysOfPython/flask_project$
source venv/bin/activate
Activation of the virtual environment in Windows may very on Windows Power shell
and git bash.
We are going to do a small flask project so let us install flask package to this project.
(venv)
asabeneh@Asabeneh:~/Desktop/30DaysOfPython/flask_project$ pip
install Flask
Now, let us write pip freeze to see a list of installed packages in the project:
(venv)
asabeneh@Asabeneh:~/Desktop/30DaysOfPython/flask_project$ pip
freeze
Click==7.0
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
Werkzeug==0.16.0
When you finish you should dactivate active project using deactivate.
(venv) asabeneh@Asabeneh:~/Desktop/30DaysOfPython$ deactivate
The necessary modules to work with flask are installed. Now, your project directory is
ready for a flask project. You should include the venv to your .gitignore file not to
push it to github.
🎉 CONGRATULATIONS ! 🎉
Statistics
Statistics is the discipline that studies
the collection, organization, displaying, analysing, interpretation and presentation of
data. Statistics is a branch of Mathematics that is recommended to be a prerequisite
for data science and machine learning. Statistics is a very broad field but we will
focus in this section only on the most relevant part. After completing this challenge,
you may go onto the web development, data analysis, machine learning and data
science path. Whatever path you may follow, at some point in your career you will
get data which you may work on. Having some statistical knowledge will help you to
make decisions based on data, data tells as they say.
Data
What is data? Data is any set of characters that is gathered and translated for some
purpose, usually analysis. It can be any character, including text and numbers,
pictures, sound, or video. If data is not put in a context, it doesn't make any sense to
a human or computer. To make sense from data we need to work on the data using
different tools.
The work flow of data analysis, data science or machine learning starts from data.
Data can be provided from some data source or it can be created. There are
structured and unstructured data.
Data can be found in small or big format. Most of the data types we will get have
been covered in the file handling section.
Statistics Module
The Python statistics module provides functions for calculating mathematical
statistics of numerical data. The module is not intended to be a competitor to third-
party libraries such as NumPy, SciPy, or proprietary full-featured statistics packages
aimed at professional statisticians such as Minitab, SAS and Matlab. It is aimed at
the level of graphing and scientific calculators.
NumPy
Importing NumPy
numpy_array_from_list = np.array(python_list)
print(type (numpy_array_from_list)) # <class
'numpy.ndarray'>
print(numpy_array_from_list) # array([1, 2, 3, 4, 5])
Creating float numpy arrays
Creating a float numpy array from list with a float data type parameter
<class 'numpy.ndarray'>
[[0 1 2]
[3 4 5]
[6 7 8]]
<class 'list'>
one dimensional array: [1, 2, 3, 4, 5]
two dimensional array: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
numpy_array_from_tuple = np.array(python_tuple)
print(type (numpy_array_from_tuple)) # <class 'numpy.ndarray'>
print('numpy_array_from_tuple: ', numpy_array_from_tuple) #
numpy_array_from_tuple: [1 2 3 4 5]
[1 2 3 4 5]
shape of nums: (5,)
[[0 1 2]
[3 4 5]
[6 7 8]]
shape of numpy_two_dimensional_list: (3, 3)
(3, 4)
print(int_array)
print(int_array.dtype)
print(float_array)
print(float_array.dtype)
In numpy to know the number of items in a numpy array list we use size
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
two_dimensional_list = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
The size: 5
The size: 9
NumPy array is not like exactly like python list. To do mathematical operation in
Python list we have to loop through the items but numpy can allow to do any
mathematical operation without looping. Mathematical Operation:
Addition (+)
Subtraction (-)
Multiplication (*)
Division (/)
Modules (%)
Floor Division(//)
Exponential(**)
Addition
# Mathematical Operation
# Addition
original array: [1 2 3 4 5]
[11 12 13 14 15]
Subtraction
# Subtraction
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
print('original array: ', numpy_array_from_list)
ten_minus_original = numpy_array_from_list - 10
print(ten_minus_original)
original array: [1 2 3 4 5]
[-9 -8 -7 -6 -5]
Multiplication
# Multiplication
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
print('original array: ', numpy_array_from_list)
ten_times_original = numpy_array_from_list * 10
print(ten_times_original)
original array: [1 2 3 4 5]
[10 20 30 40 50]
Division
# Division
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
print('original array: ', numpy_array_from_list)
ten_times_original = numpy_array_from_list / 10
print(ten_times_original)
original array: [1 2 3 4 5]
[0.1 0.2 0.3 0.4 0.5]
Modulus
# Modulus; Finding the remainder
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
original array: [1 2 3 4 5]
[1 2 0 1 2]
Floor Division
# Floor division: the division result without the remainder
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
print('original array: ', numpy_array_from_list)
ten_times_original = numpy_array_from_list // 10
print(ten_times_original)
Exponential
# Exponential is finding some number the power of another:
numpy_array_from_list = np.array([1, 2, 3, 4, 5])
print('original array: ', numpy_array_from_list)
ten_times_original = numpy_array_from_list ** 2
print(ten_times_original)
original array: [1 2 3 4 5]
[ 1 4 9 16 25]
print(numpy_int_arr.dtype)
print(numpy_float_arr.dtype)
print(numpy_bool_arr.dtype)
int64
float64
bool
Converting types
We can convert the data types of numpy array
1. Int to Float
2. Float to Int
numpy_int_arr = np.array([1., 2., 3., 4.], dtype = 'int')
numpy_int_arr
array([1, 2, 3, 4])
3. Int ot boolean
np.array([-3, -2, 0, 1,2,3], dtype='bool')
Multi-dimensional Arrays
# 2 Dimension Array
two_dimension_array = np.array([(1,2,3),(4,5,6), (7,8,9)])
print(type (two_dimension_array))
print(two_dimension_array)
print('Shape: ', two_dimension_array.shape)
print('Size:', two_dimension_array.size)
print('Data type:', two_dimension_array.dtype)
<class 'numpy.ndarray'>
[[1 2 3]
[4 5 6]
[7 8 9]]
Shape: (3, 3)
Size: 9
Data type: int64
First row: [1 2 3]
Second row: [4 5 6]
Third row: [7 8 9]
first_column= two_dimension_array[:,0]
second_column = two_dimension_array[:,1]
third_column = two_dimension_array[:,2]
print('First column:', first_column)
print('Second column:', second_column)
print('Third column: ', third_column)
print(two_dimension_array)
First column: [1 4 7]
Second column: [2 5 8]
Third column: [3 6 9]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2]
[4 5]]
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
array([[9, 8, 7],
[6, 5, 4],
[3, 2, 1]])
[[1 2 3]
[4 5 6]
[7 8 9]]
[[ 1 2 3]
[ 4 55 44]
[ 7 8 9]]
# Numpy Zeroes
# numpy.zeros(shape, dtype=float, order='C')
numpy_zeroes = np.zeros((3,3),dtype=int,order='C')
numpy_zeroes
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
# Numpy Zeroes
numpy_ones = np.ones((3,3),dtype=int,order='C')
print(numpy_ones)
[[1 1 1]
[1 1 1]
[1 1 1]]
twoes = numpy_ones * 2
# Reshape
# numpy.reshape(), numpy.flatten()
first_shape = np.array([(1,2,3), (4,5,6)])
print(first_shape)
reshaped = first_shape.reshape(3,2)
print(reshaped)
[[1 2 3]
[4 5 6]]
[[1 2]
flattened = reshaped.flatten()
flattened
array([1, 2, 3, 4, 5, 6])
## Horitzontal Stack
np_list_one = np.array([1,2,3])
np_list_two = np.array([4,5,6])
print(np_list_one + np_list_two)
[5 7 9]
Horizontal Append: [1 2 3 4 5 6]
## Vertical Stack
print('Vertical Append:', np.vstack((np_list_one,
np_list_two)))
0.018929887384753874
array([8, 8, 8, 2])
array([[3, 5, 3],
[7, 3, 6],
[2, 3, 3]])
(array([2., 0., 0., 0., 1., 2., 2., 0., 2., 0., 0., 1.,
2., 2., 1., 4., 3.,
4., 2., 7., 2., 2., 5., 4., 2., 4., 3., 2., 1.,
5., 3., 0., 3., 2.,
1., 0., 0., 1., 3., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 0., 1.]),
array([ 38.69307086, 40.37038529, 42.04769973,
43.72501417,
45.4023286 , 47.07964304, 48.75695748,
50.43427191,
52.11158635, 53.78890079, 55.46621523,
57.14352966,
58.8208441 , 60.49815854, 62.17547297,
63.85278741,
65.53010185, 67.20741628, 68.88473072,
70.56204516,
72.23935959, 73.91667403, 75.59398847,
77.27130291,
78.94861734, 80.62593178, 82.30324622,
83.98056065,
85.65787509, 87.33518953, 89.01250396,
90.6898184 ,
92.36713284, 94.04444727, 95.72176171,
97.39907615,
Matrix in numpy
four_by_four_matrix = np.matrix(np.ones((4,4), dtype=float))
four_by_four_matrix
np.asarray(four_by_four_matrix)[2] = 2
four_by_four_matrix
Numpy numpy.arange()
What is Arrange?
Sometimes, you want to create values that are evenly spaced within a defined
interval. For instance, you want to create values from 1 to 10; you can use
numpy.arange() function
# creating list using range(starting, stop, step)
lst = range(0, 11, 2)
lst
range(0, 11, 2)
for l in lst:
print(l)
# Syntax:
x.itemsize
16
array([[1, 2, 3],
[4, 5, 6]])
First row: [1 2 3]
Second row: [4 5 6]
First column: [1 4]
Second column: [2 5]
Third column: [3 6]
Numpy Functions
o Min np.min()
o Max np.max()
o Mean np.mean()
o Median np.median()
o Varience
o Percentile
min: 1
max: 55
mean: 14.777777777777779
sd: 18.913709183069525
min: 1
max: 55
mean: 14.777777777777779
sd: 18.913709183069525
print(two_dimension_array)
print('Column with minimum: ',
np.amin(two_dimension_array,axis=0))
print('Column with maximum: ',
np.amax(two_dimension_array,axis=0))
print('=== Row ==')
print('Row with minimum: ',
np.amin(two_dimension_array,axis=1))
print('Row with maximum: ',
np.amax(two_dimension_array,axis=1))
Tile: [1 2 3 1 2 3]
Repeat: [1 1 2 2 3 3]
0.6149403282678213
0.4763968133790438
0.4763968133790438
['u' 'o' 'o' 'i' 'e' 'e' 'u' 'o' 'u' 'a']
['i' 'u' 'e' 'o' 'a' 'i' 'e' 'u' 'o' 'i']
array([[0.97992598, 0.79642484],
[0.65263629, 0.55763145]])
rand2 = np.random.randn(2,2)
rand2
array([[0, 7, 5],
[4, 1, 4],
[3, 5, 3],
[4, 3, 8],
[4, 6, 7]])
min: 3.557811005458804
max: 6.876317743643499
mean: 5.035832048106663
median: 5.020161980441937
mode: ModeResult(mode=array([3.55781101]),
count=array([1]))
sd: 0.489682424165213
# Syntax
# numpy.dot(x, y, out=None)
Linear Algebra
1. Dot Product
## Linear algebra
### Dot product: product of two arrays
f = np.array([1,2,3])
g = np.array([4,5,3])
### 1*4+2*5 + 3*6
np.dot(f, g) # 23
np.linalg.det(i)
Z = np.zeros((8,8))
Z[1::2,::2] = 1
Z[::2,1::2] = 1
new_list
Summary
3. Every array has one and only one dtype. All items in it should be of that dtype.
4. An equivalent numpy array occupies much less space than a python list of
lists.
💻 Exercises: Day 24
🎉 CONGRATULATIONS ! 🎉
reshaping
merging
sorting
slicing
aggregation
imputation. If you are using anaconda, you do not have install pandas.
Installing Pandas
For Mac:
pip install conda
conda install pandas
For Windows:
pip install conda
pip install pandas
Pandas data structure is based on Series and DataFrames.
Countries Series
As you can see, pandas series is just one column of data. If we want to have multiple
columns we use data frames. The example below shows pandas DataFrames.
Data frame is a collection of rows and columns. Look at the table below; it has many
more columns than the example above:
Importing Pandas
import pandas as pd # importing pandas as pd
import numpy as np # importing numpy as np
0 1
1 2
2 3
3 4
4 5
dtype: int64
1 1
2 2
3 3
4 4
5 5
dtype: int64
fruits = ['Orange','Banana','Mango']
fruits = pd.Series(fruits, index=[1, 2, 3])
print(fruits)
1 Orange
2 Banana
3 Mango
dtype: object
s = pd.Series(dct)
print(s)
name Asabeneh
country Finland
city Helsinki
dtype: object
1 10
2 10
3 10
dtype: int64
0 5.000000
1 6.666667
2 8.333333
3 10.000000
4 11.666667
5 13.333333
6 15.000000
7 16.666667
8 18.333333
9 20.000000
dtype: float64
DataFrames
Pandas data frames can be created in different ways.
df = pd.read_csv('weight-height.csv')
print(df)
Data Exploration
As you can see the csv file has three rows: Gender, Height and Weight. If the
DataFrame would have a long rows, it would be hard to know all the columns.
Therefore, we should use a method to know the colums. we do not know the number
of rows. Let's use shape meathod.
print(df.shape) # as you can see 10000 rows and three columns
(10000, 3)
print(heights)
0 73.847017
1 68.781904
2 74.110105
3 71.730978
4 69.881796
...
9995 66.172652
9996 67.067155
9997 63.867992
9998 69.034243
9999 61.944246
Name: Height, Length: 10000, dtype: float64
print(weights)
0 241.893563
1 162.310473
2 212.740856
3 220.042470
4 206.349801
...
9995 136.777454
9996 170.867906
9997 128.475319
9998 163.852461
9999 113.649103
Name: Weight, Length: 10000, dtype: float64
print(len(heights) == len(weights))
True
The describe() method provides a descriptive statistical values of a dataset.
count 10000.000000
mean 66.367560
std 3.847528
min 54.263133
25% 63.505620
50% 66.318070
75% 69.174262
max 78.998742
Name: Height, dtype: float64
print(weights.describe())
count 10000.000000
mean 161.440357
std 32.108439
min 64.700127
25% 135.818051
50% 161.212928
75% 187.169525
max 269.989699
Name: Weight, dtype: float64
Modifying a DataFrame
Modifying a DataFrame: * We can create a new DataFrame * We can create a new
column and add it to the DataFrame, * we can remove an existing column from a
DataFrame, * we can modify an existing column in a DataFrame, * we can change
the data type of column values in the DataFrame
Creating a DataFrame
As always, first we import the necessary packages. Now, lets import pandas and
numpy, two best friends ever.
import pandas as pd
import numpy as np
data = [
{"Name": "Asabeneh",
"Country":"Finland","City":"Helsinki"},
{"Name": "David", "Country":"UK","City":"London"},
{"Name": "John", "Country":"Sweden","City":"Stockholm"}]
df = pd.DataFrame(data)
print(df)
First let's use the previous example to create a DataFrame. After we create the
DataFrame, we will start modifying the columns and column values.
As you can see in the DataFrame above, we did add new columns, Weight and
Height. Let's add one additional column called BMI(Body Mass Index) by calculating
their BMI using thier mass and height. BMI is mass divided by height squared (in
meters) - Weight/Height * Height.
As you can see, the height is in centimeters, so we shoud change it to meters. Let's
modify the height row.
# Using functions makes our code clean, but you can calculate
the bmi without one
def calculate_bmi ():
weights = df['Weight']
heights = df['Height']
bmi = []
for w,h in zip(weights, heights):
b = w/(h*h)
bmi.append(b)
return bmi
bmi = calculate_bmi()
df['BMI'] = bmi
df
dtype('int64')
dtype('int32')
Now same for the current year:
df['Current Year'] = df['Current Year'].astype('int')
df['Current Year'].dtype
dtype('int32')
0 251
1 35
2 30
dtype: int32
df['Ages'] = ages
print(df)
The person in the first row lived so far for 251 years. It is unlikely for someone to live
so long. Either it is a typo or the data is cooked. So lets fill that data with average of
the columns without including outlier.
Mean: 32.5
Boolean Indexing
print(df[df['Ages'] > 120])
Exercises: Day 25
1. Read the hacker_news.csv file from data directory
🎉 CONGRATULATIONS ! 🎉
Flask
Flask is a web development framework written in Python. Flask uses Jinja2 template
engine. Flask can be also used with other modern front libraries such as React.
If you did not install the virtualenv package yet install it first. Virtual environment will
allows to isolate project dependencies from the local machine dependencies.
Folder structure
After completing all the step, your project file structure should look like this:
Creating routes
app = Flask(__name__)
@app.route('/about')
def about():
return '<h1>About us</h1>'
To run the flask application, write python app.py in the main flask application
directory.
After you run python app.py check local host 5000.
app = Flask(__name__)
@app.route('/about')
def about():
return '<h1>About us</h1>'
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
Now, we added the about route in the above code. How about if we want to render
an HTML file instead of string? It is possible to render HTML file using the
function render_templae. Let us create a folder called templates and create
home.html and about.html in the project directory. Let us also import
the render_template function from flask.
Creating templates
<body>
<h1>Welcome Home</h1>
</body>
</html>
about.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,
initial-scale=1.0" />
<title>About</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Python Script
app.py
# let's import the flask
from flask import Flask, render_template
import os # importing operating system module
app = Flask(__name__)
@app.route('/about')
def about():
return render_template('about.html')
if __name__ == '__main__':
Navigation
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
Now, we can navigate between the pages using the above link. Let us create
additional page which handle form data. You can call it any name, I like to call it
post.html.
We can inject data to the HTML files using Jinja2 template engine.
app = Flask(__name__)
@app.route('/about')
def about():
name = '30 Days Of Python Programming'
return render_template('about.html', name = name, title =
'About Us')
@app.route('/post')
def post():
name = 'Text Analyzer'
return render_template('post.html', name = name, title =
name)
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,
initial-scale=1.0" />
<title>Home</title>
</head>
<body>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
<h1>Welcome to {{name}}</h1>
<ul>
{% for tech in techs %}
<li>{{tech}}</li>
{% endfor %}
</ul>
</body>
</html>
about.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,
initial-scale=1.0" />
<title>About Us</title>
</head>
<body>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
<h1>About Us</h1>
Creating a layout
In the template files, there are lots of repeated codes, we can write a layout and we
can remove the repetition. Let's create layout.html inside the templates folder. After
we create the layout we will import to every file.
Serving Static File
Create a static folder in your project directory. Inside the static f older create CSS or
styles folder and create a CSS stylesheet. We use the url_for module to serve the
static file.
layout.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,
initial-scale=1.0" />
<link
href="https://fonts.googleapis.com/css?family=Lato:300,400|Nun
ito:300,400|Raleway:300,400,500&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="{{ url_for('static', filename='css/main.css') }}"
/>
{% if title %}
<title>30 Days of Python - {{ title}}</title>
{% else %}
<title>30 Days of Python</title>
{% endif %}
</head>
<body>
<header>
<div class="menu-container">
<div>
<a class="brand-name nav-link"
href="/">30DaysOfPython</a>
</div>
<ul class="nav-lists">
<li class="nav-list">
home.html
{% extends 'layout.html' %} {% block content %}
<div class="container">
<h1>Welcome to {{name}}</h1>
<p>
This application clean texts and analyse the number of
word, characters and
most frequent words in the text. Check it out by click
text analyzer at the
menu. You need the following technologies to build this
web application:
</p>
<ul class="tech-lists">
{% for tech in techs %}
<li class="tech">{{tech}}</li>
{% endfor %}
</ul>
</div>
{% endblock %}
about.html
post.html
{% extends 'layout.html' %} {% block content %}
<div class="container">
<h1>Text Analyzer</h1>
<form action="https://thirtydaysofpython-
v1.herokuapp.com/post" method="POST">
<div>
<textarea rows="25" name="content" autofocus></textarea>
</div>
<div>
<input type="submit" class="btn" value="Process Text" />
</div>
</form>
</div>
{% endblock %}
Request methods, there are different request methods(GET, POST, PUT, DELETE)
are the common request methods which allow us to do CRUD(Create, Read,
Update, Delete) operation.
In the post, route we will use GET and POST method alternative depending on the
type of request, check how it looks in the code below. The request method is a
function to handle request methods and also to access form data. app.py
app = Flask(__name__)
# to stop caching static file
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
@app.route('/about')
def about():
name = '30 Days Of Python Programming'
return render_template('about.html', name = name, title =
'About Us')
@app.route('/result')
def result():
return render_template('result.html')
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
So far, we have seen how to use template and how to inject data to template, how to
a common layout. Now, lets handle static file. Create a folder called static in the
project director and create a folder called css. Inside css folder create main.css. Your
main. css file will be linked to the layout.html.
You don't have to write the css file, copy and use it. Let's move on to deployment.
Deployment
Let's see the result by clicking any key from the keyboard. When you press any key
from you keyboard it will open the heroku login page and click the login page. Then
you will local machine will be connected to the remote heroku server. If you are
connected to remote server, you will see this.
requirements.txt
Procfile
(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ pip freeze
Click==7.0
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
Werkzeug==0.16.0
(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ touch
requirements.txt
(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ pip freeze >
requirements.txt
(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ cat
requirements.txt
Click==7.0
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
Werkzeug==0.16.0
The Procfile will have the command which run the application in the web server in
our case on Heroku.
web: python app.py
Pushing project to heroku
1. git init
2. git add .
Exercises: Day 26
1. You will build this application. Only the text analyser part is left
🎉 CONGRATULATIONS ! 🎉
MongoDB
MongoDB is a NoSQL database. MongoDB stores data in a JSON like document
which make MongoDB very flexible and scalable. Let us see the different
terminologies of SQL and NoSQL databases. The following table will make the
difference between SQL versus NoSQL databases.
Choose the proximate free region and give any name for you cluster.
Copy the connection string link and you will get something like this:
mongodb+srv://asabeneh:<password>@30daysofpython-
twxkr.mongodb.net/test?retryWrites=true&w=majority
Do not worry about the url, it is a means to connect your application with mongoDB.
Let us replace the password placeholder with the password you used to add a user.
Example:
mongodb+srv://asabeneh:123123123@30daysofpython-
twxkr.mongodb.net/test?retryWrites=true&w=majority
Now, I replaced everything and the password is 123123 and the name of the
database is thirty_days_python. This is just an example, your password must be
stronger than the example password.
Python needs a mongoDB driver to access mongoDB database. We will
use pymongo with dnspython to connect our application with mongoDB base . Inside
your project directory install pymongo and dnspython.
pip install pymongo dnspython
The "dnspython" module must be installed to use mongodb+srv:// URIs. The
dnspython is a DNS toolkit for Python. It supports almost all record types.
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
When we run the above code we get the default mongoDB databases.
['admin', 'local']
To create a database:
db = client.name_of_databse # we can create a database like
this or the second way
db = client['name_of_database']
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
If you see this on the mongoDB cluster, it means you have successfully created a
database and a collection.
If you have seen on the figure, the document has been created with a long id which
acts as a primary key. Every time we create a document mongoDB create and
unique id for it.
students = [
{'name':'David','country':'UK','city':'London','age':34},
{'name':'John','country':'Sweden','city':'Stockholm','age':28}
,
{'name':'Sami','country':'Finland','city':'Helsinki','age':25}
,
]
for student in students:
db.students.insert_one(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
MongoDB Find
The find() and findOne() methods are common method to find data in a collection in
mongoDB database. It is similar to the SELECT statement in a MySQL database. Let
us use the find_one() method to get a document in a database collection.
*find_one({"_id": ObjectId("id"}): Gets the first occurrence if an id is not
provided
# let's import the flask
from flask import Flask, render_template
import os # importing operating system module
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
student = db.students.find_one()
print(student)
app = Flask(__name__)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
We have seen, how to use find_one() using the above examples. Let's move one
to find()
find(): returns all the occurrence from a collection if we don't pass a query
object. The object is pymongo.cursor object.
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
students = db.students.find()
for student in students:
print(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
We can specify which fields to return by passing second object in the find({}, {}). 0
means not include and 1 means include but we can not mix 0 and 1, except for _id.
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
students = db.students.find({}, {"_id":0, "name": 1,
"country":1}) # 0 means not include and 1 means include
for student in students:
print(student)
In mongoDB find take a query object. We can pass a query object and we can filter
the documents we like to filter out.
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {
"country":"Finland"
}
students = db.students.find(query)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {
"city":"Helsinki"
}
students = db.students.find(query)
for student in students:
print(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {
"country":"Finland",
"city":"Helsinki"
}
students = db.students.find(query)
for student in students:
print(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {"age":{"$gt":30}}
students = db.students.find(query)
for student in students:
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {"age":{"$gt":30}}
students = db.students.find(query)
for student in students:
print(student)
Limiting documents
We can limit the number of documents we return using the limit() method.
# let's import the flask
from flask import Flask, render_template
import os # importing operating system module
import pymongo
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
students = db.students.find().sort('name')
for student in students:
print(student)
students = db.students.find().sort('name',-1)
for student in students:
print(student)
students = db.students.find().sort('age')
for student in students:
print(student)
students = db.students.find().sort('age',-1)
for student in students:
print(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
Ascending order
{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name':
'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age':
250}
{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David',
'country': 'UK', 'city': 'London', 'age': 34}
Descending order
{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami',
'country': 'Finland', 'city': 'Helsinki', 'age': 25}
{'_id': ObjectId('5df68a23f106fe2d315bbc8d'), 'name': 'John',
'country': 'Sweden', 'city': 'Stockholm', 'age': 28}
{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David',
'country': 'UK', 'city': 'London', 'age': 34}
{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name':
'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age':
250}
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {'age':250}
new_value = {'$set':{'age':38}}
db.students.update_one(query, new_value)
# lets check the result if the age is modified
for student in db.students.find():
print(student)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
Delete Document
The method delete_one() deletes one document. The delete_one() takes a query
object parameter. It only removes the first occurrence. Let us remove one John from
the collection.
# let's import the flask
from flask import Flask, render_template
import os # importing operating system module
import pymongo
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
query = {'name':'John'}
db.students.delete_one(query)
app = Flask(__name__)
if __name__ == '__main__':
# for deployment we use the environ
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
Drop a collection
MONGODB_URI =
'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython
-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
db.students.drop()
Now, we have deleted the students collection from the database.
💻 Exercises: Day 27
🎉 CONGRATULATIONS ! 🎉
API
API stands for Application Programming Interface. The kind of API we will cover in
this section is going to be Web APIs. Web APIs are the defined interfaces through
which interactions happen between an enterprise and applications that use its
assets, which also is a Service Level Agreement (SLA) to specify the functional
provider and expose the service path or URL for its API users.
In the context of web development, an API is defined as a set of specifications, such
as Hypertext Transfer Protocol (HTTP) request messages, along with a definition of
the structure of response messages, usually in an XML or a JavaScript Object
Notation (JSON) format.
Web API has been moving away from Simple Object Access Protocol (SOAP) based
web services and service-oriented architecture (SOA) towards more direct
representational state transfer (REST) style web resources.
Social media services, web APIs have allowed web communities to share content
and data between communities and different platforms.
Using API, content that is created in one place dynamically can be posted and
updated to multiple locations on the web.
For example, Twitter's REST API allows developers to access core Twitter data and
the Search API provides methods for developers to interact with Twitter Search and
trends data.
Many applications provide API end points. Some examples of API such as the
countries API, cat's breed API.
In this section, we will cover a RESTful API that uses HTTP request methods to GET,
PUT, POST and DELETE data.
Building API
RESTful API is an application program interface (API) that uses HTTP requests to
GET, PUT, POST and DELETE data. In the previous sections, we have learned
about python, flask and mongoDB. We will use the knowledge we acquire to develop
a RESTful API using Python flask and mongoDB database. Every application which
has CRUD(Create, Read, Update, Delete) operation has an API to create data, to
get data, to update data or to delete data from a database.
Structure of HTTP
HTTP uses client-server model. An HTTP client opens a connection and sends a
request message to an HTTP server and the HTTP server returns response
message which is the requested resources. When the request response cycle
completes the server closes the connection.
The format of the request and response messages are similar. Both kinds of
messages have
an initial line,
The initial response line, called the status line, also has three parts separated by
spaces:
HTTP version
Response status code that gives the result of the request, and a reason which
describes the status code. Example of status lines are: HTTP/1.0 200 OK or
HTTP/1.0 404 Not Found Notes:
The most common status codes are: 200 OK: The request succeeded, and the
resulting resource (e.g. file or script output) is returned in the message body. 500
Server Error A complete list of HTTP status code can be found here. It can be also
found here.
Request Methods
The GET, POST, PUT and DELETE are the HTTP request methods which we are
going to implement an API or a CRUD operation application.
💻 Exercises: Day 28
🎉 CONGRATULATIONS ! 🎉
Examples of API
Structure of an API
The API uses the following HTTP methods for object manipulation:
GET Used for object retrieval
POST Used for object creation and object actions
PUT Used for object update
DELETE Used for object deletion
Let us build an API which collects information about 30DaysOfPython students. We
will collect the name, country, city, date of birth, skills and bio.
Postman
Python
Flask
MongoDB
app = Flask(__name__)
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
app = Flask(__name__)
#
MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpyth
on-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
return Response(json.dumps(student),
mimetype='application/json')
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
By connecting the flask, we can fetch students collection data from the
thirty_days_of_python database.
[
{
"_id": {
"$oid": "5df68a21f106fe2d315bbc8b"
},
"name": "Asabeneh",
"country": "Finland",
"city": "Helsinki",
"age": 38
},
{
"_id": {
"$oid": "5df68a23f106fe2d315bbc8c"
},
"name": "David",
"country": "UK",
"city": "London",
"age": 34
},
{
"_id": {
"$oid": "5df68a23f106fe2d315bbc8e"
},
"name": "Sami",
"country": "Finland",
"city": "Helsinki",
"age": 25
}
]
Getting a document by id
We can access signle document using an id, let's access Asabeneh using his
id. http://localhost:5000/api/v1.0/students/5df68a21f106fe2d315bbc8b
# let's import the flask
#
MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpyth
on-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
return Response(json.dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students/<id>', methods = ['GET'])
def single_student (id):
student = db.students.find({'_id':ObjectId(id)})
return Response(dumps(student),
mimetype='application/json')
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
[
{
"_id": {
"$oid": "5df68a21f106fe2d315bbc8b"
},
"name": "Asabeneh",
"country": "Finland",
"city": "Helsinki",
"age": 38
}
]
Creating data using POST
#
MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpyth
on-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
return Response(json.dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students/<id>', methods = ['GET'])
def single_student (id):
student = db.students.find({'_id':ObjectId(id)})
return Response(dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students', methods = ['POST'])
def create_student ():
name = request.form['name']
country = request.form['country']
city = request.form['city']
skills = request.form['skills'].split(', ')
bio = request.form['bio']
birthyear = request.form['birthyear']
created_at = datetime.now()
student = {
'name': name,
'country': country,
'city': city,
'birthyear': birthyear,
'skills': skills,
'bio': bio,
'created_at': created_at
}
db.students.insert_one(student)
return ;
def update_student (id):
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
app = Flask(__name__)
#
MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpyth
on-twxkr.mongodb.net/test?retryWrites=true&w=majority'
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python'] # accessing the database
return Response(json.dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students/<id>', methods = ['GET'])
def single_student (id):
student = db.students.find({'_id':ObjectId(id)})
return Response(dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students', methods = ['POST'])
def create_student ():
name = request.form['name']
country = request.form['country']
city = request.form['city']
skills = request.form['skills'].split(', ')
bio = request.form['bio']
birthyear = request.form['birthyear']
created_at = datetime.now()
student = {
'name': name,
'country': country,
'city': city,
'birthyear': birthyear,
'skills': skills,
'bio': bio,
'created_at': created_at
}
db.students.insert_one(student)
}
db.students.update_one(query, student)
# return Response(dumps({"result":"a new student has been
created"}), mimetype='application/json')
return
def update_student (id):
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
app = Flask(__name__)
return Response(json.dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students/<id>', methods = ['GET'])
def single_student (id):
student = db.students.find({'_id':ObjectId(id)})
return Response(dumps(student),
mimetype='application/json')
@app.route('/api/v1.0/students', methods = ['POST'])
def create_student ():
name = request.form['name']
country = request.form['country']
city = request.form['city']
skills = request.form['skills'].split(', ')
bio = request.form['bio']
birthyear = request.form['birthyear']
created_at = datetime.now()
student = {
'name': name,
'country': country,
'city': city,
'birthyear': birthyear,
'skills': skills,
'bio': bio,
'created_at': created_at
}
db.students.insert_one(student)
return
@app.route('/api/v1.0/students/<id>', methods = ['PUT']) #
this decorator create the home route
def update_student (id):
query = {"_id":ObjectId(id)}
name = request.form['name']
country = request.form['country']
city = request.form['city']
skills = request.form['skills'].split(', ')
bio = request.form['bio']
birthyear = request.form['birthyear']
created_at = datetime.now()
student = {
'name': name,
'country': country,
'city': city,
}
db.students.update_one(query, student)
# return Response(dumps({"result":"a new student has been
created"}), mimetype='application/json')
return
@app.route('/api/v1.0/students/<id>', methods = ['PUT']) #
this decorator create the home route
def update_student (id):
query = {"_id":ObjectId(id)}
name = request.form['name']
country = request.form['country']
city = request.form['city']
skills = request.form['skills'].split(', ')
bio = request.form['bio']
birthyear = request.form['birthyear']
created_at = datetime.now()
student = {
'name': name,
'country': country,
'city': city,
'birthyear': birthyear,
'skills': skills,
'bio': bio,
'created_at': created_at
}
db.students.update_one(query, student)
# return Response(dumps({"result":"a new student has been
created"}), mimetype='application/json')
return ;
@app.route('/api/v1.0/students/<id>', methods = ['DELETE'])
def delete_student (id):
db.students.delete_one({"_id":ObjectId(id)})
return
if __name__ == '__main__':
# for deployment
# to make it work for both production and development
port = int(os.environ.get("PORT", 5000))
app.run(debug=True, host='0.0.0.0', port=port)
💻 Exercises: Day 29
🎉 CONGRATULATIONS ! 🎉