diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..a9ccc188b
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+github: [Asabeneh]
+thanks_dev:
+custom: []
diff --git a/.gitignore b/.gitignore
index 5b1b25794..e9c3c9a5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,4 +17,5 @@ flask_project/ven/lib
numpy.ipynb
.ipynb_checkpoints
.vscode/
+*~
test.py
\ No newline at end of file
diff --git a/01_Day_Introduction/helloworld.py b/01_Day_Introduction/helloworld.py
index cfded3c68..1dc2999f2 100644
--- a/01_Day_Introduction/helloworld.py
+++ b/01_Day_Introduction/helloworld.py
@@ -1,9 +1,14 @@
# Introduction
# Day 1 - 30DaysOfPython Challenge
+print("Hello World!") # print hello world
+
print(2 + 3) # addition(+)
print(3 - 1) # subtraction(-)
print(2 * 3) # multiplication(*)
+print(3 + 2) # addition(+)
+print(3 - 2) # subtraction(-)
+print(3 * 2) # multiplication(*)
print(3 / 2) # division(/)
print(3 ** 2) # exponential(**)
print(3 % 2) # modulus(%)
@@ -19,3 +24,5 @@
print(type({'name':'Asabeneh'})) # Dictionary
print(type({9.8, 3.14, 2.7})) # Set
print(type((9.8, 3.14, 2.7))) # Tuple
+print(type(3 == 3)) # Bool
+print(type(3 >= 3)) # Bool
diff --git a/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md b/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md
index d1927f2de..722edb3ad 100644
--- a/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md
+++ b/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md
@@ -33,7 +33,7 @@
## 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()_, _file()_, _help()_, and _dir()_. In the following table you will see an exhaustive list of Python built-in functions taken from [python documentation](https://docs.python.org/3.9/library/functions.html).
+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()_, _file()_, _help()_, and _dir()_. In the following table you will see an exhaustive list of Python built-in functions taken from [python documentation](https://docs.python.org/3/library/functions.html).

@@ -63,7 +63,7 @@ Python Variable Name Rules
- A variable name can only contain alpha-numeric characters and underscores (A-z, 0-9, and \_ )
- Variable names are case-sensitive (firstname, Firstname, FirstName and FIRSTNAME) are different variables)
-Let us se valid variable names
+Here are some example of valid variable names:
```shell
firstname
@@ -180,7 +180,7 @@ There are several data types in Python. To identify the data type we use the _ty
## Checking Data types and Casting
- Check Data types: To check the data type of certain data/variable we use the _type_
- **Example:**
+ **Examples:**
```py
# Different python data types
@@ -193,22 +193,22 @@ city= 'Helsinki' # str
age = 250 # int, it is not my real age, don't worry about it
# Printing out types
-print(type('Asabeneh')) # str
-print(type(first_name)) # str
-print(type(10)) # int
-print(type(3.14)) # float
-print(type(1 + 1j)) # complex
-print(type(True)) # bool
-print(type([1, 2, 3, 4])) # list
-print(type({'name':'Asabeneh','age':250, 'is_married':250})) # dict
-print(type((1,2))) # tuple
-print(type(zip([1,2],[3,4]))) # set
+print(type('Asabeneh')) # str
+print(type(first_name)) # str
+print(type(10)) # int
+print(type(3.14)) # float
+print(type(1 + 1j)) # complex
+print(type(True)) # bool
+print(type([1, 2, 3, 4])) # list
+print(type({'name':'Asabeneh'})) # dict
+print(type((1,2))) # tuple
+print(type(zip([1,2],[3,4]))) # zip
```
- Casting: Converting one data type to another data type. We use _int()_, _float()_, _str()_, _list_, _set_
When we do arithmetic operations string numbers should be first converted to int or float otherwise it will return an error. If we concatenate a number with a string, the number should be first converted to a string. We will talk about concatenation in String section.
- **Example:**
+ **Examples:**
```py
# int to float
@@ -229,8 +229,12 @@ print(num_str) # '10'
# str to int or float
num_str = '10.6'
+num_float = float(num_str) # Convert the string to a float first
+num_int = int(num_float) # Then convert the float to an integer
print('num_int', int(num_str)) # 10
print('num_float', float(num_str)) # 10.6
+num_int = int(num_float)
+print('num_int', int(num_int)) # 10
# str to list
first_name = 'Asabeneh'
@@ -278,22 +282,22 @@ Number data types in Python:
### Exercises: Level 2
1. Check the data type of all your variables using type() built-in function
-1. Using the _len()_ built-in function, find the length of your first name
-1. Compare the length of your first name and your last name
-1. Declare 5 as num_one and 4 as num_two
- 1. Add num_one and num_two and assign the value to a variable total
- 2. Subtract num_two from num_one and assign the value to a variable diff
- 3. Multiply num_two and num_one and assign the value to a variable product
- 4. Divide num_one by num_two and assign the value to a variable division
- 5. Use modulus division to find num_two divided by num_one and assign the value to a variable remainder
- 6. Calculate num_one to the power of num_two and assign the value to a variable exp
- 7. Find floor division of num_one by num_two and assign the value to a variable floor_division
-1. The radius of a circle is 30 meters.
+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
+4. Declare 5 as num_one and 4 as num_two
+5. Add num_one and num_two and assign the value to a variable total
+6. Subtract num_two from num_one and assign the value to a variable diff
+7. Multiply num_two and num_one and assign the value to a variable product
+8. Divide num_one by num_two and assign the value to a variable division
+9. Use modulus division to find num_two divided by num_one and assign the value to a variable remainder
+10. Calculate num_one to the power of num_two and assign the value to a variable exp
+11. Find floor division of num_one by num_two and assign the value to a variable floor_division
+12. The radius of a circle is 30 meters.
1. Calculate the area of a circle and assign the value to a variable name of _area_of_circle_
2. Calculate the circumference of a circle and assign the value to a variable name of _circum_of_circle_
3. Take radius as user input and calculate the area.
-1. Use the built-in input function to get first name, last name, country and age from a user and store the value to their corresponding variable names
-1. Run help('keywords') in Python shell or in your file to check for the Python reserved words or keywords
+13. Use the built-in input function to get first name, last name, country and age from a user and store the value to their corresponding variable names
+14. Run help('keywords') in Python shell or in your file to check for the Python reserved words or keywords
🎉 CONGRATULATIONS ! 🎉
diff --git a/02_Day_Variables_builtin_functions/variables.py b/02_Day_Variables_builtin_functions/variables.py
index 78ba0e71e..c4c667496 100644
--- a/02_Day_Variables_builtin_functions/variables.py
+++ b/02_Day_Variables_builtin_functions/variables.py
@@ -37,4 +37,5 @@
print('Last name: ', last_name)
print('Country: ', country)
print('Age: ', age)
-print('Married: ', is_married)
\ No newline at end of file
+print('Married: ', is_married)
+
diff --git a/03_Day_Operators/03_operators.md b/03_Day_Operators/03_operators.md
index 0fcfeb994..972b56943 100644
--- a/03_Day_Operators/03_operators.md
+++ b/03_Day_Operators/03_operators.md
@@ -75,7 +75,7 @@ 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
+print('Exponentiation: ', 2 ** 3) # 8 it means 2 * 2 * 2
```
**Example:Floats**
@@ -121,7 +121,7 @@ print('a * b = ', product)
print('a / b = ', division)
print('a % b = ', remainder)
print('a // b = ', floor_division)
-print('a ** b = ', exponentiation)
+print('a ** b = ', exponential)
```
**Example:**
@@ -148,7 +148,7 @@ print('division: ', div)
print('remainder: ', remainder)
```
-Let us start start connecting the dots and start making use of what we already know to calculate (area, volume,density, weight, perimeter, distance, force).
+Let us start connecting the dots and start making use of what we already know to calculate (area, volume,density, weight, perimeter, distance, force).
**Example:**
@@ -174,6 +174,7 @@ print(weight, 'N') # Adding unit to the weight
mass = 75 # in Kg
volume = 0.075 # in cubic meter
density = mass / volume # 1000 Kg/m^3
+print(density, 'Kg/m^3') # Adding unit to the density
```
@@ -213,13 +214,13 @@ In addition to the above comparison operator Python uses:
- _is_: Returns true if both variables are the same object(x is y)
- _is not_: Returns true if both variables are not the same object(x is not y)
- _in_: Returns True if the queried list contains a certain item(x in y)
-- _not in_: Returns True if the queried list doesn't have a certain item(x in y)
+- _not in_: Returns True if the queried list doesn't have a certain item(x not in y)
```py
print('1 is 1', 1 is 1) # True - because the data values are the same
print('1 is not 2', 1 is not 2) # True - because 1 is not 2
print('A in Asabeneh', 'A' in 'Asabeneh') # True - A found in the string
-print('B in Asabeneh', 'B' in 'Asabeneh') # False - there is no uppercase B
+print('B not in Asabeneh', 'B' in 'Asabeneh') # False - there is no uppercase B
print('coding' in 'coding for all') # True - because coding for all has the word coding
print('a in an:', 'a' in 'an') # True
print('4 is 2 ** 2:', 4 is 2 ** 2) # True
@@ -287,7 +288,7 @@ The perimeter of the triangle is 12
18. Check if the floor division of 7 by 3 is equal to the int converted value of 2.7.
19. Check if type of '10' is equal to type of 10
20. Check if int('9.8') is equal to 10
-21. Writ a script that prompts the user to enter hours and rate per hour. Calculate pay of the person?
+21. Write a script that prompts the user to enter hours and rate per hour. Calculate pay of the person?
```py
Enter hours: 40
diff --git a/03_Day_Operators/day-3.py b/03_Day_Operators/day-3.py
index bacdf837c..c984a82c3 100644
--- a/03_Day_Operators/day-3.py
+++ b/03_Day_Operators/day-3.py
@@ -9,16 +9,16 @@
print('Division: ', 7 / 2)
print('Division without the remainder: ', 7 // 2) # gives without the floating number or without the remaining
print('Modulus: ', 3 % 2) # Gives the remainder
-print ('Division without the remainder: ',7 // 3)
-print('Exponential: ', 3 ** 2) # it means 3 * 3
+print ('Division without the remainder: ', 7 // 3)
+print('Exponential: ', 2 ** 3) # 8 it means 2 * 2 * 2
# Floating numbers
print('Floating Number,PI', 3.14)
print('Floating Number, gravity', 9.81)
# Complex numbers
-print('Complex number: ', 1+1j)
-print('Multiplying complex number: ',(1+1j) * (1-1j))
+print('Complex number: ', 1 + 1j)
+print('Multiplying complex number: ',(1 + 1j) * (1-1j))
# Declaring the variable at the top first
@@ -109,7 +109,7 @@
print('B in Asabeneh', 'B' in 'Asabeneh') # False -there is no uppercase B
print('coding' in 'coding for all') # True - because coding for all has the word coding
print('a in an:', 'a' in 'an') # True
-print('4 is 2 ** 2:', 4 is 2 **2) # True
+print('4 is 2 ** 2:', 4 is 2 ** 2) # True
print(3 > 2 and 4 > 3) # True - because both statements are true
print(3 > 2 and 4 < 3) # False - because the second statement is false
diff --git a/04_Day_Strings/04_strings.md b/04_Day_Strings/04_strings.md
index 4377d5eba..9d09d2cfe 100644
--- a/04_Day_Strings/04_strings.md
+++ b/04_Day_Strings/04_strings.md
@@ -92,7 +92,7 @@ print(len(full_name)) # 16
In Python and other programming languages \ followed by a character is an escape sequence. Let us see the most common escape characters:
- \n: new line
-- \t: Tab means(8 spaces)
+- \t: Tab means(8 spaces)
- \\\\: Back slash
- \\': Single quote (')
- \\": Double quote (")
@@ -101,18 +101,18 @@ Now, let us see the use of the above escape sequences with examples.
```py
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\t3\t5')
-print('Day 2\t3\t5')
-print('Day 3\t3\t5')
-print('Day 4\t3\t5')
+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
+Days Topics Exercises
Day 1 5 5
Day 2 6 20
Day 3 5 23
@@ -154,7 +154,7 @@ print(formated_string) # "The following are python libraries:['Django', 'Flask',
#### New Style String Formatting (str.format)
-This formatting is introduced in Python version 3.
+This format was introduced in Python version 3.
```py
@@ -328,16 +328,16 @@ print(challenge.expandtabs(10)) # 'thirty days of python'
```py
challenge = 'thirty days of python'
-print(challenge.find('y')) # 16
-print(challenge.find('th')) # 17
+print(challenge.find('y')) # 5
+print(challenge.find('th')) # 0
```
- rfind(): Returns the index of the last occurrence of a substring, if not found returns -1
```py
challenge = 'thirty days of python'
-print(challenge.rfind('y')) # 5
-print(challenge.rfind('th')) # 1
+print(challenge.rfind('y')) # 16
+print(challenge.rfind('th')) # 17
```
- format(): formats string into a nicer output
@@ -349,7 +349,7 @@ last_name = 'Yetayeh'
age = 250
job = 'teacher'
country = 'Finland'
-sentence = 'I am {} {}. I am a {}. I am {} years old. I live in {}.'.format(first_name, last_name, age, job, country)
+sentence = 'I am {} {}. I am a {}. I am {} years old. I live in {}.'.format(first_name, last_name, job, age, country)
print(sentence) # I am Asabeneh Yetayeh. I am 250 years old. I am a teacher. I live in Finland.
radius = 10
@@ -373,8 +373,9 @@ print(challenge.index(sub_string, 9)) # error
```py
challenge = 'thirty days of python'
sub_string = 'da'
-print(challenge.rindex(sub_string)) # 8
+print(challenge.rindex(sub_string)) # 7
print(challenge.rindex(sub_string, 9)) # error
+print(challenge.rindex('on', 8)) # 19
```
- isalnum(): Checks alphanumeric character
@@ -412,7 +413,7 @@ print(challenge.isdecimal()) # False
challenge = '123'
print(challenge.isdecimal()) # True
challenge = '\u00B2'
-print(challenge.isdigit()) # False
+print(challenge.isdigit()) # True
challenge = '12 3'
print(challenge.isdecimal()) # False, space not allowed
```
@@ -544,7 +545,7 @@ print(challenge.startswith('thirty')) # False
9. Cut(slice) out the first word of _Coding For All_ string.
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.
+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_.
@@ -560,7 +561,7 @@ print(challenge.startswith('thirty')) # False
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_?
+28. Does 'Coding For All' start with a substring _Coding_?
29. Does 'Coding For All' end 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():
@@ -600,3 +601,5 @@ The area of a circle with radius 10 is 314 meters square.
🎉 CONGRATULATIONS ! 🎉
[<< Day 3](../03_Day_Operators/03_operators.md) | [Day 5 >>](../05_Day_Lists/05_lists.md)
+
+
diff --git a/04_Day_Strings/day_4.py b/04_Day_Strings/day_4.py
index 28ddc2622..b406cb1f0 100644
--- a/04_Day_Strings/day_4.py
+++ b/04_Day_Strings/day_4.py
@@ -30,7 +30,7 @@
print(len(first_name)) # 8
print(len(last_name)) # 7
print(len(first_name) > len(last_name)) # True
-print(len(full_name)) # 15
+print(len(full_name)) # 16
#### Unpacking characters
language = 'Python'
@@ -153,7 +153,7 @@
# isalpha(): Checks if all characters are alphabets
challenge = 'thirty days of python'
-print(challenge.isalpha()) # True
+print(challenge.isalpha()) # False
num = '123'
print(num.isalpha()) # False
@@ -168,7 +168,7 @@
challenge = 'Thirty'
print(challenge.isdigit()) # False
challenge = '30'
-print(challenge.digit()) # True
+print(challenge.isdigit()) # True
# isdecimal():Checks decimal characters
@@ -210,13 +210,13 @@
# join(): Returns a concatenated string
web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
-result = '#, '.join(web_tech)
-print(result) # 'HTML# CSS# JavaScript# React'
+result = '# '.join(web_tech)
+print(result) # 'HTML# CSS# JavaScript# React'
# strip(): Removes both leading and trailing characters
challenge = ' thirty days of python '
-print(challenge.strip('y')) # 5
+print(challenge.strip()) # 'thirty days of python'
# replace(): Replaces substring inside
diff --git a/05_Day_Lists/05_lists.md b/05_Day_Lists/05_lists.md
index ac18fce3a..a91c74d5f 100644
--- a/05_Day_Lists/05_lists.md
+++ b/05_Day_Lists/05_lists.md
@@ -91,7 +91,7 @@ fruits = ['banana', 'orange', 'mango', 'lemon'] # list of fr
vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot'] # list of vegetables
animal_products = ['milk', 'meat', 'butter', 'yoghurt'] # list of animal products
web_techs = ['HTML', 'CSS', 'JS', 'React','Redux', 'Node', 'MongDB'] # list of web technologies
-countries = ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway']
+countries = ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway']
# Print the lists and its length
print('Fruits:', fruits)
@@ -163,7 +163,7 @@ print(second_last) # mango
### Unpacking List Items
```py
-lst = ['item','item2','item3', 'item4', 'item5']
+lst = ['item1','item2','item3', 'item4', 'item5']
first_item, second_item, third_item, *rest = lst
print(first_item) # item1
print(second_item) # item2
@@ -175,7 +175,7 @@ print(rest) # ['item4', 'item5']
```py
# First Example
fruits = ['banana', 'orange', 'mango', 'lemon','lime','apple']
-first_fruit, second_fruit, third_fruit, *rest = lst
+first_fruit, second_fruit, third_fruit, *rest = fruits
print(first_fruit) # banana
print(second_fruit) # orange
print(third_fruit) # mango
@@ -190,7 +190,7 @@ print(tenth) # 10
# Third Example about unpacking list
countries = ['Germany', 'France','Belgium','Sweden','Denmark','Finland','Norway','Iceland','Estonia']
gr, fr, bg, sw, *scandic, es = countries
-print(gr)
+print(gr)
print(fr)
print(bg)
print(sw)
@@ -364,7 +364,7 @@ print(fruits) # []
### Copying a List
-It is possible to copy a list by reassigning it to a new variable in the following way: list2 = list1. Now, list2 is a reference of list1, any changes we make in list2 will also modify the original, list2. But there are lots of case in which we do not like to modify the original instead we like to have a different copy. One of way of avoiding the problem above is using _copy()_.
+It is possible to copy a list by reassigning it to a new variable in the following way: list2 = list1. Now, list2 is a reference of list1, any changes we make in list2 will also modify the original, list1. But there are lots of case in which we do not like to modify the original instead we like to have a different copy. One of way of avoiding the problem above is using _copy()_.
```py
# syntax
@@ -408,7 +408,7 @@ print(fruits_and_vegetables ) # ['banana', 'orange', 'mango', 'lemon', 'Tomato',
# syntax
list1 = ['item1', 'item2']
list2 = ['item3', 'item4', 'item5']
-list1.extend(list2)
+list1.extend(list2) # ['item1', 'item2', 'item3', 'item4', 'item5']
```
```py
@@ -562,7 +562,7 @@ To sort lists we can use _sort()_ method or _sorted()_ built-in functions. The _
back_end = ['Node','Express', 'MongoDB']
```
-27. After joining the lists in question 26. Copy the joined list and assign it to a variable full_stack. Then insert Python and SQL after Redux.
+27. After joining the lists in question 26. Copy the joined list and assign it to a variable full_stack, then insert Python and SQL after Redux.
### Exercises: Level 2
diff --git a/05_Day_Lists/day_5.py b/05_Day_Lists/day_5.py
index 9e7e15464..3ca46fa26 100644
--- a/05_Day_Lists/day_5.py
+++ b/05_Day_Lists/day_5.py
@@ -80,7 +80,7 @@
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.insert(2, 'apple') # insert apple between orange and mango
print(fruits) # ['banana', 'orange', 'apple', 'mango', 'lemon']
-fruits.insert(3, 'lime') # ['banana', 'orange', 'apple', 'mango', 'lime','lemon',]
+fruits.insert(3, 'lime') # ['banana', 'orange', 'apple', 'lime', 'mango', 'lemon']
print(fruits)
# remove
@@ -176,4 +176,4 @@
ages.sort()
print(ages)
ages.sort(reverse=True)
-print(ages)
\ No newline at end of file
+print(ages)
diff --git a/06_Day_Tuples/06_tuples.md b/06_Day_Tuples/06_tuples.md
index 8823d2316..5c155034e 100644
--- a/06_Day_Tuples/06_tuples.md
+++ b/06_Day_Tuples/06_tuples.md
@@ -41,7 +41,7 @@ A tuple is a collection of different data types which is ordered and unchangeabl
- tuple(): to create an empty tuple
- count(): to count the number of a specified item in a tuple
- index(): to find the index of a specified item in a tuple
-- + operator: to join two or more tuples and to create a new tuple
+- `+` operator: to join two or more tuples and to create a new tuple
### Creating a Tuple
@@ -93,7 +93,7 @@ len(tpl)
first_fruit = fruits[0]
second_fruit = fruits[1]
last_index =len(fruits) - 1
- last_fruit = fruits[las_index]
+ last_fruit = fruits[last_index]
```
- Negative indexing
@@ -239,8 +239,8 @@ del fruits
1. Create fruits, vegetables and animal products tuples. Join the three tuples and assign it to a variable called food_stuff_tp.
1. Change the about food_stuff_tp tuple to a food_stuff_lt list
1. Slice out the middle item or items from the food_stuff_tp tuple or food_stuff_lt list.
-1. Slice out the first three items and the last three items from food_staff_lt list
-1. Delete the food_staff_tp tuple completely
+1. Slice out the first three items and the last three items from food_stuff_lt list
+1. Delete the food_stuff_tp tuple completely
1. Check if an item exists in tuple:
- Check if 'Estonia' is a nordic country
diff --git a/07_Day_Sets/07_sets.md b/07_Day_Sets/07_sets.md
index d47a662a4..26ca08e40 100644
--- a/07_Day_Sets/07_sets.md
+++ b/07_Day_Sets/07_sets.md
@@ -48,14 +48,12 @@ Set is a collection of items. Let me take you back to your elementary or high sc
### Creating a Set
-We use curly brackets, {} to create a set or the *set()* built-in function.
+To create an empty set, we use the set() function. Empty curly brackets {} will create a dictionary.
- Creating an empty set
```py
# syntax
-st = {}
-# or
st = set()
```
@@ -80,7 +78,7 @@ We use **len()** method to find the length of a set.
```py
# syntax
st = {'item1', 'item2', 'item3', 'item4'}
-len(set)
+len(st)
```
**Example:**
@@ -131,7 +129,7 @@ fruits.add('lime')
```
- Add multiple items using _update()_
- The *update()* allows to add multiple items to a set. The *update()* takes a list argument.
+ The _update()_ allows to add multiple items to a set. The _update()_ takes a list argument.
```py
# syntax
@@ -174,7 +172,6 @@ fruits = {'banana', 'orange', 'mango', 'lemon'}
removed_item = fruits.pop()
```
-
### Clearing Items in a Set
If we want to clear or empty the set we use _clear_ method.
@@ -229,7 +226,7 @@ fruits = set(fruits) # {'mango', 'lemon', 'banana', 'orange'}
### Joining Sets
-We can join two sets using the _union()_ or _update()_ method.
+We can join two sets using the _union()_ or _update()_ method or _|_ symbol .
- Union
This method returns a new set
@@ -238,7 +235,7 @@ We can join two sets using the _union()_ or _update()_ method.
# syntax
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item5', 'item6', 'item7', 'item8'}
-st3 = st1.union(st2)
+st3 = st1.union(st2) #st3 = st1 | st2
```
**Example:**
@@ -247,6 +244,7 @@ st3 = st1.union(st2)
fruits = {'banana', 'orange', 'mango', 'lemon'}
vegetables = {'tomato', 'potato', 'cabbage','onion', 'carrot'}
print(fruits.union(vegetables)) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabbage', 'potato', 'onion'}
+# or using this : print(fruits | vegetables)
```
- Update
@@ -270,13 +268,14 @@ print(fruits) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabb
### Finding Intersection Items
-Intersection returns a set of items which are in both the sets. See the example
+Intersection returns a set of items which are in both the sets or using _&_ symbol. See the example
```py
# syntax
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item3', 'item2'}
st1.intersection(st2) # {'item3', 'item2'}
+# or using thia : st1 & st2
```
**Example:**
@@ -289,6 +288,7 @@ whole_numbers.intersection(even_numbers) # {0, 2, 4, 6, 8, 10}
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.intersection(dragon) # {'o', 'n'}
+# python & dragon
```
### Checking Subset and Super Set
@@ -321,14 +321,14 @@ python.issubset(dragon) # False
### Checking the Difference Between Two Sets
-It returns the difference between two sets.
+It returns the difference between two sets or using _-_ symbol .
```py
# syntax
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
-st2.difference(st1) # set()
-st1.difference(st2) # {'item1', 'item4'} => st1\st2
+st2.difference(st1) # set() : st2 - st1
+st1.difference(st2) # {'item1', 'item4'} => st1\st2 : st2 - st1
```
**Example:**
@@ -341,19 +341,21 @@ whole_numbers.difference(even_numbers) # {1, 3, 5, 7, 9}
python = {'p', 'y', 't', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.difference(dragon) # {'p', 'y', 't'} - the result is unordered (characteristic of sets)
+# python - dragon
dragon.difference(python) # {'d', 'r', 'a', 'g'}
+# dragon - python
```
### Finding Symmetric Difference Between Two Sets
-It returns the the symmetric difference between two sets. It means that it returns a set that contains all items from both sets, except items that are present in both sets, mathematically: (A\B) ∪ (B\A)
+It returns the symmetric difference between two sets. It means that it returns a set that contains all items from both sets, except items that are present in both sets, mathematically: (A\B) ∪ (B\A)
```py
# syntax
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
# it means (A\B)∪(B\A)
-st2.symmetric_difference(st1) # {'item1', 'item4'}
+st2.symmetric_difference(st1) # {'item1', 'item4'} : st2 ^ st1
```
**Example:**
@@ -366,6 +368,7 @@ whole_numbers.symmetric_difference(some_numbers) # {0, 6, 7, 8, 9, 10}
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.symmetric_difference(dragon) # {'r', 't', 'p', 'y', 'g', 'a', 'd', 'h'}
+# python ^ dragon
```
### Joining Sets
@@ -383,7 +386,7 @@ st2.isdisjoint(st1) # False
```py
even_numbers = {0, 2, 4 ,6, 8}
-even_numbers = {1, 3, 5, 7, 9}
+odd_numbers = {1, 3, 5, 7, 9}
even_numbers.isdisjoint(odd_numbers) # True, because no common item
python = {'p', 'y', 't', 'h', 'o','n'}
@@ -414,19 +417,18 @@ age = [22, 19, 24, 25, 26, 24, 25, 24]
### Exercises: Level 2
1. Join A and B
-1. Find A intersection B
-1. Is A subset of B
-1. Are A and B disjoint sets
-1. Join A with B and B with A
-1. What is the symmetric difference between A and B
-1. Delete the sets completely
+2. Find A intersection B
+3. Is A subset of B
+4. Are A and B disjoint sets
+5. Join A with B and B with A
+6. What is the symmetric difference between A and B
+7. Delete the sets completely
### Exercises: Level 3
1. Convert the ages to a set and compare the length of the list and the set, which one is bigger?
-1. Explain the difference between the following data types: string, list, tuple and set
-2. _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.
-
+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 ! 🎉
diff --git a/08_Day_Dictionaries/08_dictionaries.md b/08_Day_Dictionaries/08_dictionaries.md
index 20248a1de..07bd049e3 100644
--- a/08_Day_Dictionaries/08_dictionaries.md
+++ b/08_Day_Dictionaries/08_dictionaries.md
@@ -89,7 +89,7 @@ person = {
'last_name':'Yetayeh',
'age':250,
'country':'Finland',
- 'is_marred':True,
+ 'is_married':True,
'skills':['JavaScript', 'React', 'Node', 'MongoDB', 'Python'],
'address':{
'street':'Space street',
@@ -150,7 +150,7 @@ person = {
}
print(person.get('first_name')) # Asabeneh
print(person.get('country')) # Finland
-print(person.get('skills')) #['HTML','CSS','JavaScript', 'React', 'Node', 'MongoDB', 'Python']
+print(person.get('skills')) #['JavaScript', 'React', 'Node', 'MongoDB', 'Python']
print(person.get('city')) # None
```
diff --git a/09_Day_Conditionals/09_conditionals.md b/09_Day_Conditionals/09_conditionals.md
index 578ea5780..811908c7e 100644
--- a/09_Day_Conditionals/09_conditionals.md
+++ b/09_Day_Conditionals/09_conditionals.md
@@ -29,6 +29,8 @@
- [If and Or Logical Operators](#if-and-or-logical-operators)
- [💻 Exercises: Day 9](#-exercises-day-9)
- [Exercises: Level 1](#exercises-level-1)
+ - [Exercises: Level 2](#exercises-level-2)
+ - [Exercises: Level 3](#exercises-level-3)
# 📘 Day 9
@@ -72,7 +74,7 @@ else:
this part of code runs for false conditions
```
-**Example: **
+**Example:**
```py
a = 3
@@ -82,7 +84,7 @@ else:
print('A is a positive number')
```
-The condition above proves false, therefore the else block was executed. How about if our condition is more than two? We could use _ elif_.
+The condition above proves false, therefore the else block was executed. How about if our condition is more than two? We could use _elif_.
### If Elif Else
@@ -99,7 +101,7 @@ else:
```
-**Example: **
+**Example:**
```py
a = 0
@@ -118,7 +120,7 @@ else:
code if condition else code
```
-**Example: **
+**Example:**
```py
a = 3
@@ -137,7 +139,7 @@ if condition:
code
```
-**Example: **
+**Example:**
```py
a = 0
@@ -163,7 +165,7 @@ if condition and condition:
code
```
-**Example: **
+**Example:**
```py
a = 0
@@ -185,7 +187,7 @@ if condition or condition:
code
```
-**Example: **
+**Example:**
```py
user = 'James'
@@ -202,7 +204,8 @@ else:
### 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:
+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:
+
```sh
Enter your age: 30
You are old enough to learn to drive.
@@ -210,12 +213,15 @@ else:
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:
+
+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:
+
```sh
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:
+
+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:
```sh
Enter number one: 4
@@ -223,39 +229,42 @@ Enter number two: 3
4 is greater than 3
```
- ### Exercises: Level 2
+### Exercises: Level 2
1. Write a code which gives grade to students according to theirs scores:
-
- ```sh
- 80-100, A
- 70-89, B
- 60-69, C
- 50-59, D
- 0-49, F
- ```
-1. Check if the season is Autumn, Winter, Spring or Summer. If the user input is:
+
+ ```sh
+ 90-100, A
+ 80-89, B
+ 70-79, C
+ 60-69, D
+ 0-59, F
+ ```
+
+ 2. Get the month from user input then 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
-2. The following list contains some fruits:
+ 3. The following list contains some fruits:
+
```sh
fruits = ['banana', 'orange', 'mango', 'lemon']
```
- If a fruit doesn't exist in the list add the fruit to the list and print the modified list. If the fruit exists print('That fruit already exist in the list')
- ### Exercises: Level 3
+ If a fruit doesn't exist in the list add the fruit to the list and print the modified list. If the fruit exists print('That fruit already exist in the list')
+
+### Exercises: Level 3
1. Here we have a person dictionary. Feel free to modify it!
-
+
```py
person={
'first_name': 'Asabeneh',
'last_name': 'Yetayeh',
'age': 250,
'country': 'Finland',
- 'is_marred': True,
+ 'is_married': True,
'skills': ['JavaScript', 'React', 'Node', 'MongoDB', 'Python'],
'address': {
'street': 'Space street',
diff --git a/10_Day_Loops/10_loops.md b/10_Day_Loops/10_loops.md
index e80a392d6..4f9730e2e 100644
--- a/10_Day_Loops/10_loops.md
+++ b/10_Day_Loops/10_loops.md
@@ -127,6 +127,7 @@ while condition:
count = 0
while count < 5:
if count == 3:
+ count = count + 1
continue
print(count)
count = count + 1
@@ -138,7 +139,7 @@ The above while loop only prints 0, 1, 2 and 4 (skips 3).
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).
-- For loop with list
+-Using For loop on list
```py
# syntax
@@ -154,7 +155,7 @@ for number in numbers: # number is temporary name to refer to the list's items,
print(number) # the numbers will be printed line by line, from 0 to 5
```
-- For loop with string
+-Using For loop on string
```py
# syntax
@@ -174,7 +175,7 @@ for i in range(len(language)):
print(language[i])
```
-- For loop with tuple
+-Using For loop on tuple
```py
# syntax
@@ -221,7 +222,7 @@ for key, value in person.items():
print(key, value) # this way we get both keys and values printed out
```
-- Loops in set
+-Using For Loop in set
```py
# syntax
@@ -240,7 +241,7 @@ for company in it_companies:
### Break and Continue - Part 2
Short reminder:
-_Break_: We use break when we like to stop our loop before it is completed.
+_Break_: We use break when we want to stop our loop before it is completed.
```py
# syntax
@@ -262,7 +263,7 @@ for number in numbers:
In the above example, the loop stops when it reaches 3.
-Continue: We use continue when we like to skip some of the steps in the iteration of the loop.
+Continue: We use continue when we want to skip some of the steps in the iteration of the loop.
```py
# syntax
@@ -288,7 +289,12 @@ In the example above, if the number equals 3, the step *after* the condition (bu
### The Range Function
-The _range()_ function is used list of numbers. The _range(start, end, step)_ takes three parameters: starting, ending and increment. By default it starts from 0 and the increment is 1. The range sequence needs at least 1 argument (end).
+The _range()_ function is used to loop through a set of code a certain number of times. The _range(start,end, step)_ takes three parameters: starting, ending and increment.
+ start: integer starting from which the sequence of integers is to be returned
+ stop: integer before which the sequence of integers is to be returned.
+ The range of integers end at stop – 1.
+ step: integer value which determines the increment between each integer in the sequence
+By default it starts from 0 and the increment is 1. The range sequence needs at least 1 argument (end).
Creating sequences using range
```py
@@ -301,6 +307,10 @@ 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}
+
+# for backward from start to end
+lst = list(range(11,0,-2))
+print(lst) # [11,9,7,5,3,1]
```
```py
@@ -440,7 +450,7 @@ for number in range(6):
The sum of all numbers is 5050.
```
-1. Use for loop to iterate from 0 to 100 and print the sum of all evens and the sum of all odds.
+2. Use for loop to iterate from 0 to 100 and print the sum of all evens and the sum of all odds.
```sh
The sum of all evens is 2550. And the sum of all odds is 2500.
@@ -449,8 +459,8 @@ for number in range(6):
### Exercises: Level 3
1. Go to the data folder and use the [countries.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries.py) file. Loop through the countries and extract all the countries containing the word _land_.
-1. This is a fruit list, ['banana', 'orange', 'mango', 'lemon'] reverse the order using loop.
-2. Go to the data folder and use the [countries_data.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries-data.py) file.
+2. This is a fruit list, ['banana', 'orange', 'mango', 'lemon'] reverse the order using loop.
+3. Go to the data folder and use the [countries_data.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries-data.py) file.
1. What are the total number of languages in the data
2. Find the ten most spoken languages from the data
3. Find the 10 most populated countries in the world
diff --git a/11_Day_Functions/11_functions.md b/11_Day_Functions/11_functions.md
index f7bd8f9ae..3e413f83c 100644
--- a/11_Day_Functions/11_functions.md
+++ b/11_Day_Functions/11_functions.md
@@ -31,6 +31,7 @@
- [Arbitrary Number of Arguments](#arbitrary-number-of-arguments)
- [Default and Arbitrary Number of Parameters in Functions](#default-and-arbitrary-number-of-parameters-in-functions)
- [Function as a Parameter of Another Function](#function-as-a-parameter-of-another-function)
+ - [Testimony](#testimony)
- [💻 Exercises: Day 11](#-exercises-day-11)
- [Exercises: Level 1](#exercises-level-1)
- [Exercises: Level 2](#exercises-level-2)
@@ -48,7 +49,7 @@ A function is a reusable block of code or programming statements designed to per
### Declaring and Calling a Function
-When we make a function, we call it declaring a function. When we start using the it, we call it *calling* or *invoking* a function. Function can be declared with or without parameters.
+When we make a function, we call it declaring a function. When we start using the it, we call it _calling_ or _invoking_ a function. Functions can be declared with or without parameters.
```py
# syntax
@@ -85,7 +86,7 @@ add_two_numbers()
### Function Returning a Value - Part 1
-Function can also return values, if a function does not have a return statement, the value of the function is None. Let us rewrite the above functions using return. From now on, we get a value from a function when we call the function and print it.
+Functions return values using the _return_ statement. If a function has no return statement, it returns None. Let us rewrite the above functions using return. From now on, we get a value from a function when we call the function and print it.
```py
def generate_full_name ():
@@ -106,7 +107,7 @@ print(add_two_numbers())
### Function with Parameters
-In a function we can pass different data types(number, string, boolean, list, tuple, dictionary or set) as a parameter
+In a function we can pass different data types(number, string, boolean, list, tuple, dictionary or set) as parameters.
- Single Parameter: If our function takes a parameter we should call our function with an argument
@@ -148,7 +149,7 @@ def sum_of_numbers(n):
total = 0
for i in range(n+1):
total+=i
- print(total)
+ return total
print(sum_of_numbers(10)) # 55
print(sum_of_numbers(100)) # 5050
```
@@ -181,7 +182,7 @@ print('Sum of two numbers: ', sum_two_numbers(1, 9))
def calculate_age (current_year, birth_year):
age = current_year - birth_year
- return age;
+ return age
print('Age: ', calculate_age(2021, 1819))
@@ -212,12 +213,12 @@ def print_fullname(firstname, lastname):
space = ' '
full_name = firstname + space + lastname
print(full_name)
-print(print_fullname(firstname = 'Asabeneh', lastname = 'Yetayeh'))
+print_fullname(firstname = 'Asabeneh', lastname = 'Yetayeh')
def add_two_numbers (num1, num2):
total = num1 + num2
- print(total)
-print(add_two_numbers(num2 = 3, num1 = 2)) # Order does not matter
+ return total
+print(add_two_numbers(num2 = 3, num1 = 2)) # Order does not matter
```
### Function Returning a Value - Part 2
@@ -251,7 +252,7 @@ print(add_two_numbers(2, 3))
def calculate_age (current_year, birth_year):
age = current_year - birth_year
- return age;
+ return age
print('Age: ', calculate_age(2019, 1819))
```
@@ -261,7 +262,6 @@ print('Age: ', calculate_age(2019, 1819))
```py
def is_even (n):
if n % 2 == 0:
- print('even')
return True # return stops further execution of the function, similar to break
return False
print(is_even(10)) # True
@@ -315,7 +315,7 @@ print(generate_full_name('David','Smith'))
def calculate_age (birth_year,current_year = 2021):
age = current_year - birth_year
- return age;
+ return age
print('Age: ', calculate_age(1821))
def weight_of_object (mass, gravity = 9.81):
@@ -356,10 +356,48 @@ print(sum_all_nums(2, 3, 5)) # 10
def generate_groups (team,*args):
print(team)
for i in args:
- print(i)
-print(generate_groups('Team-1','Asabeneh','Brook','David','Eyob'))
+ print(i)
+generate_groups('Team-1','Asabeneh','Brook','David','Eyob')
+```
+### Dictionary unpacking
+
+You can call a function which has named arguments using a dictionary with matching key names. You do so using ``**``.
+
+```py
+# Define a function that takes two arguments: 'name' and 'location'
+def greet(name, location):
+ # Print a greeting message using the provided arguments
+ print("Hi there", name, "how is the weather in", location)
+
+# Call the function using keyword arguments
+greet(name="Alice", location="New York")
+# Output: Hi there Alice how is the weather in New York
+
+# Create a dictionary with keys matching the function's parameter names
+my_dict = {"name": "Alice", "location": "New York"}
+
+# Call the function using dictionary unpacking
+greet(**my_dict)
+# The ** operator unpacks the dictionary, passing its key-value pairs
+# as keyword arguments to the function.
+# Output: Hi there Alice how is the weather in New York
+```
+
+### Arbitrary Number of Named Arguments
+
+You can also define a function to accept an arbitrary number of named arguments.
+
+```py
+def arbitrary_named_args(**args):
+ print("I received an arbitrary number of arguments, totaling", len(args))
+ print("They are provided as a dictionary in my function:", type(args))
+ print("Let's print them:")
+ for k, v in args.items():
+ print(" * key:", k, "value:", v)
```
+Generally avoid this unless required as it makes it harder to understand what the function accepts and does.
+
### Function as a Parameter of Another Function
```py
@@ -368,11 +406,15 @@ def square_number (n):
return n * n
def do_something(f, x):
return f(x)
-print(do_something(square_number, 3)) # 27
+print(do_something(square_number, 3)) # 9
```
🌕 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
+
+Now it is time to express your thoughts about the Author and 30DaysOfPython. You can leave your testimonial on this [link](https://testimonial-s3sw.onrender.com/)
+
## 💻 Exercises: Day 11
### Exercises: Level 1
@@ -390,7 +432,7 @@ print(do_something(square_number, 3)) # 27
```py
print(reverse_list([1, 2, 3, 4, 5]))
# [5, 4, 3, 2, 1]
-print(reverse_list1(["A", "B", "C"]))
+print(reverse_list(["A", "B", "C"]))
# ["C", "B", "A"]
```
@@ -398,18 +440,19 @@ print(reverse_list1(["A", "B", "C"]))
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.
```py
-food_staff = ['Potato', 'Tomato', 'Mango', 'Milk'];
-print(add_item(food_staff, 'Meat')) # ['Potato', 'Tomato', 'Mango', 'Milk','Meat'];
+food_stuff = ['Potato', 'Tomato', 'Mango', 'Milk'];
+print(add_item(food_stuff, 'Meat')) # ['Potato', 'Tomato', 'Mango', 'Milk','Meat'];
numbers = [2, 3, 7, 9];
-print(add_item(numbers, 5)) [2, 3, 7, 9, 5]
+print(add_item(numbers, 5)) # [2, 3, 7, 9, 5]
+
```
12. Declare a function named remove_item. It takes a list and an item parameters. It returns a list with the item removed from it.
```py
-food_staff = ['Potato', 'Tomato', 'Mango', 'Milk'];
-print(remove_item(food_staff, 'Mango')) # ['Potato', 'Tomato', 'Milk'];
-numbers = [2, 3, 7, 9];
+food_stuff = ['Potato', 'Tomato', 'Mango', 'Milk']
+print(remove_item(food_stuff, 'Mango')) # ['Potato', 'Tomato', 'Milk'];
+numbers = [2, 3, 7, 9]
print(remove_item(numbers, 3)) # [2, 7, 9]
```
@@ -417,8 +460,8 @@ print(remove_item(numbers, 3)) # [2, 7, 9]
```py
print(sum_of_numbers(5)) # 15
-print(sum_all_numbers(10)) # 55
-print(sum_all_numbers(100)) # 5050
+print(sum_of_numbers(10)) # 55
+print(sum_of_numbers(100)) # 5050
```
14. Declare a function named sum_of_odds. It takes a number parameter and it adds all the odd numbers in that range.
@@ -426,7 +469,7 @@ print(sum_all_numbers(100)) # 5050
### 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.
+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.
```py
print(evens_and_odds(100))
@@ -437,6 +480,22 @@ print(sum_all_numbers(100)) # 5050
1. Call your function factorial, it takes a whole number as a parameter and it return a factorial of the number
1. Call your function _is_empty_, it takes a parameter and it checks if it is empty or not
1. Write different functions which take lists. They should calculate_mean, calculate_median, calculate_mode, calculate_range, calculate_variance, calculate_std (standard deviation).
+1. Write a function called _greet_ which takes a default argument, _name_. If no argument is supplied it should print "Hello, Guest!", otherwise it should greet the person by name.
+
+```py
+ greet()
+ # "Hello, Guest!
+ greet("Alice")
+ # "Hello, Alice!"
+```
+1. Create a function called _show_args_ to take an arbitrary number of named arguments and print their names and values.
+ ```py
+ show_args(name="Alice", age=30, city="New York")
+ # Received: name: Alice, age: 30, city: New York
+ show_args(name="Bob", pet="Fluffy, the bunny")
+ # Received: name: Bob, pet: Fluffy, the bunny
+ ```
+
### Exercises: Level 3
diff --git a/12_Day_Modules/12_modules.md b/12_Day_Modules/12_modules.md
index caa6e94b8..07508a88b 100644
--- a/12_Day_Modules/12_modules.md
+++ b/12_Day_Modules/12_modules.md
@@ -12,7 +12,7 @@
Second Edition: July, 2021
-
+
[<< Day 11](../11_Day_Functions/11_functions.md) | [Day 13>>](../13_Day_List_comprehension/13_list_comprehension.md)
@@ -77,7 +77,7 @@ We can have many functions in a file and we can import all the functions differe
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;
+mass = 100
weight = mass * gravity
print(weight)
print(person['firstname'])
@@ -92,7 +92,7 @@ During importing we can rename the name of the module.
from mymodule import generate_full_name as fullname, sum_two_nums as total, person as p, gravity as g
print(fullname('Asabneh','Yetayeh'))
print(total(1, 9))
-mass = 100;
+mass = 100
weight = mass * g
print(weight)
print(p)
@@ -251,9 +251,9 @@ print(randint(5, 20)) # it returns a random integer number between [5, 20] inclu
### Exercises: Level 1
-1. Writ a function which generates a six digit/character random_user_id.
+1. Write a function which generates a six digit/character random_user_id.
```py
- print(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.
diff --git a/12_Day_Modules/main.py b/12_Day_Modules/main.py
index 2c11370d9..e5e3e416e 100644
--- a/12_Day_Modules/main.py
+++ b/12_Day_Modules/main.py
@@ -2,7 +2,8 @@
from mymodule import generate_full_name as fullname, sum_two_nums as total, person as p, gravity as g
print(fullname('Asabneh','Yetayeh'))
print(total(1, 9))
-mass = 100;
+mass = 100
+print(mass)
weight = mass * g
print(weight)
print(p)
diff --git a/13_Day_List_comprehension/13_list_comprehension.md b/13_Day_List_comprehension/13_list_comprehension.md
index d5c392f1c..71e18298b 100644
--- a/13_Day_List_comprehension/13_list_comprehension.md
+++ b/13_Day_List_comprehension/13_list_comprehension.md
@@ -12,7 +12,7 @@
Second Edition: July, 2021
-
+
[<< Day 12](../12_Day_Modules/12_modules.md) | [Day 14>>](../14_Day_Higher_order_functions/14_higher_order_functions.md)
@@ -34,7 +34,7 @@ List comprehension in Python is a compact way of creating a list from a sequence
```py
# syntax
-[i for i in iterable if expression]
+[expression for i in iterable if condition]
```
**Example:1**
@@ -89,7 +89,7 @@ odd_numbers = [i for i in range(21) if i % 2 != 0] # to generate odd numbers in
print(odd_numbers) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
# Filter numbers: let's filter out positive even numbers from the list below
numbers = [-8, -7, -3, -1, 0, 1, 3, 4, 5, 7, 6, 8, 10]
-positive_even_numbers = [i for i in range(21) if i % 2 == 0 and i > 0]
+positive_even_numbers = [i for i in numbers if i % 2 == 0 and i > 0]
print(positive_even_numbers) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# Flattening a three dimensional array
@@ -108,7 +108,7 @@ To create a lambda function we use _lambda_ keyword followed by a parameter(s),
```py
# syntax
-x = lambda param1, param2, param3: param1 + param2 + param2
+x = lambda param1, param2, param3: param1 + param2 + param3
print(x(arg1, arg2, arg3))
```
diff --git a/14_Day_Higher_order_functions/14_higher_order_functions.md b/14_Day_Higher_order_functions/14_higher_order_functions.md
index 2af24c65e..68f65d713 100644
--- a/14_Day_Higher_order_functions/14_higher_order_functions.md
+++ b/14_Day_Higher_order_functions/14_higher_order_functions.md
@@ -11,8 +11,8 @@
Asabeneh Yetayeh
Second Edition: July, 2021
-
-
+
+
[<< Day 13](../13_Day_List_comprehension/13_list_comprehension.md) | [Day 15>>](../15_Day_Python_type_errors/15_python_type_errors.md)
@@ -177,14 +177,13 @@ def split_string_decorator(function):
func = function()
splitted_string = func.split()
return splitted_string
-
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
+print(greeting()) # ['WELCOME', 'TO', 'PYTHON']
```
### Accepting Parameters in Decorator Functions
@@ -201,7 +200,7 @@ def decorator_with_parameters(function):
@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))
+ first_name, last_name))
print_full_name("Asabeneh", "Yetayeh",'Finland')
```
diff --git a/15_Day_Python_type_errors/15_python_type_errors.md b/15_Day_Python_type_errors/15_python_type_errors.md
index 16c3e7136..949cc1fc9 100644
--- a/15_Day_Python_type_errors/15_python_type_errors.md
+++ b/15_Day_Python_type_errors/15_python_type_errors.md
@@ -11,7 +11,7 @@
Asabeneh Yetayeh
Second Edition: July, 2021
-
+
[<< Day 14](../14_Day_Higher_order_functions/14_higher_order_functions.md) | [Day 16 >>](../16_Day_Python_date_time/16_python_datetime.md)
@@ -183,7 +183,7 @@ AttributeError: module 'math' has no attribute 'PI'
>>>
```
-As you can see, I made a mistake again! Instead of pi, I tried to call a PI function from maths module. It raised an attribute error, it means, that the function does not exist in the module. Lets fix it by changing from PI to pi.
+As you can see, I made a mistake again! Instead of pi, I tried to call a PI constant from maths module. It raised an attribute error, it means, that the attribute does not exist in the module. Lets fix it by changing from PI to pi.
```py
asabeneh@Asabeneh:~$ python
@@ -358,4 +358,4 @@ If you are good at reading the error types then you will be able to fix your bug
🎉 CONGRATULATIONS ! 🎉
-[<< Day 14](../14_Day_Higher_order_functions/14_higher_order_functions.md) | [Day 16 >>](../16_Day_Python_date_time/16_python_datetime.md)
\ No newline at end of file
+[<< Day 14](../14_Day_Higher_order_functions/14_higher_order_functions.md) | [Day 16 >>](../16_Day_Python_date_time/16_python_datetime.md)
diff --git a/16_Day_Python_date_time/16_python_datetime.md b/16_Day_Python_date_time/16_python_datetime.md
index 65172be3b..6e93ceb09 100644
--- a/16_Day_Python_date_time/16_python_datetime.md
+++ b/16_Day_Python_date_time/16_python_datetime.md
@@ -11,7 +11,6 @@
Asabeneh Yetayeh
Second Edition: July, 2021
-
[<< Day 15](../15_Day_Python_type_errors/15_python_type_errors.md) | [Day 17 >>](../17_Day_Exception_handling/17_exception_handling.md)
@@ -25,7 +24,7 @@
- [Using *date* from *datetime*](#using-date-from-datetime)
- [Time Objects to Represent Time](#time-objects-to-represent-time)
- [Difference Between Two Points in Time Using](#difference-between-two-points-in-time-using)
- - [Difference Between Two Points in Time Using *timedelata*](#difference-between-two-points-in-time-using-timedelata)
+ - [Difference Between Two Points in Time Using *timedelta*](#difference-between-two-points-in-time-using-timedelta)
- [💻 Exercises: Day 16](#-exercises-day-16)
# 📘 Day 16
@@ -85,13 +84,13 @@ from datetime import datetime
# current date and time
now = datetime.now()
t = now.strftime("%H:%M:%S")
-print("time:", t)
+print("time:", t) # time: 18:21:40
time_one = now.strftime("%m/%d/%Y, %H:%M:%S")
# mm/dd/YY H:M:S format
-print("time one:", time_one)
+print("time one:", time_one) # time one: 06/28/2022, 18:21:40
time_two = now.strftime("%d/%m/%Y, %H:%M:%S")
# dd/mm/YY H:M:S format
-print("time two:", time_two)
+print("time two:", time_two) # time two: 28/06/2022, 18:21:40
```
```sh
@@ -105,14 +104,14 @@ Here are all the _strftime_ symbols we use to format time. An example of all the

### String to Time Using *strptime*
-Here is a [documentation](https://www.programiz.com/python-programming/datetime/strptimet) hat helps to understand the format.
+Here is a [documentation](https://www.programiz.com/python-programming/datetime/strptime) hat helps to understand the format.
```py
from datetime import datetime
date_string = "5 December, 2019"
-print("date_string =", date_string)
+print("date_string =", date_string) # date_string = 5 December, 2019
date_object = datetime.strptime(date_string, "%d %B, %Y")
-print("date_object =", date_object)
+print("date_object =", date_object) # date_object = 2019-12-05 00:00:00
```
```sh
@@ -125,7 +124,7 @@ date_object = 2019-12-05 00:00:00
```py
from datetime import date
d = date(2020, 1, 1)
-print(d)
+print(d) # 2020-01-01
print('Current date:', d.today()) # 2019-12-05
# date object of today's date
today = date.today()
@@ -140,16 +139,16 @@ print("Current day:", today.day) # 5
from datetime import time
# time(hour = 0, minute = 0, second = 0)
a = time()
-print("a =", a)
+print("a =", a) # a = 00:00:00
# time(hour, minute and second)
b = time(10, 30, 50)
-print("b =", b)
+print("b =", b) # b = 10:30:50
# time(hour, minute and second)
c = time(hour=10, minute=30, second=50)
-print("c =", c)
+print("c =", c) # c = 10:30:50
# time(hour, minute, second, microsecond)
d = time(10, 30, 50, 200555)
-print("d =", d)
+print("d =", d) # d = 10:30:50.200555
```
output
@@ -161,11 +160,12 @@ d = 10:30:50.200555
### Difference Between Two Points in Time Using
```py
+from datetime import date, datetime
today = date(year=2019, month=12, day=5)
new_year = date(year=2020, month=1, day=1)
time_left_for_newyear = new_year - today
# Time left for new year: 27 days, 0:00:00
-print('Time left for new year: ', time_left_for_newyear)
+print('Time left for new year: ', time_left_for_newyear) # Time left for new year: 27 days, 0:00:00
t1 = datetime(year = 2019, month = 12, day = 5, hour = 0, minute = 59, second = 0)
t2 = datetime(year = 2020, month = 1, day = 1, hour = 0, minute = 0, second = 0)
@@ -173,7 +173,7 @@ diff = t2 - t1
print('Time left for new year:', diff) # Time left for new year: 26 days, 23: 01: 00
```
-### Difference Between Two Points in Time Using *timedelata*
+### Difference Between Two Points in Time Using *timedelta*
```py
from datetime import timedelta
@@ -194,15 +194,15 @@ print("t3 =", t3)
## 💻 Exercises: Day 16
1. Get the current day, month, year, hour, minute and timestamp from datetime module
-1. Format the current date using this format: "%m/%d/%Y, %H:%M:%S")
-1. Today is 5 December, 2019. Change this time string to time.
-1. Calculate the time difference between now and new year.
-1. Calculate the time difference between 1 January 1970 and now.
-1. Think, what can you use the datetime module for? Examples:
+2. Format the current date using this format: "%m/%d/%Y, %H:%M:%S")
+3. Today is 5 December, 2019. Change this time string to time.
+4. Calculate the time difference between now and new year.
+5. Calculate the time difference between 1 January 1970 and now.
+6. Think, what can you use the datetime module for? Examples:
- Time series analysis
- To get a timestamp of any activities in an application
- Adding posts on a blog
🎉 CONGRATULATIONS ! 🎉
-[<< Day 15](../15_Day_Python_type_errors/15_python_type_errors.md) | [Day 17 >>](../17_Day_Exception_handling/17_exception_handling.md)
\ No newline at end of file
+[<< Day 15](../15_Day_Python_type_errors/15_python_type_errors.md) | [Day 17 >>](../17_Day_Exception_handling/17_exception_handling.md)
diff --git a/17_Day_Exception_handling/17_exception_handling.md b/17_Day_Exception_handling/17_exception_handling.md
index b9378ed9d..1d5409a05 100644
--- a/17_Day_Exception_handling/17_exception_handling.md
+++ b/17_Day_Exception_handling/17_exception_handling.md
@@ -16,6 +16,7 @@
[<< Day 16](../16_Day_Python_date_time/16_python_datetime.md) | [Day 18 >>](../18_Day_Regular_expressions/18_regular_expressions.md)

+
- [📘 Day 17](#-day-17)
- [Exception Handling](#exception-handling)
- [Packing and Unpacking Arguments in Python](#packing-and-unpacking-arguments-in-python)
@@ -106,7 +107,7 @@ try:
name = input('Enter your name:')
year_born = input('Year you born:')
age = 2019 - int(year_born)
- print('You are {name}. And your age is {age}.')
+ print(f'You are {name}. And your age is {age}.')
except TypeError:
print('Type error occur')
except ValueError:
@@ -128,12 +129,13 @@ I alway run.
```
It is also shorten the above code as follows:
+
```py
try:
name = input('Enter your name:')
year_born = input('Year you born:')
age = 2019 - int(year_born)
- print('You are {name}. And your age is {age}.')
+ print(f'You are {name}. And your age is {age}.')
except Exception as e:
print(e)
@@ -223,9 +225,9 @@ print(sum_all(1, 2, 3, 4, 5, 6, 7)) # 28
def packing_person_info(**kwargs):
# check the type of kwargs and it is a dict type
# print(type(kwargs))
- # Printing dictionary items
+ # Printing dictionary items
for key in kwargs:
- print("{key} = {kwargs[key]}")
+ print(f"{key} = {kwargs[key]}")
return kwargs
print(packing_person_info(name="Asabeneh",
@@ -247,7 +249,7 @@ Like in JavaScript, spreading is possible in Python. Let us check it in an examp
```py
lst_one = [1, 2, 3]
lst_two = [4, 5, 6, 7]
-lst = [0, *list_one, *list_two]
+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']
@@ -257,7 +259,7 @@ print(nordic_countries) # ['Finland', 'Sweden', 'Norway', 'Denmark', 'Iceland']
## Enumerate
-If we are interested in an index of a list, we use *enumerate* built-in function to get the index of each item in the list.
+If we are interested in an index of a list, we use _enumerate_ built-in function to get the index of each item in the list.
```py
for index, item in enumerate([20, 30, 40]):
@@ -265,14 +267,14 @@ for index, item in enumerate([20, 30, 40]):
```
```py
+countries = ['Finland', 'Sweden', 'Norway', 'Denmark', 'Iceland']
for index, i in enumerate(countries):
- print('hi')
if i == 'Finland':
- print('The country {i} has been found at index {index}')
+ print(f'The country {i} has been found at index {index}')
```
```sh
-The country Finland has been found at index 1.
+The country Finland has been found at index 0.
```
## Zip
@@ -299,6 +301,7 @@ print(fruits_and_veges)
1. names = ['Finland', 'Sweden', 'Norway','Denmark','Iceland', 'Estonia','Russia']. Unpack the first five countries and store them in a variable nordic_countries, store Estonia and Russia in es, and ru respectively.
+
🎉 CONGRATULATIONS ! 🎉
-[<< Day 16](../16_Day_Python_date_time/16_python_datetime.md) | [Day 18 >>](../18_Day_Regular_expressions/18_regular_expressions.md)
\ No newline at end of file
+[<< Day 16](../16_Day_Python_date_time/16_python_datetime.md) | [Day 18 >>](../18_Day_Regular_expressions/18_regular_expressions.md)
diff --git a/18_Day_Regular_expressions/18_regular_expressions.md b/18_Day_Regular_expressions/18_regular_expressions.md
index f8366d26c..4284f7b4d 100644
--- a/18_Day_Regular_expressions/18_regular_expressions.md
+++ b/18_Day_Regular_expressions/18_regular_expressions.md
@@ -12,7 +12,7 @@
First Edition: Nov 22 - Dec 22, 2019
-
+
[<< Day 17](../17_Day_Exception_handling/17_exception_handling.md) | [Day 19>>](../19_Day_File_handling/19_file_handling.md)
@@ -59,16 +59,16 @@ import re
To find a pattern we use different set of *re* character sets that allows to search for a match in a string.
-* *re.match()*: searches only in the beginning of the first line of the string and returns matched objects if found, else returns None.
-* *re.search*: Returns a match object if there is one anywhere in the string, including multiline strings.
-* *re.findall*: Returns a list containing all matches
-* *re.split*: Takes a string, splits it at the match points, returns a list
-* *re.sub*: Replaces one or many matches within a string
+- *re.match()*: searches only in the beginning of the first line of the string and returns matched objects if found, else returns None.
+- *re.search*: Returns a match object if there is one anywhere in the string, including multiline strings.
+- *re.findall*: Returns a list containing all matches
+- *re.split*: Takes a string, splits it at the match points, returns a list
+- *re.sub*: Replaces one or many matches within a string
#### Match
```py
-# syntac
+# syntax
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
```
@@ -85,7 +85,7 @@ span = match.span()
print(span) # (0, 15)
# Lets find the start and stop position from the span
start, end = span
-print(start, end) # 0, 15
+print(start, end) # 0 15
substring = txt[start:end]
print(substring) # I love to teach
```
@@ -129,7 +129,7 @@ substring = txt[start:end]
print(substring) # first
```
-As you can see, search is much better than match because it can look for the pattern throughout the text. Search returns a match object with a first match that was found, otherwise it returns _None_. A much better *re* function is *findall*. This function checks for the pattern through the whole string and returns all the matches as a list.
+As you can see, search is much better than match because it can look for the pattern throughout the text. Search returns a match object with a first match that was found, otherwise it returns *None*. A much better *re* function is *findall*. This function checks for the pattern through the whole string and returns all the matches as a list.
#### Searching for All Matches Using *findall*
@@ -179,19 +179,19 @@ txt = '''Python is the most beautiful language that a human being has ever creat
I recommend python for a first programming language'''
match_replaced = re.sub('Python|python', 'JavaScript', txt, re.I)
-print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.
+print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.I recommend python for a first programming language
# OR
match_replaced = re.sub('[Pp]ython', 'JavaScript', txt, re.I)
-print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.
+print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.I recommend python for a first programming language
```
Let us add one more example. The following string is really hard to read unless we remove the % symbol. Replacing the % with an empty string will clean the text.
```py
-txt = '''%I a%m te%%a%%che%r% a%n%d %% I l%o%ve te%ach%ing.
+txt = '''%I a%m te%%a%%che%r% a%n%d %% I l%o%ve te%ach%ing.
T%he%re i%s n%o%th%ing as r%ewarding a%s e%duc%at%i%ng a%n%d e%m%p%ow%er%ing p%e%o%ple.
-I fo%und te%a%ching m%ore i%n%t%er%%es%ting t%h%an any other %jobs.
+I fo%und te%a%ching m%ore i%n%t%er%%es%ting t%h%an any other %jobs.
D%o%es thi%s m%ot%iv%a%te %y%o%u to b%e a t%e%a%cher?'''
matches = re.sub('%', '', txt)
@@ -200,7 +200,7 @@ print(matches)
```sh
I am teacher and I love teaching.
-There is nothing as rewarding as educating and empowering people.
+There is nothing as rewarding as educating and empowering people.
I found teaching more interesting than any other jobs. Does this motivate you to be a teacher?
```
@@ -221,7 +221,7 @@ print(re.split('\n', txt)) # splitting using \n - end of line symbol
## Writing RegEx Patterns
To declare a string variable we use a single or double quote. To declare RegEx variable *r''*.
-The following pattern only identifies apple with lowercase, to make it case insensitive either we should rewrite our pattern or we should add a flag.
+The following pattern only identifies apple with lowercase, to make it case insensitive either we should rewrite our pattern or we should add a flag.
```py
import re
@@ -240,38 +240,39 @@ matches = re.findall(regex_pattern, txt)
print(matches) # ['Apple', 'apple']
```
+
* []: A set of characters
- * [a-c] means, a or b or c
- * [a-z] means, any letter from a to z
- * [A-Z] means, any character from A to Z
- * [0-3] means, 0 or 1 or 2 or 3
- * [0-9] means any number from 0 to 9
- * [A-Za-z0-9] any single character, that is a to z, A to Z or 0 to 9
-* \\: uses to escape special characters
- * \d means: match where the string contains digits (numbers from 0-9)
- * \D means: match where the string does not contain digits
-* . : any character except new line character(\n)
-* ^: starts with
- * r'^substring' eg r'^love', a sentence that starts with a word love
- * r'[^abc] means not a, not b, not c.
-* $: ends with
- * r'substring$' eg r'love$', sentence that ends with a word love
-* *: zero or more times
- * r'[a]*' means a optional or it can occur many times.
-* +: one or more times
- * r'[a]+' means at least once (or more)
-* ?: zero or one time
- * r'[a]?' means zero times or once
-* {3}: Exactly 3 characters
-* {3,}: At least 3 characters
-* {3,8}: 3 to 8 characters
-* |: Either or
- * r'apple|banana' means either apple or a banana
-* (): Capture and group
+ - [a-c] means, a or b or c
+ - [a-z] means, any letter from a to z
+ - [A-Z] means, any character from A to Z
+ - [0-3] means, 0 or 1 or 2 or 3
+ - [0-9] means any number from 0 to 9
+ - [A-Za-z0-9] any single character, that is a to z, A to Z or 0 to 9
+- \\: uses to escape special characters
+ - \d means: match where the string contains digits (numbers from 0-9)
+ - \D means: match where the string does not contain digits
+- . : any character except new line character(\n)
+- ^: starts with
+ - r'^substring' eg r'^love', a sentence that starts with a word love
+ - r'[^abc] means not a, not b, not c.
+- $: ends with
+ - r'substring$' eg r'love$', sentence that ends with a word love
+- *: zero or more times
+ - r'[a]*' means a optional or it can occur many times.
+- +: one or more times
+ - r'[a]+' means at least once (or more)
+- ?: zero or one time
+ - r'[a]?' means zero times or once
+- {3}: Exactly 3 characters
+- {3,}: At least 3 characters
+- {3,8}: 3 to 8 characters
+- |: Either or
+ - r'apple|banana' means either apple or a banana
+- (): Capture and group

-Let us use examples to clarify the meta characters above
+Let us use examples to clarify the meta characters above
### Square Bracket
@@ -321,7 +322,7 @@ txt = '''Apple and banana are fruits'''
matches = re.findall(regex_pattern, txt)
print(matches) # ['an', 'an', 'an', 'a ', 'ar']
-regex_pattern = r'[a].+' # . any character, + any character one or more times
+regex_pattern = r'[a].+' # . any character, + any character one or more times
matches = re.findall(regex_pattern, txt)
print(matches) # ['and banana are fruits']
```
@@ -331,7 +332,7 @@ print(matches) # ['and banana are fruits']
Zero or many times. The pattern could may not occur or it can occur many times.
```py
-regex_pattern = r'[a].*' # . any character, * any character zero or more times
+regex_pattern = r'[a].*' # . any character, * any character zero or more times
txt = '''Apple and banana are fruits'''
matches = re.findall(regex_pattern, txt)
print(matches) # ['and banana are fruits']
@@ -360,15 +361,15 @@ matches = re.findall(regex_pattern, txt)
print(matches) # ['2019', '2021']
txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
-regex_pattern = r'\d{1, 4}' # 1 to 4
+regex_pattern = r'\d{1,4}'
matches = re.findall(regex_pattern, txt)
-print(matches) # ['6', '2019', '8', '2021']
+print(matches) # ['6', '2019', '8', '2021']
```
### Cart ^
-* Starts with
-
+- Starts with
+
```py
txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
regex_pattern = r'^This' # ^ means starts with
@@ -376,7 +377,7 @@ matches = re.findall(regex_pattern, txt)
print(matches) # ['This']
```
-* Negation
+- Negation
```py
txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
@@ -388,7 +389,9 @@ print(matches) # ['6,', '2019', '8', '2021']
## 💻 Exercises: Day 18
### Exercises: Level 1
+
1. What is the most frequent word in the following paragraph?
+
```py
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.
```
@@ -423,9 +426,9 @@ print(matches) # ['6,', '2019', '8', '2021']
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.
```py
-points = ['-1', '2', '-4', '-3', '-1', '0', '4', '8']
-sorted_points = [-4, -3, -1, -1, 0, 2, 4, 8]
-distance = 8 -(-4) # 12
+points = ['-12', '-4', '-3', '-1', '0', '4', '8']
+sorted_points = [-12, -4, -3, -1, -1, 0, 2, 4, 8]
+distance = 8 -(-12) # 20
```
### Exercises: Level 2
@@ -453,4 +456,4 @@ distance = 8 -(-4) # 12
🎉 CONGRATULATIONS ! 🎉
-[<< Day 17](../17_Day_Exception_handling/17_exception_handling.md) | [Day 19>>](../19_Day_File_handling/19_file_handling.md)
\ No newline at end of file
+[<< Day 17](../17_Day_Exception_handling/17_exception_handling.md) | [Day 19>>](../19_Day_File_handling/19_file_handling.md)
diff --git a/19_Day_File_handling/19_file_handling.md b/19_Day_File_handling/19_file_handling.md
index de51b9bd1..da1e12bf7 100644
--- a/19_Day_File_handling/19_file_handling.md
+++ b/19_Day_File_handling/19_file_handling.md
@@ -166,7 +166,7 @@ with open('./files/reading_file_example.txt') as f:
To write to an existing file, we must add a mode as parameter to the _open()_ function:
-- "a" - append - will append to the end of the file, if the file does not it creates a new file.
+- "a" - append - will append to the end of the file, if the file does not exist it creates a new file.
- "w" - write - will overwrite any existing content, if the file does not exist it creates.
Let us append some text to the file we have been reading:
@@ -333,7 +333,7 @@ CSV stands for comma separated values. CSV is a simple file format used to store
```py
import csv
with open('./files/csv_example.csv') as f:
- csv_reader = csv.reader(f, delimiter=',') # w use, reader method to read csv
+ csv_reader = csv.reader(f, delimiter=',') # we use, reader method to read csv
line_count = 0
for row in csv_reader:
if line_count == 0:
@@ -349,6 +349,7 @@ with open('./files/csv_example.csv') as f:
```sh
# output:
Column names are :name, country, city, skills
+Number of lines: 1
Asabeneh is a teacher. He lives in Finland, Helsinki.
Number of lines: 2
```
@@ -359,7 +360,7 @@ To read excel files we need to install _xlrd_ package. We will cover this after
```py
import xlrd
-excel_book = xlrd.open_workbook('sample.xls)
+excel_book = xlrd.open_workbook('sample.xls')
print(excel_book.nsheets)
print(excel_book.sheet_names)
```
@@ -412,10 +413,10 @@ field: skills
### 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
+ 1) Read obama_speech.txt file and count number of lines and words
+ 2) Read michelle_obama_speech.txt file and count number of lines and words
+ 3) Read donald_speech.txt file and count number of lines and words
+ 4) 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
```py
@@ -471,8 +472,8 @@ field: skills
### 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
+1. Extract all incoming email addresses as a list from the email_exchange_big.txt file.
+2. 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
```py
# Your output should look like this
@@ -498,19 +499,17 @@ field: skills
(5, 'and')]
```
-6. Use the function, find_most_frequent_words to find:
- a) The ten most frequent words used in [Obama's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/obama_speech.txt)
- b) The ten most frequent words used in [Michelle's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/michelle_obama_speech.txt)
- c) The ten most frequent words used in [Trump's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/donald_speech.txt)
- d) The ten most frequent words used in [Melina's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/melina_trump_speech.txt)
-7. Write a python application that checks similarity between two texts. It takes a file or a string as a parameter and it will evaluate the similarity of the two texts. For instance check the similarity between the transcripts of [Michelle's](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/michelle_obama_speech.txt) and [Melina's](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/melina_trump_speech.txt) speech. You may need a couple of functions, function to clean the text(clean_text), function to remove support words(remove_support_words) and finally to check the similarity(check_text_similarity). List of [stop words](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/stop_words.py) are in the data directory
-8. Find the 10 most repeated words in the romeo_and_juliet.txt
-9. Read the [hacker news csv](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/hacker_news.csv) file and find out:
- a) Count the number of lines containing python or Python
- b) Count the number lines containing JavaScript, javascript or Javascript
- c) Count the number lines containing Java and not JavaScript
-
-### Exercises: Level 3
+3. Use the function, find_most_frequent_words to find:
+ 1) The ten most frequent words used in [Obama's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/obama_speech.txt)
+ 2) The ten most frequent words used in [Michelle's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/michelle_obama_speech.txt)
+ 3) The ten most frequent words used in [Trump's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/donald_speech.txt)
+ 4) The ten most frequent words used in [Melina's speech](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/melina_trump_speech.txt)
+4. Write a python application that checks similarity between two texts. It takes a file or a string as a parameter and it will evaluate the similarity of the two texts. For instance check the similarity between the transcripts of [Michelle's](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/michelle_obama_speech.txt) and [Melina's](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/melina_trump_speech.txt) speech. You may need a couple of functions, function to clean the text(clean_text), function to remove support words(remove_support_words) and finally to check the similarity(check_text_similarity). List of [stop words](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/stop_words.py) are in the data directory
+5. Find the 10 most repeated words in the romeo_and_juliet.txt
+6. Read the [hacker news csv](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/hacker_news.csv) file and find out:
+ 1) Count the number of lines containing python or Python
+ 2) Count the number lines containing JavaScript, javascript or Javascript
+ 3) Count the number lines containing Java and not JavaScript
🎉 CONGRATULATIONS ! 🎉
diff --git a/21_Day_Classes_and_objects/21_classes_and_objects.md b/21_Day_Classes_and_objects/21_classes_and_objects.md
index 9876cfb55..7e0e85198 100644
--- a/21_Day_Classes_and_objects/21_classes_and_objects.md
+++ b/21_Day_Classes_and_objects/21_classes_and_objects.md
@@ -180,7 +180,7 @@ Asabeneh Yetayeh is 250 years old. He lives in Helsinki, Finland
### Object Default Methods
-Sometimes, you may want to have a default values for your object methods. If we give default values for the parameters in the constructor, we can avoid errors when we call or instantiate our class without parameters. Let's see how it looks:
+Sometimes, you may want to have default values for your object methods. If we give default values for the parameters in the constructor, we can avoid errors when we call or instantiate our class without parameters. Let's see how it looks:
**Example:**
@@ -333,7 +333,7 @@ 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('Range: ', data.range()) # 14
print('Mean: ', data.mean()) # 30
print('Median: ', data.median()) # 29
print('Mode: ', data.mode()) # {'mode': 26, 'count': 5}
@@ -360,10 +360,7 @@ Frequency Distribution: [(20.0, 26), (16.0, 27), (12.0, 32), (8.0, 37), (8.0, 34
### Exercises: Level 2
-1. Create a class called PersonAccount. It has firstname, lastname, incomes, expenses properties and it has total_income, total_expense, account_info, add_income, add_expense and account_balance methods. Incomes is a set of incomes and its description. The same goes for expenses.
-
-### Exercises: Level 3
-
+1. Create a class called PersonAccount. It has firstname, lastname, incomes, expenses properties and it has total_income, total_expense, account_info, add_income, add_expense and account_balance methods. Incomes is a set of incomes and its description. The same goes for expenses.
🎉 CONGRATULATIONS ! 🎉
diff --git a/24_Day_Statistics/24_statistics.md b/24_Day_Statistics/24_statistics.md
index 4978e3c27..76a4251e4 100644
--- a/24_Day_Statistics/24_statistics.md
+++ b/24_Day_Statistics/24_statistics.md
@@ -930,7 +930,7 @@ Numpy is equipped with the robust statistical function as listed below
- Max np.max()
- Mean np.mean()
- Median np.median()
- - Varience
+ - Variance
- Percentile
- Standard deviation np.std()
@@ -1203,7 +1203,7 @@ plt.show()

-To draw the Gaussian normal distribution using numpy. As you can see below, the numpy can generate random numbers. To create random sample, we need the mean(mu), sigma(standard deviation), mumber of data points.
+To draw the Gaussian normal distribution using numpy. As you can see below, the numpy can generate random numbers. To create random sample, we need the mean(mu), sigma(standard deviation), number of data points.
```python
mu = 28
@@ -1218,7 +1218,7 @@ plt.show()

-# Summery
+# Summary
To summarize, the main differences with python lists are:
diff --git a/25_Day_Pandas/25_pandas.md b/25_Day_Pandas/25_pandas.md
index 4f1c8216c..4e4d8bc74 100644
--- a/25_Day_Pandas/25_pandas.md
+++ b/25_Day_Pandas/25_pandas.md
@@ -37,18 +37,18 @@
- [Creating a DataFrame](#creating-a-dataframe)
- [Adding a New Column](#adding-a-new-column)
- [Modifying column values](#modifying-column-values)
- - [Formating DataFrame columns](#formating-dataframe-columns)
+ - [Formatting DataFrame columns](#formatting-dataframe-columns)
- [Checking data types of Column values](#checking-data-types-of-column-values)
- [Boolean Indexing](#boolean-indexing)
- [Exercises: Day 25](#exercises-day-25)
-
+
# 📘 Day 25
## Pandas
Pandas is an open source, high-performance, easy-to-use data structures and data analysis tools for the Python programming language.
Pandas adds data structures and tools designed to work with table-like data which is *Series* and *Data Frames*.
-Pandas provides tools for data manipulation:
+Pandas provides tools for data manipulation:
- reshaping
- merging
@@ -72,18 +72,18 @@ pip install conda
pip install pandas
```
-Pandas data structure is based on *Series* and *DataFrames*.
+Pandas data structure is based on *Series* and *DataFrames*.
A *series* is a *column* and a DataFrame is a *multidimensional table* made up of collection of *series*. In order to create a pandas series we should use numpy to create a one dimensional arrays or a python list.
Let us see an example of a series:
Names Pandas Series
-
+
Countries Series
-
+
Cities Series
@@ -216,7 +216,7 @@ Pandas data frames can be created in different ways.
```python
data = [
- ['Asabeneh', 'Finland', 'Helsink'],
+ ['Asabeneh', 'Finland', 'Helsink'],
['David', 'UK', 'London'],
['John', 'Sweden', 'Stockholm']
]
@@ -455,7 +455,7 @@ print(df.tail()) # tails give the last five rows, we can increase the rows by pa
-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.
+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 columns. we do not know the number of rows. Let's use shape method.
```python
print(df.shape) # as you can see 10000 rows and three columns
@@ -487,7 +487,7 @@ print(heights)
2 74.110105
3 71.730978
4 69.881796
- ...
+ ...
9995 66.172652
9996 67.067155
9997 63.867992
@@ -510,7 +510,7 @@ print(weights)
2 212.740856
3 220.042470
4 206.349801
- ...
+ ...
9995 136.777454
9996 170.867906
9997 128.475319
@@ -528,7 +528,7 @@ print(len(heights) == len(weights))
The describe() method provides a descriptive statistical values of a dataset.
```python
-print(heights.describe()) # give statisical information about height data
+print(heights.describe()) # give statistical information about height data
```
```sh
@@ -621,9 +621,9 @@ Similar to describe(), the info() method also give information about the dataset
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 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
@@ -828,7 +828,7 @@ def calculate_bmi ():
b = w/(h*h)
bmi.append(b)
return bmi
-
+
bmi = calculate_bmi()
```
@@ -882,7 +882,7 @@ df
-### Formating DataFrame columns
+### Formatting DataFrame columns
The BMI column values of the DataFrame are float with many significant digits after decimal. Let's change it to one significant digit after point.
@@ -1102,7 +1102,7 @@ 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.
+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 = (35 + 30)/ 2
@@ -1202,7 +1202,7 @@ print(df[df['Ages'] < 120])
## Exercises: Day 25
-1. Read the hacker_news.csv file from data directory
+1. Read the hacker_news.csv file from data directory
1. Get the first five rows
1. Get the last five rows
1. Get the title column as pandas series
diff --git a/27_Day_Python_with_mongodb/27_python_with_mongodb.md b/27_Day_Python_with_mongodb/27_python_with_mongodb.md
index b708ed92c..2214d84cf 100644
--- a/27_Day_Python_with_mongodb/27_python_with_mongodb.md
+++ b/27_Day_Python_with_mongodb/27_python_with_mongodb.md
@@ -88,7 +88,7 @@ Select Python 3.6 or above driver
### Getting Connection String(MongoDB URI)
-Copy the connection string link and you will get something like this
+Copy the connection string link and you will get something like this:
```sh
mongodb+srv://asabeneh:@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority
@@ -103,7 +103,7 @@ Let us replace the password placeholder with the password you used to add a user
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 a bit stronger than this.
+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.
@@ -140,8 +140,9 @@ When we run the above code we get the default mongoDB databases.
### Creating a database and collection
-Let us create a database, database and collection in mongoDB will be created if it doesn't exist. Let's create a data base name _thirty_days_of_python_ and _students_ collection.
-To create a database
+Let us create a database, database and collection in mongoDB will be created if it doesn't exist. Let's create a data base name *thirty_days_of_python* and *students* collection.
+
+To create a database:
```sh
db = client.name_of_databse # we can create a database like this or the second way
diff --git a/29_Day_Building_API/29_building_API.md b/29_Day_Building_API/29_building_API.md
index 472b2c40d..6d77abb37 100644
--- a/29_Day_Building_API/29_building_API.md
+++ b/29_Day_Building_API/29_building_API.md
@@ -85,6 +85,7 @@ In this step, let us use dummy data and return it as a json. To return it as jso
from flask import Flask, Response
import json
+import os
app = Flask(__name__)
@@ -136,7 +137,7 @@ In stead of displaying dummy data let us connect the flask application with Mong
from flask import Flask, Response
import json
import pymongo
-
+import os
app = Flask(__name__)
@@ -194,7 +195,7 @@ By connecting the flask, we can fetch students collection data from the thirty_d
### Getting a document by id
-We can access signle document using an id, let's access Asabeneh using his id.
+We can access single document using an id, let's access Asabeneh using his id.
http://localhost:5000/api/v1.0/students/5df68a21f106fe2d315bbc8b
```py
@@ -206,7 +207,7 @@ from bson.objectid import ObjectId
import json
from bson.json_util import dumps
import pymongo
-
+import os
app = Flask(__name__)
@@ -259,7 +260,7 @@ import json
from bson.json_util import dumps
import pymongo
from datetime import datetime
-
+import os
app = Flask(__name__)
@@ -317,7 +318,7 @@ import json
from bson.json_util import dumps
import pymongo
from datetime import datetime
-
+import os
app = Flask(__name__)
@@ -398,7 +399,7 @@ import json
from bson.json_util import dumps
import pymongo
from datetime import datetime
-
+import os
app = Flask(__name__)
diff --git a/30_Day_Conclusions/30_conclusions.md b/30_Day_Conclusions/30_conclusions.md
index 5f8f2cf21..1a3b0e39f 100644
--- a/30_Day_Conclusions/30_conclusions.md
+++ b/30_Day_Conclusions/30_conclusions.md
@@ -8,7 +8,7 @@
-
+
Author:
Asabeneh Yetayeh
Second Edition: July, 2021
@@ -21,13 +21,18 @@
- [Day 30](#day-30)
- [Conclusions](#conclusions)
+ - [Testimony](#testimony)
# Day 30
+
## Conclusions
In the process of preparing this material I have learned quite a lot and you have inspired me to do more. Congratulations for making it to this level. If you have done all the exercise and the projects, now you are capable to go to a data analysis, data science, machine learning or web development paths. [Support the author for more educational materials](https://www.paypal.com/paypalme/asabeneh).
+## Testimony
+Now it is time to express your thoughts about the Author and 30DaysOfPython. You can leave your testimonial on this [link](https://www.asabeneh.com/testimonials)
+
GIVE FEEDBACK:
http://thirtydayofpython-api.herokuapp.com/feedback
diff --git a/Chinese/02_variables_builtin_functions.md b/Chinese/02_variables_builtin_functions.md
new file mode 100644
index 000000000..36ba68bb4
--- /dev/null
+++ b/Chinese/02_variables_builtin_functions.md
@@ -0,0 +1,307 @@
+
+
+[<< Day 1](../readme.md) | [Day 3 >>](../03_Day_Operators/03_operators.md)
+
+
+
+- [📘 Day 2](#-day-2)
+ - [내장 함수](#내장-함수)
+ - [변수](#변수)
+ - [한 줄로 여러개의 변수 선언](#한-줄로-여러개의-변수-선언)
+ - [자료형](#자료형)
+ - [자료형 확인 및 형변환](#자료형-확인-및-형변환)
+ - [숫자](#숫자)
+ - [💻 Exercises - Day 2](#-exercises---day-2)
+ - [Exercises: Level 1](#exercises-level-1)
+ - [Exercises: Level 2](#exercises-level-2)
+
+# 📘 Day 2
+
+## 내장 함수
+
+파이썬에는 수많은 내장 함수가 있습니다. 내장 함수는 전역에서 사용 가능하고 그건 importing 이나 configuring없이 내장 함수를 사용 가능하다는 뜻입니다. 다음은 가장 자주 사용되는 파이썬 내장함수들 중 몇가지입니다: _print()_, _len()_, _type()_, _int()_, _float()_, _str()_, _input()_, _list()_, _dict()_, _min()_, _max()_, _sum()_, _sorted()_, _open()_, _file()_, _help()_, and _dir()_. 밑의 표에서 [파이썬 공식문서](https://docs.python.org/3.9/library/functions.html) 에 쓰여진 파이썬 내장 함수의 전체 목록을 볼 수 있습니다.
+
+
+
+파이썬 쉘을 열고 가장 자주 사용되는 내장 함수를 사용해봅시다.
+
+
+
+다른 내장 함수를 사용해 더 연습해봅시다.
+
+
+
+위의 터미널에서 볼 수 있듯이, 파이썬에는 reserved word가 있습니다. reserved word는 변수나 함수를 선언할때 사용되지 않습니다. 변수에 관해서는 다음 장에서 다룰것입니다.
+
+이제 당신은 내장 함수에 익숙해졌을 것이라 믿습니다. 한번 더 내장 함수의 연습을 하고 다음 장으로 넘어갑시다.
+
+
+## 변수
+
+변수는 컴퓨터 메모리에 정보를 저장합니다. Mnemonic 변수는 많은 프로그래밍 언어에서 사용하도록 권장됩니다. Mnemonic 변수는 쉽게 기억하고 연관지을 수 있는 변수 이름입니다. 한 변수는 정보가 저장되어있는 메모리 주소를 참조합니다.
+변수 이름을 지정할 때는 시작 부분의 숫자, 특수 문자, 하이픈을 사용할 수 없습니다. 변수는 짧은 이름(예: x, y, z)을 가질 수 있지만 더 변수에 대한 설명을 담은 이름(이름, 성, 나이, 국가)을 사용하는 것을 추천합니다.
+
+파이썬 변수 이름 규칙
+
+- 변수 이름은 문자 또는 밑줄 문자로 시작해야 합니다
+- 변수 이름은 숫자로 시작할 수 없습니다
+- 변수 이름에는 알파벳과 숫자와 밑줄(A-z, 0-9 및 \_)만 사용할 수 있습니다
+- 변수 이름은 대소문자를 구분합니다(firstname, Firstname, FirstName, FIRSTNAME은 서로 다른 변수)
+
+사용가능한 변수 이름들을 살펴봅시다
+
+```shell
+firstname
+lastname
+age
+country
+city
+first_name
+last_name
+capital_city
+_if # reserved word를 변수 이름으로 사용하고 싶은 경우
+year_2021
+year2021
+current_year_2021
+birth_year
+num1
+num2
+```
+
+사용할 수 없는 변수 이름들
+
+```shell
+first-name
+first@name
+first$name
+num-1
+1num
+```
+
+우리는 많은 파이썬 개발자들이 채택한 표준 파이썬 변수 명명 방식을 사용할 것입니다. 파이썬 개발자들은 스네이크 케이스(snake_case) 변수 명명 규칙을 사용합니다. 우리는 두 개 이상의 단어를 포함하는 변수에 대해 각 단어 뒤에 밑줄 문자를 사용합니다(예: first_name, last_name, engine_rotation_speed). 아래 예제는 변수의 표준 명명 예제이며, 변수 이름이 둘 이상의 단어일 경우 밑줄이 필요합니다.
+
+변수에 특정 데이터 유형을 할당할 때 이를 변수 선언이라고 합니다. 예를 들어 아래 예제에서 내 이름은 first_name 변수에 할당됩니다. 등호 기호는 할당 연산자입니다. 할당은 변수에 데이터를 저장하는 것을 의미합니다. 파이썬에서 등호 기호는 수학에서의 등호가 아닙니다.
+
+_Example:_
+
+```py
+# 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'
+ }
+```
+
+내장 함수인 _print()_ 와 _len()_ 을 사용해봅시다. Print 함수는 인자의 수에 제한이 없습니다. 인자는 함수 괄호 안에 넣어 전달할 수 있는 값입니다. 아래 예제를 봅시다.
+
+**Example:**
+
+```py
+print('Hello, World!') # Hello, World! 라는 글이 하나의 인자입니다
+print('Hello',',', 'World','!') # 여러개의 인자를 받을 수 있습니다, 네개의 인자가 넘겨졌습니다
+print(len('Hello, World!')) # 하나의 인자만을 받습니다
+```
+
+위에서 정의된 변수들을 찍어보고 길이를 찾아봅시다:
+
+**Example:**
+
+```py
+# 변수에 저장된 값 찍기
+
+print('First name:', first_name)
+print('First name length:', len(first_name))
+print('Last name: ', last_name)
+print('Last name length: ', len(last_name))
+print('Country: ', country)
+print('City: ', city)
+print('Age: ', age)
+print('Married: ', is_married)
+print('Skills: ', skills)
+print('Person information: ', person_info)
+```
+
+### 한 줄로 여러개의 변수 선언
+
+하나의 줄에서 여러개의 변수를 선언할 수도 있습니다:
+
+**Example:**
+
+```py
+first_name, last_name, country, age, is_married = 'Asabeneh', 'Yetayeh', 'Helsink', 250, True
+
+print(first_name, last_name, country, age, is_married)
+print('First name:', first_name)
+print('Last name: ', last_name)
+print('Country: ', country)
+print('Age: ', age)
+print('Married: ', is_married)
+```
+
+내장 함수 _input()_ 을 사용해 사용자의 입력 받기. 사용자로부터 받은 정보를 first_name과 age 변수에 할당해봅시다.
+**Example:**
+
+```py
+first_name = input('What is your name: ')
+age = input('How old are you? ')
+
+print(first_name)
+print(age)
+```
+
+## 자료형
+
+파이썬에는 몇 가지 자료형이 있습니다. 자료형을 식별하기 위해 내장 함수 _type()_ 을 사용합니다. 서로 다른 자료형을 잘 이해하는 데 집중해 주시기를 부탁드립니다. 프로그래밍에서 모든것은 자료형과 관련이 있습니다. 처음에 자료형을 소개했지만 모든 주제가 자료형과 관련이 있기 때문에 다시 나옵니다. 자료형에 대해서는 각 섹션에서 자세히 설명하겠습니다.
+
+## 자료형 확인 및 형변환
+
+- 자료형 확인: 특정 정보/변수의 자료형을 확인하기위해 우리는 _type()_ 을 사용합니다
+ **Example:**
+
+```py
+# 다양한 파이썬 자료형
+# 다양한 자료형의 변수들을 선언해 봅시다.
+
+first_name = 'Asabeneh' # str
+last_name = 'Yetayeh' # str
+country = 'Finland' # str
+city= 'Helsinki' # str
+age = 250 # int, 제 실제 나이가 아닙니다, 걱정마세요
+
+# Printing out types
+print(type('Asabeneh')) # str
+print(type(first_name)) # str
+print(type(10)) # int
+print(type(3.14)) # float
+print(type(1 + 1j)) # complex
+print(type(True)) # bool
+print(type([1, 2, 3, 4])) # list
+print(type({'name':'Asabeneh','age':250, 'is_married':250})) # dict
+print(type((1,2))) # tuple
+print(type(zip([1,2],[3,4]))) # set
+```
+
+- 형변환: 하나의 자료형을 다른 자료형으로 변환합니다. _int()_, _float()_, _str()_, _list_, _set_ 를 사용합니다.
+ 산술 연산을 수행할 때 문자열 숫자들을 먼저 int 나 float로 변환해야 합니다. 그렇지 않으면 오류가 반환됩니다. 만약 숫자를 문자열과 결합한다면, 그 숫자는 먼저 문자열로 변환되어야 합니다. 결합에 대해서는 String 섹션에서 설명하겠습니다.
+
+ **Example:**
+
+```py
+# int to float
+num_int = 10
+print('num_int',num_int) # 10
+num_float = float(num_int)
+print('num_float:', num_float) # 10.0
+
+# float to int
+gravity = 9.81
+print(int(gravity)) # 9
+
+# int to str
+num_int = 10
+print(num_int) # 10
+num_str = str(num_int)
+print(num_str) # '10'
+
+# str to int or float
+num_str = '10.6'
+print('num_int', int(num_str)) # 10
+print('num_float', float(num_str)) # 10.6
+
+# 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']
+```
+
+## 숫자
+
+파이썬의 숫자 자료형:
+
+1. Integers: 정수(음수, 0 , 양수)
+ 예:
+ ... -3, -2, -1, 0, 1, 2, 3 ...
+
+2. 부동 소수점 숫자(10진수)
+ 예:
+ ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+
+3. 복소수
+ 예:
+ 1 + j, 2 + 4j, 1 - 1j
+
+🌕 당신은 정말 멋집니다. 여러분은 이제 막 2일차 도전을 마쳤고 위대함으로 가는 길에 두 걸음 앞서 있습니다. 이제 여러분의 뇌와 근육을 위한 운동을 하세요.
+
+## 💻 Exercises - Day 2
+
+### Exercises: Level 1
+
+1. 30DaysOfPython 내에 day_2라는 폴더를 생성하세요. 그 폴더 내에 variables.py 라는 파일을 생성하세요.
+2. 'Day 2: 30 Days of python programming'이라는 파이썬 주석을 작성합니다.
+3. first name 변수를 선언하고 변수에 값을 할당합니다.
+4. last name 변수를 선언하고 변수에 값을 할당합니다.
+5. full name 변수를 선언하고 변수에 값을 할당합니다.
+6. country 변수를 선언하고 값을 할당합니다.
+7. city 변수를 선언하고 값을 할당합니다.
+8. age 변수를 선언하고 값을 할당합니다.
+9. year 변수를 선언하고 값을 할당합니다.
+10. is_married 변수를 선언하고 값을 할당합니다.
+11. is_true 변수를 선언하고 값을 할당합니다.
+12. is_light_on 변수를 선언하고 값을 할당합니다.
+13. 한 줄에 여러개의 변수를 선언합니다.
+
+### Exercises: Level 2
+
+1. Check the data type of all your variables using type() built-in function
+1. Using the _len()_ built-in function, find the length of your first name
+1. Compare the length of your first name and your last name
+1. Declare 5 as num_one and 4 as num_two
+ 1. Add num_one and num_two and assign the value to a variable total
+ 2. Subtract num_two from num_one and assign the value to a variable diff
+ 3. Multiply num_two and num_one and assign the value to a variable product
+ 4. Divide num_one by num_two and assign the value to a variable division
+ 5. Use modulus division to find num_two divided by num_one and assign the value to a variable remainder
+ 6. Calculate num_one to the power of num_two and assign the value to a variable exp
+ 7. Find floor division of num_one by num_two and assign the value to a variable floor_division
+1. The radius of a circle is 30 meters.
+ 1. Calculate the area of a circle and assign the value to a variable name of _area_of_circle_
+ 2. Calculate the circumference of a circle and assign the value to a variable name of _circum_of_circle_
+ 3. Take radius as user input and calculate the area.
+1. Use the built-in input function to get first name, last name, country and age from a user and store the value to their corresponding variable names
+1. Run help('keywords') in Python shell or in your file to check for the Python reserved words or keywords
+
+1. type() 내장 함수를 사용하여 모든 변수의 자료형을 확인합니다.
+1. _len()_ 내장 함수를 사용하여 당신의 first name 의 길이를 찾습니다.
+1. 당신의 first name 과 last name 의 길이를 비교합니다.
+1. 5를 num_1로, 4를 num_2로 선언합니다.
+ 1. num_one과 num_two를 더하고 그 값을 변수 total 에 할당합니다.
+ 2. num_1에서 num_2를 빼고 그 값을 변수 diff 에 할당합니다.
+ 3. num_two와 num_one을 곱하여 그 값을 변수 product 에 할당합니다.
+ 4. num_one을 num_two로 나누고 그 값을 변수 division 에 할당합니다.
+ 5. 나머지 연산을 사용하여 num_two를 num_one으로 나눈 값을 찾고 변수 remainder 에 할당합니다.
+ 6. num_one을 num_two의 거듭제곱으로 계산하고 그 값을 변수 exp 에 할당합니다.
+ 7. num_one을 num_two로 나누고 소숫값은 버린 정수 값을 구하고 변수 floor_division 에 값을 할당합니다.
+1. 원의 반지름은 30미터입니다.
+ 1. 원의 면적을 계산하여 _area_of_circle_ 이라는 이름의 변수에 값을 할당합니다.
+ 2. 원의 둘레를 계산하여 _circum_of_circum_ 이라는 이름의 변수에 값을 할당합니다.
+ 3. 반경을 사용자 입력으로 받아서 면적을 계산합니다.
+1. 내장 함수 input을 사용하여 사용자로부터 이름, 성, 국가 및 나이를 얻고 해당 변수 이름에 값을 저장합니다.
+1. Python 셸 또는 파일에서 help('keywords')을 실행하여 파이썬의 reserved words 또는 키워드를 확인합니다.
+
+🎉 축하합니다 ! 🎉
+
+[<< Day 1](../readme.md) | [Day 3 >>](../03_Day_Operators/03_operators.md)
diff --git a/Korean/04_strings_ko.md b/Korean/04_strings_ko.md
new file mode 100644
index 000000000..a5e1d774f
--- /dev/null
+++ b/Korean/04_strings_ko.md
@@ -0,0 +1,591 @@
+
+
+
+[<< Day 3](../03_Day_Operators/03_operators.md) | [Day 5 >>](../05_Day_Lists/05_lists.md)
+
+
+
+- [Day 4](#day-4)
+ - [문자열](#strings)
+ - [문자열 만들기](#문자열-만들기)
+ - [문자열 연결](#문자열-연결)
+ - [문자열의 이스케이프 시퀀스](#문자열의-이스케이프-시퀀스)
+ - [문자열 포매팅](#문자열-포매팅)
+ - [올드 스타일 문자열 포매팅(% 연산자)](#올드-스타일-문자열-포매팅%-연산자)
+ - [새로운 스타일 문자열 포매팅(str.format)](#새로운-스타일-문자열-포매팅str.format)
+ - [문자열 Interpolation / f-Strings (Python 3.6+)](#string-interpolation--f-strings-python-36)
+ - [문자 시퀀스로서의 Python 문자열](#문자-시퀀스로서의-Python-문자열)
+ - [언패킹 문자](#언패킹-문자)
+ - [인덱스로 문자열의 문자에 액세스](#인덱스로-문자열의-문자에-액세스)
+ - [파이썬 문자열 슬라이싱](#파이썬-문자열-슬라이싱)
+ - [문자열 리버스](#문자열-리버스)
+ - [슬라이싱하는 동안 문자 건너뛰기](#슬라이싱하는-동안-문자-건너뛰기)
+ - [문자열 메서드](#문자열-메서드)
+ - [💻 Exercises - Day 4](#-exercises---day-4)
+
+# Day 4
+
+## 문자열
+
+텍스트는 문자열 데이터 유형입니다. 텍스트로 작성된 모든 데이터 유형은 문자열입니다. 작은따옴표, 큰따옴표 또는 삼중따옴표 아래의 모든 데이터는 문자열입니다. 문자열 데이터 유형을 처리하기 위한 다양한 문자열 메서드와 내장 함수가 있습니다. 문자열의 길이를 확인하려면 len() 메서드를 사용하십시오.
+
+### 문자열 만들기
+
+```py
+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)
+```
+
+여러 줄 문자열은 세 개의 작은따옴표(''') 또는 세 개의 큰따옴표(""")를 사용하여 생성됩니다. 아래 예를 참조하십시오.
+
+```py
+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)
+
+# Another way of doing the same thing
+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)
+```
+
+### 문자열 연결
+
+문자열을 함께 연결할 수 있습니다. 문자열을 병합하거나 연결하는 것을 연결이라고 합니다. 아래 예를 참조하십시오.
+
+```py
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+space = ' '
+full_name = first_name + space + last_name
+print(full_name) # Asabeneh Yetayeh
+# Checking the length of a string using len() built-in function
+print(len(first_name)) # 8
+print(len(last_name)) # 7
+print(len(first_name) > len(last_name)) # True
+print(len(full_name)) # 16
+```
+
+### 문자열의 이스케이프 시퀀스
+
+Python 및 기타 프로그래밍 언어에서 \ 다음에 오는 문자는 이스케이프 시퀀스입니다. 가장 일반적인 이스케이프 문자를 살펴보겠습니다.
+
+- \n: 새로운 라인
+- \t: 탭은(8칸)을 의미합니다.
+- \\: 백슬래시
+- \': 작은따옴표(')
+- \": 큰따옴표(")
+
+이제 위의 이스케이프 시퀀스를 예제와 함께 사용하는 방법을 살펴보겠습니다.
+
+```py
+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\t3\t5')
+print('Day 2\t3\t5')
+print('Day 3\t3\t5')
+print('Day 4\t3\t5')
+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!"
+```
+
+### 문자열 포매팅
+
+#### 올드 스타일 문자열 형식화(% 연산자)
+
+Python에는 문자열 형식을 지정하는 여러 가지 방법이 있습니다. 이 섹션에서는 그 중 일부를 다룰 것입니다. "%" 연산자는 "인수 지정자", "%s"와 같은 특수 기호와 함께 일반 텍스트를 포함하는 형식 문자열과 함께 "튜플"(고정 크기 목록)로 묶인 변수 세트의 형식을 지정하는 데 사용됩니다. , "%d", "%f", "%. 자릿수 f".
+
+- %s - 문자열(또는 숫자와 같은 문자열 표현이 있는 모든 객체)
+- %d - 정수
+- %f - 부동 소수점 숫자
+- "%. number of digits f" - 정밀도가 고정된 부동 소수점 숫자
+
+```py
+# Strings only
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+language = 'Python'
+formated_string = 'I am %s %s. I teach %s' %(first_name, last_name, language)
+print(formated_string)
+
+# Strings and numbers
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+formated_string = 'The area of circle with a radius %d is %.2f.' %(radius, area) # 2 refers the 2 significant digits after the point
+
+python_libraries = ['Django', 'Flask', 'NumPy', 'Matplotlib','Pandas']
+formated_string = 'The following are python libraries:%s' % (python_libraries)
+print(formated_string) # "The following are python libraries:['Django', 'Flask', 'NumPy', 'Matplotlib','Pandas']"
+```
+
+#### 새로운스타일 문자열 형식화(str.format)
+
+이 형식은 Python 버전 3에서 도입되었습니다.
+
+```py
+
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+language = 'Python'
+formated_string = 'I am {} {}. I teach {}'.format(first_name, last_name, language)
+print(formated_string)
+a = 4
+b = 3
+
+print('{} + {} = {}'.format(a, b, a + b))
+print('{} - {} = {}'.format(a, b, a - b))
+print('{} * {} = {}'.format(a, b, a * b))
+print('{} / {} = {:.2f}'.format(a, b, a / b)) # limits it to two digits after decimal
+print('{} % {} = {}'.format(a, b, a % b))
+print('{} // {} = {}'.format(a, b, a // b))
+print('{} ** {} = {}'.format(a, b, a ** b))
+
+# output
+4 + 3 = 7
+4 - 3 = 1
+4 * 3 = 12
+4 / 3 = 1.33
+4 % 3 = 1
+4 // 3 = 1
+4 ** 3 = 64
+
+# Strings and numbers
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+formated_string = 'The area of a circle with a radius {} is {:.2f}.'.format(radius, area) # 2 digits after decimal
+print(formated_string)
+
+```
+
+#### 문자열 Interpolation / f-Strings (Python 3.6+)
+
+또 다른 새로운 문자열 형식화는 문자열 보간법인 f-문자열입니다. 문자열은 f로 시작하고 해당 위치에 데이터를 주입할 수 있습니다.
+
+```py
+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}')
+```
+
+### 문자 시퀀스로서의 Python 문자열
+
+Python 문자열은 문자 시퀀스이며, 기본 액세스 방법을 다른 Python 순서 객체 시퀀스(목록 및 튜플)와 공유합니다. 문자열(및 모든 시퀀스의 개별 멤버)에서 단일 문자를 추출하는 가장 간단한 방법은 해당 변수로 압축을 푸는 것입니다.
+
+#### 언패킹 문자
+
+```
+language = 'Python'
+a,b,c,d,e,f = language # unpacking sequence characters into variables
+print(a) # P
+print(b) # y
+print(c) # t
+print(d) # h
+print(e) # o
+print(f) # n
+```
+
+#### 인덱스로 문자열의 문자에 액세스
+
+프로그래밍에서 카운팅은 0부터 시작합니다. 따라서 문자열의 첫 번째 문자는 인덱스가 0이고 문자열의 마지막 문자는 문자열의 길이에서 1을 뺀 값입니다.
+
+
+
+```py
+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
+```
+
+오른쪽 끝에서 시작하려면 음수 인덱싱을 사용할 수 있습니다. -1은 마지막 인덱스입니다.
+
+```py
+language = 'Python'
+last_letter = language[-1]
+print(last_letter) # n
+second_last = language[-2]
+print(second_last) # o
+```
+
+#### 파이썬 문자열 슬라이싱
+
+파이썬에서는 문자열을 하위 문자열로 슬라이스할 수 있습니다.
+
+```py
+language = 'Python'
+first_three = language[0:3] # starts at zero index and up to 3 but not include 3
+print(first_three) #Pyt
+last_three = language[3:6]
+print(last_three) # hon
+# Another way
+last_three = language[-3:]
+print(last_three) # hon
+last_three = language[3:]
+print(last_three) # hon
+```
+
+#### 문자열 리버스
+
+파이썬에서 문자열을 쉽게 뒤집을 수 있습니다.
+
+```py
+greeting = 'Hello, World!'
+print(greeting[::-1]) # !dlroW ,olleH
+```
+
+#### 슬라이싱하는 동안 문자 건너뛰기
+
+슬라이스 메소드에 단계 인수를 전달하여 슬라이스하는 동안 문자를 건너뛸 수 있습니다.
+
+```py
+language = 'Python'
+pto = language[0:6:2] #
+print(pto) # Pto
+```
+
+### 문자열 메서드
+
+문자열을 형식화할 수 있는 많은 문자열 메서드가 있습니다. 다음 예제에서 일부 문자열 메서드를 참조하십시오.
+
+- capitalize(): 문자열의 첫 번째 문자를 대문자로 변환
+
+```py
+challenge = 'thirty days of python'
+print(challenge.capitalize()) # 'Thirty days of python'
+```
+
+- count(): 문자열에서 하위 문자열의 발생을 반환합니다. count(substring, start=.., end=..). 시작은 카운트를 위한 시작 인덱싱이고 끝은 카운트할 마지막 인덱스입니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.count('y')) # 3
+print(challenge.count('y', 7, 14)) # 1,
+print(challenge.count('th')) # 2`
+```
+
+- endswith(): 문자열이 지정된 끝으로 끝나는지 확인합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.endswith('on')) # True
+print(challenge.endswith('tion')) # False
+```
+
+- expandtabs(): 탭 문자를 공백으로 바꿉니다. 기본 탭 크기는 8입니다. 탭 크기 인수를 사용합니다.
+
+```py
+challenge = 'thirty\tdays\tof\tpython'
+print(challenge.expandtabs()) # 'thirty days of python'
+print(challenge.expandtabs(10)) # 'thirty days of python'
+```
+
+- find(): 하위 문자열이 처음 나타나는 인덱스를 반환합니다. 찾을 수 없으면 -1을 반환합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.count('y')) # 3
+print(challenge.count('y', 7, 14)) # 1,
+print(challenge.count('th')) # 2`
+```
+
+- rfind(): 하위 문자열이 마지막으로 나타나는 인덱스를 반환합니다. 찾을 수 없으면 -1을 반환합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.rfind('y')) # 5
+print(challenge.rfind('th')) # 1
+```
+
+- format(): 문자열을 더 나은 출력으로 포맷합니다. 문자열 형식에 대한 자세한 내용은 이 [링크](https://www.programiz.com/python-programming/methods/string/format) 를 확인하세요.
+
+```py
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+age = 250
+job = 'teacher'
+country = 'Finland'
+sentence = 'I am {} {}. I am a {}. I am {} years old. I live in {}.'.format(first_name, last_name, age, job, country)
+print(sentence) # I am Asabeneh Yetayeh. I am 250 years old. I am a teacher. I live in Finland.
+
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+result = 'The area of a circle with radius {} is {}'.format(str(radius), str(area))
+print(result) # The area of a circle with radius 10 is 314
+```
+
+- index(): 하위 문자열의 가장 낮은 색인을 반환하고 추가 인수는 시작 및 끝 색인을 나타냅니다(기본값 0 및 문자열 길이 - 1). 하위 문자열을 찾을 수 없으면 valueError가 발생합니다.
+
+```py
+challenge = 'thirty days of python'
+sub_string = 'da'
+print(challenge.index(sub_string)) # 7
+print(challenge.index(sub_string, 9)) # error
+```
+
+- rindex(): 하위 문자열의 가장 높은 색인을 반환합니다. 추가 인수는 시작 및 끝 색인을 나타냅니다(기본값 0 및 문자열 길이 - 1).
+
+```py
+challenge = 'thirty days of python'
+sub_string = 'da'
+print(challenge.rindex(sub_string)) # 8
+print(challenge.rindex(sub_string, 9)) # error
+```
+
+- isalnum(): 영숫자 확인
+
+```py
+challenge = 'ThirtyDaysPython'
+print(challenge.isalnum()) # True
+
+challenge = '30DaysPython'
+print(challenge.isalnum()) # True
+
+challenge = 'thirty days of python'
+print(challenge.isalnum()) # False, space is not an alphanumeric character
+
+challenge = 'thirty days of python 2019'
+print(challenge.isalnum()) # False
+```
+
+- isalpha(): 모든 문자열 요소가 알파벳 문자(az 및 AZ)인지 확인합니다.
+
+```py
+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(): 문자열의 모든 문자가 십진수(0-9)인지 확인합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.isdecimal()) # False
+challenge = '123'
+print(challenge.isdecimal()) # True
+challenge = '\u00B2'
+print(challenge.isdigit()) # False
+challenge = '12 3'
+print(challenge.isdecimal()) # False, space not allowed
+```
+
+- isdigit(): 문자열의 모든 문자가 숫자인지 확인합니다(숫자는 0-9 및 일부 다른 유니코드 문자).
+
+```py
+challenge = 'Thirty'
+print(challenge.isdigit()) # False
+challenge = '30'
+print(challenge.isdigit()) # True
+challenge = '\u00B2'
+print(challenge.isdigit()) # True
+```
+
+- isnumeric(): 문자열의 모든 문자가 숫자인지 또는 숫자와 관련된 것인지 확인합니다(isdigit()와 마찬가지로 ½과 같은 더 많은 기호를 허용합니다).
+
+```py
+num = '10'
+print(num.isnumeric()) # True
+num = '\u00BD' # ½
+print(num.isnumeric()) # True
+num = '10.5'
+print(num.isnumeric()) # False
+```
+
+- isidentifier(): 유효한 식별자를 확인합니다. 문자열이 유효한 변수 이름인지 확인합니다.
+
+```py
+challenge = '30DaysOfPython'
+print(challenge.isidentifier()) # False, because it starts with a number
+challenge = 'thirty_days_of_python'
+print(challenge.isidentifier()) # True
+```
+
+- islower(): 문자열의 모든 알파벳 문자가 소문자인지 확인
+
+```py
+challenge = 'thirty days of python'
+print(challenge.islower()) # True
+challenge = 'Thirty days of python'
+print(challenge.islower()) # False
+```
+
+- islower(): 문자열의 모든 알파벳 문자가 소문자인지 확인
+
+```py
+challenge = 'thirty days of python'
+print(challenge.isupper()) # False
+challenge = 'THIRTY DAYS OF PYTHON'
+print(challenge.isupper()) # True
+```
+
+- join(): 연결된 문자열을 반환합니다.
+
+```py
+web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
+result = ' '.join(web_tech)
+print(result) # 'HTML CSS JavaScript React'
+```
+
+```py
+web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
+result = '# '.join(web_tech)
+print(result) # 'HTML# CSS# JavaScript# React'
+```
+
+- strip(): 문자열의 시작과 끝에서 시작하여 주어진 모든 문자를 제거합니다.
+
+```py
+challenge = 'thirty days of pythoonnn'
+print(challenge.strip('noth')) # 'irty days of py'
+```
+
+- replace(): 하위 문자열을 주어진 문자열로 대체합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.replace('python', 'coding')) # 'thirty days of coding'
+```
+
+- split(): 주어진 문자열 또는 공백을 구분 기호로 사용하여 문자열을 분할합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.split()) # ['thirty', 'days', 'of', 'python']
+challenge = 'thirty, days, of, python'
+print(challenge.split(', ')) # ['thirty', 'days', 'of', 'python']
+```
+
+- title(): 제목 케이스 문자열을 반환합니다.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.title()) # Thirty Days Of Python
+```
+
+- swapcase(): 모든 대문자를 소문자로, 모든 소문자를 대문자로 변환
+
+```py
+challenge = 'thirty days of python'
+print(challenge.swapcase()) # THIRTY DAYS OF PYTHON
+challenge = 'Thirty Days Of Python'
+print(challenge.swapcase()) # tHIRTY dAYS oF pYTHON
+```
+
+- startswith(): 문자열이 지정된 문자열로 시작하는지 확인
+
+```py
+challenge = 'thirty days of python'
+print(challenge.startswith('thirty')) # True
+
+challenge = '30 days of python'
+print(challenge.startswith('thirty')) # False
+```
+
+🌕 당신은 특별한 사람이고 놀라운 잠재력을 가지고 있습니다. 당신은 방금 4일 차 도전을 완료했고 당신은 위대함을 향한 당신의 길에 4걸음 남았습니다. 이제 뇌와 근육을 위한 몇 가지 훈련을 하십시오.
+
+## 💻 Exercises - Day 4
+
+1. 문자열 'Thirty', 'Days', 'Of', 'Python'을 단일 문자열 'Thirty Days Of Python'에 연결합니다.
+2. 문자열 'Coding', 'For' , 'All'을 단일 문자열 'Coding For All'에 연결합니다.
+3. company라는 변수를 선언하고 초기 값 "Coding For All"에 할당합니다.
+4. *print()* 를 사용하여 회사 변수를 인쇄합니다.
+5. *len()* 메서드와 *print()* 를 사용하여 회사 문자열의 길이를 인쇄합니다.
+6. *upper()* 메서드를 사용하여 모든 문자를 대문자로 변경합니다.
+7. *lower()* 메서드를 사용하여 모든 문자를 소문자로 변경합니다.
+8. 문자열 *Coding For All* 의 값을 형식화하려면 capitalize(), title(), swapcase() 메소드를 사용하십시오.
+9. *Coding For All* 문자열의 첫 번째 단어를 잘라냅니다.
+10. Index, find 또는 기타 방법을 사용하여 *Coding For All* 문자열에 단어 Coding이 포함되어 있는지 확인합니다.
+11. 문자열 'Coding For All'의 코딩이라는 단어를 Python으로 바꿉니다.
+12. replace 메서드 또는 기타 메서드를 사용하여 모두를 위한 Python을 모두를 위한 Python으로 변경합니다.
+13. 공백을 구분 기호로 사용하여 문자열 'Coding For All'을 분할합니다(split()).
+14. "Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon"은 쉼표에서 문자열을 나눕니다.
+15. 문자열 *Coding For All* 에서 인덱스 0에 있는 문자는 무엇입니까?
+16. 문자열 *Coding For All* 에서 인덱스 0에 있는 문자는 무엇입니까?
+17. "Coding For All" 문자열에서 인덱스 10에 있는 문자는 무엇입니까?
+18. 'Python For Everyone'이라는 이름의 약어 또는 약어를 만듭니다.
+19. 'Coding For All'이라는 이름의 약어 또는 약어를 만듭니다.
+20. Index를 사용하여 Coding For All에서 C가 처음 나타나는 위치를 결정합니다.
+21. Index를 사용하여 Coding For All에서 F가 처음 나타나는 위치를 결정합니다.
+22. Coding For All People에서 l이 마지막으로 나타나는 위치를 결정하려면 rfind를 사용하십시오.
+23. 색인 또는 찾기를 사용하여 다음 문장에서 'because'라는 단어가 처음 나타나는 위치를 찾습니다.
+24. 색인 또는 찾기를 사용하여 다음 문장에서 'because'라는 단어가 처음 나타나는 위치를 찾습니다.
+25. 색인 또는 찾기를 사용하여 다음 문장에서 'because'라는 단어가 처음 나타나는 위치를 찾습니다.
+26. 색인 또는 찾기를 사용하여 다음 문장에서 'because'라는 단어가 처음 나타나는 위치를 찾습니다.
+27. 다음 문장에서 'because because because'라는 구문을 잘라냅니다.
+28. 'Coding For All'은 하위 문자열 *Coding* 으로 시작합니까?
+29. 'Coding For All'은 하위 문자열 *코딩* 으로 끝납니까?
+30. ' Coding For All ' , 주어진 문자열에서 왼쪽 및 오른쪽 후행 공백을 제거합니다.
+31. 다음 변수 중 isidentifier() 메서드를 사용할 때 True를 반환하는 변수는 무엇입니까?
+ - 30DaysOfPython
+ - thirty_days_of_python
+32. 다음 목록에는 일부 파이썬 라이브러리의 이름이 포함되어 있습니다: ['Django', 'Flask', 'Bottle', 'Pyramid', 'Falcon']. 공백 문자열이 있는 해시로 목록에 가입하십시오.
+33. 새 줄 이스케이프 시퀀스를 사용하여 다음 문장을 구분합니다.
+ ```py
+ I am enjoying this challenge.
+ I just wonder what is next.
+ ```
+34. 새 줄 이스케이프 시퀀스를 사용하여 다음 문장을 구분합니다.
+ ```py
+ Name Age Country City
+ Asabeneh 250 Finland Helsinki
+ ```
+35. 문자열 형식 지정 방법을 사용하여 다음을 표시합니다:
+
+```sh
+radius = 10
+area = 3.14 * radius ** 2
+The area of a circle with radius 10 is 314 meters square.
+```
+
+1. 문자열 형식화 방법을 사용하여 다음을 작성하십시오:
+
+```sh
+8 + 6 = 14
+8 - 6 = 2
+8 * 6 = 48
+8 / 6 = 1.33
+8 % 6 = 2
+8 // 6 = 1
+8 ** 6 = 262144
+```
+
+🎉 축하합니다! 🎉
+
+[<< Day 3](../03_Day_Operators/03_operators.md) | [Day 5 >>](../05_Day_Lists/05_lists.md)
diff --git a/Korean/05_Day_Lists/05_lists.md b/Korean/05_Day_Lists/05_lists.md
new file mode 100644
index 000000000..4b4e89a11
--- /dev/null
+++ b/Korean/05_Day_Lists/05_lists.md
@@ -0,0 +1,588 @@
+
+
+
+[<< Day 9](../09_Day_Conditionals/09_conditionals.md) | [Day 11 >>](../11_Day_Functions/11_functions.md)
+
+
+
+- [📘 Day 10](#-day-10)
+ - [Loops](#loops)
+ - [While 루프](#while-루프)
+ - [Break 과 Continue - Part 1](#break-과-continue---part-1)
+ - [For 루프](#for-루프)
+ - [Break 과 Continue - Part 2](#break-과-continue---part-2)
+ - [범위 기능](#범위-기능)
+ - [중첩 For 루프](#중첩-for-루프)
+ - [For Else](#for-else)
+ - [Pass](#pass)
+ - [💻 Exercises: Day 10](#-exercises-day-10)
+ - [Exercises: Level 1](#exercises-level-1)
+ - [Exercises: Level 2](#exercises-level-2)
+ - [Exercises: Level 3](#exercises-level-3)
+
+# 📘 Day 10
+
+## Loops
+
+인생은 일상으로 가득 차 있습니다. 프로그래밍에서 우리는 또한 많은 반복 작업을 수행합니다. 반복 작업을 처리하기 위해 프로그래밍 언어는 루프를 사용합니다. Python 프로그래밍 언어는 또한 다음 유형의 두 루프를 제공합니다.
+
+1. while loop
+2. for loop
+
+### While 루프
+
+우리는 while 루프를 만들기 위해 예약어 *while* 을 사용합니다. 주어진 조건이 만족될 때까지 문 블록을 반복적으로 실행하는 데 사용됩니다. 조건이 거짓이 되면 루프 뒤의 코드 행이 계속 실행됩니다.
+
+```py
+ # syntax
+while condition:
+ code goes here
+```
+
+**예시:**
+
+```py
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+#prints from 0 to 4
+```
+
+위의 while 루프에서 count가 5일 때 조건이 false가 됩니다. 이때 루프가 중지됩니다. 조건이 더 이상 참이 아닐 때 코드 블록을 실행하고 싶다면 *else* 를 사용할 수 있습니다.
+
+```py
+ # syntax
+while condition:
+ code goes here
+else:
+ code goes here
+```
+
+**예시:**
+
+```py
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+#prints from 0 to 4
+```
+
+위의 루프 조건은 count가 5이고 루프가 중지되고 실행이 else 문을 시작하면 거짓이 됩니다. 결과적으로 5가 인쇄됩니다.
+
+### Break 과 Continue - Part 1
+
+- 중단: 루프에서 벗어나거나 중단하고 싶을 때 중단을 사용합니다.
+
+```py
+# syntax
+while condition:
+ code goes here
+ if another_condition:
+ break
+```
+
+**예시:**
+
+```py
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+ if count == 3:
+ break
+```
+
+위의 while 루프는 0, 1, 2만 인쇄하지만 3에 도달하면 중지합니다.
+
+- 계속: continue 문을 사용하면 현재 반복을 건너뛰고 다음을 계속할 수 있습니다.
+
+```py
+ # syntax
+while condition:
+ code goes here
+ if another_condition:
+ continue
+```
+
+**예시:**
+
+```py
+count = 0
+while count < 5:
+ if count == 3:
+ continue
+ print(count)
+ count = count + 1
+```
+
+위의 while 루프는 0, 1, 2 및 4만 인쇄합니다(3을 건너뜁니다).
+
+### For 루프
+
+*for* 키워드는 다른 프로그래밍 언어와 유사하지만 구문이 약간 다른 for 루프를 만드는 데 사용됩니다. 루프는 시퀀스(즉, 목록, 튜플, 사전, 집합 또는 문자열)를 반복하는 데 사용됩니다.
+
+- For loop with list
+
+```py
+# syntax
+for iterator in lst:
+ code goes here
+```
+
+**예시:**
+
+```py
+numbers = [0, 1, 2, 3, 4, 5]
+for number in numbers: # number is temporary name to refer to the list's items, valid only inside this loop
+ print(number) # the numbers will be printed line by line, from 0 to 5
+```
+
+- For loop with string
+
+```py
+# syntax
+for iterator in string:
+ code goes here
+```
+
+**예시:**
+
+```py
+language = 'Python'
+for letter in language:
+ print(letter)
+
+
+for i in range(len(language)):
+ print(language[i])
+```
+
+- For loop with tuple
+
+```py
+# syntax
+for iterator in tpl:
+ code goes here
+```
+
+**예시:**
+
+```py
+numbers = (0, 1, 2, 3, 4, 5)
+for number in numbers:
+ print(number)
+```
+
+- 사전을 사용한 For 루프 사전을 통한 루프는 사전의 키를 제공합니다.
+
+```py
+ # syntax
+for iterator in dct:
+ code goes here
+```
+
+**예시:**
+
+```py
+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:
+ print(key)
+
+for key, value in person.items():
+ print(key, value) # this way we get both keys and values printed out
+```
+
+- Loops in set
+
+```py
+# syntax
+for iterator in st:
+ code goes here
+```
+
+**예시:**
+
+```py
+it_companies = {'Facebook', 'Google', 'Microsoft', 'Apple', 'IBM', 'Oracle', 'Amazon'}
+for company in it_companies:
+ print(company)
+```
+
+### Break 과 Continue - Part 2
+
+짧은 알림: *중단* : 루프가 완료되기 전에 중단하고 싶을 때 중단을 사용합니다.
+
+```py
+# syntax
+for iterator in sequence:
+ code goes here
+ if condition:
+ break
+```
+
+**예시:**
+
+```py
+numbers = (0,1,2,3,4,5)
+for number in numbers:
+ print(number)
+ if number == 3:
+ break
+```
+
+위의 예에서 루프는 3에 도달하면 중지됩니다.
+
+계속: 루프 반복에서 일부 단계를 건너뛰고 싶을 때 계속을 사용합니다.
+
+```py
+ # syntax
+for iterator in sequence:
+ code goes here
+ if condition:
+ continue
+```
+
+**예시:**
+
+```py
+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')
+```
+
+위의 예에서 숫자가 3이면 조건 *다음* 단계(루프 내부)를 건너뛰고 반복이 남아 있으면 루프 실행이 계속됩니다.
+
+### 범위 기능
+
+*range()* 함수는 숫자 목록에 사용됩니다. *범위(시작, 끝, 단계)* 는 시작, 종료 및 증분의 세 가지 매개변수를 사용합니다. 기본적으로 0부터 시작하고 증분은 1입니다. 범위 시퀀스에는 최소 1개의 인수(종료)가 필요합니다. 범위를 사용하여 시퀀스 만들기
+
+```py
+lst = list(range(11))
+print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+st = set(range(1, 11)) # 2 arguments indicate start and end of the sequence, step set to default 1
+print(st) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+
+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}
+```
+
+```py
+# syntax
+for iterator in range(start, end, step):
+```
+
+**예시:**
+
+```py
+for number in range(11):
+ print(number) # prints 0 to 10, not including 11
+```
+
+### 중첩 For 루프
+
+루프 안에 루프를 작성할 수 있습니다.
+
+```py
+# syntax
+for x in y:
+ for t in x:
+ print(t)
+```
+
+**예시:**
+
+```py
+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
+
+루프가 끝날 때 메시지를 실행하려면 else를 사용합니다.
+
+```py
+# syntax
+for iterator in range(start, end, step):
+ do something
+else:
+ print('The loop ended')
+```
+
+**예시:**
+
+```py
+for number in range(11):
+ print(number) # prints 0 to 10, not including 11
+else:
+ print('The loop stops at', number)
+```
+
+### Pass
+
+Python에서 when 문이 필요하지만(세미콜론 뒤에) 코드를 실행하는 것을 좋아하지 않으므로 오류를 피하기 위해 *pass* 라는 단어를 쓸 수 있습니다. 또한 향후 진술을 위해 자리 표시자로 사용할 수 있습니다.
+
+**예시:**
+
+```py
+for number in range(6):
+ pass
+```
+
+🌕 당신은 큰 이정표를 세웠고, 당신은 멈출 수 없습니다. 계속하세요! 10일차 챌린지를 방금 완료했으며 위대함을 향한 10단계를 앞두고 있습니다. 이제 뇌와 근육을 위한 몇 가지 운동을 하십시오.
+
+## 💻 Exercises: Day 10
+
+### Exercises: Level 1
+
+1. for 루프를 사용하여 0에서 10까지 반복하고 while 루프를 사용하여 동일한 작업을 수행합니다.
+
+2. for 루프를 사용하여 10에서 0까지 반복하고 while 루프를 사용하여 동일한 작업을 수행합니다.
+
+3. print()를 7번 호출하는 루프를 작성하여 다음 삼각형을 출력합니다.
+
+ ```py
+ #
+ ##
+ ###
+ ####
+ #####
+ ######
+ #######
+ ```
+
+4. 중첩 루프를 사용하여 다음을 만듭니다.
+
+ ```sh
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ ```
+
+5. 다음 패턴을 인쇄합니다.
+
+ ```sh
+ 0 x 0 = 0
+ 1 x 1 = 1
+ 2 x 2 = 4
+ 3 x 3 = 9
+ 4 x 4 = 16
+ 5 x 5 = 25
+ 6 x 6 = 36
+ 7 x 7 = 49
+ 8 x 8 = 64
+ 9 x 9 = 81
+ 10 x 10 = 100
+ ```
+
+6. for 루프를 사용하여 ['Python', 'Numpy','Pandas','Django', 'Flask'] 목록을 반복하고 항목을 출력합니다.
+
+7. for 루프를 사용하여 0에서 100까지 반복하고 짝수만 출력
+
+8. for 루프를 사용하여 0에서 100까지 반복하고 홀수만 출력
+
+### Exercises: Level 2
+
+1. for 루프를 사용하여 0에서 100까지 반복하고 모든 숫자의 합계를 인쇄합니다.
+
+```sh
+The sum of all numbers is 5050.
+```
+
+1. for 루프를 사용하여 0에서 100까지 반복하고 모든 짝수의 합과 모든 승산의 합을 인쇄합니다.
+
+ ```sh
+ The sum of all evens is 2550. And the sum of all odds is 2500.
+ ```
+
+### Exercises: Level 3
+
+1. 데이터 폴더로 이동하여 [countries.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries.py) 파일을 사용합니다. 국가를 순환하고 단어 *land* 를 포함하는 모든 국가를 추출합니다.
+2. 이것은 과일 목록입니다. ['banana', 'orange', 'mango', 'lemon'] 루프를 사용하여 순서를 뒤집습니다.
+3. 데이터 폴더로 이동하여 [countries_data.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries-data.py) 파일을 사용합니다.
+ 1. 데이터의 총 언어 수는 얼마입니까?
+ 2. 데이터에서 가장 많이 사용되는 10개 언어 찾기
+ 3. 세계에서 인구가 가장 많은 10개 국가 찾기
+
+🎉 축하합니다! 🎉
+
+[<< Day 9](../09_Day_Conditionals/09_conditionals.md) | [Day 11 >>](../11_Day_Functions/11_functions.md)
diff --git a/Korean/readme_ko.md b/Korean/readme_ko.md
new file mode 100644
index 000000000..d6160ec27
--- /dev/null
+++ b/Korean/readme_ko.md
@@ -0,0 +1,454 @@
+# 🐍 30 Days Of Python
+
+|# Day | Topics |
+|------|:---------------------------------------------------------:|
+| 01 | [Introduction](./readme_ko.md)|
+| 02 | [Variables, Built-in Functions](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)|
+| 03 | [Operators](../03_Day_Operators/03_operators.md)|
+| 04 | [Strings](../04_Day_Strings/04_strings.md)|
+| 05 | [Lists](../05_Day_Lists/05_lists.md)|
+| 06 | [Tuples](../06_Day_Tuples/06_tuples.md)|
+| 07 | [Sets](../07_Day_Sets/07_sets.md)|
+| 08 | [Dictionaries](../08_Day_Dictionaries/08_dictionaries.md)|
+| 09 | [Conditionals](../09_Day_Conditionals/09_conditionals.md)|
+| 10 | [Loops](../10_Day_Loops/10_loops.md)|
+| 11 | [Functions](../11_Day_Functions/11_functions.md)|
+| 12 | [Modules](../12_Day_Modules/12_modules.md)|
+| 13 | [List Comprehension](../13_Day_List_comprehension/13_list_comprehension.md)|
+| 14 | [Higher Order Functions](../14_Day_Higher_order_functions/14_higher_order_functions.md)|
+| 15 | [Python Type Errors](../15_Day_Python_type_errors/15_python_type_errors.md)|
+| 16 | [Python Date time](../16_Day_Python_date_time/16_python_datetime.md) |
+| 17 | [Exception Handling](../17_Day_Exception_handling/17_exception_handling.md)|
+| 18 | [Regular Expressions](../18_Day_Regular_expressions/18_regular_expressions.md)|
+| 19 | [File Handling](../19_Day_File_handling/19_file_handling.md)|
+| 20 | [Python Package Manager](../20_Day_Python_package_manager/20_python_package_manager.md)|
+| 21 | [Classes and Objects](../21_Day_Classes_and_objects/21_classes_and_objects.md)|
+| 22 | [Web Scraping](../22_Day_Web_scraping/22_web_scraping.md)|
+| 23 | [Virtual Environment](../23_Day_Virtual_environment/23_virtual_environment.md)|
+| 24 | [Statistics](../24_Day_Statistics/24_statistics.md)|
+| 25 | [Pandas](../25_Day_Pandas/25_pandas.md)|
+| 26 | [Python web](../26_Day_Python_web/26_python_web.md)|
+| 27 | [Python with MongoDB](../27_Day_Python_with_mongodb/27_python_with_mongodb.md)|
+| 28 | [API](../28_Day_API/28_API.md)|
+| 29 | [Building API](../29_Day_Building_API/29_building_API.md)|
+| 30 | [Conclusions](../30_Day_Conclusions/30_conclusions.md)|
+
+🧡🧡🧡 HAPPY CODING 🧡🧡🧡
+
+
+Support the author to create more educational materials
+
+
+
+
+[Day 2 >>](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)
+
+
+
+- [🐍 30 Days Of Python](#-30-days-of-python)
+- [📘 Day 1](#-day-1)
+ - [환영합니다](#환영합니다)
+ - [소개](#소개)
+ - [왜 Python이느냐?](#왜-python이느냐?)
+ - [환경 설정](#환경-설정)
+ - [Python 설치](#python-설치)
+ - [Python 셸](#python-셸)
+ - [Visual Studio Code 설치](#visual-studio-code-설치)
+ - [visual studio code를 사용하기](#visual-studio-code를-사용하기)
+ - [Python 기본](#python-기본)
+ - [Python 구문](#python-구문)
+ - [Python 들여쓰기](#python-들여쓰기)
+ - [주석](#주석)
+ - [데이터 타입](#데이터-타입)
+ - [Number](#number)
+ - [String](#string)
+ - [Booleans](#booleans)
+ - [List](#list)
+ - [Dictionary](#dictionary)
+ - [Tuple](#tuple)
+ - [Set](#set)
+ - [데이터 타입 체크](#데이터-타입-체크)
+ - [Python 파일](#python-파일)
+ - [💻 Exercises - Day 1](#-exercises---day-1)
+ - [Exercise: Level 1](#exercise-level-1)
+ - [Exercise: Level 2](#exercise-level-2)
+ - [Exercise: Level 3](#exercise-level-3)
+
+# 📘 Day 1
+
+## 환영합니다
+
+_30 days of Python_에 참여하기로 결정하신 것을 **축하드립니다**. 이 챌린지에서는 Python 프로그래머가 되기 위해 필요한 모든 것과 프로그래밍의 전체 개념을 배우게 됩니다. 챌린지가 끝나면 _30DaysOfPython_프로그래밍 챌린지 인증서를 받게 됩니다.
+
+챌린지에 적극적으로 참여하고 싶다면 [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython) 텔레그램 그룹에 가입할 수 있습니다.
+
+## 소개
+
+Python은 범용 프로그래밍을 위한 고급 프로그래밍 언어입니다. 오픈 소스, 인터프리터, 객체 지향 프로그래밍 언어입니다. Python은 네덜란드 프로그래머 Guido van Rossum이 만들었습니다. Python 프로그래밍 언어의 이름은 영국 스케치 코미디 시리즈 *Month Python's Flying Circus* 에서 파생되었습니다. 첫 번째 버전은 1991년 2월 20일에 출시되었습니다. 이 30일간의 Python 챌린지는 최신 버전의 Python인 Python 3를 차근차근 배울 수 있도록 도와줄 것입니다. 주제는 30일로 나뉘며, 매일 이해하기 쉬운 설명, 실제 사례, 많은 실습 및 프로젝트가 포함된 여러 주제가 포함됩니다.
+
+이 챌린지는 Python 프로그래밍 언어를 배우고자 하는 초보자와 전문가를 위해 고안되었습니다. 챌린지를 완료하는 데 30~100일이 소요될 수 있으며 텔레그램 그룹에 적극적으로 참여하는 사람들이 챌린지를 완료할 확률이 높습니다.
+시각적 학습자이거나 동영상을 선호하는 경우 이 [완전 초보를 위한 Python 동영상](https://www.youtube.com/watch?v=11OYpBrhdyM)으로 시작할 수 있습니다.
+
+## 왜 Python이느냐?
+
+인간의 언어에 매우 가깝고 배우기 쉽고 사용하기 쉬운 프로그래밍 언어입니다.
+Python은 다양한 산업 및 회사(Google 포함)에서 사용됩니다. 웹 응용 프로그램, 데스크톱 응용 프로그램, 시스템 관리 및 기계 학습 라이브러리를 개발하는 데 사용되었습니다. Python은 데이터 과학 및 기계 학습 커뮤니티에서 널리 사용되는 언어입니다. 이것이 Python 학습을 시작하도록 설득하기에 충분하기를 바랍니다. Python은 세상을 지배하고 있으니 지배 당하기 전에 Python을 지배하십시오.
+## 환경 설정
+
+### Python 설치
+
+Python 스크립트를 실행하려면 Python을 설치해야 합니다. Python을 [다운로드](https://www.python.org/)합시다.
+Windows 사용자인 경우. 빨간색 동그라미 친 버튼을 클릭합니다.
+
+
+
+macOS 사용자인 경우. 빨간색 동그라미 친 버튼을 클릭합니다.
+
+[](https://www.python.org/)
+
+Python이 설치되어 있는지 확인하려면 장치 터미널에 다음 명령을 작성하십시오.
+
+```shell
+python --version
+```
+
+
+
+터미널에서 보시다시피 저는 현재 _Python 3.7.5_ 버전을 사용하고 있습니다. 귀하의 Python 버전은 내 버전과 다를 수 있지만 3.6 이상이어야 합니다. Python 버전을 볼 수 있다면 잘한 것입니다. 이제 컴퓨터에 Python이 설치되었습니다. 다음 섹션으로 계속 진행하십시오.
+
+### Python 셸
+
+Python은 해석된 스크립팅 언어이므로 컴파일할 필요가 없습니다. 코드를 한 줄씩 실행한다는 의미입니다. Python은 _Python Shell(Python Interactive Shell)_과 함께 제공됩니다. 단일 Python 명령을 실행하고 결과를 얻는 데 사용됩니다.
+
+Python Shell은 사용자의 Python 코드를 기다립니다. 코드를 입력하면 코드를 해석하여 다음 줄에 결과를 표시합니다.
+터미널이나 명령 프롬프트(cmd)를 열고 쓰기:
+
+```shell
+python
+```
+
+
+
+Python 대화형 셸이 열리고 Python 코드(Python 스크립트)를 작성하기를 기다립니다. 기호 >>> 옆에 Python 스크립트를 작성하고 Enter를 누릅니다.
+Python 스크립팅 셸에서 첫 번째 스크립트를 작성해 보겠습니다.
+
+
+
+훌륭합니다. Python 대화형 셸에서 첫 번째 Python 스크립트를 작성했습니다. Python 대화형 셸을 어떻게 닫습니까?
+셸을 닫으려면 기호 옆에 >> **exit()** 명령을 작성하고 Enter 키를 누릅니다.
+
+
+
+이제 Python 대화형 셸을 여는 방법과 종료하는 방법을 알았습니다.
+
+Python은 Python이 이해하는 스크립트를 작성하면 결과를 제공하고 그렇지 않으면 오류를 반환합니다. 고의적인 실수를 하고 Python이 무엇을 반환하는지 봅시다.
+
+
+
+반환된 오류에서 볼 수 있듯이 Python은 우리가 저지른 실수와 _Syntax Error: invalid syntax_를 알고 있을 정도로 영리합니다. Python에서 x를 곱셈으로 사용하는 것은 (x)가 Python에서 유효한 구문이 아니기 때문에 구문 오류입니다. (**x**) 대신 곱셈에 별표(*)를 사용합니다. 반환된 오류는 수정해야 할 사항을 명확하게 보여줍니다.
+
+프로그램에서 오류를 식별하고 제거하는 프로세스를 *디버깅*이라고 합니다. **x** 대신 *를 넣어 디버깅해 봅시다.
+
+
+
+버그가 수정되었고 코드가 실행되었으며 예상했던 결과를 얻었습니다. 프로그래머로서 매일 이러한 종류의 오류를 보게 될 것입니다. 디버깅 방법을 아는 것이 좋습니다. 디버깅을 잘하려면 어떤 종류의 오류가 발생했는지 이해해야 합니다. 발생할 수 있는 Python 오류 중 일부는 *SyntaxError*, *IndexError*, *NameError*, *ModuleNotFoundError*, *KeyError*, *ImportError*, *AttributeError*, *TypeError*, *ValueError*, *ZeroDivisionError* 등입니다. 이후 섹션에서 다른 Python **_오류 유형_**에 대해 자세히 알아볼 것입니다.
+
+Python 대화형 셸을 사용하는 방법을 더 연습해 보겠습니다. 터미널이나 명령 프롬프트로 이동하여 **python**이라는 단어를 씁니다.
+
+
+
+Python 대화형 셸이 열립니다. 몇 가지 기본적인 수학 연산(더하기, 빼기, 곱하기, 나누기, 나머지, 지수)을 수행해 보겠습니다.
+
+Python 코드를 작성하기 전에 먼저 몇 가지 수학을 수행해 보겠습니다:
+
+- 2 + 3 = 5
+- 3 - 2 = 1
+- 3 \* 2 = 6
+- 3 / 2 = 1.5
+- 3 ^ 2 = 3 x 3 = 9
+
+Python에는 다음과 같은 추가 작업이 있습니다:
+
+- 3 % 2 = 1 => 나머지를 구함
+- 3 // 2 = 1 => 나머지를 제거
+
+위의 수학식을 Python 코드로 바꿔봅시다. Python 셸이 열렸으며 셸 맨 처음에 주석을 작성하겠습니다.
+
+_comment_는 Python에 의해 실행되지 않는 코드의 일부입니다. 따라서 코드를 더 읽기 쉽게 만들기 위해 코드에 일부 텍스트를 남길 수 있습니다. Python은 주석 부분을 실행하지 않습니다. Python에서 주석은 해시(#) 기호로 시작합니다.
+이것이 Python에서 주석을 작성하는 방법입니다
+
+```shell
+ # 주석은 해시로 시작합니다.
+ # (#) 심볼로 시작하기 때문에 이것은 파이썬 주석입니다.
+```
+
+
+
+다음 섹션으로 이동하기 전에 Python 대화형 셸에서 더 많은 연습을 해 보겠습니다. 셸에서 _exit()_를 작성하여 열린 셸을 닫았다가 다시 열어 Python 셸에서 텍스트를 쓰는 방법을 연습해 봅시다.
+
+
+
+### Visual Studio Code 설치
+
+Python 대화형 셸은 작은 스크립트 코드를 시도하고 테스트하는 데 적합하지만 큰 프로젝트에는 적합하지 않습니다. 실제 작업 환경에서 개발자는 다양한 코드 편집기를 사용하여 코드를 작성합니다. 이 30일간의 Python 프로그래밍 챌린지에서는 Visual Studio 코드를 사용합니다. Visual Studio Code는 매우 인기 있는 오픈 소스 텍스트 편집기입니다. 나는 vscode의 팬이고 Visual Studio 코드를 [다운로드](https://code.visualstudio.com/)하는 것을 추천하고 싶지만, 다른 편집자를 선호한다면 가지고 있는 것을 자유롭게 따르십시오.
+
+[](https://code.visualstudio.com/)
+
+Visual Studio Code를 설치하셨다면 어떻게 사용하는지 알아보겠습니다.
+비디오를 선호하는 경우 Python용 Visual Studio Code[비디오 자습서](https://www.youtube.com/watch?v=bn7Cx4z-vSo)를 따를 수 있습니다.
+
+#### visual studio code를 사용하기
+
+Visual Studio 아이콘을 두 번 클릭하여 Visual Studio 코드를 엽니다. 열면 이런 종류의 인터페이스가 나타납니다. 레이블이 지정된 아이콘을 따라해보세요.
+
+
+
+바탕 화면에 30DaysOfPython이라는 폴더를 만듭니다. 그런 다음 Visual Studio 코드를 사용하여 엽시다.
+
+
+
+
+
+파일을 열면 30DaysOfPython 프로젝트의 디렉토리 내부에 파일과 폴더를 생성하기 위한 바로 가기가 표시됩니다. 아래에서 볼 수 있듯이 첫 번째 파일인 helloworld.py를 만들었습니다. 당신도 똑같이 할 수 있습니다.
+
+
+
+하루동안 오래 코딩을 한 후에 코드 편집기를 닫고 싶습니까? 이렇게 열린 프로젝트를 닫으면 됩니다.
+
+
+
+축하합니다. 개발 환경 설정을 완료했습니다. 코딩을 시작해 봅시다.
+
+## Python 기본
+
+### Python 구문
+
+Python 스크립트는 Python 대화형 셸 또는 코드 편집기에서 작성할 수 있습니다. Python 파일의 확장자는 .py입니다.
+
+### Python 들여 쓰기
+
+들여쓰기는 텍스트의 공백입니다. 많은 언어에서 들여쓰기는 코드 가독성을 높이는 데 사용되지만 Python은 들여쓰기를 사용하여 코드 블록을 만듭니다. 다른 프로그래밍 언어에서는 중괄호를 사용하여 들여쓰기 대신 코드 블록을 만듭니다. Python 코드를 작성할 때 흔히 발생하는 버그 중 하나는 잘못된 들여쓰기입니다.
+
+
+
+### 주석
+
+주석은 코드를 더 읽기 쉽게 만들고 코드에 설명을 남기기 위해 매우 중요합니다. Python은 코드의 주석 부분을 실행하지 않습니다.
+Python에서 해시(#)로 시작하는 모든 텍스트는 주석입니다.
+
+**예시:한 문장 주석**
+
+```shell
+ # This is the first comment
+ # This is the second comment
+ # Python is eating the world
+```
+
+**예시: 여러 문장 주석**
+
+Triple quote can be used for multiline comment if it is not assigned to a variable
+
+```shell
+"""This is multiline comment
+multiline comment takes multiple lines.
+python is eating the world
+"""
+```
+
+### 데이터 타입
+
+Python에는 여러 유형의 데이터 유형이 있습니다. 가장 일반적인 것부터 시작하겠습니다. 다른 데이터 유형은 다른 섹션에서 자세히 다룰 것입니다. 당분간 다양한 데이터 유형을 살펴보고 익숙해지도록 합시다. 지금은 명확하게 이해하지 않아도 됩니다.
+
+#### Number
+
+- Integer: 정수(음수, 영 그리고 양수)
+ 예시:
+ ... -3, -2, -1, 0, 1, 2, 3 ...
+- Float: 십진수
+ 예시
+ ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+- Complex
+ 예시
+ 1 + j, 2 + 4j
+
+#### String
+
+작은따옴표 또는 큰따옴표 아래에 있는 하나 이상의 문자 모음입니다. 문자열이 두 문장 이상인 경우 삼중 따옴표를 사용합니다.
+
+**예시:**
+
+```py
+'Asabeneh'
+'Finland'
+'Python'
+'I love teaching'
+'I hope you are enjoying the first day of 30DaysOfPython Challenge'
+```
+
+#### Boolean
+
+부울 데이터 유형은 True 또는 False 값입니다. T와 F는 항상 대문자여야 합니다.
+
+**예시:**
+
+```python
+ True # 불이 켜져있나요? 그러면 참입니다.
+ False # 불이 꺼져있나요? 그러면 거짓입니다.
+```
+
+#### List
+
+Python 리스트는 다른 데이터 유형 항목을 저장할 수 있는 정렬된 컬렉션입니다. 리스트는 JavaScript의 배열과 비슷합니다.
+
+**Example:**
+
+```py
+[0, 1, 2, 3, 4, 5] # 모두 동일한 데이터 유형 - 숫자 리스트
+['Banana', 'Orange', 'Mango', 'Avocado'] # 모두 동일한 데이터 유형 - 문자열 리스트(과일)
+['Finland','Estonia', 'Sweden','Norway'] # 모두 동일한 데이터 유형 - 문자열 리스트(국가)
+['Banana', 10, False, 9.81] # 리스트의 다양한 데이터 유형 - 문자열, 정수, 부울 및 부동 소수점
+```
+
+#### Dictionary
+
+Python 사전 개체는 키 값 쌍 형식의 정렬되지 않은 데이터 모음입니다.
+
+**Example:**
+
+```py
+{
+'first_name':'Asabeneh',
+'last_name':'Yetayeh',
+'country':'Finland',
+'age':250,
+'is_married':True,
+'skills':['JS', 'React', 'Node', 'Python']
+}
+```
+
+#### Tuple
+
+튜플은 목록과 같은 다양한 데이터 유형의 정렬된 모음이지만 튜플이 생성되면 수정할 수 없습니다. 그것들은 변할 수 없습니다.
+
+**Example:**
+
+```py
+('Asabeneh', 'Pawel', 'Brook', 'Abraham', 'Lidiya') # Names
+```
+
+```py
+('Earth', 'Jupiter', 'Neptune', 'Mars', 'Venus', 'Saturn', 'Uranus', 'Mercury') # planets
+```
+
+#### Set
+
+집합은 목록 및 튜플과 유사한 데이터 유형의 모음입니다. 목록 및 튜플과 달리 집합은 순서가 지정된 항목 모음이 아닙니다. 수학에서와 마찬가지로 Python에서 set은 고유한 항목만 저장합니다.
+
+이후 섹션에서는 각각의 모든 Python 데이터 유형에 대해 자세히 설명합니다.
+
+**Example:**
+
+```py
+{2, 4, 3, 5}
+{3.14, 9.81, 2.7} # order is not important in set
+```
+
+### 데이터 타입 체크
+
+특정 데이터/변수의 데이터 유형을 확인하기 위해 **type** 기능을 사용합니다. 다음 터미널에서 다양한 Python 데이터 유형을 볼 수 있습니다:
+
+
+
+### Python 파일
+
+먼저 프로젝트 폴더인 30DaysOfPython을 엽니다. 이 폴더가 없으면 30DaysOfPython이라는 폴더 이름을 만듭니다. 이 폴더 안에 helloworld.py라는 파일을 만듭니다. 이제 Visual Studio 코드를 사용하여 Python 대화형 셸에서 수행한 작업을 수행해 보겠습니다.
+
+Python 대화형 셸은 **print**를 사용하지 않고 인쇄했지만 Visual Studio 코드에서 결과를 보려면 내장 함수 *print()를 사용해야 합니다. *print()* 내장 함수는 *print('arument1', 'argument2', 'argument3')*와 같이 하나 이상의 인수를 사용합니다. 아래 예를 참조하십시오.
+
+**Example:**
+
+파일 이름은 helloworld.py.
+
+```py
+# Day 1 - 30DaysOfPython Challenge
+
+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(//)
+
+# Checking data types
+print(type(10)) # Int
+print(type(3.14)) # Float
+print(type(1 + 3j)) # Complex number
+print(type('Asabeneh')) # String
+print(type([1, 2, 3])) # List
+print(type({'name':'Asabeneh'})) # Dictionary
+print(type({9.8, 3.14, 2.7})) # Set
+print(type((9.8, 3.14, 2.7))) # Tuple
+```
+
+Python 파일을 실행하려면 아래 이미지를 확인하세요. Visual Studio Code에서 녹색 버튼을 실행하거나 터미널에 *python helloworld.py*를 입력하여 Python 파일을 실행할 수 있습니다.
+
+
+
+🌕 좋습니다. 당신은 방금 1일차 도전을 완료했고 당신은 위대한 여정에 있습니다. 이제 뇌와 근육을 위한 몇 가지 훈련을 해봅시다.
+
+## 💻 Exercises - Day 1
+
+### Exercise: Level 1
+
+1. 사용 중인 Python 버전 확인
+2. Python 대화형 셸을 열고 다음 작업을 수행합니다. 피연산자는 3과 4입니다.
+ - 더하기(+)
+ - 빼기(-)
+ - 곱하기(\*)
+ - 나머지(%)
+ - 나누기(/)
+ - 지수(\*\*)
+ - 정수 나누기(//)
+3. Python 대화형 셸에 문자열을 씁니다. 문자열은 다음과 같습니다:
+ - 이름
+ - 가족 이름
+ - 국가 이름
+ - I am enjoying 30 days of python
+4. 다음 데이터의 데이터 유형을 확인하십시오.:
+ - 10
+ - 9.8
+ - 3.14
+ - 4 - 4j
+ - ['Asabeneh', 'Python', 'Finland']
+ - 이름
+ - 가족 이름
+ - 국가 이름
+
+### Exercise: Level 2
+
+1. 30DaysOfPython 폴더 안에 day_1이라는 폴더를 만듭니다. day_1 폴더 안에 python 파일 helloworld.py를 만들고 질문 1, 2, 3, 4를 반복하세요. Python 파일에서 작업할 때 _print()_를 사용하는 것을 잊지 마세요. 파일을 저장한 디렉토리로 이동하여 실행합니다.
+
+### Exercise: Level 3
+
+1. Number(Integer, Float, Complex), String, Boolean, List, Tuple, Set 및 Dictionary와 같은 다양한 Python 데이터 유형에 대한 예제를 작성합니다.
+2. 참고 [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) (2, 3) 과 (10, 8) 사이
+
+🎉 축하합니다 ! 🎉
+
+[Day 2 >>](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)
diff --git a/Portuguese/02_Dia_Variaveis_BuiltIn_Functions/README.md b/Portuguese/02_Dia_Variaveis_BuiltIn_Functions/README.md
new file mode 100644
index 000000000..93aa7a8a7
--- /dev/null
+++ b/Portuguese/02_Dia_Variaveis_BuiltIn_Functions/README.md
@@ -0,0 +1,300 @@
+
+
30 Dias de Python: Dia 2 - Variaveis, Builtin Functions
+
+[<< Dia 1](../README.md) | [Dia 3 >>](../03_Day_Operators/03_operators.md)
+
+
+
+- [📘 Dia 2](#-dia-2)
+ - [Built in functions](#built-in-functions)
+ - [Variaveis](#Variaveis)
+ - [Declarando múltiplas váriaveis em uma linha](#Declarando-múltiplas-variaveis-em-uma-linha)
+ - [Tipos de dados](#Tipos-de-Dados)
+ - [Checando tipos de dados e type Casting](#Checando-tipos-de-dados-e-Casting)
+ - [Numeros](#Numeros)
+ - [💻 Exercicios - Dia 2](#-Exercicios---Dia-2)
+ - [Exercicios: Level 1](#Exercicios-level-1)
+ - [Exercicios: Level 2](#Exercicios-level-2)
+
+# 📘 Dia 2
+
+## Built in functions
+
+Em Python, temos muitas built-in functions. As built-in functions estão disponíveis globalmente para seu uso, o que significa que você pode fazer uso das built-in functions sem importar ou configurar. Algumas das built-in functions do Python mais usadas são as seguintes: _print()_, _len()_, _type()_, _int()_, _float()_, _str()_, _input()_, _list()_, _dict()_, _min()_, _max()_, _sum()_, _sorted()_, _open()_, _file()_, _help()_ e _dir()_ . Na tabela a seguir, você verá uma lista gigantesca de funções do Python retiradas da [documentação do python](https://docs.python.org/3.9/library/functions.html).
+
+
+Vamos abrir o shell do Python e começar a usar algumas built-in functions.
+
+
+
+Vamos praticar mais usando diferentes built-in functions
+
+
+
+Como você pode ver no terminal acima, O Python possui palavras reservadas. Não usamos palavras reservadas para declarar variáveis ou funções. Abordaremos as variáveis na próxima seção.
+
+Acredito que agora você já esteja familiarizado com as built-in functions. Vamos fazer mais uma prática de built-in functions e passaremos para a próxima seção.
+
+
+
+## Variaveis
+
+As variáveis armazenam dados na memória do computador. Variáveis mnemônicas são recomendadas para uso em muitas linguagens de programação. Uma variável mnemônica é um nome de variável que pode ser facilmente lembrado e associado. Uma variável refere-se a um endereço de memória no qual os dados são armazenados.
+Número no início, caractere especial e hífen não são permitidos ao nomear uma variável. Uma variável pode ter um nome curto (como x, y, z), mas um nome mais descritivo tipo (nome, sobrenome, idade, país) é altamente recomendado.
+
+Regras da nomeclatura de variáveis no Python
+
+- O nome de uma variável deve começar com uma letra ou underline
+- O nome de uma variável não pode começar com um número
+- Um nome de variável só pode conter caracteres alfanuméricos e underlines (A-z, 0-9 e \_ )
+- O interpretador Python diferencia maiúsculas de minúsculas (nome, nome, nome e PRIMEIRO NOME) são variáveis diferentes) então tome cuidado com isso.
+
+Aqui estão alguns exemplos de nomes de variáveis válidos:
+
+```shell
+firstname
+lastname
+age
+country
+city
+first_name
+last_name
+capital_city
+_if # if we want to use reserved word as a variable
+year_2021
+year2021
+current_year_2021
+birth_year
+num1
+num2
+```
+
+Nomes invalidos de variaveis
+
+```shell
+first-name
+first@name
+first$name
+num-1
+1num
+```
+
+Usaremos o estilo de nomenclatura de variáveis Python padrão que foi adotado por muitos desenvolvedores Python. Os desenvolvedores Python usam a convenção de nomenclatura de variáveis snake case (snake_case). Usamos underline após cada palavra para uma variável contendo mais de uma palavra (por exemplo, primeiro_nome, sobrenome, velocidade_de_rotação_do_motor). O exemplo abaixo é um exemplo de nomenclatura padrão de variáveis, o underline é necessário quando o nome da variável tem mais de uma palavra (isso é uma boa prática).
+
+Quando atribuímos um determinado tipo de dado a uma variável, isso é chamado de declaração de variável. Por exemplo, no exemplo abaixo, meu primeiro nome é atribuído a uma variável first_name. O sinal de igual é um operador de atribuição. Atribuir significa armazenar dados na variável (dar um valor a uma variavel). O sinal de igual em Python não é igualdade como em Matemática.
+
+_Exemplo:_
+
+```py
+# 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'
+ }
+```
+
+Vamos usar as funções _print()_ e _len()_. A função de impressão aceita um número ilimitado de argumentos. Um argumento é um valor que podemos passar ou colocar entre parênteses, veja o exemplo abaixo.
+
+**Exemplo:**
+
+```py
+print('Hello, World!') # The text Hello, World! is an argument
+print('Hello',',', 'World','!') # it can take multiple arguments, four arguments have been passed
+print(len('Hello, World!')) # it takes only one argument
+```
+
+Vamos imprimir e também encontrar o comprimento das variáveis declaradas no topo:
+
+**Exemplo:**
+
+```py
+# Printing the values stored in the variables
+
+print('First name:', first_name)
+print('First name length:', len(first_name))
+print('Last name: ', last_name)
+print('Last name length: ', len(last_name))
+print('Country: ', country)
+print('City: ', city)
+print('Age: ', age)
+print('Married: ', is_married)
+print('Skills: ', skills)
+print('Person information: ', person_info)
+```
+
+### Declarando múltiplas variaveis em uma linha
+
+Múltiplas variáveis também podem ser declaradas em uma linha:
+
+**Exemplo:**
+
+```py
+first_name, last_name, country, age, is_married = 'Asabeneh', 'Yetayeh', 'Helsink', 250, True
+
+print(first_name, last_name, country, age, is_married)
+print('First name:', first_name)
+print('Last name: ', last_name)
+print('Country: ', country)
+print('Age: ', age)
+print('Married: ', is_married)
+```
+
+Podemos obter a entrada do usuário usando a função _input()_. Vamos atribuir os dados que obtemos de um usuário às variáveis first_name e age.
+
+**Exemplo:**
+
+```py
+first_name = input('What is your name: ')
+age = input('How old are you? ')
+
+print(first_name)
+print(age)
+```
+
+## Tipos de Dados
+
+Existem vários tipos de dados no Python. Para identificar o tipo de dados, usamos a função _type_. Gostaria de pedir que você se concentrasse em compreender muito bem os diferentes tipos de dados. Quando se trata de programação, tudo se resume a tipos de dados. Introduzi os tipos de dados logo no início e depois veremos de novo, porque cada tópico está relacionado aos tipos de dados. Abordaremos os tipos de dados com mais detalhes em suas respectivas seções.
+
+## Checando tipos de dados e Casting
+
+- Checando tipos de dados: Para verificar o tipo de dados de determinados dados/variáveis, usamos o _type_
+ **Exemplo:**
+
+```py
+# Different python data types
+# Let's declare variables with various data types
+
+first_name = 'Asabeneh' # str
+last_name = 'Yetayeh' # str
+country = 'Finland' # str
+city= 'Helsinki' # str
+age = 250 # int, it is not my real age, don't worry about it
+
+# Printing out types
+print(type('Asabeneh')) # str
+print(type(first_name)) # str
+print(type(10)) # int
+print(type(3.14)) # float
+print(type(1 + 1j)) # complex
+print(type(True)) # bool
+print(type([1, 2, 3, 4])) # list
+print(type({'name':'Asabeneh','age':250, 'is_married':250})) # dict
+print(type((1,2))) # tuple
+print(type(zip([1,2],[3,4]))) # set
+```
+
+- Type Casting: Podemos converter um tipo de dado em outro tipo de dado. Nós podemos usar esses tipos para fazer o casting _int()_, _float()_, _str()_, _list_, _set_
+ Quando fazemos operações aritméticas, os números das strings devem ser primeiro convertidos para int ou float, caso contrário, retornará um erro. Se concatenarmos um número com uma string, o número deverá primeiro ser convertido em uma string. Falaremos sobre concatenação na seção String.
+
+ **Exemplo:**
+
+```py
+# int to float
+num_int = 10
+print('num_int',num_int) # 10
+num_float = float(num_int)
+print('num_float:', num_float) # 10.0
+
+# float to int
+gravity = 9.81
+print(int(gravity)) # 9
+
+# int to str
+num_int = 10
+print(num_int) # 10
+num_str = str(num_int)
+print(num_str) # '10'
+
+# str to int or float
+num_str = '10.6'
+print('num_int', int(num_str)) # 10
+print('num_float', float(num_str)) # 10.6
+
+# 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']
+```
+
+## Numeros
+
+Numeros e tipos de dados em python:
+
+1. Inteiros: Inteiros são considerados os(negativos, zero números positivos)
+ Exemplo:
+ ... -3, -2, -1, 0, 1, 2, 3 ...
+
+2. Float(Números Decimais)
+ Exemplo:
+ ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+
+3. Números Complexos
+ Exemplo:
+ 1 + j, 2 + 4j, 1 - 1j
+
+🌕 Você é incrível. Você acabou de completar os desafios do dia 2 e está dois passos à frente no caminho para a grandeza. Agora faça alguns exercícios para o cérebro e os músculos.
+
+## 💻 Exercicios - Dia 2
+
+### Exercicios: Level 1
+
+1. Dentro de 30DiasDePython crie uma pasta chamada dia_2. Dentro desta pasta crie um arquivo chamado variáveis.py
+2. Escreva um comentário em python dizendo: 'Dia 2/30 dias de programação em python'
+3. Declare uma variável de primeiro nome e atribua um valor a ela
+4. Declare uma variavel de sobrenome e atribua um valor a ela
+5. Declare uma variavel de nome completo e atribua um valor a ela
+6. Declare uma variavel do seu país e atribua um valor a ela
+7. Declare uma variavel da sua cidade e atribua um valor a ela
+8. Declare uma variavel da sua idade e atribua um valor a ela
+9. Declare uma variavel ano e atribua um valor a ela
+10. Declare uma variavel is_married e atribua um valor a ela
+11. Declare uma variavel is_true e atribua um valor a ela
+12. Declare uma variavel is_light_on e atribua um valor a ela
+13. Declare multiplas variaveis em uma linha
+
+### Exercicios: Level 2
+
+1. Verifique o tipo de dados de todas as suas variáveis usando a função integrada type()
+1. Usando a função integrada _len()_, encontre o comprimento do seu primeiro nome
+1. Compare o comprimento do seu nome e do seu sobrenome
+1. Declare 5 como num_one e 4 como num_two
+ 1. Adicione num_one e num_two e atribua o valor a uma variável total
+ 2. Subtraia num_two de num_one e atribua o valor a uma variável diff
+ 3. Multiplique num_two e num_one e atribua o valor a um produto variável
+ 4. Divida num_one por num_two e atribua o valor a uma divisão variável
+ 5. Use a divisão de módulo para encontrar num_dois dividido por num_um e atribua o valor a uma variável restante
+ 6. Calcule num_one elevado a num_two e atribua o valor a uma variável exp
+ 7. Encontre a divisão mínima de num_one por num_two e atribua o valor a uma variável floor_division
+2. O raio de um círculo é de 30 metros.
+ 1. Calcule a área de um círculo e atribua o valor a um nome de variável de _area_of_circle_
+ 2. Calcule a circunferência de um círculo e atribua o valor a um nome de variável _circum_of_circle_
+ 3. Pegue o raio como entrada do usuário e calcule a área.
+1. Use a função de entrada integrada para obter nome, sobrenome, país e idade de um usuário e armazenar o valor em seus nomes de variáveis correspondentes
+1. Execute help('keywords') no Python shell ou em seu arquivo para verificar as palavras ou palavras-chave reservadas do Python
+
+🎉 PARABÉNS ! 🎉
+
+[<< Day 1](../README.md) | [Day 3 >>](../03_Day_Operators/03_operators.md)
diff --git a/Portuguese/README.md b/Portuguese/README.md
new file mode 100644
index 000000000..1e0b51398
--- /dev/null
+++ b/Portuguese/README.md
@@ -0,0 +1,456 @@
+# 🐍 30 Dias de python
+
+|# Day | Topics |
+|------|:---------------------------------------------------------:|
+| 01 | [Introdução](./readme.md)|
+| 02 | [Variaveis, Built-in Functions](./02_Dia_Variaveis_BuiltIn_Functions/README.md)|
+| 03 | [Operadores](./03_Day_Operators/03_operators.md)|
+| 04 | [Strings](./04_Day_Strings/04_strings.md)|
+| 05 | [Listas](./05_Day_Lists/05_lists.md)|
+| 06 | [Tuplas](./06_Day_Tuples/06_tuples.md)|
+| 07 | [Conjuntos](./07_Day_Sets/07_sets.md)|
+| 08 | [Dicionários](./08_Day_Dictionaries/08_dictionaries.md)|
+| 09 | [Condicionais](./09_Day_Conditionals/09_conditionals.md)|
+| 10 | [Loops](./10_Day_Loops/10_loops.md)|
+| 11 | [Funções](./11_Day_Functions/11_functions.md)|
+| 12 | [Modulos](./12_Day_Modules/12_modules.md)|
+| 13 | [Compreensão de Listas](./13_Day_List_comprehension/13_list_comprehension.md)|
+| 14 | [Higher Order Functions](./14_Day_Higher_order_functions/14_higher_order_functions.md)|
+| 15 | [Tripos de Erros](./15_Day_Python_type_errors/15_python_type_errors.md)|
+| 16 | [Python Date time](./16_Day_Python_date_time/16_python_datetime.md) |
+| 17 | [Manipulação de Excessão](./17_Day_Exception_handling/17_exception_handling.md)|
+| 18 | [Regex (Expressões Regulares)](./18_Day_Regular_expressions/18_regular_expressions.md)|
+| 19 | [Manipulação De Arquivos](./19_Day_File_handling/19_file_handling.md)|
+| 20 | [Gerenciador De Pacotes](./20_Day_Python_package_manager/20_python_package_manager.md)|
+| 21 | [Classes e Objetos](./21_Day_Classes_and_objects/21_classes_and_objects.md)|
+| 22 | [Web Scraping](./22_Day_Web_scraping/22_web_scraping.md)|
+| 23 | [Ambiente Virtual](./23_Day_Virtual_environment/23_virtual_environment.md)|
+| 24 | [Estatisticas](./24_Day_Statistics/24_statistics.md)|
+| 25 | [Pandas](./25_Day_Pandas/25_pandas.md)|
+| 26 | [Python web](./26_Day_Python_web/26_python_web.md)|
+| 27 | [Python com MongoDB](./27_Day_Python_with_mongodb/27_python_with_mongodb.md)|
+| 28 | [API](./28_Day_API/28_API.md)|
+| 29 | [Construindo API's](./29_Day_Building_API/29_building_API.md)|
+| 30 | [Conclusão](./30_Day_Conclusions/30_conclusions.md)|
+
+🧡🧡🧡 CODANDO FELIZ 🧡🧡🧡
+
+
+Ajudem o autor a criar mais materiais educacionais
+
+
+
+[Dia 2 >>](./02_Dia_Variaveis_BuiltIn_Functions/README.md)
+
+
+
+- [🐍 30 Dias de python](#-30-dias-de-python)
+- [📘 Dia 1](#-dia-1)
+ - [Bem Vindo!](#bem-vindo)
+ - [Introdução](#introdução)
+ - [Por quê Python?](#por-quê-python)
+ - [Setup do ambiente](#setup-do-ambiente)
+ - [Instalando o Python](#instalando-o-python)
+ - [Python Shell](#python-shell)
+ - [Instalando o Visual Studio Code](#instalando-o-visual-studio-code)
+ - [Como usar o Visual Studio Code](#como-usar-o-visual-studio-code)
+ - [Basico de Python](#basico-de-python)
+ - [Sintaxe do Python](#sintaxe-do-python)
+ - [Identação do Python](#identação-do-python)
+ - [Comentários](#comentários)
+ - [Tipos de dados](#tipos-de-dados)
+ - [Números](#números)
+ - [Strings](#strings)
+ - [Booleanos](#booleanos)
+ - [Listas](#listas)
+ - [Dicionário](#dicionário)
+ - [Tupla](#tupla)
+ - [Set](#set)
+ - [Checando Tipos de Dados](#checando-tipos-de-dados)
+ - [Arquivo Python](#arquivo-python)
+ - [💻 Exercicios - Dia 1](#-exercicios---dia-1)
+ - [Exercicio: Level 1](#exercicio-level-1)
+ - [Exercicio: Level 2](#exercicio-level-2)
+ - [Exercicio: Level 3](#exercicio-level-3)
+
+# 📘 Dia 1
+
+## Bem Vindo!
+
+**Parabéns** por decidir participar do desafio de programação _30 dias de Python_ . E nesse desafio você vai aprender tudo o que você precisa para se tornar um programador python e todo o conceito de programação. No final do desafio você receberá o certificado do desafio de programação _30DiasDePython_.
+
+Se você quiser se envolver ativamente no desafio, você pode se juntar ao grupo do telegram [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython).
+
+## Introdução
+
+Python é uma linguagem de programação de alto nível para programação de uso geral. É uma linguagem de programação de código aberto, interpretada e orientada a objetos. Python foi criado por um programador holandês, Guido van Rossum. O nome da linguagem de programação Python foi derivado de uma série de comédia britânica, _Monty Python's Flying Circus_. A primeira versão foi lançada em 20 de fevereiro de 1991. Este desafio de 30 dias de Python irá ajudá-lo a aprender a versão mais recente do Python, Python 3, passo a passo. Os tópicos são divididos em 30 dias, onde cada dia contém diversos tópicos com explicações fáceis de entender, exemplos do mundo real, muitos exercícios práticos e projetos.
+
+Este desafio foi desenvolvido para iniciantes e profissionais que desejam aprender a linguagem de programação python. Pode levar de 30 a 100 dias para completar o desafio, as pessoas que participam ativamente do grupo de telegramas têm grande probabilidade de completar o desafio.
+
+Este desafio é fácil de ler, escrito originalmente em inglês coloquial e traduzido para um português, envolvente, motivador e ao mesmo tempo muito exigente. Você precisa destinar muito tempo para terminar este desafio. Se você é um dos que aprendem melhor vendo, você pode assistir às vídeo-aulas em
+Canal do Youtube do Washera Você pode começar pelo [Video de Python para iniciantes absolutos](https://youtu.be/OCCWZheOesI). Se inscreva no canal, comente suas dúvidas nos vídeos do YouTube e seja proativo, o autor eventualmente notará você.
+
+O autor gosta de ouvir sua opinião sobre o desafio, compartilhe o artigo do autor dando um feedback com sua opinião sobre o desafio 30DiasDePython. E você pode deixar seu feedback sobre o artigo em: [link](https://www.asabeneh.com/testimonials)
+
+## Por quê Python?
+
+É uma linguagem de programação muito próxima da linguagem humana, com uma sintaxe simples! e por isso fácil de aprender e usar.
+Python é usado por vários setores e empresas (incluindo o Google). Ele tem sido usado para desenvolver aplicações web, aplicativos de desktop, administração de sistemas e bibliotecas de machine learning. Python é uma linguagem altamente adotada na comunidade de data science e machine learning. Espero que isso seja suficiente para convencê-lo a começar a aprender Python.
+
+## Setup do ambiente
+
+### Instalando o Python
+Para executar um script escrito em Python, você precisa instalar o Python. Vamos para a página [download](https://www.python.org/) python.
+Se você for um usuario de windows. Clique no botão circulado em vermelho.
+
+[](https://www.python.org/)
+
+Se você for um usuário de MacOs. Clique no botão circulado em vermelho.
+
+[](https://www.python.org/)
+
+Para verificar se o python está instalado, digite o seguinte comando no terminal do seu dispositivo.
+```shell
+python --version
+```
+
+
+
+Como você pode ver no terminal, estou usando a versão _Python 3.7.5_ no momento. Sua versão do Python pode ser diferente da minha, mas deve ser 3.6 ou superior. Se você conseguir ver a versão python, muito bem. Python foi instalado em sua máquina. Continue para a próxima seção.
+
+### Python Shell
+
+Python é uma linguagem de script interpretada, portanto não precisa ser compilada. Isso significa que executa o código linha por linha. O Python vem com um _Python Shell (Shell Interativo do Python)_, também conhecido como REPL (Read Eval Print Loop). E é usado para executar um único comando python e obter o resultado.
+
+O Python Shell aguarda o código Python do usuário. Ao inserir o código, ele o interpreta e mostra o resultado na próxima linha.
+Abra seu terminal ou prompt de comando (cmd) e escreva:
+
+```shell
+python
+```
+
+
+
+O shell interativo do Python é aberto e aguarda que você escreva o código em Python (script Python). E você escreverá seu script Python próximo a este símbolo >>> e clique em Enter.
+Vamos escrever nosso primeiro scripts no shell de script Python.
+
+
+
+Muito bem, você escreveu seu primeiro script Python no shell interativo Python. Como fechamos o shell interativo do Python?
+Para fechar o shell, próximo a este símbolo >> escreva o comando **exit()** e pressione Enter.
+
+
+
+Agora você sabe como abrir o shell interativo do Python e como sair dele.
+
+Python fornecerá resultados se você escrever scripts que Python entenda; caso contrário, retornará erros. Vamos cometer um erro proposital e ver o que o Python retornará.
+
+
+
+Como você pode ver no erro retornado, Python é tão inteligente que sabe o erro que cometemos e que foi _Syntax Error: Invalid Syntax_. Usar x como multiplicação em Python é um erro de sintaxe porque (x) não é uma sintaxe válida em Python. Em vez de (**x**) usamos asterisco (*) para multiplicação. O erro retornado mostra claramente o que corrigir.
+
+O processo de identificação e remoção de erros de um programa é chamado de _depuração_. Vamos depurá-lo colocando * no lugar de **x**.
+
+
+
+Nosso bug foi corrigido, o código foi executado e obtivemos o resultado que esperávamos. Como programador, você verá esse tipo de erro diariamente. É bom saber como depurar. Para ser bom em depuração, você deve entender que tipo de erros está enfrentando. Alguns dos erros do Python que você pode encontrar são _SyntaxError_, _IndexError_, _NameError_, _ModuleNotFoundError_, _KeyError_, _ImportError_, _AttributeError_, _TypeError_, _ValueError_, _ZeroDivisionError_ etc. Veremos mais sobre diferentes tipos de erros no Python mais tarde, em outras seções!
+
+Vamos praticar mais como usar o shell interativo Python. Vá para o seu terminal ou prompt de comando e escreva a palavra **python**.
+
+
+
+O shell interativo do Python é aberto. Vamos fazer algumas operações matemáticas básicas (adição, subtração, multiplicação, divisão, módulo, exponencial).
+
+Vamos fazer algumas contas antes de escrever qualquer código Python:
+
+- 2 + 3 is 5
+- 3 - 2 is 1
+- 3 \* 2 is 6
+- 3 / 2 is 1.5
+- 3 ** 2 is the same as 3 * 3
+
+Em python temos as seguintes operações adicionais:
+
+- 3 % 2 = 1 => que significa encontrar o resto ou (módulo da divisão)
+- 3 // 2 = 1 => que significa remover o resto da divisão
+
+Vamos mudar as expressões matemáticas acima para código Python. O shell Python foi aberto e vamos escrever um comentário logo no início do shell.
+
+Um _comentário_ é uma parte do código que não é executada por python o comentário é ignorado pelo interpretador Python. Portanto, podemos deixar algum texto em nosso código para torná-lo mais legível. Python não executa a parte de comentários. Um comentário em python começa com o símbolo hash(#).
+É assim que você escreve um comentário em python:
+
+```shell
+ # comment starts with hash
+ # this is a python comment, because it starts with a (#) symbol
+```
+
+
+
+Antes de passarmos para a próxima seção, vamos praticar mais no shell interativo do Python. Feche o shell aberto escrevendo _exit()_ no shell e abra-o novamente e vamos praticar como escrever um texto no shell Python.
+
+
+
+### Instalando o Visual Studio Code
+
+O shell interativo Python é bom para testar pequenos códigos de script, mas não será para um grande projeto. No ambiente de trabalho real, os desenvolvedores usam diferentes editores de código para escrever códigos. Neste desafio de programação de 30 dias De Python usaremos código do visual studio. O Visual Studio Code é um editor de texto de código aberto muito popular. Sou fã do vscode e recomendo [download](https://code.visualstudio.com/) visual studio code, mas se você é a adépito a outros editores, fique à vontade para seguir com o que tiver.
+
+[](https://code.visualstudio.com/)
+
+Se você instalou o Visual Studio Code, vamos ver como usá-lo.
+Se preferir um vídeo, você pode seguir este tutorial da instalação e configuração do Visual Studio Code para Python [Video tutorial](https://www.youtube.com/watch?v=bn7Cx4z-vSo)
+
+#### Como usar o Visual Studio Code
+
+Abra o visual studio code clicando duas vezes no ícone do visual studio. Ao abri-lo, você obterá esse tipo de interface. Tente interagir com os ícones rotulados.
+
+
+
+Crie uma pasta chamada 30DiasDePython no seu desktop. Em seguida, abra-a usando o visual studio code.
+
+
+
+
+
+Após abri-lo você verá atalhos para criação de arquivos e pastas dentro do diretório do projeto 30DiasDePython. Como você pode ver abaixo, criei o primeiro arquivo, helloworld.py. Você pode fazer o mesmo.
+
+
+
+Depois de um longo dia codando, você deseja fechar seu editor de código fonte, certo? É assim que você fechará o projeto aberto.
+
+
+
+Parabéns, você concluiu a configuração do ambiente de desenvolvimento. Vamos começar a codar.
+
+## Basico de Python
+
+### Sintaxe do Python
+
+Um script Python pode ser escrito no shell interativo Python ou no editor de código. Um arquivo Python possui uma extensão .py.
+
+### Identação do Python
+
+Uma identação é um espaço em branco em um texto. A identação em muitas linguagens é usada para aumentar a legibilidade do código, mas o Python usa a identação para criar blocos de códigos. Em outras linguagens de programação, chaves são usadas para criar blocos de códigos em vez de a identação. Um dos bugs comuns ao escrever código um python é o erro de identação.
+
+
+
+### Comentários
+
+Os comentários são muito importantes para tornar o código mais legível e para deixar comentários em nosso código. Python não executa partes de comentários do nosso código.
+Qualquer texto que comece com hash(#) em Python é um comentário.
+
+**Exemplo: de um comentário de uma linha**
+
+```shell
+ # This is the first comment
+ # This is the second comment
+ # Python is eating the world
+```
+
+**Exemplo: de um Comentário de multiplas linhas conhecido como docstring**
+
+Aspas triplas podem ser usadas para comentários de múltiplas linhas se não estiverem atribuídas a uma variável
+
+```shell
+"""This is multiline comment
+multiline comment takes multiple lines.
+python is eating the world
+"""
+```
+
+### Tipos de dados
+
+Em Python existem vários tipos de dados. Vamos começar com os mais comuns. Diferentes tipos de dados serão abordados em detalhes em outras seções. Por enquanto, vamos examinar os diferentes tipos de dados e nos familiarizar com eles. Você não precisa ter um entendimento claro agora.
+
+#### Números
+
+- Inteiro: É considerado Inteiro(números negativos, zero e positivos)
+ Exemplo:
+ ... -3, -2, -1, 0, 1, 2, 3 ...
+- Float: Números decimais
+ Exemplo:
+ ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+- Complexos
+ Exemplo:
+ 1 + j, 2 + 4j
+
+#### Strings
+
+Uma coleção de um ou mais caracteres entre aspas simples ou duplas são considerados strings. Se uma string tiver mais de uma frase, usamos aspas triplas.
+
+**Exemplo:**
+
+```py
+'Asabeneh'
+'Finland'
+'Python'
+'I love teaching'
+'I hope you are enjoying the first day of 30DaysOfPython Challenge'
+```
+
+#### Booleanos
+
+Um tipo de dado booleano é um valor True ou False. T e F devem estar sempre maiúsculos.
+
+**Exemplo:**
+
+```python
+ 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
+```
+
+#### Listas
+
+A lista em Python é uma coleção ordenada que permite armazenar itens de diferentes tipos de dados. Uma lista é semelhante a um array em JavaScript.
+
+**Exemplo:**
+
+```py
+[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)
+['Banana', 10, False, 9.81] # different data types in the list - string, integer, boolean and float
+```
+
+#### Dicionário
+
+Um objeto de dicionário Python é uma coleção não ordenada de dados em um formato de par de valores-chave.
+
+**Exemplo:**
+
+```py
+{
+'first_name':'Asabeneh',
+'last_name':'Yetayeh',
+'country':'Finland',
+'age':250,
+'is_married':True,
+'skills':['JS', 'React', 'Node', 'Python']
+}
+```
+
+#### Tupla
+
+Uma tupla é uma coleção ordenada de diferentes tipos de dados, como uma lista, mas as tuplas não podem ser modificadas (são imutáveis) depois de criadas. Eles são imutáveis.
+
+**Exemplo:**
+
+```py
+('Asabeneh', 'Pawel', 'Brook', 'Abraham', 'Lidiya') # Names
+```
+
+```py
+('Earth', 'Jupiter', 'Neptune', 'Mars', 'Venus', 'Saturn', 'Uranus', 'Mercury') # planets
+```
+
+#### Set
+
+O set é uma coleção de tipos de dados semelhantes a uma lista e uma tupla. Ao contrário da lista e da tupla, set não é uma coleção ordenada de itens. Como na matemática, o conjunto em Python armazena apenas itens exclusivos.
+
+Nas seções posteriores, entraremos em detalhes sobre cada tipo de dados Python.
+
+**Exemplo:**
+
+```py
+{2, 4, 3, 5}
+{3.14, 9.81, 2.7} # order is not important in set
+```
+
+### Checando Tipos de Dados
+
+Para checar um determinado tipo de dado dados/variáveis, usamos a função **type**. No terminal a seguir você verá diferentes tipos de dados python:
+
+
+
+### Arquivo Python
+
+Primeiro abra a pasta do seu projeto, 30DiasDePython. Se você não tiver essa pasta, crie um nome de pasta chamada 30DiasDePython. Dentro desta pasta, crie um arquivo chamado helloworld.py. Agora, vamos fazer o que fizemos no shell interativo python usando o visual studio code.
+
+O shell interativo do Python estava imprimindo sem usar **print** mas no visual studio code para ver nosso resultado deveríamos usar uma função integrada _print(). A função interna _print()_ recebe um ou mais argumentos da seguinte maneira _print('arument1', 'argument2', 'argument3')_. Veja os exemplos abaixo.
+
+**Exemplo:**
+
+O nome do arquivo é helloworld.py
+
+```py
+# Day 1 - 30DaysOfPython Challenge
+
+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(//)
+
+# Checking data types
+print(type(10)) # Int
+print(type(3.14)) # Float
+print(type(1 + 3j)) # Complex number
+print(type('Asabeneh')) # String
+print(type([1, 2, 3])) # List
+print(type({'name':'Asabeneh'})) # Dictionary
+print(type({9.8, 3.14, 2.7})) # Set
+print(type((9.8, 3.14, 2.7))) # Tuple
+```
+
+Para executar o arquivo python verifique a imagem abaixo. Você pode executar o arquivo python executando o botão verde em Visual Studio Code ou digitando _python helloworld.py_ no seu terminal.
+
+
+
+🌕 Você é incrível. Você acabou de completar o desafio do primeiro dia e está a caminho da grandeza. Agora faça alguns exercícios para o cérebro e os músculos.
+
+## 💻 Exercicios - Dia 1
+
+### Exercicio: Level 1
+
+1. Cheque a versão do python que você esta usando
+2. Abra o shell interativo python e execute as seguintes operações. Os operandos são 3 e 4.
+ - adição(+)
+ - subtração(-)
+ - multiplicação(\*)
+ - modulo(%)
+ - divisão(/)
+ - exponencial(\*\*)
+ - Divisão inteira(//)
+3. Escreva strings no shell interativo python. As strings são as seguintes:
+ - Seu nome
+ - Seu sobrenome
+ - Seu país
+ - Eu estou aproveitando o 30 dias de python
+4. Verifique os tipos de dados dos seguintes dados:
+ - 10
+ - 9.8
+ - 3.14
+ - 4 - 4j
+ - ['Asabeneh', 'Python', 'Finland']
+ - Seu nome
+ - O seu sobrenome
+ - Seu país
+
+### Exercicio: Level 2
+
+1. Crie uma pasta chamada dia_1 dentro da pasta 30DiasDePython. Dentro da pasta day_1, crie um arquivo python helloworld.py e repita as perguntas 1, 2, 3 e 4. Lembre-se de usar _print()_ quando estiver trabalhando em um arquivo python. Navegue até o diretório onde você salvou seu arquivo e execute-o.
+
+### Exercicio: Level 3
+
+1. Escreva um exemplo para diferentes tipos de dados Python, como Número (Inteiro, Flutuante, Complex), Strings, Booleanos, Listas, Tuplas, Set e Dicionário.
+2. Ache a [Distancia Euclidiana](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) entre (2, 3) e (10, 8)
+
+🎉 PARABÉNS ! 🎉
+
+[Day 2 >>](./02_Dia_Variaveis_BuiltIn_Functions/README.md)
diff --git a/Spanish/01_Day_Introduction/helloworld.py b/Spanish/01_Day_Introduction/helloworld.py
new file mode 100644
index 000000000..1539cfcd5
--- /dev/null
+++ b/Spanish/01_Day_Introduction/helloworld.py
@@ -0,0 +1,22 @@
+# Introducción
+# Día 1 - Desafío 30DaysOfPython
+
+print(2 + 3) # suma(+)
+print(3 - 1) # resta(-)
+print(2 * 3) # multiplicación(*)
+print(3 / 2) # división(/)
+print(3 ** 2) # exponencial(**)
+print(3 % 2) # módulo(%)
+print(3 // 2) # División de piso(//)
+
+# Comprobando los tipos de datos
+
+print(type(10)) # Int
+print(type(3.14)) # Float
+print(type(1 + 3j)) # Complejo
+print(type('Asabeneh')) # Cadena
+print(type([1, 2, 3])) # Lista
+print(type({'name':'Asabeneh'})) # Diccionario
+print(type({9.8, 3.14, 2.7})) # Conjunto
+print(type((9.8, 3.14, 2.7))) # Tupla
+
diff --git a/Spanish/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md b/Spanish/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md
new file mode 100644
index 000000000..149cc7b43
--- /dev/null
+++ b/Spanish/02_Day_Variables_builtin_functions/02_variables_builtin_functions.md
@@ -0,0 +1,300 @@
+
+
30 Dias de Python: Dia 2 - Variables, Funciones integradas
+
+[<< Dia 1](../readme.md) | [Dia 3 >>](../03_Day_Operators/03_operators.md)
+
+
+
+- [📘 Día 2](#-día-2)
+ - [Funciones integradas](#funciones-integradas)
+ - [Variables](#variables)
+ - [Declaración de múltiples variables en una línea](#declaración-de-múltiples-variables-en-una-línea)
+ - [Tipos de datos](#tipos-de-datos)
+ - [Comprobación de tipos de datos y conversión](#comprobación-de-tipos-de-datos-y-conversión)
+ - [Números](#números)
+ - [💻 Ejercicios - Día 2](#💻-ejercicios---día-2)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+
+# 📘 Dia 2
+
+## Funciones integradas
+
+En Python tenemos muchas funciones integradas. Las funciones integradas están disponibles globalmente para su uso, lo que significa que puede hacer uso de las funciones integradas sin importarlas ni configurarlas. Algunas de las funciones integradas de Python más utilizadas son las siguientes: _print()_, _len()_, _type()_, _int()_, _float()_, _str()_, _input()_, _list()_, _dict()_, _min()_, _max()_, _sum()_, _sorted()_, _open()_, _file()_, _help()_ y _dir()_ . En la siguiente tabla, verá una lista exhaustiva de las funciones integradas de Python sacadas de la [documentación de Python](https://docs.python.org/3.9/library/functions.html).
+
+
+
+Abramos el shell de Python y comencemos a usar algunas de las funciones integradas más comunes.
+
+
+
+Practiquemos más usando diferentes funciones integradas
+
+
+
+Como puede ver en la terminal de arriba, Python tiene palabras reservadas. No usamos palabras reservadas para declarar variables o funciones. En la siguiente sección cubriremos las variables.
+
+Creo que a estas alturas ya está familiarizado con las funciones integradas. Hagamos una práctica más de funciones integradas y pasaremos a la siguiente sección.
+
+
+
+## Variables
+
+Las variables almacenan datos en la memoria de una computadora. Se recomienda el uso de variables mnemotécnicas en muchos lenguajes de programación. Una variable mnemotécnica es un nombre de variable que se puede recordar y asociar fácilmente. Una variable se refiere a una dirección de memoria en la que se almacenan los datos.
+Número al principio, carácter especial o guión no están permitidos al nombrar una variable. Una variable puede tener un nombre corto (como x, y, z), pero se recomienda enfáticamente un nombre más descriptivo (nombre, apellido, edad, país).
+
+Reglas de nombres de variables de Python
+
+- Un nombre de variable debe comenzar con una letra o el carácter de subrayado
+- Un nombre de variable no puede comenzar con un número
+- Un nombre de variable solo puede contener caracteres alfanuméricos y guiones bajos (A-z, 0-9 y \_)
+- Los nombres de las variables distinguen entre mayúsculas y minúsculas (firstname, Firstname, FirstName y FIRSTNAME) son variables diferentes)
+
+Estos son algunos ejemplos de nombres de variables válidos:
+
+```shell
+firstname
+lastname
+age
+country
+city
+first_name
+last_name
+capital_city
+_if # si queremos usar palabra reservada como variable
+year_2021
+year2021
+current_year_2021
+birth_year
+num1
+num2
+```
+
+Nombres de variables no válidos
+
+```shell
+first-name
+first@name
+first$name
+num-1
+1num
+```
+
+Usaremos el estilo estándar de nomenclatura de variables de Python que ha sido adoptado por muchos desarrolladores de Python. Los desarrolladores de Python usan la convención de nomenclatura de variables de caja de serpiente (snake_case). Usamos un carácter de subrayado después de cada palabra para una variable que contiene más de una palabra (p. ej., nombre, apellido, velocidad de rotación del motor). El siguiente ejemplo es un ejemplo de nomenclatura estándar de variables, se requiere guión bajo cuando el nombre de la variable es más de una palabra.
+
+Cuando asignamos un determinado tipo de datos a una variable, se llama declaración de variable. Por ejemplo, en el siguiente ejemplo, mi nombre se asigna a una variable first_name. El signo igual es un operador de asignación. Asignar significa almacenar datos en la variable. El signo igual en Python no es la igualdad como en Matemáticas.
+
+_Ejemplo:_
+
+```py
+# Variables en 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'
+ }
+```
+
+Usemos las funciones integradas _print()_ y _len()_. La función de impresión toma un número ilimitado de argumentos. Un argumento es un valor que se puede pasar o poner dentro del paréntesis de la función, vea el ejemplo a continuación.
+
+**Ejemplo:**
+
+```py
+print('Hello, World!') # El texto Hola, Mundo! es un argumento
+print('Hello',',', 'World','!') # Puede tomar varios argumentos, se han pasado cuatro argumentos
+print(len('Hello, World!')) # solo se necesita un argumento
+```
+
+Imprimamos y también encontremos la longitud de las variables declaradas en la parte superior:
+
+**Ejemplo:**
+
+```py
+# Imprimiendo los valores almacenados en las variables
+
+print('First name:', first_name)
+print('First name length:', len(first_name))
+print('Last name: ', last_name)
+print('Last name length: ', len(last_name))
+print('Country: ', country)
+print('City: ', city)
+print('Age: ', age)
+print('Married: ', is_married)
+print('Skills: ', skills)
+print('Person information: ', person_info)
+```
+
+### Declaración de múltiples variables en una línea
+
+También se pueden declarar múltiples variables en una línea:
+
+**Ejemplo:**
+
+```py
+first_name, last_name, country, age, is_married = 'Asabeneh', 'Yetayeh', 'Helsink', 250, True
+
+print(first_name, last_name, country, age, is_married)
+print('First name:', first_name)
+print('Last name: ', last_name)
+print('Country: ', country)
+print('Age: ', age)
+print('Married: ', is_married)
+```
+
+Obtener la entrada del usuario usando la función integrada _input()_. Asignemos los datos que obtenemos de un usuario a las variables first_name y age.
+**Ejemplo:**
+
+```py
+first_name = input('What is your name: ')
+age = input('How old are you? ')
+
+print(first_name)
+print(age)
+```
+
+## Tipos de datos
+
+Hay varios tipos de datos en Python. Para identificar el tipo de datos usamos la función incorporada _type_. Me gustaría pedirle que se concentre en comprender muy bien los diferentes tipos de datos. Cuando se trata de programar, todo se trata de tipos de datos. Introduje los tipos de datos desde el principio y viene de nuevo, porque todos los temas están relacionados con los tipos de datos. Cubriremos los tipos de datos con más detalle en sus respectivas secciones.
+
+## Comprobación de tipos de datos y conversión
+
+- Verificar tipos de datos: para verificar el tipo de datos de ciertos datos/variables usamos el _type_
+ **Ejemplo:**
+
+```py
+# Diferentes tipos de datos en python
+# Declaremos variables con varios tipos de datos
+
+first_name = 'Asabeneh' # str
+last_name = 'Yetayeh' # str
+country = 'Finland' # str
+city= 'Helsinki' # str
+age = 250 # int, no es mi edad real, no te preocupes
+
+# Imprimir tipos
+print(type('Asabeneh')) # str
+print(type(first_name)) # str
+print(type(10)) # int
+print(type(3.14)) # float
+print(type(1 + 1j)) # complex
+print(type(True)) # bool
+print(type([1, 2, 3, 4])) # list
+print(type({'name':'Asabeneh','age':250, 'is_married':250})) # dict
+print(type((1,2))) # tuple
+print(type(zip([1,2],[3,4]))) # set
+```
+
+- Casting: Conversión de un tipo de dato a otro tipo de dato. Usamos _int()_, _float()_, _str()_, _list_, _set_
+ Cuando hacemos operaciones aritméticas, los números de cadena deben convertirse primero a int o float; de lo contrario, devolverá un error. Si concatenamos un número con una cadena, el número debe convertirse primero en una cadena. Hablaremos sobre la concatenación en la sección String.
+
+ **Ejemplo:**
+
+```py
+# int a float
+num_int = 10
+print('num_int',num_int) # 10
+num_float = float(num_int)
+print('num_float:', num_float) # 10.0
+
+# float a int
+gravity = 9.81
+print(int(gravity)) # 9
+
+# int a str
+num_int = 10
+print(num_int) # 10
+num_str = str(num_int)
+print(num_str) # '10'
+
+# str a int o float
+num_str = '10.6'
+print('num_int', int(num_str)) # 10
+print('num_float', float(num_str)) # 10.6
+
+# str a 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']
+```
+
+## Números
+
+Tipos de datos numéricos en Python:
+
+1. Integers: números enteros (negativos, cero y positivos)
+ Ejemplo:
+ ... -3, -2, -1, 0, 1, 2, 3...
+
+2. Floating: números de coma (números decimales)
+ Ejemplo:
+ ... -3,5, -2,25, -1,0, 0,0, 1,1, 2,2, 3,5...
+
+3. Complex: números complejos
+ Ejemplo:
+ 1 + j, 2 + 4j, 1 - 1j
+
+🌕 Eres increíble. Acaba de completar los desafíos del día 2 y está dos pasos por delante en su camino hacia la grandeza. Ahora haz algunos ejercicios para tu cerebro y tus músculos.
+
+## 💻 Ejercicios - Día 2
+
+### Ejercicios: Nivel 1
+
+1. Dentro de 30DaysOfPython crea una carpeta llamada day_2. Dentro de esta carpeta crea un archivo llamado variables.py
+2. Escriba un comentario de python que diga 'Día 2: 30 días de programación en python'
+3. Declarar una variable de nombre y asignarle un valor
+4. Declarar una variable de apellido y asignarle un valor
+5. Declare una variable de nombre completo y asígnele un valor
+6. Declarar una variable de país y asignarle un valor
+7. Declarar una variable de ciudad y asignarle un valor
+8. Declarar una variable de edad y asignarle un valor
+9. Declarar una variable de año y asignarle un valor
+10. Declarar una variable is_married y asignarle un valor
+11. Declarar una variable is_true y asignarle un valor
+12. Declare una variable is_light_on y asígnele un valor
+13. Declarar múltiples variables en una línea
+
+### Ejercicios: Nivel 2
+
+1. Verifique el tipo de datos de todas sus variables usando la función incorporada type()
+1. Usando la función incorporada _len()_, encuentre la longitud de su nombre
+1. Compara la longitud de tu nombre y tu apellido
+1. Declarar 5 como num_one y 4 como num_two
+ 1. Sume num_one y num_two y asigne el valor a un total variable
+ 2. Reste num_two de num_one y asigne el valor a una variable diff
+ 3. Multiplique num_two y num_one y asigne el valor a un producto variable
+ 4. Divide num_one por num_two y asigna el valor a una división variable
+ 5. Use la división de módulo para encontrar num_two dividido por num_one y asigne el valor a un residuo variable
+ 6. Calcula num_one a la potencia de num_two y asigna el valor a una variable exp
+ 7. Encuentra la división de piso de num_one por num_two y asigna el valor a una variable floor_division
+1. El radio de un círculo es de 30 metros.
+ 1. Calcule el área de un círculo y asigne el valor a una variable con el nombre de _area_of_circle_
+ 2. Calcule la circunferencia de un círculo y asigne el valor a una variable con el nombre de _circum_of_circle_
+ 3. Tome el radio como entrada del usuario y calcule el área.
+1. Use la función de entrada integrada para obtener el nombre, el apellido, el país y la edad de un usuario y almacene el valor en sus nombres de variables correspondientes
+1. Ejecute la ayuda ('palabras clave') en el shell de Python o en su archivo para verificar las palabras o palabras clave reservadas de Python
+
+🎉 ¡FELICITACIONES! 🎉
+
+[<< Day 1](../readme.md) | [Day 3 >>](../03_Day_Operators/03_operators.md)
diff --git a/Spanish/02_Day_Variables_builtin_functions/variables.py b/Spanish/02_Day_Variables_builtin_functions/variables.py
new file mode 100644
index 000000000..53729dce9
--- /dev/null
+++ b/Spanish/02_Day_Variables_builtin_functions/variables.py
@@ -0,0 +1,40 @@
+
+# Variables en 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'
+ }
+
+# Imprimir los valores almacenados en las variables
+
+print('First name:', first_name)
+print('First name length:', len(first_name))
+print('Last name: ', last_name)
+print('Last name length: ', len(last_name))
+print('Country: ', country)
+print('City: ', city)
+print('Age: ', age)
+print('Married: ', is_married)
+print('Skills: ', skills)
+print('Person information: ', person_info)
+
+# Declarar múltiples variables en una línea
+
+first_name, last_name, country, age, is_married = 'Asabeneh', 'Yetayeh', 'Helsink', 250, True
+
+print(first_name, last_name, country, age, is_married)
+print('First name:', first_name)
+print('Last name: ', last_name)
+print('Country: ', country)
+print('Age: ', age)
+print('Married: ', is_married)
\ No newline at end of file
diff --git a/Spanish/02_variables_builtin_functions_sp.md b/Spanish/02_variables_builtin_functions_sp.md
new file mode 100644
index 000000000..0aea1e65d
--- /dev/null
+++ b/Spanish/02_variables_builtin_functions_sp.md
@@ -0,0 +1,307 @@
+
+
30 días de Python: Día 2 - Variables y funciones integradas
+
+[<< Día 1](./readme_sp.md) | [Día 3 >>](./03_operators_sp.md)
+
+
+
+_Lectura aproximada: 12 min_
+
+- [📘 Día 2](#-día-2)
+ - [Funciones integradas](#funciones-integradas)
+ - [Variables](#variables)
+ - [Declarar varias variables en una línea](#declarar-varias-variables-en-una-línea)
+ - [Tipos de datos](#tipos-de-datos)
+ - [Conversión de tipos de datos](#conversión-de-tipos-de-datos)
+ - [Números](#números)
+ - [💻 Ejercicios - Día 2](#-ejercicios---día-2)
+ - [Ejercicio: Nivel 1](#ejercicio-nivel-1)
+ - [Ejercicio: Nivel 2](#ejercicio-nivel-2)
+
+# 📘 Día 2
+
+## Funciones integradas
+
+Python proporciona muchas funciones integradas. Las funciones integradas están disponibles a nivel global, lo que significa que puede usarlas sin importar o configurar nada. A continuación se muestran algunas de las funciones integradas más comunes de Python: _print()_, _len()_, _type()_, _int()_, _float()_, _str()_, _input()_, _list()_, _dict()_, _min()_, _max()_, _sum()_, _sorted()_, _open()_, _file()_, _help()_, _dir()_. En la tabla siguiente verá la lista completa de funciones integradas obtenida de la [documentación de Python](https://docs.python.org/3.9/library/functions.html).
+
+
+
+Abramos el intérprete interactivo de Python y comencemos a usar algunas de las funciones integradas más comunes.
+
+
+
+Practique más usando diferentes funciones integradas
+
+
+
+Como se muestra arriba, Python tiene palabras reservadas. No podemos usar palabras reservadas para declarar variables o funciones. Presentaremos las variables en la sección siguiente.
+
+Confío en que ahora esté familiarizado con las funciones integradas. Practiquemos más con ellas antes de continuar a la siguiente sección.
+
+
+
+## Variables
+
+Las variables almacenan datos en la memoria del ordenador. En muchos lenguajes de programación se recomienda usar nombres de variables mnemotécnicos. Un nombre mnemotécnico es un nombre de variable fácil de recordar y asociar. Una variable hace referencia a la dirección de memoria donde se almacena un dato.
+
+Al nombrar variables, no se permite empezar con un número, usar caracteres especiales ni guiones. Una variable puede tener un nombre corto (por ejemplo x, y, z), pero se recomienda encarecidamente usar nombres más descriptivos (nombre, apellido, edad, país).
+
+Reglas para nombres de variables en Python
+
+- El nombre de la variable debe comenzar con una letra o un guion bajo
+- El nombre de la variable no puede comenzar con un número
+- El nombre de la variable sólo puede contener caracteres alfanuméricos y guiones bajos (A-z, 0-9 y _)
+- Los nombres de variables distinguen mayúsculas de minúsculas (firstname, Firstname, FirstName y FIRSTNAME son variables diferentes)
+
+A continuación algunos ejemplos de nombres válidos:
+
+```shell
+firstname
+lastname
+age
+country
+city
+first_name
+last_name
+capital_city
+ _if # si queremos usar una palabra reservada como variable
+year_2021
+year2021
+current_year_2021
+birth_year
+num1
+num2
+```
+
+Nombres de variables inválidos
+
+```shell
+first-name
+first@name
+first$name
+num-1
+1num
+```
+Usaremos la convención de nombres estándar adoptada por muchos desarrolladores de Python. Los desarrolladores de Python usan la convención snake_case. Para variables que contienen varias palabras usamos guiones bajos entre las palabras (por ejemplo first_name, last_name, engine_rotation_speed). El siguiente ejemplo muestra la convención estándar: cuando el nombre de la variable contiene más de una palabra, se deben usar guiones bajos.
+
+Cuando asignamos un valor a una variable, esto se llama declarar una variable. Por ejemplo, en el siguiente ejemplo mi nombre se asigna a la variable first_name. El signo igual es el operador de asignación. Asignar significa almacenar un dato en una variable. El signo igual en Python no es el mismo que en matemáticas.
+
+_Ejemplo:_
+
+```py
+# Variables en 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'
+ }
+```
+
+Usemos las funciones integradas _print()_ y _len()_. La función print puede aceptar un número ilimitado de argumentos. Un argumento es un valor que podemos pasar dentro de los paréntesis de la función; vea el ejemplo a continuación.
+
+**Ejemplo:**
+
+```py
+print('Hello, World!') # The text Hello, World! is an argument
+print('Hello',',', 'World','!') # it can take multiple arguments, four arguments have been passed
+print(len('Hello, World!')) # it takes only one argument
+```
+
+Imprimamos y calculemos la longitud de las variables declaradas arriba:
+
+
+**Ejemplo:**
+
+```py
+# Imprimir valores de las variables
+
+print('First name:', first_name)
+print('First name length:', len(first_name))
+print('Last name: ', last_name)
+print('Last name length: ', len(last_name))
+print('Country: ', country)
+print('City: ', city)
+print('Age: ', age)
+print('Married: ', is_married)
+print('Skills: ', skills)
+print('Person information: ', person_info)
+```
+
+### Declarar varias variables en una línea
+
+También se pueden declarar múltiples variables en la misma línea:
+
+**Ejemplo:**
+
+```py
+first_name, last_name, country, age, is_married = 'Asabeneh', 'Yetayeh', 'Helsink', 250, True
+
+print(first_name, last_name, country, age, is_married)
+print('First name:', first_name)
+print('Last name: ', last_name)
+print('Country: ', country)
+print('Age: ', age)
+print('Married: ', is_married)
+```
+
+Use la función integrada _input()_ para obtener entrada del usuario. Asignemos los datos ingresados por el usuario a las variables first_name y age.
+.
+**Ejemplo:**
+
+```py
+first_name = input('What is your name: ')
+age = input('How old are you? ')
+
+print(first_name)
+print(age)
+```
+
+## Tipos de datos
+
+Hay varios tipos de datos en Python. Para identificar el tipo de un dato usamos la función integrada _type_. Le recomiendo dominar los distintos tipos de datos: en programación todo está relacionado con los tipos de datos. Ya introduje los tipos de datos al principio y los vuelvo a mencionar porque cada tema está relacionado con los tipos de datos. Estudiaremos cada tipo con más detalle en capítulos posteriores.
+
+## Conversión de tipos de datos
+
+- Comprobar el tipo de dato: Para comprobar el tipo de un dato/variable usamos la función _type_
+
+ **Ejemplo:**
+
+```py
+# Diferentes tipos de datos en Python
+# Declaramos algunas variables con distintos tipos de datos
+
+first_name = 'Asabeneh' # str
+last_name = 'Yetayeh' # str
+country = 'Finland' # str
+city= 'Helsinki' # str
+age = 250 # int, no se preocupe, esta no es mi edad real :)
+
+# Printing out types
+print(type('Asabeneh')) # str
+print(type(first_name)) # str
+print(type(10)) # int
+print(type(3.14)) # float
+print(type(1 + 1j)) # complex
+print(type(True)) # bool
+print(type([1, 2, 3, 4])) # list
+print(type({'name':'Asabeneh','age':250, 'is_married':250})) # dict
+print(type((1,2))) # tuple
+print(type(zip([1,2],[3,4]))) # set
+```
+
+- Conversión de tipos: convertir un tipo de dato a otro. Usamos _int()_, _float()_, _str()_, _list_, _set_.
+Cuando realizamos operaciones aritméticas, las cadenas que contienen números deben convertirse primero a int o float, de lo contrario se producirá un error. Si concatenamos un número y una cadena, hay que convertir primero el número a cadena. Veremos la concatenación en la sección de cadenas.
+
+
+ **Ejemplo:**
+
+```py
+# De entero a float
+num_int = 10
+print('num_int',num_int) # 10
+num_float = float(num_int)
+print('num_float:', num_float) # 10.0
+
+# De float a entero
+gravity = 9.81
+print(int(gravity)) # 9
+
+# De entero a cadena
+num_int = 10
+print(num_int) # 10
+num_str = str(num_int)
+print(num_str) # '10'
+
+# De cadena a entero o float
+num_str = '10.6'
+print('num_int', int(num_str)) # 10
+print('num_float', float(num_str)) # 10.6
+
+# De cadena a lista
+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']
+```
+
+## Números
+
+Diferentes tipos numéricos en Python
+
+- Integer: números enteros (negativos, 0 y positivos)
+ Ejemplo:
+ ... -3, -2, -1, 0, 1, 2, 3 ...
+- Float: números de punto flotante
+ Ejemplo
+ ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+- Complex: números complejos
+ Ejemplo
+ 1 + j, 2 + 4j, 1 - 1j
+
+🌕 ¡Excelente! Acabas de completar el desafío del Día 2, estás un paso más cerca del éxito. Ahora realiza algunos ejercicios para ejercitar tu mente y tus habilidades.
+
+
+## 💻 Ejercicios - Día 2
+
+### Ejercicio: Nivel 1
+
+1. Crea una carpeta `day_2` dentro de la carpeta `30DaysOfPython`. Dentro de esa carpeta crea un archivo `variables.py`
+2. Añade un comentario: 'Día 2: 30 Days of Python programming'
+3. Declara una variable `first_name` y asígnale un valor
+4. Declara una variable `last_name` y asígnale un valor
+5. Declara una variable `full_name` y asígnale un valor
+6. Declara una variable `country` y asígnale un valor
+7. Declara una variable `city` y asígnale un valor
+8. Declara una variable `age` y asígnale un valor
+9. Declara una variable `year` y asígnale un valor
+10. Declara una variable `is_married` y asígnale un valor
+11. Declara una variable `is_true` y asígnale un valor
+12. Declara una variable `is_light_on` y asígnale un valor
+13. Declara múltiples variables en una sola línea
+
+### Ejercicio: Nivel 2
+
+1. Usa la función integrada _type()_ para comprobar el tipo de las variables que declaraste
+1. Usa la función _len()_ para calcular la longitud de la variable `first_name`
+1. Compara la longitud de las variables `first_name` y `last_name`
+1. Declara las variables `num_one = 5` y `num_two = 4`
+ 1. Suma `num_one` y `num_two` y asigna el resultado a la variable `total`
+ 2. Resta `num_two` de `num_one` y asigna el resultado a la variable `diff`
+ 3. Multiplica `num_one` y `num_two` y asigna el resultado a la variable `product`
+ 4. Divide `num_one` entre `num_two` y asigna el resultado a la variable `division`
+ 5. Usa la operación módulo para obtener el resto de `num_two` dividido por `num_one` y asígnalo a `remainder`
+ 6. Calcula `num_one` elevado a `num_two` y asigna el valor a `exp`
+ 7. Calcula la división entera de `num_one` entre `num_two` (operación de floor division) y asigna el resultado a `floor_division`
+1. El círculo tiene un radio de 30 metros.
+ 1. Calcula el área del círculo y asígnala a la variable `_area_of_circle_`
+ 2. Calcula la circunferencia del círculo y asígnala a la variable `_circum_of_circle_`
+ 3. Pide el radio al usuario y calcula el área.
+1. Usa la función integrada `input()` para obtener nombre, apellido, país y edad del usuario y almacena los valores en las variables correspondientes
+1. Ejecuta `help('keywords')` en el intérprete de Python o en un archivo para comprobar las palabras reservadas (keywords) de Python
+
+
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 1](./readme_sp.md) | [Día 3 >>](./03_operators_sp.md)
\ No newline at end of file
diff --git a/Spanish/03_Day_Operators/03_operators.md b/Spanish/03_Day_Operators/03_operators.md
new file mode 100644
index 000000000..45641894f
--- /dev/null
+++ b/Spanish/03_Day_Operators/03_operators.md
@@ -0,0 +1,316 @@
+
+
+[<< Dia 2](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md) | [Dia 4 >>](../04_Day_Strings/04_strings.md)
+
+
+
+- [📘 Día 3](#📘-día-3)
+ - [Booleano](#booleano)
+ - [Operadores](#operadores)
+ - [Operadores de asignación](#operadores-de-asignación)
+ - [Operadores aritméticos:](#operadores-aritméticos)
+ - [Operadores de comparación](#operadores-de-comparación)
+ - [Operadores lógicos](#operadores-lógicos)
+ - [💻 Ejercicios - Día 3](#💻-ejercicios---día-3)
+
+# 📘 Día 3
+
+## Booleano
+
+Un tipo de datos booleano representa uno de los dos valores: _Verdadero_ o _Falso_. El uso de estos tipos de datos quedará claro una vez que comencemos a usar el operador de comparación. La primera letra **T** para Verdadero y **F** para Falso debe ser en mayúscula a diferencia de JavaScript.
+**Ejemplo: valores booleanos**
+
+```py
+print(True)
+print(False)
+```
+
+## Operadores
+
+Python language supports several types of operators. In this section, we will focus on few of them.
+
+### Operadores de asignación
+
+Los operadores de asignación se utilizan para asignar valores a las variables. Tomemos = como ejemplo. El signo igual en matemáticas muestra que dos valores son iguales, sin embargo, en Python significa que estamos almacenando un valor en una determinada variable y lo llamamos asignación o asignación de valor a una variable. La siguiente tabla muestra los diferentes tipos de operadores de asignación de Python, tomados de [w3school](https://www.w3schools.com/python/python_operators.asp).
+
+
+
+### Operadores aritméticos:
+
+- Suma (+): a + b
+- Resta(-): a - b
+- Multiplicación(*): a * b
+- División(/): a/b
+- Módulo(%): a % b
+- División de piso(//): a // b
+- Exponenciación(**): a ** b
+
+
+
+**Ejemplo: Enteros**
+
+```py
+# Operaciones aritméticas en Python
+# enteros
+
+print('Addition: ', 1 + 2) # 3
+print('Subtraction: ', 2 - 1) # 1
+print('Multiplication: ', 2 * 3) # 6
+print ('Division: ', 4 / 2) # 2.0 La división en Python da un número flotante
+print('Division: ', 6 / 2) # 3.0
+print('Division: ', 7 / 2) # 3.5
+print('Division without the remainder: ', 7 // 2) # 3, da sin el número flotante o sin el resto
+print ('Division without the remainder: ',7 // 3) # 2
+print('Modulus: ', 3 % 2) # 1, da el resto
+print('Exponentiation: ', 2 ** 3) # 9 significa 2 * 2 * 2
+```
+
+**Ejemplo: Floats**
+
+```py
+# Números flotantes
+print('Floating Point Number, PI', 3.14)
+print('Floating Point Number, gravity', 9.81)
+```
+
+**Ejemplo: Números complex**
+
+```py
+# Números complejos
+print('Complex number: ', 1 + 1j)
+print('Multiplying complex numbers: ',(1 + 1j) * (1 - 1j))
+```
+
+Declaremos una variable y asignemos un tipo de dato numérico. Voy a usar una variable de un solo carácter, pero recuerde que no desarrolle el hábito de declarar este tipo de variables. Los nombres de las variables deben ser siempre mnemotécnicos.
+
+**Ejemplo:**
+
+```python
+# Declarar la variable en la parte superior primero
+
+a = 3 # a es un nombre de variable y 3 es un tipo de dato entero
+b = 2 # b es un nombre de variable y 3 es un tipo de dato entero
+
+# Operaciones aritméticas y asignación del resultado a una variable
+total = a + b
+diff = a - b
+product = a * b
+division = a / b
+remainder = a % b
+floor_division = a // b
+exponential = a ** b
+
+# Debería haber usado sum en lugar de total, pero sum es una función integrada; trate de evitar anular las funciones integradas
+print(total) # si no etiqueta su impresión con alguna cadena, nunca sabrá de dónde viene el resultado
+print('a + b = ', total)
+print('a - b = ', diff)
+print('a * b = ', product)
+print('a / b = ', division)
+print('a % b = ', remainder)
+print('a // b = ', floor_division)
+print('a ** b = ', exponentiation)
+```
+
+**Ejemplo:**
+
+```py
+print('== Addition, Subtraction, Multiplication, Division, Modulus ==')
+
+# Declarar valores y organizarlos juntos
+num_one = 3
+num_two = 4
+
+# Operaciones aritmeticas
+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
+
+# Imprimiendo valores con etiqueta
+print('total: ', total)
+print('difference: ', diff)
+print('product: ', product)
+print('division: ', div)
+print('remainder: ', remainder)
+```
+
+Empecemos a conectar los puntos y empecemos a hacer uso de lo que ya sabemos para calcular (área, volumen, densidad, peso, perímetro, distancia, fuerza).
+
+**Ejemplo:**
+```py
+# Cálculo del área de un círculo
+radius = 10 # radio de un circulo
+area_of_circle = 3.14 * radius ** 2 # dos signo * significa exponente o potencia
+print('Area of a circle:', area_of_circle)
+
+# Calcular el área de un rectángulo
+length = 10
+width = 20
+area_of_rectangle = length * width
+print('Area of rectangle:', area_of_rectangle)
+
+# Calcular el peso de un objeto
+mass = 75
+gravity = 9.81
+weight = mass * gravity
+print(weight, 'N') # Agregando unidad al peso
+
+# Calcular la densidad de un líquido
+mass = 75 # en kg
+volume = 0.075 # en metros cúbicos
+density = mass / volume # 1000 Kg/m^3
+
+```
+
+### Operadores de comparación
+
+En programación comparamos valores, usamos operadores de comparación para comparar dos valores. Comprobamos si un valor es mayor o menor o igual a otro valor. La siguiente tabla muestra los operadores de comparación de Python que se tomaron de [w3shool](https://www.w3schools.com/python/python_operators.asp).
+
+
+**Ejemplo: Operadores de comparación**
+
+```py
+print(3 > 2) # True, porque 3 es mayor que 2
+print(3 >= 2) # True, porque 3 es mayor que 2
+print(3 < 2) # False, porque 3 es mayor que 2
+print(2 < 3) # True, porque 2 es menor que 3
+print(2 <= 3) # True, porque 2 es menor que 3
+print(3 == 2) # False, porque 3 no es igual a 2
+print(3 != 2) # True, porque 3 no es igual a 2
+print(len('mango') == len('avocado')) # False
+print(len('mango') != len('avocado')) # True
+print(len('mango') < len('avocado')) # True
+print(len('milk') != len('meat')) # False
+print(len('milk') == len('meat')) # True
+print(len('tomato') == len('potato')) # True
+print(len('python') > len('dragon')) # False
+
+
+# Comparar algo da un True o False
+
+print('True == True: ', True == True)
+print('True == False: ', True == False)
+print('False == False:', False == False)
+```
+
+Además del operador de comparación anterior, Python usa:
+
+- _is_: Devuelve True si ambas variables son el mismo objeto (x es y)
+- _is not_: Devuelve True si ambas variables no son el mismo objeto (x no es y)
+- _in_: Devuelve True si la lista consultada contiene un elemento determinado (x en y)
+- _not in_: Devuelve True si la lista consultada no tiene un elemento determinado (x en y)
+
+```py
+print('1 is 1', 1 is 1) # True - porque los valores de los datos son los mismos
+print('1 is not 2', 1 is not 2) # True - porque 1 no es 2
+print('A in Asabeneh', 'A' in 'Asabeneh') # True - A encontrado en la cadena
+print('B in Asabeneh', 'B' in 'Asabeneh') # False - no hay b mayúscula
+print('coding' in 'coding for all') # True - porque 'coding for all' tiene la palabra 'coding'
+print('a in an:', 'a' in 'an') # True
+print('4 is 2 ** 2:', 4 is 2 ** 2) # True
+```
+
+### Operadores lógicos
+
+A diferencia de otros lenguajes de programación, Python utiliza las palabras clave _and_, _or_ y _not_ para los operadores lógicos. Los operadores lógicos se utilizan para combinar sentencias condicionales:
+
+
+
+```py
+print(3 > 2 and 4 > 3) # True - porque ambas afirmaciones son verdaderas
+print(3 > 2 and 4 < 3) # False - porque la segunda afirmación es falsa
+print(3 < 2 and 4 < 3) # False - porque ambas afirmaciones son falsas
+print('True and True: ', True and True)
+print(3 > 2 or 4 > 3) # True - porque ambas afirmaciones son verdaderas
+print(3 > 2 or 4 < 3) # True - porque una de las afirmaciones es verdadera
+print(3 < 2 or 4 < 3) # False - porque ambas afirmaciones son falsas
+print('True or False:', True or False)
+print(not 3 > 2) # False - porque 3 > 2 es verdadero, entonces no verdadero da falso
+print(not True) # False - Negación, el operador not devuelve verdadero a falso
+print(not False) # True
+print(not not True) # True
+print(not not False) # False
+
+```
+
+🌕 Tienes una energía ilimitada. Acaba de completar los desafíos del día 3 y está tres pasos por delante en su camino hacia la grandeza. Ahora haz algunos ejercicios para tu cerebro y tus músculos.
+
+## 💻 Ejercicios - Día 3
+
+1. Declara tu edad como variable entera
+2. Declara tu altura como una variable flotante
+3. Declarar una variable que almacene un número complejo
+4. Escriba un script que solicite al usuario que ingrese la base y la altura del triángulo y calcule el área de este triángulo (área = 0,5 x b x h).
+
+```py
+ Enter base: 20
+ Enter height: 10
+ The area of the triangle is 100
+```
+
+5. Escriba un script que solicite al usuario que ingrese el lado a, el lado b y el lado c del triángulo. Calcula el perímetro del triángulo (perímetro = a + b + c).
+
+```py
+Enter side a: 5
+Enter side b: 4
+Enter side c: 3
+The perimeter of the triangle is 12
+```
+
+6. Obtenga la longitud y el ancho de un rectángulo usando el indicador. Calcula su área (área = largo x ancho) y perímetro (perímetro = 2 x (largo + ancho))
+7. Obtenga el radio de un círculo usando el aviso. Calcula el área (área = pi x r x r) y la circunferencia (c = 2 x pi x r) donde pi = 3,14.
+8. Calcular la pendiente, la intersección x y la intersección y de y = 2x -2
+9. La pendiente es (m = y2-y1/x2-x1). Encuentre la pendiente y la [distancia euclidiana](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) entre el punto (2, 2) y el punto (6,10)
+10. Compara las pendientes en las tareas 8 y 9.
+11. Calcula el valor de y (y = x^2 + 6x + 9). Trate de usar diferentes valores de x y descubra en qué valor de x y será 0.
+12. Encuentra la longitud de 'python' y 'dragon' y haz una declaración de comparación falsa.
+13. Use el operador _and_ para verificar si 'on' se encuentra tanto en 'python' como en 'dragon'
+14. _Espero que este curso no esté lleno de jerga_. Use el operador _in_ para verificar si _jerga_ está en la oración.
+15. No hay 'on' ni en dragón ni en pitón
+16. Encuentre la longitud del texto _python_ y convierta el valor en flotante y conviértalo en cadena
+17. Los números pares son divisibles por 2 y el resto es cero. ¿Cómo verifica si un número es par o no usando python?
+18. Verifique si la división de piso de 7 por 3 es igual al valor int convertido de 2.7.
+19. Comprueba si el tipo de '10' es igual al tipo de 10
+20. Comprueba si int('9.8') es igual a 10
+21. Escriba un script que solicite al usuario que ingrese las horas y la tarifa por hora. ¿Calcular el salario de la persona?
+
+```py
+Enter hours: 40
+Enter rate per hour: 28
+Your weekly earning is 1120
+```
+
+22. Escriba un script que le solicite al usuario que ingrese el número de años. Calcula el número de segundos que una persona puede vivir. Suponga que una persona puede vivir cien años.
+
+```py
+Enter number of years you have lived: 100
+You have lived for 3153600000 seconds.
+```
+
+23. Escriba un script de Python que muestre la siguiente tabla
+
+```py
+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
+```
+
+🎉 ¡FELICITACIONES! 🎉
+
+[<< Day 2](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md) | [Day 4 >>](../04_Day_Strings/04_strings.md)
diff --git a/Spanish/03_Day_Operators/day-3.py b/Spanish/03_Day_Operators/day-3.py
new file mode 100644
index 000000000..7764c9a30
--- /dev/null
+++ b/Spanish/03_Day_Operators/day-3.py
@@ -0,0 +1,124 @@
+# Operaciones aritméticas en Python
+# Integers
+
+print('Addition: ', 1 + 2)
+print('Subtraction: ', 2 - 1)
+print('Multiplication: ', 2 * 3)
+print ('Division: ', 4 / 2) # La división en python da un número flotante
+print('Division: ', 6 / 2)
+print('Division: ', 7 / 2)
+print('Division without the remainder: ', 7 // 2) # da sin el número flotante o sin el resto
+print('Modulus: ', 3 % 2) # Da el resto
+print ('Division without the remainder: ', 7 // 3)
+print('Exponential: ', 3 ** 2) # significa 3 * 3
+
+# Números Floating
+print('Floating Number,PI', 3.14)
+print('Floating Number, gravity', 9.81)
+
+# Números Complex
+print('Complex number: ', 1 + 1j)
+print('Multiplying complex number: ',(1 + 1j) * (1-1j))
+
+# Declarar la variable en la parte superior primero
+
+a = 3 # a es un nombre de variable y 3 es un tipo de dato entero
+b = 2 # b es un nombre de variable y 3 es un tipo de dato entero
+
+# Operaciones aritméticas y asignación del resultado a una variable
+total = a + b
+diff = a - b
+product = a * b
+division = a / b
+remainder = a % b
+floor_division = a // b
+exponential = a ** b
+
+# Debería haber usado sum en lugar de total, pero sum es una función integrada. Trate de evitar anular las funciones integradas.
+print(total) # si no etiqueta su impresión con alguna cadena, nunca sabrá de dónde viene el resultado
+print('a + b = ', total)
+print('a - b = ', diff)
+print('a * b = ', product)
+print('a / b = ', division)
+print('a % b = ', remainder)
+print('a // b = ', floor_division)
+print('a ** b = ', exponential)
+
+# Declarar valores y organizarlos juntos
+num_one = 3
+num_two = 4
+
+# Operaciones aritmeticas
+total = num_one + num_two
+diff = num_two - num_one
+product = num_one * num_two
+div = num_two / num_two
+remainder = num_two % num_one
+
+# Imprimiendo valores con etiqueta
+print('total: ', total)
+print('difference: ', diff)
+print('product: ', product)
+print('division: ', div)
+print('remainder: ', remainder)
+
+
+# Cálculo del área de un círculo
+radius = 10 # radio de un circulo
+area_of_circle = 3.14 * radius ** 2 # dos * signo significa exponente o potencia
+print('Area of a circle:', area_of_circle)
+
+# Calcular el área de un rectángulo
+length = 10
+width = 20
+area_of_rectangle = length * width
+print('Area of rectangle:', area_of_rectangle)
+
+# Calcular el peso de un objeto
+mass = 75
+gravity = 9.81
+weight = mass * gravity
+print(weight, 'N')
+
+print(3 > 2) # True, porque 3 es mayor que 2
+print(3 >= 2) # True, porque 3 es mayor que 2
+print(3 < 2) # False, porque 3 es mayor que 2
+print(2 < 3) # True, porque 2 es menor que 3
+print(2 <= 3) # True, porque 2 es menor que 3
+print(3 == 2) # False, porque 3 no es igual a 2
+print(3 != 2) # True, porque 3 no es igual a 2
+print(len('mango') == len('avocado')) # False
+print(len('mango') != len('avocado')) # True
+print(len('mango') < len('avocado')) # True
+print(len('milk') != len('meat')) # False
+print(len('milk') == len('meat')) # True
+print(len('tomato') == len('potato')) # True
+print(len('python') > len('dragon')) # False
+
+# Comparación booleana
+print('True == True: ', True == True)
+print('True == False: ', True == False)
+print('False == False:', False == False)
+print('True and True: ', True and True)
+print('True or False:', True or False)
+
+# Comparación de otra forma
+print('1 is 1', 1 is 1) # True - porque los valores de los datos son los mismos
+print('1 is not 2', 1 is not 2) # True - porque 1 no es 2
+print('A in Asabeneh', 'A' in 'Asabeneh') # True - A encontrado en la cadena
+print('B in Asabeneh', 'B' in 'Asabeneh') # False - no hay b mayúscula
+print('coding' in 'coding for all') # True - porque codificar para todos tiene la palabra codificar
+print('a in an:', 'a' in 'an') # True
+print('4 is 2 ** 2:', 4 is 2 ** 2) # True
+
+print(3 > 2 and 4 > 3) # True - porque ambas afirmaciones son verdaderas
+print(3 > 2 and 4 < 3) # False - porque la segunda afirmación es falsa
+print(3 < 2 and 4 < 3) # False - porque ambas afirmaciones son falsas
+print(3 > 2 or 4 > 3) # True - porque ambas afirmaciones son verdaderas
+print(3 > 2 or 4 < 3) # True - porque uno de los enunciados es verdadero
+print(3 < 2 or 4 < 3) # False - porque ambas afirmaciones son falsas
+print(not 3 > 2) # False - porque 3 > 2 es verdadero, entonces not verdadero da falso
+print(not True) # False - Negación, el operador not devuelve verdadero a falso
+print(not False) # True
+print(not not True) # True
+print(not not False) # False
\ No newline at end of file
diff --git a/Spanish/03_operators_sp.md b/Spanish/03_operators_sp.md
new file mode 100644
index 000000000..588298f73
--- /dev/null
+++ b/Spanish/03_operators_sp.md
@@ -0,0 +1,321 @@
+
+
+[<< Día 2](./02_variables_builtin_functions_sp.md) | [Día 4 >>](./04_strings_sp.md)
+
+
+
+_Lectura aproximada: 12 min_
+- [📘 Día 3](#-día-3)
+ - [Boolean](#boolean)
+ - [Operadores](#operadores)
+ - [Operadores de asignación](#operadores-de-asignación)
+ - [Operadores aritméticos](#operadores-aritméticos)
+ - [Operadores de comparación](#operadores-de-comparación)
+ - [Operadores lógicos](#operadores-lógicos)
+ - [💻 Ejercicios - Día 3](#-ejercicios---día-3)
+
+# 📘 Día 3
+
+## Boolean
+
+El tipo booleano representa uno de dos valores: _True_ o _False_. Cuando comencemos a usar operadores de comparación su uso quedará claro. La primera letra **T** representa True y **F** representa False; a diferencia de JavaScript, en Python las palabras booleanas deben escribirse con la primera letra en mayúscula.
+
+**Ejemplo: valores booleanos**
+
+```py
+print(True)
+print(False)
+```
+
+## Operadores
+
+Python soporta varios tipos de operadores. En esta sección nos centraremos en algunos de ellos.
+
+### Operadores de asignación
+
+Los operadores de asignación se usan para asignar valores a las variables. Tomemos = como ejemplo: en matemáticas el signo igual indica que dos valores son iguales, pero en Python indica que estamos almacenando un valor en una variable; esto se llama asignación. La tabla siguiente muestra los diferentes operadores de asignación en Python (tomada de [w3schools](https://www.w3schools.com/python/python_operators.asp)).
+
+
+
+### Operadores aritméticos:
+
+- Suma (+): a + b
+- Resta (-): a - b
+- Multiplicación (*): a * b
+- División (/): a / b
+- Módulo (%): a % b
+- División entera (//): a // b
+- Exponenciación (**): a ** b
+
+
+
+**Ejemplo: enteros**
+
+```py
+# Operadores aritméticos en Python
+# Enteros
+
+print('Addition: ', 1 + 2) # 3
+print('Subtraction: ', 2 - 1) # 1
+print('Multiplication: ', 2 * 3) # 6
+print ('Division: ', 4 / 2) # 2.0 la división en Python devuelve float
+print('Division: ', 6 / 2) # 3.0
+print('Division: ', 7 / 2) # 3.5
+print('Division without the remainder: ', 7 // 2) # 3, devuelve la parte entera del cociente
+print ('Division without the remainder: ',7 // 3) # 2
+print('Modulus: ', 3 % 2) # 1, devuelve el resto
+print('Exponentiation: ', 2 ** 3) # 8 representa 2 * 2 * 2
+```
+
+**Ejemplo: flotantes**
+
+```py
+# Flotantes
+print('Floating Point Number, PI', 3.14)
+print('Floating Point Number, gravity', 9.81)
+```
+
+**Ejemplo: números complejos**
+
+```py
+# Números complejos
+print('Complex number: ', 1 + 1j)
+print('Multiplying complex numbers: ',(1 + 1j) * (1 - 1j))
+```
+
+Declararemos una variable y le asignaremos un valor numérico. En el ejemplo uso nombres de una sola letra, pero no acostumbres a nombrar variables así; los nombres deben ser siempre fáciles de recordar.
+
+**Ejemplo:**
+
+```python
+# Primero declaramos las variables
+
+a = 3 # a es un nombre de variable, 3 es un valor entero
+b = 2 # b es un nombre de variable, 2 es un valor entero
+
+# Realizamos operaciones aritméticas y asignamos los resultados a variables
+total = a + b
+diff = a - b
+product = a * b
+division = a / b
+remainder = a % b
+floor_division = a // b
+exponential = a ** b
+
+# Deberíamos usar sum en lugar de total, pero sum es una función integrada — evita sobrescribirla
+print(total) # Si no imprimimos etiquetas, no sabremos qué representa cada valor
+print('a + b = ', total)
+print('a - b = ', diff)
+print('a * b = ', product)
+print('a / b = ', division)
+print('a % b = ', remainder)
+print('a // b = ', floor_division)
+print('a ** b = ', exponentiation)
+```
+
+**Ejemplo:**
+
+```py
+print('== Addition, Subtraction, Multiplication, Division, Modulus ==')
+
+# Declaramos las variables
+num_one = 3
+num_two = 4
+
+# Operaciones aritméticas
+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
+
+# Imprimimos con etiquetas
+print('total: ', total)
+print('difference: ', diff)
+print('product: ', product)
+print('division: ', div)
+print('remainder: ', remainder)
+```
+
+Comencemos a usar números con decimales y pongamos en práctica lo aprendido para calcular áreas, volúmenes, densidades, pesos, perímetros, distancias y fuerzas.
+
+**Ejemplo:**
+
+```py
+# Calcular el área de un círculo
+radius = 10 # radio del círculo
+area_of_circle = 3.14 * radius ** 2 # dos * indican exponente o potencia
+print('Area of a circle:', area_of_circle)
+
+# Calcular el área del rectángulo
+length = 10
+width = 20
+area_of_rectangle = length * width
+print('Area of rectangle:', area_of_rectangle)
+
+# Calcular el peso de un objeto
+mass = 75
+gravity = 9.81
+weight = mass * gravity
+print(weight, 'N') # añadimos la unidad para la fuerza
+
+# Calcular la densidad de un líquido
+mass = 75 # unidad: Kg
+volume = 0.075 # unidad: m³
+density = mass / volume # 1000 Kg/m³
+
+```
+
+### Operadores de comparación
+
+En programación usamos operadores de comparación para comparar dos valores. Comprobamos si un valor es mayor, menor o igual a otro. La tabla siguiente muestra los operadores de comparación en Python (tomada de [w3schools](https://www.w3schools.com/python/python_operators.asp)).
+
+
+**Ejemplo: operadores de comparación**
+
+```py
+print(3 > 2) # True, porque 3 es mayor que 2
+print(3 >= 2) # True, porque 3 es mayor o igual que 2
+print(3 < 2) # False, porque 3 no es menor que 2
+print(2 < 3) # True, porque 2 es menor que 3
+print(2 <= 3) # True, porque 2 es menor o igual que 3
+print(3 == 2) # False, porque 3 no es igual a 2
+print(3 != 2) # True, porque 3 no es igual a 2
+print(len('mango') == len('avocado')) # False
+print(len('mango') != len('avocado')) # True
+print(len('mango') < len('avocado')) # True
+print(len('milk') != len('meat')) # False
+print(len('milk') == len('meat')) # True
+print(len('tomato') == len('potato')) # True
+print(len('python') > len('dragon')) # False
+
+
+# Las comparaciones devuelven True o False
+
+print('True == True: ', True == True)
+print('True == False: ', True == False)
+print('False == False:', False == False)
+```
+
+Además de los operadores de comparación anteriores, Python también utiliza:
+
+- _is_: devuelve True si los objetos son idénticos (x is y)
+- _is not_: devuelve True si los objetos no son idénticos (x is not y)
+- _in_: devuelve True si un elemento está en una secuencia (x in y)
+- _not in_: devuelve True si un elemento no está en una secuencia (x not in y)
+
+```py
+print('1 is 1', 1 is 1) # True - porque los objetos son idénticos
+print('1 is not 2', 1 is not 2) # True - porque los objetos no son idénticos
+print('A in Asabeneh', 'A' in 'Asabeneh') # True - la cadena contiene 'A'
+print('B in Asabeneh', 'B' in 'Asabeneh') # False - no hay 'B' mayúscula
+print('coding' in 'coding for all') # True - 'coding' está en 'coding for all'
+print('a in an:', 'a' in 'an') # True
+print('4 is 2 ** 2:', 4 is 2 ** 2) # True
+```
+
+### Operadores lógicos
+
+A diferencia de otros lenguajes de programación, Python usa las palabras clave _and_, _or_ y _not_ como operadores lógicos. Los operadores lógicos se utilizan para combinar expresiones condicionales:
+
+
+
+```py
+print(3 > 2 and 4 > 3) # True - porque ambas expresiones son True
+print(3 > 2 and 4 < 3) # False - porque una de las expresiones es False
+print(3 < 2 and 4 < 3) # False - porque ambas expresiones son False
+print('True and True: ', True and True)
+print(3 > 2 or 4 > 3) # True - porque una o ambas expresiones son True
+print(3 > 2 or 4 < 3) # True - porque una de las expresiones es True
+print(3 < 2 or 4 < 3) # False - porque ambas expresiones son False
+print('True or False:', True or False)
+print(not 3 > 2) # False - 3 > 2 es True, not True es False
+print(not True) # False - not convierte True en False
+print(not False) # True
+print(not not True) # True
+print(not not False) # False
+
+```
+
+🌕 ¡Con energía! Acabas de completar el desafío del Día 3 y has avanzado tres pasos en el camino hacia el dominio. Ahora realiza algunos ejercicios para poner a prueba tu mente y tus habilidades.
+
+
+## 💻 Ejercicios - Día 3
+
+1. Declara una variable entera que represente tu edad
+2. Declara una variable float que represente tu altura
+3. Declara una variable compleja
+4. Escribe un script que pida al usuario la base y la altura de un triángulo y calcule su área (Área = 0,5 x b x h).
+
+```py
+ Entrada base: 20
+ Entrada altura: 10
+ El área del triángulo es 100
+```
+
+5. Escribe un script que pida al usuario los lados a, b y c de un triángulo y calcule su perímetro (Perímetro = a + b + c).
+
+```py
+ Entrada lado a: 5
+ Entrada lado b: 4
+ Entrada lado c: 3
+ El perímetro del triángulo es 12
+```
+6. Pide al usuario la longitud y la anchura de un rectángulo. Calcula su área (Área = largo x ancho) y su perímetro (Perímetro = 2 x (largo + ancho)).
+7. Pide al usuario el radio de un círculo. Calcula su área (Área = pi x r x r) y su circunferencia (Circunferencia = 2 x pi x r), con pi = 3.14.
+8. Calcula la pendiente, la intersección en x y la intersección en y de y = 2x - 2.
+9. La pendiente se calcula como (m = (y2 - y1) / (x2 - x1)). Encuentra la pendiente y la distancia euclídea entre los puntos (2, 2) y (6, 10).
+10. Compara las pendientes obtenidas en los ejercicios 8 y 9.
+11. Calcula el valor de y para y = x^2 + 6x + 9. Prueba con distintos valores de x y encuentra cuándo y es 0.
+12. Encuentra la longitud de 'python' y 'dragon', y realiza una comparación ficticia.
+13. Usa el operador _and_ para comprobar si tanto 'python' como 'dragon' contienen 'on'.
+14. En la oración _I hope this course is not full of jargon_, usa el operador _in_ para comprobar si contiene la palabra _jargon_.
+15. Comprueba que ni 'dragon' ni 'python' contienen 'on'.
+16. Encuentra la longitud de 'python', conviértela a float y luego a string.
+17. Los números pares son divisibles por 2 con resto 0. ¿Cómo comprobar en Python si un número es par o impar?
+18. Comprueba si la división entera de 7 entre 3 es igual al valor entero de 2.7.
+19. Comprueba si el tipo de '10' es igual al tipo de 10.
+20. Comprueba si int('9.8') es igual a 10.
+21. Escribe un script que solicite las horas trabajadas y la tarifa por hora al usuario y calcule el salario.
+
+```py
+Introduce horas trabajadas: 40
+Introduce tarifa por hora: 28
+Tu salario semanal es 1120
+```
+
+
+22. Escribe un script que pida al usuario los años vividos y calcule cuántos segundos ha vivido una persona (supongamos que puede vivir 100 años).
+
+```py
+Introduce cuántos años has vivido: 100
+Has vivido 3153600000 segundos.
+```
+
+23. Escribe un script en Python que muestre la siguiente tabla
+
+
+```py
+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
+```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 2](./02_variables_builtin_functions_sp.md) | [Día 4 >>](./04_strings_sp.md)
diff --git a/Spanish/04_strings_sp.md b/Spanish/04_strings_sp.md
new file mode 100644
index 000000000..2a0c16284
--- /dev/null
+++ b/Spanish/04_strings_sp.md
@@ -0,0 +1,608 @@
+
+
+[<< Día 3](./03_operators_sp.md) | [Día 5 >>](./05_lists_sp.md)
+
+
+
+_Lectura aproximada: 20 min_
+
+- [Día 4](#día-4)
+ - [Cadenas](#cadenas)
+ - [Crear cadenas](#crear-cadenas)
+ - [Concatenación de cadenas](#concatenación-de-cadenas)
+ - [Secuencias de escape en cadenas](#secuencias-de-escape-en-cadenas)
+ - [Formateo de cadenas](#formateo-de-cadenas)
+ - [Formateo clásico (% operador)](#formateo-clásico--operador)
+ - [Formateo moderno (str.format)](#formateo-moderno-strformat)
+ - [Interpolación / f-Strings (Python 3.6+)](#interpolación--f-strings-python-36)
+ - [Las cadenas en Python son secuencias de caracteres](#las-cadenas-en-python-son-secuencias-de-caracteres)
+ - [Desempaquetar caracteres](#desempaquetar-caracteres)
+ - [Obtener caracteres por índice](#obtener-caracteres-por-índice)
+ - [Slicing de cadenas](#slicing-de-cadenas)
+ - [Invertir cadenas](#invertir-cadenas)
+ - [Saltar caracteres al hacer slicing](#saltar-caracteres-al-hacer-slicing)
+ - [Métodos de cadenas](#métodos-de-cadenas)
+ - [💻 Ejercicios - Día 4](#-ejercicios---día-4)
+
+# Día 4
+
+## Cadenas
+
+El texto es un tipo de dato de cadena. Cualquier dato escrito como texto es una cadena. Todo lo que esté entre comillas simples, dobles o triples se considera una cadena. Existen muchos métodos y funciones integradas para trabajar con cadenas. Use la función `len()` para obtener la longitud de una cadena.
+
+### Crear cadenas
+
+```py
+letter = 'P' # Una cadena puede ser un carácter o un texto
+print(letter) # P
+print(len(letter)) # 1
+greeting = 'Hello, World!' # Las cadenas se crean con comillas simples o dobles, "Hello, World!"
+print(greeting) # Hello, World!
+print(len(greeting)) # 13
+sentence = "I hope you are enjoying 30 days of Python Challenge"
+print(sentence)
+```
+
+Las cadenas multilínea se crean utilizando tres comillas simples (`'''`) o tres comillas dobles (`"""`). A continuación un ejemplo:
+
+```py
+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)
+
+# Otra forma
+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)
+```
+
+### Concatenación de cadenas
+
+Podemos concatenar cadenas. La unión de cadenas se llama concatenación. Vea el siguiente ejemplo:
+
+```py
+
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+space = ' '
+full_name = first_name + space + last_name
+print(full_name) # Asabeneh Yetayeh
+# Uso de `len()` para obtener la longitud de una cadena
+print(len(first_name)) # 8
+print(len(last_name)) # 7
+print(len(first_name) > len(last_name)) # True
+print(len(full_name)) # 16
+```
+
+### Secuencias de escape en cadenas
+
+En Python y otros lenguajes una barra invertida (`\`) seguida de un carácter forma una secuencia de escape. Algunas secuencias comunes son:
+
+- \n: nueva línea
+- \t: tabulación (4 espacios)
+- \\\\: barra invertida
+- \' : comilla simple
+- \" : comilla doble
+
+Ahora veamos ejemplos del uso de estas secuencias.
+
+```py
+print('I hope everyone is enjoying the Python Challenge.\nAre you ?') # nueva línea
+print('Days\tTopics\tExercises') # añade una tabulación
+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 (\\)') # imprime barra invertida
+print('In every programming language it starts with \"Hello, World!\"') # comillas dobles dentro de comillas simples
+
+# Salida
+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!"
+```
+
+### Formateo de cadenas
+
+#### Formateo clásico (% operador)
+
+En Python existen varias maneras de formatear cadenas. En esta sección veremos algunas de ellas.
+El operador '%' se usa para formatear una tupla de variables dentro de una cadena de formato, usando especificadores como '%s', '%d', '%f' y '%.nf'.
+
+- %s - cadena (o cualquier objeto representable como cadena)
+- %d - entero
+- %f - punto flotante
+- "%.nf" - punto flotante con precisión fija (n decimales)
+
+```py
+# Solo cadenas
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+language = 'Python'
+formated_string = 'I am %s %s. I teach %s' %(first_name, last_name, language)
+print(formated_string)
+
+# Cadenas y números
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+formated_string = 'The area of circle with a radius %d is %.2f.' %(radius, area) # 2 indica 2 decimales
+
+python_libraries = ['Django', 'Flask', 'NumPy', 'Matplotlib','Pandas']
+formated_string = 'The following are python libraries:%s' % (python_libraries)
+print(formated_string) # imprime "The following are python libraries:['Django', 'Flask', 'NumPy', 'Matplotlib','Pandas']"
+```
+
+#### Formateo moderno (str.format)
+
+Este método de formateo se introdujo en Python 3.
+
+```py
+
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+language = 'Python'
+formated_string = 'I am {} {}. I teach {}'.format(first_name, last_name, language)
+print(formated_string)
+a = 4
+b = 3
+
+print('{} + {} = {}'.format(a, b, a + b))
+print('{} - {} = {}'.format(a, b, a - b))
+print('{} * {} = {}'.format(a, b, a * b))
+print('{} / {} = {:.2f}'.format(a, b, a / b)) # limitar a dos decimales
+print('{} % {} = {}'.format(a, b, a % b))
+print('{} // {} = {}'.format(a, b, a // b))
+print('{} ** {} = {}'.format(a, b, a ** b))
+
+# Salida
+4 + 3 = 7
+4 - 3 = 1
+4 * 3 = 12
+4 / 3 = 1.33
+4 % 3 = 1
+4 // 3 = 1
+4 ** 3 = 64
+
+# Cadenas y números
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+formated_string = 'The area of a circle with a radius {} is {:.2f}.'.format(radius, area) # mantener dos decimales
+print(formated_string)
+
+```
+
+#### Interpolación / f-Strings (Python 3.6+)
+
+Otra forma moderna de formatear cadenas es la interpolación con f-strings. Las cadenas empiezan con `f` y se insertan expresiones entre llaves.
+
+```py
+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}')
+```
+
+### Las cadenas en Python son secuencias de caracteres
+
+Las cadenas en Python son secuencias de caracteres y comparten los mismos métodos de acceso que otras secuencias como listas y tuplas. La forma más sencilla de extraer caracteres individuales (o elementos de cualquier secuencia) es desempaquetarlos en variables.
+
+#### Desempaquetar caracteres
+
+```
+language = 'Python'
+a,b,c,d,e,f = language # desempaquetar caracteres y asignarlos a variables
+print(a) # P
+print(b) # y
+print(c) # t
+print(d) # h
+print(e) # o
+print(f) # n
+```
+
+#### Obtener caracteres por índice
+
+En programación la indexación comienza en cero. Por tanto, la primera letra está en el índice 0 y la última en la longitud de la cadena menos uno.
+
+
+
+```py
+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
+```
+
+Si queremos contar desde la derecha usamos índices negativos; -1 es el último índice.
+
+```py
+language = 'Python'
+last_letter = language[-1]
+print(last_letter) # n
+second_last = language[-2]
+print(second_last) # o
+```
+
+#### Slicing de cadenas
+
+En Python podemos obtener subcadenas mediante slicing.
+
+```py
+language = 'Python'
+first_three = language[0:3] # empieza en índice 0, hasta 3 pero sin incluir 3
+print(first_three) #Pyt
+last_three = language[3:6]
+print(last_three) # hon
+# Otra forma
+last_three = language[-3:]
+print(last_three) # hon
+last_three = language[3:]
+print(last_three) # hon
+```
+
+#### Invertir cadenas
+
+Podemos invertir fácilmente una cadena.
+
+```py
+greeting = 'Hello, World!'
+print(greeting[::-1]) # !dlroW ,olleH
+```
+
+#### Saltar caracteres al hacer slicing
+
+Al pasar un parámetro de paso en slicing podemos omitir caracteres al extraer subcadenas.
+
+
+```py
+language = 'Python'
+pto = language[0:6:2] #
+print(pto) # Pto
+```
+
+### Métodos de cadenas
+
+Hay muchos métodos para manipular y formatear cadenas. A continuación vemos algunos ejemplos:
+
+- capitalize(): convierte el primer carácter de la cadena a mayúscula
+
+```py
+challenge = 'thirty days of python'
+print(challenge.capitalize()) # 'Thirty days of python' (primera letra en mayúscula)
+```
+
+- count(): devuelve el número de ocurrencias de una subcadena: `count(subcadena, start=.., end=..)`. `start` y `end` definen el rango de conteo.
+
+```py
+challenge = 'thirty days of python'
+print(challenge.count('y')) # 3
+print(challenge.count('y', 7, 14)) # 1, cuenta entre índices 7 y 14
+print(challenge.count('th')) # 2
+```
+
+- endswith(): determina si la cadena termina con la subcadena dada; devuelve `True` o `False`
+
+```py
+challenge = 'thirty days of python'
+print(challenge.endswith('on')) # True
+print(challenge.endswith('tion')) # False (no termina con 'tion')
+```
+
+- expandtabs(): reemplaza tabulaciones por espacios; el tamaño por defecto es 8, acepta parámetro de tamaño.
+
+```py
+challenge = 'thirty\tdays\tof\tpython'
+print(challenge.expandtabs()) # 'thirty days of python'
+print(challenge.expandtabs(10)) # 'thirty days of python' (tabulaciones expandidas a 10 espacios)
+```
+
+- find(): devuelve el índice de la primera aparición de una subcadena; si no se encuentra devuelve -1
+
+```py
+challenge = 'thirty days of python'
+print(challenge.find('y')) # 5
+print(challenge.find('th')) # 0
+```
+
+- rfind(): devuelve el índice de la última aparición de una subcadena; si no se encuentra devuelve -1
+
+```py
+challenge = 'thirty days of python'
+print(challenge.rfind('y')) # 16
+print(challenge.rfind('th')) # 17
+```
+
+- format(): formatea una cadena para una salida más legible
+Para más información sobre el formateo de cadenas consulte este [enlace](https://www.programiz.com/python-programming/methods/string/format)
+
+```py
+first_name = 'Asabeneh'
+last_name = 'Yetayeh'
+age = 250
+job = 'teacher'
+country = 'Finland'
+sentence = 'I am {} {}. I am a {}. I am {} years old. I live in {}.'.format(first_name, last_name, age, job, country)
+print(sentence) # I am Asabeneh Yetayeh. I am 250 years old. I am a teacher. I live in Finland.
+
+radius = 10
+pi = 3.14
+area = pi * radius ** 2
+result = 'The area of a circle with radius {} is {}'.format(str(radius), str(area))
+print(result) # The area of a circle with radius 10 is 314
+```
+
+- index(): devuelve el índice de la primera aparición de una subcadena; acepta parámetros de inicio y fin (por defecto 0 y longitud de la cadena). Si la subcadena no se encuentra, lanza `ValueError`.
+
+```py
+challenge = 'thirty days of python'
+sub_string = 'da'
+print(challenge.index(sub_string)) # 7
+print(challenge.index(sub_string, 9)) # error
+```
+
+- rindex(): devuelve el índice de la última aparición de una subcadena; acepta parámetros de inicio y fin (por defecto 0 y longitud de la cadena).
+
+```py
+challenge = 'thirty days of python'
+sub_string = 'da'
+print(challenge.rindex(sub_string)) # 8
+print(challenge.rindex(sub_string, 9)) # error
+```
+
+- isalnum(): determina si todos los caracteres de la cadena son alfanuméricos
+
+```py
+challenge = 'ThirtyDaysPython'
+print(challenge.isalnum()) # True
+
+challenge = '30DaysPython'
+print(challenge.isalnum()) # True
+
+challenge = 'thirty days of python'
+print(challenge.isalnum()) # False, el espacio no es un carácter alfanumérico
+
+challenge = 'thirty days of python 2019'
+print(challenge.isalnum()) # False
+```
+
+- isalpha(): determina si todos los caracteres de la cadena son letras (a-z y A-Z)
+
+```py
+challenge = 'thirty days of python'
+print(challenge.isalpha()) # False, el espacio no es una letra
+challenge = 'ThirtyDaysPython'
+print(challenge.isalpha()) # True
+num = '123'
+print(num.isalpha()) # False
+```
+
+- isdecimal(): determina si todos los caracteres son decimales (0-9)
+
+```py
+challenge = 'thirty days of python'
+print(challenge.isdecimal()) # False
+challenge = '123'
+print(challenge.isdecimal()) # True
+challenge = '\u00B2'
+print(challenge.isdigit()) # False
+challenge = '12 3'
+print(challenge.isdecimal()) # False, contiene espacios
+```
+
+- isdigit(): determina si todos los caracteres son dígitos (0-9 y otros caracteres numéricos Unicode)
+
+```py
+challenge = 'Thirty'
+print(challenge.isdigit()) # False
+challenge = '30'
+print(challenge.isdigit()) # True
+challenge = '\u00B2'
+print(challenge.isdigit()) # True (caracteres numéricos Unicode)
+```
+
+- isnumeric(): determina si todos los caracteres son numéricos o están relacionados con números (similar a `isdigit()` pero acepta más símbolos, p. ej. ½)
+
+```py
+num = '10'
+print(num.isnumeric()) # True
+num = '\u00BD' # ½
+print(num.isnumeric()) # True
+num = '10.5'
+print(num.isnumeric()) # False
+```
+
+- isidentifier(): comprueba si la cadena es un identificador válido (nombre de variable válido)
+
+```py
+challenge = '30DaysOfPython'
+print(challenge.isidentifier()) # False, porque empieza por un número
+challenge = 'thirty_days_of_python'
+print(challenge.isidentifier()) # True
+```
+
+- islower(): determina si todas las letras de la cadena están en minúsculas
+
+```py
+challenge = 'thirty days of python'
+print(challenge.islower()) # True
+challenge = 'Thirty days of python'
+print(challenge.islower()) # False
+```
+
+- isupper(): determina si todas las letras de la cadena están en mayúsculas
+
+```py
+challenge = 'thirty days of python'
+print(challenge.isupper()) # False
+challenge = 'THIRTY DAYS OF PYTHON'
+print(challenge.isupper()) # True
+```
+
+- join(): devuelve la cadena resultante tras unir los elementos
+
+```py
+web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
+result = ' '.join(web_tech)
+print(result) # 'HTML CSS JavaScript React' (devuelve la cadena unida)
+```
+
+```py
+web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
+result = '# '.join(web_tech)
+print(result) # 'HTML# CSS# JavaScript# React'
+```
+
+- strip(): elimina los caracteres dados del inicio y del final de la cadena
+
+```py
+challenge = 'thirty days of python'
+print(challenge.strip('noth')) # 'irty days of py' (elimina los caracteres dados del inicio y final)
+```
+
+- replace(): reemplaza una subcadena por otra dada
+
+```py
+challenge = 'thirty days of python'
+print(challenge.replace('python', 'coding')) # 'thirty days of coding'
+```
+
+- split(): divide una cadena usando un separador dado o espacios
+
+```py
+challenge = 'thirty days of python'
+print(challenge.split()) # ['thirty', 'days', 'of', 'python']
+challenge = 'thirty, days, of, python'
+print(challenge.split(', ')) # ['thirty', 'days', 'of', 'python']
+```
+
+- title(): devuelve la cadena en formato título (Title Case)
+
+```py
+challenge = 'thirty days of python'
+print(challenge.title()) # Thirty Days Of Python
+```
+
+- swapcase(): convierte mayúsculas a minúsculas y minúsculas a mayúsculas
+
+```py
+challenge = 'thirty days of python'
+print(challenge.swapcase()) # THIRTY DAYS OF PYTHON
+challenge = 'Thirty Days Of Python'
+print(challenge.swapcase()) # tHIRTY dAYS oF pYTHON
+```
+
+- startswith(): determina si la cadena comienza con la subcadena especificada
+
+```py
+challenge = 'thirty days of python'
+print(challenge.startswith('thirty')) # True
+
+challenge = '30 days of python'
+print(challenge.startswith('thirty')) # False (no empieza con 'thirty')
+```
+
+🌕 Eres una persona extraordinaria con un enorme potencial. Acabas de completar el desafío del Día 4; llevas cuatro pasos en tu camino para convertirte en un gran profesional. Ahora realiza algunos ejercicios para entrenar tu mente y tus habilidades.
+
+## 💻 Ejercicios - Día 4
+
+1. Une las cadenas 'Thirty', 'Days', 'Of', 'Python' en 'Thirty Days Of Python'.
+2. Une las cadenas 'Coding', 'For', 'All' en 'Coding For All'.
+3. Declara la variable `company` y asígnale el valor inicial "Coding For All".
+4. Imprime la variable `company` usando `print()`.
+5. Usa `len()` y `print()` para mostrar la longitud de la cadena `company`.
+6. Usa el método `upper()` para convertir todos los caracteres a mayúsculas.
+7. Usa el método `lower()` para convertir todos los caracteres a minúsculas.
+8. Aplica `capitalize()`, `title()` y `swapcase()` sobre la cadena 'Coding For All'.
+9. Extrae mediante slicing la primera palabra de 'Coding For All'.
+10. Usa `index`, `find` u otros métodos para comprobar si la cadena 'Coding For All' contiene la palabra 'Coding'.
+11. Reemplaza la palabra 'Coding' por 'Python' en 'Coding For All'.
+12. Reemplaza 'Python for Everyone' por 'Python for All' (usa `replace()` u otro método).
+13. Separa la cadena 'Coding For All' usando espacios como separador.
+14. Divide la cadena 'Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon' por las comas.
+15. ¿Qué carácter está en el índice 0 de 'Coding For All'?
+16. ¿Cuál es el índice del último carácter de 'Coding For All'?
+17. ¿Qué carácter está en el índice 10 de 'Coding For All'?
+18. Crea una sigla (acrónimo) a partir de 'Python For Everyone'.
+19. Crea una sigla a partir de 'Coding For All'.
+20. Usando `index`, determina la primera aparición de la letra 'C' en 'Coding For All'.
+21. Usando `index`, determina la primera aparición de la letra 'F' en 'Coding For All'.
+22. Usa `rfind` para determinar la última aparición de 'l' en 'Coding For All People'.
+23. Usa `index` o `find` para encontrar la primera aparición de la palabra 'because' en: 'You cannot end a sentence with because because because is a conjunction'
+24. Usa `rindex` para encontrar la última aparición de la palabra 'because' en: 'You cannot end a sentence with because because because is a conjunction'.
+25. Elimina la frase 'because because because' de: 'You cannot end a sentence with because because because is a conjunction'.
+26. Encuentra la primera aparición de la palabra 'because' en: 'You cannot end a sentence with because because because is a conjunction'.
+27. Elimina la frase 'because because because' de la oración anterior.
+28. ¿La cadena 'Coding For All' empieza con la subcadena 'Coding'?
+29. ¿La cadena 'Coding For All' termina con la subcadena 'coding'?
+30. Elimina los espacios en blanco a la izquierda y derecha de la cadena ' Coding For All '.
+31. Usando `isidentifier()`, ¿cuál de las siguientes devuelve `True`?
+ - 30DaysOfPython
+ - thirty_days_of_python
+32. Dada la lista ['Django', 'Flask', 'Bottle', 'Pyramid', 'Falcon'], únela en una cadena separada por espacios.
+33. Usa la secuencia de escape de nueva línea para separar las siguientes oraciones:
+ ```py
+ I am enjoying this challenge.
+ I just wonder what is next.
+ ```
+34. Usa la secuencia de tabulación para mostrar:
+ ```py
+ Name Age Country City
+ Asabeneh 250 Finland Helsinki
+ ```
+35. Usa un método de formateo de cadenas para imprimir:
+
+```py
+radius = 10
+area = 3.14 * radius ** 2
+# The area of a circle with radius 10 is 314 meters square.
+```
+
+36. Usa un método de formateo de cadenas para imprimir:
+
+```py
+8 + 6 = 14
+8 - 6 = 2
+8 * 6 = 48
+8 / 6 = 1.33
+8 % 6 = 2
+8 // 6 = 1
+8 ** 6 = 262144
+```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 3](./03_operators_sp.md) | [Día 5 >>](./05_lists_sp.md)
+
+
diff --git a/Spanish/05_lists_sp.md b/Spanish/05_lists_sp.md
new file mode 100644
index 000000000..5a9237f9e
--- /dev/null
+++ b/Spanish/05_lists_sp.md
@@ -0,0 +1,596 @@
+
+
+[<< Día 4](./04_strings_sp.md) | [Día 6 >>](./06_tuples_sp.md)
+
+
+
+- [Día 5](#día-5)
+ - [Listas](#listas)
+ - [Cómo crear listas](#cómo-crear-listas)
+ - [Acceder por índice positivo](#acceder-por-índice-positivo)
+ - [Acceder por índice negativo](#acceder-por-índice-negativo)
+ - [Desempaquetado de listas](#desempaquetado-de-listas)
+ - [Slicing de listas](#slicing-de-listas)
+ - [Modificar listas](#modificar-listas)
+ - [Buscar elementos](#buscar-elementos)
+ - [Agregar elementos](#agregar-elementos)
+ - [Insertar elementos](#insertar-elementos)
+ - [Eliminar elementos](#eliminar-elementos)
+ - [Eliminar con pop()](#eliminar-con-pop)
+ - [Eliminar con del](#eliminar-con-del)
+ - [Vaciar la lista](#vaciar-la-lista)
+ - [Copiar listas](#copiar-listas)
+ - [Unir listas](#unir-listas)
+ - [Contar elementos](#contar-elementos)
+ - [Encontrar el índice de un elemento](#encontrar-el-índice-de-un-elemento)
+ - [Invertir listas](#invertir-listas)
+ - [Ordenar listas](#ordenar-listas)
+ - [💻 Ejercicios - Día 5](#-ejercicios---día-5)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+
+# Día 5
+
+## Listas
+
+En Python hay cuatro tipos de colecciones:
+
+- List: colección ordenada y mutable. Permite elementos duplicados.
+- Tuple: colección ordenada e inmutable. Permite elementos duplicados.
+- Set: colección no ordenada e indexable; no permite duplicados (aunque se pueden añadir elementos).
+- Dictionary: colección no ordenada, mutable y accesible por clave. No permite claves duplicadas.
+
+
+Una lista es una colección ordenada y mutable que puede contener elementos de diferentes tipos. Una lista puede estar vacía o contener elementos heterogéneos.
+
+### Cómo crear listas
+
+En Python podemos crear listas de dos maneras:
+
+- Usando la función incorporada `list()`
+
+```py
+# Sintaxis
+lst = list()
+```
+
+```py
+empty_list = list() # Esta es una lista vacía
+print(len(empty_list)) # 0
+```
+- Usando corchetes `[]`
+
+```py
+# Sintaxis
+lst = []
+```
+
+```py
+empty_list = [] # Esta es una lista vacía
+print(len(empty_list)) # 0
+```
+
+Listas con valores iniciales. Usamos `len()` para comprobar la longitud.
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon'] # lista de frutas
+vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot'] # lista de verduras
+animal_products = ['milk', 'meat', 'butter', 'yoghurt'] # lista de animal products
+web_techs = ['HTML', 'CSS', 'JS', 'React','Redux', 'Node', 'MongDB'] # lista de web technologies
+countries = ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway']
+
+# Imprimir listas y su longitud
+print('Fruits:', fruits)
+print('Number of fruits:', len(fruits))
+print('Vegetables:', vegetables)
+print('Number of vegetables:', len(vegetables))
+print('Animal products:',animal_products)
+print('Number of animal products:', len(animal_products))
+print('Web technologies:', web_techs)
+print('Number of web technologies:', len(web_techs))
+print('Countries:', countries)
+print('Number of countries:', len(countries))
+```
+
+```sh
+Salida
+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
+```
+
+- Las listas pueden contener elementos de distintos tipos
+
+```py
+ lst = ['Asabeneh', 250, True, {'country':'Finland', 'city':'Helsinki'}] # lista con distintos tipos de datos
+```
+
+
+### Acceder por índice positivo
+
+Usamos índices para acceder a los elementos de una lista. Los índices comienzan en 0. La imagen muestra claramente dónde empiezan los índices.
+
+
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+first_fruit = fruits[0] # estamos usando su índice para acceder al primer elemento
+print(first_fruit) # banana
+second_fruit = fruits[1]
+print(second_fruit) # orange
+last_fruit = fruits[3]
+print(last_fruit) # lemon
+# Last index
+last_index = len(fruits) - 1
+last_fruit = fruits[last_index]
+```
+
+### Acceder por índice negativo
+
+Los índices negativos cuentan desde el final; `-1` es el último elemento, `-2` el penúltimo.
+
+
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+first_fruit = fruits[-4]
+last_fruit = fruits[-1]
+second_last = fruits[-2]
+print(first_fruit) # banana
+print(last_fruit) # lemon
+print(second_last) # mango
+```
+
+### Desempaquetado de listas
+
+```py
+lst = ['item1','item2','item3', 'item4', 'item5']
+first_item, second_item, third_item, *rest = lst
+print(first_item) # item1
+print(second_item) # item2
+print(third_item) # item3
+print(rest) # ['item4', 'item5']
+
+```
+
+```py
+# Ejemplo uno
+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']
+# Ejemplo dos
+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
+# Ejemplo tres
+countries = ['Germany', 'France','Belgium','Sweden','Denmark','Finland','Norway','Iceland','Estonia']
+gr, fr, bg, sw, *scandic, es = countries
+print(gr)
+print(fr)
+print(bg)
+print(sw)
+print(scandic)
+print(es)
+```
+
+### Slicing de listas
+
+- Índices positivos: especificando inicio, fin y paso obtenemos una nueva lista. (inicio por defecto 0, fin por defecto len(lst) - 1, paso por defecto 1)
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+all_fruits = fruits[0:4] # devuelve todos los elementos
+# mismo resultado que arriba
+all_fruits = fruits[0:] # Si no se especifica el índice de fin, devolverá todos los elementos desde el inicio hasta el final
+orange_and_mango = fruits[1:3] # no incluye el índice 3
+orange_mango_lemon = fruits[1:]
+orange_and_lemon = fruits[::2] # usamos el tercer parámetro (paso). Toma cada 2 elementos - ['banana', 'mango']
+```
+
+- Índices negativos: especificando inicio, fin y paso con índices negativos se obtiene una nueva lista.
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+all_fruits = fruits[-4:] # Devuelve todos los elementos
+orange_and_mango = fruits[-3:-1] # No incluye el último elemento, ['orange', 'mango']
+orange_mango_lemon = fruits[-3:] # Devuelve los elementos desde -3 hasta el final, ['orange', 'mango', 'lemon']
+reverse_fruits = fruits[::-1] # un paso negativo invierte la lista, ['lemon', 'mango', 'orange', 'banana']
+```
+
+### Modificar listas
+
+Una lista es una colección ordenada y mutable. A continuación modificamos la lista `fruits`.
+
+
+```py
+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']
+```
+
+### Buscar elementos
+
+Use el operador `in` para comprobar si un elemento es miembro de una lista. Véase el ejemplo.
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+does_exist = 'banana' in fruits
+print(does_exist) # True
+does_exist = 'lime' in fruits
+print(does_exist) # False
+```
+
+### Agregar elementos
+
+Para añadir un elemento al final de una lista usamos el método `append()`.
+
+```py
+# Sintaxis
+lst = list()
+lst.append(item)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits.append('apple')
+print(fruits) # ['banana', 'orange', 'mango', 'lemon', 'apple']
+fruits.append('lime') # ['banana', 'orange', 'mango', 'lemon', 'apple', 'lime']
+print(fruits)
+```
+
+### Insertar elementos
+
+Podemos usar el método *insert()* para insertar un elemento en un índice específico de la lista. Ten en cuenta que los demás elementos se desplazarán a la derecha. El método *insert()* recibe dos parámetros: el índice y el elemento a insertar.
+
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.insert(index, item)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits.insert(2, 'apple') # inserta 'apple' entre 'orange' y 'mango'
+print(fruits) # ['banana', 'orange', 'apple', 'mango', 'lemon']
+fruits.insert(3, 'lime') # ['banana', 'orange', 'apple', 'lime', 'mango', 'lemon']
+print(fruits)
+```
+
+### Eliminar elementos
+
+- Usa el método *remove()* para eliminar un elemento específico de la lista
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.remove(item)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon', 'banana']
+fruits.remove('banana')
+print(fruits) # ['orange', 'mango', 'lemon', 'banana'] - este método elimina la primera aparición del elemento en la lista
+fruits.remove('lemon')
+print(fruits) # ['orange', 'mango', 'banana']
+```
+
+### Eliminar con `pop()`
+
+Usa `pop()` para eliminar el elemento en el índice dado (si no se indica, elimina el último elemento):
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.pop() # Último elemento
+lst.pop(index)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits.pop()
+print(fruits) # ['banana', 'orange', 'mango']
+
+fruits.pop(0)
+print(fruits) # ['orange', 'mango']
+```
+
+### Eliminar con `del`
+
+Usa la palabra clave *del* para eliminar un índice específico, también puede eliminar un rango de índices o eliminar por completo la lista
+
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+del lst[index] # Elimina solo un elemento
+del lst # Elimina la lista completa
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon', 'kiwi', 'lime']
+del fruits[0]
+print(fruits) # ['orange', 'mango', 'lemon', 'kiwi', 'lime']
+del fruits[1]
+print(fruits) # ['orange', 'lemon', 'kiwi', 'lime']
+del fruits[1:3] # elimina elementos en el rango dado; no eliminará el elemento con índice 3!
+print(fruits) # ['orange', 'lime']
+del fruits
+print(fruits) # Esto producirá: NameError: name 'fruits' is not defined
+```
+
+### Vaciar listas
+
+Usa `clear()` para vaciar una lista:
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.clear()
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits.clear()
+print(fruits) # []
+```
+
+### Copiar listas
+
+Puedes copiar una lista reasignándola a una nueva variable: `list2 = list1`. En ese caso `list2` referencia el mismo objeto; los cambios se reflejarán en ambos. Si quieres una copia independiente usa el método `copy()`.
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst_copy = lst.copy()
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits_copy = fruits.copy()
+print(fruits_copy) # ['banana', 'orange', 'mango', 'lemon'] (copia de la lista)
+```
+
+### Unir listas
+
+Hay varias formas de concatenar o unir dos o más listas.
+
+- Suma (+)
+
+```py
+# Sintaxis
+list3 = list1 + list2
+```
+
+```py
+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']
+```
+
+- Usar el método *extend()*
+El método *extend()* puede anexar una lista a otra. Véase el ejemplo a continuación.
+
+```py
+# Sintaxis
+list1 = ['item1', 'item2']
+list2 = ['item3', 'item4', 'item5']
+list1.extend(list2)
+```
+
+```py
+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]
+zero = [0]
+
+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']
+```
+
+### Contar elementos
+
+Usa el método *count()* para devolver el número de veces que aparece un elemento en la lista:
+
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.count(item)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+print(fruits.count('orange')) # 1
+ages = [22, 19, 24, 25, 26, 24, 25, 24]
+print(ages.count(24)) # 3
+```
+
+### Encontrar el índice de un elemento
+
+El método *index()* devuelve el índice de un elemento en la lista:
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.index(item)
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+print(fruits.index('orange')) # 1
+ages = [22, 19, 24, 25, 26, 24, 25, 24]
+print(ages.index(24)) # 2, primera aparición
+```
+
+### Invertir listas
+
+Usa el método *reverse()* para invertir el orden de la lista.
+
+```py
+# Sintaxis
+lst = ['item1', 'item2']
+lst.reverse()
+
+```
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon']
+fruits.reverse()
+print(fruits) # ['lemon', 'mango', 'orange', 'banana']
+ages = [22, 19, 24, 25, 26, 24, 25, 24]
+ages.reverse()
+print(ages) # [24, 25, 24, 26, 25, 24, 19, 22]
+```
+
+### Ordenar listas
+
+Para ordenar una lista podemos usar el método *sort()* o la función incorporada *sorted()*. El método *sort()* reordena la lista en orden ascendente y modifica la lista original. Si el parámetro reverse de *sort()* es True, ordenará la lista en orden descendente.
+
+- sort(): Este método modifica la lista original
+
+ ```py
+ # Sintaxis
+ lst = ['item1', 'item2']
+ lst.sort() # ascending
+ lst.sort(reverse=True) # descending
+ ```
+
+ **Ejemplo:**
+
+ ```py
+ fruits = ['banana', 'orange', 'mango', 'lemon']
+ fruits.sort()
+ print(fruits) # ordenadas alfabéticamente, ['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(): No modifica la lista original; devuelve una nueva lista
+
+ **Ejemplo:**
+
+ ```py
+ 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']
+ ```
+
+
+
+🌕 Muy bien, has avanzado mucho. Acabas de completar el desafío del día 5. Ahora realiza algunos ejercicios para practicar.
+
+## 💻 Ejercicios - Día 5
+
+### Ejercicios: Nivel 1
+
+1. Declara una lista vacía
+2. Declara una lista con más de 5 elementos
+3. Encuentra la longitud de la lista
+4. Obtén el primer, medio y último elemento de la lista
+5. Declara una lista llamada `mixed_data_types` que contenga tu nombre, edad, altura, estado civil y dirección
+6. Declara una lista `it_companies` e inicialízala con: Facebook, Google, Microsoft, Apple, IBM, Oracle y Amazon
+7. Imprime la lista usando `print()`
+8. Imprime el número de empresas en la lista
+9. Imprime la primera, la del medio y la última empresa
+10. Cambia el nombre de una de las empresas y vuelve a imprimir la lista
+11. Agrega una empresa IT a `it_companies`
+12. Inserta una empresa IT en la mitad de la lista
+13. Cambia el nombre de una empresa en `it_companies` a mayúsculas (¡excepto IBM!)
+14. Une `it_companies` en una cadena usando la cadena '#; '
+15. Verifica si una empresa existe en `it_companies`
+16. Ordena la lista usando el método `sort()`
+17. Invierte la lista en orden descendente usando `reverse()`
+18. Corta (slice) las primeras 3 empresas de la lista
+19. Corta (slice) las últimas 3 empresas de la lista
+20. Corta la(s) empresa(s) del medio de la lista
+21. Elimina la primera empresa IT de la lista
+22. Elimina la(s) empresa(s) del medio de la lista
+23. Elimina la última empresa IT de la lista
+24. Elimina todas las empresas IT de la lista
+25. Destruye la lista `it_companies`
+26. Concatena las siguientes listas:
+
+ ```py
+ front_end = ['HTML', 'CSS', 'JS', 'React', 'Redux']
+ back_end = ['Node','Express', 'MongoDB']
+ ```
+27. Inserta 'Python' y 'SQL' después de `full_stack` en la lista concatenada.
+
+### Ejercicios: Nivel 2
+
+1. A continuación, una lista con las edades de 10 estudiantes:
+
+```py
+ages = [19, 22, 19, 24, 20, 25, 26, 24, 25, 24]
+```
+
+- Ordena la lista y encuentra la edad máxima y mínima
+- Agrega la edad mínima y máxima nuevamente a la lista
+- Encuentra la mediana de las edades (un elemento medio o el promedio de dos elementos medios)
+- Encuentra la edad promedio (suma de todos los elementos dividida por su cantidad)
+- Encuentra el rango de edades (máximo - mínimo)
+- Compara |min - promedio| y |max - promedio| usando la función `abs()`
+
+1. Encuentra el país del medio en la [lista de países](https://github.com/Taki-Ta/30-Days-Of-Python-Simplified_Chinese_Version/tree/master/data/countries.py)
+2. Divide la lista de países en dos listas iguales (si es par; si no, la primera lista tendrá un país más)
+3. Para la lista ['China', 'Russia', 'USA', 'Finland', 'Sweden', 'Norway', 'Denmark'], separa los tres primeros países de los países nórdicos restantes.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 4](./04_strings_sp.md) | [Día 6 >>](./06_tuples_sp.md)
diff --git a/Spanish/06_tuples_sp.md b/Spanish/06_tuples_sp.md
new file mode 100644
index 000000000..e381563f0
--- /dev/null
+++ b/Spanish/06_tuples_sp.md
@@ -0,0 +1,258 @@
+
+
+[<< Día 5](./05_lists_sp.md) | [Día 7 >>](./07_sets_sp.md)
+
+
+
+- [Día 6](#día-6)
+ - [Tuplas](#tuplas)
+ - [Cómo crear tuplas](#cómo-crear-tuplas)
+ - [Longitud de la tupla](#longitud-de-la-tupla)
+ - [Obtener elementos de la tupla](#obtener-elementos-de-la-tupla)
+ - [Slicing de tuplas](#slicing-de-tuplas)
+ - [Convertir tupla a lista](#convertir-tupla-a-lista)
+ - [Comprobar si un elemento está en la tupla](#comprobar-si-un-elemento-está-en-la-tupla)
+ - [Unir tuplas](#unir-tuplas)
+ - [Eliminar tupla](#eliminar-tupla)
+ - [💻 Ejercicios - Día 6](#-ejercicios---día-6)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+
+# Día 6
+
+## Tuplas
+
+Una tupla es una colección ordenada e inmutable que puede contener distintos tipos de datos. Una vez creada una tupla, no podemos cambiar sus valores. No podemos usar métodos como add, insert o remove en una tupla porque no es modificable (es inmutable). A diferencia de las listas, las tuplas tienen menos métodos. Los métodos asociados a tuplas son:
+
+- tuple(): crea una tupla vacía
+- count(): cuenta cuántas veces aparece un elemento en la tupla
+- index(): busca el índice de un elemento en la tupla
+- Operador +: concatena dos o más tuplas creando una nueva tupla
+
+### Cómo crear tuplas
+
+- Crear una tupla vacía
+
+ ```py
+ # Sintaxis
+ empty_tuple = ()
+ # o usando el constructor de tuplas
+ empty_tuple = tuple()
+ ```
+
+- Crear una tupla con valores iniciales
+
+ ```py
+ # Sintaxis
+ tpl = ('item1', 'item2','item3')
+ ```
+
+ ```py
+ fruits = ('banana', 'orange', 'mango', 'lemon')
+ ```
+
+
+### Longitud de la tupla
+
+Usamos la función _len()_ para obtener la longitud de una tupla.
+
+```py
+# Sintaxis
+tpl = ('item1', 'item2', 'item3')
+len(tpl)
+```
+
+### Obtener elementos de la tupla
+
+- Índices positivos
+ Al igual que con las listas, usamos índices positivos o negativos para acceder a los elementos de una tupla.
+ 
+
+ ```py
+ # Sintaxis
+ tpl = ('item1', 'item2', 'item3')
+ first_item = tpl[0]
+ second_item = tpl[1]
+ ```
+
+ ```py
+ fruits = ('banana', 'orange', 'mango', 'lemon')
+ first_fruit = fruits[0]
+ second_fruit = fruits[1]
+ last_index =len(fruits) - 1
+ last_fruit = fruits[las_index]
+ ```
+
+- Índices negativos
+ Los índices negativos cuentan desde el final: -1 es el último elemento, -2 el penúltimo, y así sucesivamente.
+ 
+
+ ```py
+ # Sintaxis
+ tpl = ('item1', 'item2', 'item3','item4')
+ first_item = tpl[-4]
+ second_item = tpl[-3]
+ ```
+
+ ```py
+ fruits = ('banana', 'orange', 'mango', 'lemon')
+ first_fruit = fruits[-4]
+ second_fruit = fruits[-3]
+ last_fruit = fruits[-1]
+ ```
+
+### Slicing de tuplas
+
+Podemos extraer subtuplas especificando un rango de índices de inicio y fin; el resultado es una nueva tupla con los elementos seleccionados.
+
+- Rango de índices positivos
+
+ ```py
+ # Sintaxis
+ tpl = ('item1', 'item2', 'item3','item4')
+ all_items = tpl[0:4] # todos los elementos
+ all_items = tpl[0:] # todos los elementos
+ middle_two_items = tpl[1:3] # no incluye el índice 3
+ ```
+
+ ```py
+ fruits = ('banana', 'orange', 'mango', 'lemon')
+ all_fruits = fruits[0:4] # todos los elementos
+ all_fruits= fruits[0:] # todos los elementos
+ orange_mango = fruits[1:3] # no incluye el índice 3
+ orange_to_the_rest = fruits[1:]
+ ```
+
+- Rango de índices negativos
+
+ ```py
+ # Sintaxis
+ tpl = ('item1', 'item2', 'item3','item4')
+ all_items = tpl[-4:] # todos los elementos
+ middle_two_items = tpl[-3:-1] # no incluye el índice 3
+ ```
+
+ ```py
+
+ fruits = ('banana', 'orange', 'mango', 'lemon')
+ all_fruits = fruits[-4:] # todos los elementos
+ orange_mango = fruits[-3:-1] # no incluye el índice 3
+ orange_to_the_rest = fruits[-3:]
+ ```
+
+### Convertir tupla a lista
+
+Podemos convertir una tupla en una lista y viceversa. Si queremos modificar una tupla, conviene convertirla primero en lista.
+
+```py
+# Sintaxis
+tpl = ('item1', 'item2', 'item3','item4')
+lst = list(tpl)
+```
+
+```py
+fruits = ('banana', 'orange', 'mango', 'lemon')
+fruits = list(fruits)
+fruits[0] = 'apple'
+print(fruits) # ['apple', 'orange', 'mango', 'lemon']
+fruits = tuple(fruits)
+print(fruits) # ('apple', 'orange', 'mango', 'lemon')
+```
+
+### Comprobar si un elemento está en la tupla
+
+Podemos usar el operador _in_ para comprobar si un elemento pertenece a la tupla; devuelve un valor booleano.
+
+```py
+# Sintaxis
+tpl = ('item1', 'item2', 'item3','item4')
+'item2' in tpl # True
+```
+
+```py
+fruits = ('banana', 'orange', 'mango', 'lemon')
+print('orange' in fruits) # True
+print('apple' in fruits) # False
+fruits[0] = 'apple' # TypeError: 'tuple' object does not support item assignment
+```
+
+
+
+### Unir tuplas
+
+Podemos concatenar dos o más tuplas usando el operador +.
+
+```py
+# Sintaxis
+tpl1 = ('item1', 'item2', 'item3')
+tpl2 = ('item4', 'item5','item6')
+tpl3 = tpl1 + tpl2
+```
+
+```py
+fruits = ('banana', 'orange', 'mango', 'lemon')
+vegetables = ('Tomato', 'Potato', 'Cabbage','Onion', 'Carrot')
+fruits_and_vegetables = fruits + vegetables
+```
+
+### Eliminar tupla
+
+No se pueden eliminar elementos individuales de una tupla, pero sí se puede eliminar la tupla completa con la palabra clave _del_.
+
+```py
+# Sintaxis
+tpl1 = ('item1', 'item2', 'item3')
+del tpl1
+
+```
+
+```py
+fruits = ('banana', 'orange', 'mango', 'lemon')
+del fruits
+```
+
+
+🌕 Muy bien, lo conseguiste. Acabas de completar el desafío del día 6. Ahora realiza algunos ejercicios para practicar.
+
+## 💻 Ejercicios - Día 6
+
+### Ejercicios: Nivel 1
+
+1. Crea una tupla vacía
+2. Crea una tupla con los nombres de tus hermanos y hermanas (pueden ser ficticios)
+3. Concatena las tuplas de hermanos y asígnalas a `siblings`
+4. ¿Cuántos hermanos tienes?
+5. Modifica la tupla de `siblings` y añade los nombres de tus padres; asígnala a `family_members`
+
+### Ejercicios: Nivel 2
+
+1. Extrae los hermanos y los padres desde `family_members`
+2. Crea las tuplas `fruits`, `vegetables` y `animal_products`. Concatena las tres tuplas y asígnalas a la variable `food_stuff_tp`
+3. Convierte la tupla `food_stuff_tp` en la lista `food_stuff_lt`
+4. Extrae los elementos del medio desde la tupla `food_stuff_tp` o la lista `food_stuff_lt`
+5. Extrae las primeras tres y las últimas tres entradas de la lista `food_stuff_lt`
+6. Elimina completamente la tupla `food_stuff_tp`
+7. Comprueba si existen los elementos:
+- Verifica si 'Estonia' está en la tupla `nordic_countries`
+- Verifica si 'Iceland' está en la tupla `nordic_countries`
+
+ ```py
+ nordic_countries = ('Denmark', 'Finland','Iceland', 'Norway', 'Sweden')
+ ```
+
+
+[<< Día 5](./05_lists_sp.md) | [Día 7 >>](./07_sets_sp.md)
diff --git a/Spanish/07_sets_sp.md b/Spanish/07_sets_sp.md
new file mode 100644
index 000000000..c429e294f
--- /dev/null
+++ b/Spanish/07_sets_sp.md
@@ -0,0 +1,432 @@
+
+
+[<< Día 6](./06_tuples_sp.md) | [Día 8 >>](./08_dictionaries_sp.md)
+
+
+
+- [📘 Día 7](#-día-7)
+ - [Conjuntos](#conjuntos)
+ - [Crear conjuntos](#crear-conjuntos)
+ - [Obtener la longitud del conjunto](#obtener-la-longitud-del-conjunto)
+ - [Acceder a elementos del conjunto](#acceder-a-elementos-del-conjunto)
+ - [Comprobar elementos](#comprobar-elementos)
+ - [Añadir elementos al conjunto](#añadir-elementos-al-conjunto)
+ - [Eliminar elementos del conjunto](#eliminar-elementos-del-conjunto)
+ - [Vaciar el conjunto](#vaciar-el-conjunto)
+ - [Eliminar conjunto](#eliminar-conjunto)
+ - [Convertir lista a conjunto](#convertir-lista-a-conjunto)
+ - [Unir conjuntos](#unir-conjuntos)
+ - [Encontrar intersección](#encontrar-intersección)
+ - [Comprobar subconjuntos y superconjuntos](#comprobar-subconjuntos-y-superconjuntos)
+ - [Comprobar la diferencia entre conjuntos](#comprobar-la-diferencia-entre-conjuntos)
+ - [Encontrar diferencia simétrica](#encontrar-diferencia-simétrica)
+ - [Comprobar conjuntos disjuntos](#comprobar-conjuntos-disjuntos)
+ - [💻 Ejercicios - Día 7](#-ejercicios---día-7)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 7
+
+## Conjuntos
+
+Un conjunto es una colección de elementos. Volvamos a las clases de matemáticas de primaria o secundaria: la definición matemática de conjuntos aplica también en Python. Un conjunto es una colección desordenada y no indexada de elementos distintos. En Python, los conjuntos almacenan elementos únicos y se pueden encontrar la _unión_, la _intersección_, la _diferencia_, la _diferencia simétrica_, los _subconjuntos_, los _superconjuntos_ y los _conjuntos disjuntos_ entre conjuntos.
+
+### Crear conjuntos
+
+Usamos la función incorporada _set()_.
+
+- Crear un conjunto vacío
+
+```py
+# Sintaxis
+st = set()
+```
+
+- Crear un conjunto con elementos iniciales
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+```
+
+**Ejemplo:**
+
+```py
+# Sintaxis
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+```
+
+### Obtener la longitud del conjunto
+
+Usamos la función **len()** para obtener la longitud de un conjunto.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+len(st)
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+len(fruits)
+
+```
+
+### Acceder a elementos del conjunto
+
+Usamos bucles para recorrer los elementos. Veremos esto con más detalle en la sección de bucles.
+
+### Comprobar elementos
+
+Para comprobar si un elemento existe en un conjunto usamos el operador de pertenencia _in_.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+print("Does set st contain item3? ", 'item3' in st) # Does set st contain item3? True
+```
+
+**Ejemplo:**
+
+```py
+
+fruits = {'plátano', 'naranja', 'mango', 'limón'}
+
+print('mango' in fruits ) # True
+
+```
+
+### Añadir elementos al conjunto
+
+Una vez creado el conjunto no podemos cambiar elementos existentes, pero sí podemos añadir nuevos.
+
+- Usar el método _add()_ para agregar un solo elemento
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+st.add('item5')
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+fruits.add('lime')
+```
+
+- Usar el método _update()_ para agregar varios elementos
+ El método _update()_ permite añadir múltiples elementos; recibe un iterable como argumento.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+st.update(['item5','item6','item7'])
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+vegetables = ('tomato', 'potato', 'cabbage','onion', 'carrot')
+fruits.update(vegetables)
+```
+
+### Eliminar elementos del conjunto
+
+Podemos usar el método _remove()_ para eliminar un elemento de un conjunto. Si el elemento no existe, _remove()_ lanzará un error; por eso es útil comprobar antes si existe. El método _discard()_ no lanzará error si el elemento no existe.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+st.remove('item2')
+```
+
+El método _pop()_ elimina y devuelve un elemento aleatorio del conjunto.
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+fruits.pop() # Elimina un elemento aleatorio del conjunto
+```
+
+Si nos interesa el elemento eliminado.
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+removed_item = fruits.pop()
+```
+
+### Vaciar el conjunto
+
+Si queremos vaciar todas las entradas de un conjunto, podemos usar el método _clear()_.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+st.clear()
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+fruits.clear()
+print(fruits) # set()
+```
+
+### Eliminar conjunto
+
+Si queremos eliminar el conjunto por completo, podemos usar el operador _del_.
+
+```py
+# Sintaxis
+st = {'item1', 'item2', 'item3', 'item4'}
+del st
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+del fruits
+```
+
+### Convertir lista a conjunto
+
+Podemos convertir una lista en un conjunto y viceversa. Convertir una lista a conjunto elimina duplicados y conserva solo elementos únicos.
+
+```py
+# Sintaxis
+lst = ['item1', 'item2', 'item3', 'item4', 'item1']
+st = set(lst) # {'item2', 'item4', 'item1', 'item3'} - El orden es aleatorio, ya que los conjuntos son generalmente no ordenados
+```
+
+**Ejemplo:**
+
+```py
+fruits = ['banana', 'orange', 'mango', 'lemon','orange', 'banana']
+fruits = set(fruits) # {'mango', 'lemon', 'banana', 'orange'}
+```
+
+### Unir conjuntos
+
+Podemos usar los métodos _union()_ o _update()_ para combinar dos conjuntos.
+
+- Union
+ Este método devuelve un nuevo conjunto
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item5', 'item6', 'item7', 'item8'}
+st3 = st1.union(st2)
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+vegetables = {'tomato', 'potato', 'cabbage','onion', 'carrot'}
+print(fruits.union(vegetables)) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabbage', 'potato', 'onion'}
+```
+
+- Update
+ Este método inserta los elementos de un conjunto en el conjunto dado
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item5', 'item6', 'item7', 'item8'}
+st1.update(st2) # Los elementos de st2 se añaden a st1
+```
+
+**Ejemplo:**
+
+```py
+fruits = {'banana', 'orange', 'mango', 'lemon'}
+vegetables = {'tomato', 'potato', 'cabbage','onion', 'carrot'}
+fruits.update(vegetables)
+print(fruits) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabbage', 'potato', 'onion'}
+```
+
+### Encontrar intersección
+
+La intersección devuelve un conjunto con los elementos que están presentes en ambos conjuntos. Véase el ejemplo.
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item3', 'item2'}
+st1.intersection(st2) # {'item3', 'item2'}
+```
+
+**Ejemplo:**
+
+```py
+whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+even_numbers = {0, 2, 4, 6, 8, 10}
+whole_numbers.intersection(even_numbers) # {0, 2, 4, 6, 8, 10}
+
+python = {'p', 'y', 't', 'h', 'o', 'n'}
+dragon = {'d', 'r', 'a', 'g', 'o', 'n'}
+python.intersection(dragon) # {'o', 'n'}
+```
+
+### Comprobar subconjuntos y superconjuntos
+
+Un conjunto puede ser subconjunto o superconjunto de otro:
+
+- Subconjunto: _issubset()_
+- Superconjunto: _issuperset()_
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item2', 'item3'}
+st2.issubset(st1) # True
+st1.issuperset(st2) # True
+```
+
+**Ejemplo:**
+
+```py
+whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+even_numbers = {0, 2, 4, 6, 8, 10}
+whole_numbers.issubset(even_numbers) # Falso, porque es un superconjunto
+whole_numbers.issuperset(even_numbers) # Verdadero
+
+python = {'p', 'y', 't', 'h', 'o', 'n'}
+dragon = {'d', 'r', 'a', 'g', 'o', 'n'}
+python.issubset(dragon) # Falso
+```
+
+### Comprobar la diferencia entre conjuntos
+
+Devuelve la diferencia entre dos conjuntos.
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item2', 'item3'}
+st2.difference(st1) # set()
+st1.difference(st2) # {'item1', 'item4'} => st1\st2
+```
+
+**Ejemplo:**
+
+```py
+whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+even_numbers = {0, 2, 4, 6, 8, 10}
+whole_numbers.difference(even_numbers) # {1, 3, 5, 7, 9}
+
+python = {'p', 'y', 't', 'o', 'n'}
+dragon = {'d', 'r', 'a', 'g', 'o', 'n'}
+python.difference(dragon) # {'p', 'y', 't'} - El resultado es desordenado (propiedad de los conjuntos)
+dragon.difference(python) # {'d', 'r', 'a', 'g'}
+```
+
+### Encontrar diferencia simétrica
+
+Devuelve la diferencia simétrica entre dos conjuntos. Es decir, devuelve los elementos que pertenecen a uno de los conjuntos pero no a ambos; matemáticamente: (A\B) ∪ (B\A).
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item2', 'item3'}
+# Significa (A\B) ∪ (B\A)
+st2.symmetric_difference(st1) # {'item1', 'item4'}
+```
+
+**Ejemplo:**
+
+```py
+whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+some_numbers = {1, 2, 3, 4, 5}
+whole_numbers.symmetric_difference(some_numbers) # {0, 6, 7, 8, 9, 10}
+
+python = {'p', 'y', 't', 'h', 'o', 'n'}
+dragon = {'d', 'r', 'a', 'g', 'o', 'n'}
+python.symmetric_difference(dragon) # {'r', 't', 'p', 'y', 'g', 'a', 'd', 'h'}
+```
+
+### Comprobar conjuntos disjuntos
+
+Si dos conjuntos no comparten elementos se dicen disjuntos. Podemos usar el método _isdisjoint()_ para comprobar si dos conjuntos son disjuntos.
+
+```py
+# Sintaxis
+st1 = {'item1', 'item2', 'item3', 'item4'}
+st2 = {'item2', 'item3'}
+st2.isdisjoint(st1) # Falso
+```
+
+**Ejemplo:**
+
+```py
+even_numbers = {0, 2, 4, 6, 8}
+odd_numbers = {1, 3, 5, 7, 9}
+even_numbers.isdisjoint(odd_numbers) # Verdadero, porque no comparten elementos
+
+python = {'p', 'y', 't', 'h', 'o', 'n'}
+dragon = {'d', 'r', 'a', 'g', 'o', 'n'}
+python.isdisjoint(dragon) # Falso, comparten {'o', 'n'}
+```
+
+🌕 Eres una estrella en ascenso. Acabas de completar el desafío del día 7. Ahora realiza algunos ejercicios para practicar.
+
+## 💻 Ejercicios - Día 7
+
+```py
+# Conjuntos
+it_companies = {'Facebook', 'Google', 'Microsoft', 'Apple', 'IBM', 'Oracle', 'Amazon'}
+A = {19, 22, 24, 20, 25, 26}
+B = {19, 22, 20, 25, 26, 24, 28, 27}
+age = [22, 19, 24, 25, 26, 24, 25, 24]
+```
+
+### Ejercicios: Nivel 1
+
+1. Encuentra la longitud del conjunto `it_companies`
+2. Agrega 'Twitter' a `it_companies`
+3. Inserta varias empresas IT a `it_companies` de una sola vez
+4. Elimina una empresa de `it_companies`
+5. ¿Cuál es la diferencia entre `remove()` y `discard()`?
+
+### Ejercicios: Nivel 2
+
+1. Concatena A y B
+2. Encuentra la intersección entre A y B
+3. ¿Es A un subconjunto de B?
+4. ¿Son A y B conjuntos disjuntos?
+5. Combina A con B y viceversa
+6. ¿Cuál es la diferencia simétrica entre A y B?
+7. Elimina un conjunto por completo
+
+### Ejercicios: Nivel 3
+
+1. Convierte la lista de edades a un conjunto y compara la longitud de la lista y la del conjunto: ¿cuál es mayor?
+2. Explica la diferencia entre estos tipos de datos: cadena, lista, tupla y conjunto
+3. Para la frase _"Soy profesor, me gusta motivar y enseñar a las personas."_ ¿cuántas palabras únicas tiene? Usa `split()` y conjuntos para obtener las palabras únicas.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 6](./06_tuples_sp.md) | [Día 8 >>](./08_dictionaries_sp.md)
diff --git a/Spanish/08_dictionaries_sp.md b/Spanish/08_dictionaries_sp.md
new file mode 100644
index 000000000..30c9f5add
--- /dev/null
+++ b/Spanish/08_dictionaries_sp.md
@@ -0,0 +1,343 @@
+
+
+[<< Día 8](./08_dictionaries_sp.md) | [Día 10 >>](./10_loops_sp.md)
+
+
+
+- [📘 Día 9](#-día-9)
+ - [Sentencias condicionales](#sentencias-condicionales)
+ - [Condición If](#condición-if)
+ - [If Else](#if-else)
+ - [If Elif Else](#if-elif-else)
+ - [Abreviación](#abreviación)
+ - [Condicionales anidados](#condicionales-anidados)
+ - [If y operadores lógicos](#if-y-operadores-lógicos)
+ - [If y operador lógico Or](#if-y-operador-lógico-or)
+ - [💻 Ejercicios - Día 9](#-ejercicios---día-9)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+
+# 📘 Día 9
+
+## Sentencias condicionales
+
+Por defecto, las sentencias en un script de Python se ejecutan secuencialmente de arriba hacia abajo. Si la lógica lo requiere, podemos cambiar el orden de dos maneras:
+
+- Ejecución condicional: si una expresión es verdadera, se ejecutan uno o más bloques de código
+- Ejecución repetitiva: mientras una expresión sea verdadera, se repiten uno o más bloques de código. En esta sección discutiremos las sentencias *if*, *else* y *elif*. Los operadores de comparación y lógicos vistos antes serán útiles aquí.
+
+### Condición If
+
+En Python y otros lenguajes, la palabra clave *if* se usa para comprobar si una condición es verdadera y ejecutar un bloque de código. Recuerda la indentación después de los dos puntos.
+
+```py
+# Sintaxis
+if condition:
+ # Si la condición es verdadera, ejecutar este bloque de código
+```
+
+**Ejemplo 1**
+
+```py
+a = 3
+if a > 0:
+ print('A es un número positivo')
+# A es un número positivo
+```
+
+Como se muestra arriba, 3 es mayor que 0. La condición es verdadera y se ejecuta el bloque de código. Si la condición fuera falsa, no veríamos resultado; para manejar condiciones falsas usamos el bloque *else*.
+
+### If Else
+
+Si la condición es verdadera se ejecuta el primer bloque, de lo contrario se ejecuta el bloque *else*.
+
+```py
+# Sintaxis
+if condition:
+ # Si la condición es verdadera, ejecutar este bloque
+else:
+ # Si la condición es falsa, ejecutar este bloque
+```
+
+**Ejemplo:**
+
+```py
+a = 3
+if a < 0:
+ print('A es un número negativo')
+else:
+ print('A es un número positivo')
+```
+
+La condición anterior es falsa, por eso se ejecuta el bloque *else*. ¿Y si tenemos más de dos condiciones? Podemos usar *elif*.
+
+### If Elif Else
+
+En la vida tomamos decisiones cada día que implican más de una condición. En programación, cuando tenemos múltiples condiciones, usamos *elif*.
+
+```py
+# Sintaxis
+if condition:
+ # código
+elif condition:
+ # código
+else:
+ # código
+```
+
+**Ejemplo:**
+
+```py
+a = 0
+if a > 0:
+ print('A es un número positivo')
+elif a < 0:
+ print('A es un número negativo')
+else:
+ print('A es cero')
+```
+
+### Abreviación
+
+```py
+# Sintaxis
+ if condición else
+```
+
+**Ejemplo:**
+
+```py
+a = 3
+print('A es positivo') if a > 0 else print('A es negativo') # Se cumple la primera condición, imprimirá 'A es positivo'
+```
+
+### Condicionales anidados
+
+Los condicionales pueden anidarse.
+
+```py
+# Sintaxis
+if condición:
+ # código
+ if condición:
+ # código
+```
+
+**Ejemplo:**
+
+```py
+a = 0
+if a > 0:
+ if a % 2 == 0:
+ print('A es un número positivo y par')
+ else:
+ print('A es un número positivo')
+elif a == 0:
+ print('A es cero')
+else:
+ print('A es un número negativo')
+```
+
+Podemos usar el operador lógico *and* para evitar escribir condicionales anidados.
+
+### If y operadores lógicos
+
+```py
+# Sintaxis
+if condición and condición:
+ # código
+```
+
+**Ejemplo:**
+
+```py
+a = 0
+if a > 0 and a % 2 == 0:
+ print('A es un número positivo y par')
+elif a > 0 and a % 2 != 0:
+ print('A es un número positivo')
+elif a == 0:
+ print('A es cero')
+else:
+ print('A es un número negativo')
+```
+
+### If y operador lógico Or
+
+```py
+# Sintaxis
+if condición or condición:
+ # código
+```
+
+**Ejemplo:**
+
+```py
+user = 'James'
+access_level = 3
+if user == 'admin' or access_level >= 4:
+ print('Acceso concedido!')
+else:
+ print('Acceso denegado!')
+```
+
+🌕 Lo estás haciendo muy bien. Nunca te rindas; las cosas grandiosas requieren tiempo. Acabas de completar el desafío del Día 9; estás a 9 pasos en tu camino hacia lo grande. Haz ahora algunos ejercicios para entrenar tu mente y tu cuerpo.
+
+## 💻 Ejercicios - Día 9
+
+### Ejercicios: Nivel 1
+
+1. Usa input para obtener la edad del usuario (por ejemplo: "Introduce tu edad:"). Si el usuario tiene 18 años o más, muestra: 'Ya tienes la edad suficiente para aprender a conducir.' Si es menor, muestra cuántos años le faltan. Ejemplo de salida:
+
+ ```sh
+ Introduce tu edad: 30
+ Ya tienes la edad suficiente para aprender a conducir.
+ Salida:
+ Introduce tu edad: 15
+ Aún necesitas esperar 3 años para aprender a conducir.
+ ```
+
+2. Usa if…else para comparar my_age y your_age. ¿Quién es mayor (yo o tú)? Usa input("Introduce tu edad:") para obtener la edad. Puedes usar condicionales anidados para imprimir 'año' cuando la diferencia sea 1, 'años' para diferencias mayores, y un mensaje personalizado si my_age = your_age. Salida de ejemplo:
+
+ ```sh
+ Introduce tu edad: 30
+ Tienes 5 años más que yo.
+ ```
+
+3. Pide al usuario dos números con input. Si a > b, imprime 'a es mayor que b'; si a < b, imprime 'a es menor que b'; si son iguales, imprime 'a es igual a b'.
+
+```sh
+Introduce el primer número: 4
+Introduce el segundo número: 3
+4 es mayor que 3
+```
+
+### Ejercicios: Nivel 2
+
+1. Escribe un código que asigne una calificación según la nota del estudiante:
+
+ ```sh
+ 80-100, A
+ 70-79, B
+ 60-69, C
+ 50-59, D
+ 0-49, F
+ ```
+
+2. Comprueba si es otoño, invierno, primavera o verano. Si el usuario introduce:
+ Septiembre, Octubre o Noviembre → otoño.
+ Diciembre, Enero o Febrero → invierno.
+ Marzo, Abril o Mayo → primavera.
+ Junio, Julio u Agosto → verano.
+3. La siguiente lista contiene algunas frutas:
+
+ ```py
+ fruits = ['banana', 'orange', 'mango', 'lemon']
+ ```
+
+ Si una fruta no está en la lista, añádela e imprime la lista modificada. Si ya existe, imprime 'La fruta ya está en la lista'.
+
+### Ejercicios: Nivel 3
+
+1. Aquí hay un diccionario persona. ¡Siéntete libre de modificarlo!
+
+```py
+person = {
+ 'first_name': 'Asabeneh',
+ 'last_name': 'Yetayeh',
+ 'age': 250,
+ 'country': 'Finlandia',
+ 'is_married': True,
+ 'skills': ['JavaScript', 'React', 'Node', 'MongoDB', 'Python'],
+ 'address': {
+ 'street': 'Calle Espacial',
+ 'zipcode': '02210'
+ }
+}
+```
+
+- Comprueba si existe la clave skills en el diccionario; si existe, imprime la habilidad central de la lista skills.
+- Comprueba si existe la clave skills; si existe, verifica si la persona tiene la habilidad 'Python' e imprime el resultado.
+- Si las habilidades son sólo JavaScript y React, imprime 'Es desarrollador frontend'; si incluyen Node, Python y MongoDB, imprime 'Es desarrollador backend'; si incluyen React, Node y MongoDB, imprime 'Es desarrollador full-stack'; en caso contrario, imprime 'Título desconocido' — puedes anidar más condiciones para mayor precisión.
+- Si la persona está casada y vive en Finlandia, imprime la siguiente línea:
+
+```py
+print('Asabeneh Yetayeh vive en Finlandia. Está casado.')
+```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 8](./08_dictionaries_sp.md) | [Día 10 >>](./10_loops_sp.md)
diff --git a/Spanish/10_loops_sp.md b/Spanish/10_loops_sp.md
new file mode 100644
index 000000000..9761fa5eb
--- /dev/null
+++ b/Spanish/10_loops_sp.md
@@ -0,0 +1,451 @@
+
+
+[<< Día 9](./09_conditionals_sp.md) | [Día 11 >>](./11_functions_sp.md)
+
+
+
+
+- [📘 Día 10](#-día-10)
+ - [Bucles](#bucles)
+ - [Bucle while](#bucle-while)
+ - [break y continue - parte 1](#break-y-continue---parte-1)
+ - [Bucle for](#bucle-for)
+ - [break y continue - parte 2](#break-y-continue---parte-2)
+ - [Función range()](#función-range)
+ - [Bucles for anidados](#bucles-for-anidados)
+ - [for y else](#for-y-else)
+ - [Sentencia pass](#sentencia-pass)
+ - [💻 Ejercicios - Día 10](#-ejercicios---día-10)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 10
+
+## Bucles
+
+La vida está llena de ciclos. En programación realizamos muchas tareas repetitivas. Los lenguajes de programación usan bucles para gestionar tareas repetitivas; en Python hay principalmente dos tipos de bucles:
+1. Bucle while
+2. Bucle for
+
+### Bucle while
+
+Usamos la palabra clave `while` para crear un bucle while. Repite un bloque de código mientras la condición se cumpla. Cuando la condición se vuelve falsa, el bucle termina y se ejecuta el código que sigue.
+
+```python
+# Sintaxis
+while condition:
+ # código
+```
+
+**Ejemplo:**
+
+```python
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+# prints from 0 to 4
+```
+
+En el bucle anterior, cuando count llegue a 5 la condición se vuelve falsa y el bucle se detiene.
+
+Si queremos ejecutar un bloque cuando la condición sea falsa, podemos usar la palabra clave `else`.
+
+```python
+ # syntax
+while condition:
+ code goes here
+else:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+else:
+ print(count)
+```
+
+Cuando count sea 5 la condición será falsa, el bucle terminará y se ejecutará el bloque else; por tanto se imprimirá 5.
+
+### break y continue - parte 1
+
+* break: cuando queremos salir del bucle usamos la palabra clave \break`.`
+
+```python
+# syntax
+while condition:
+ code goes here
+ if another_condition:
+ break
+```
+
+**Example:**
+
+```python
+count = 0
+while count < 5:
+ print(count)
+ count = count + 1
+ if count == 3:
+ break
+```
+El while anterior solo imprimirá 0, 1, 2; cuando count llegue a 3 el bucle terminará.
+- Continue: cuando queremos saltarnos la iteración actual y continuar con la siguiente usamos la palabra clave `continue`.
+
+```python
+ # syntax
+while condition:
+ code goes here
+ if another_condition:
+ continue
+```
+
+**Ejemplo:**
+
+```python
+count = 0
+while count < 5:
+ if count == 3:
+ count = count + 1
+ continue
+ print(count)
+ count = count + 1
+```
+
+El while anterior imprimirá 0, 1, 2, 4 (3 se saltó).
+
+### Bucle for
+
+La palabra clave `for` se usa para crear bucles for. Es similar a otros lenguajes, pero con diferencias sintácticas. Se usa para iterar sobre secuencias (listas, tuplas, diccionarios, conjuntos, cadenas, etc.).
+
+- Bucle for para listas
+
+```python
+# syntax
+for iterator in lst:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+numbers = [0, 1, 2, 3, 4, 5]
+for number in numbers: # number es un nombre temporal que referencia el elemento de la lista dentro del bucle
+ print(number) # number se imprimirá línea por línea, de 0 a 5
+```
+
+- Bucle for para cadenas
+
+```python
+# syntax
+for iterator in string:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+language = 'Python'
+for letter in language:
+ print(letter)
+
+for i in range(len(language)):
+ print(language[i])
+```
+
+- Bucle for para tuplas
+
+```python
+# syntax
+for iterator in tpl:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+numbers = (0, 1, 2, 3, 4, 5)
+for number in numbers:
+ print(number)
+```
+
+- Bucle for para diccionarios
+ Al iterar, se recorrerán las claves del diccionario.
+
+```python
+ # syntax
+for iterator in dct:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+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:
+ print(key) # sólo imprime las claves
+
+for key, value in person.items():
+ print(key, value) # así podemos acceder a claves y valores durante la iteración
+```
+
+- Bucle for para conjuntos
+
+```python
+# syntax
+for iterator in st:
+ code goes here
+```
+
+**Ejemplo:**
+
+```python
+it_companies = {'Facebook', 'Google', 'Microsoft', 'Apple', 'IBM', 'Oracle', 'Amazon'}
+for company in it_companies:
+ print(company)
+```
+
+### break y continue - parte 2
+
+Pista:
+_break_: cuando queremos terminar el bucle antes de completarlo usamos `break`.
+
+```python
+# syntax
+for iterator in sequence:
+ code goes here
+ if condition:
+ break
+```
+
+**Ejemplo:**
+
+```python
+numbers = (0,1,2,3,4,5)
+for number in numbers:
+ print(number) # imprime 0, 1, 2, 3
+ if number == 3:
+ break
+```
+En el ejemplo anterior, cuando number sea 3 el bucle terminará.
+
+_continue_: cuando queremos saltarnos la iteración actual y continuar con la siguiente usamos la palabra clave `continue`.
+
+```python
+ # syntax
+for iterator in sequence:
+ code goes here
+ if condition:
+ continue
+```
+
+**Ejemplo:**
+
+```python
+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") # En resumen: para condiciones cortas se puede usar if y else en línea
+print('outside the loop')
+```
+En el ejemplo anterior, cuando number es 3, las instrucciones posteriores dentro del bucle se saltan y si hay más elementos por recorrer, continúa con la siguiente iteración.
+
+### Función range()
+
+La función `range()` genera una secuencia de números. La forma _range(start, end, step)_ acepta tres parámetros: inicio, fin y paso. Por defecto inicio es 0 y el paso es 1. Se necesita al menos un parámetro (el valor de fin).
+
+Usando `range()` para generar secuencias
+
+```python
+lst = list(range(11))
+print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+st = set(range(1, 11)) # start y stop, paso por defecto 1
+print(st) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
+
+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}
+```
+
+```python
+# syntax
+for iterator in range(start, end, step):
+```
+
+**Ejemplo:**
+
+```python
+for number in range(11):
+ print(number) # imprime 0 a 10, no incluye 11.
+```
+
+### Bucles for anidados
+
+Podemos anidar un bucle dentro de otro; a esto se le llama bucle anidado.
+
+```python
+# syntax
+for x in y:
+ for t in x:
+ print(t)
+```
+
+**Ejemplo:**
+
+```python
+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 y else
+
+Si queremos ejecutar un bloque de código al terminar el bucle, podemos usar la palabra clave `else`.
+
+```python
+# syntax
+for iterator in range(start, end, step):
+ do something
+else:
+ print('The loop ended')
+```
+
+**Ejemplo:**
+
+```python
+for number in range(11):
+ print(number) # prints 0 to 10, not including 11
+else:
+ print('The loop stops at', number)
+```
+
+### Sentencia pass
+
+En Python, cuando se requiere una instrucción (por ejemplo después de `:`) pero no queremos ejecutar código, usamos `pass` para evitar errores. También sirve como marcador para rellenar más adelante.
+
+**Ejemplo:**
+
+```python
+for number in range(6):
+ pass
+```
+
+🌕 Has dado un gran paso — ¡bien hecho! Acabas de completar el desafío del Día 10; estás a 10 pasos en tu camino hacia lo grande. Ahora hagamos algunos ejercicios para entrenar la mente y los músculos.
+
+## 💻 Ejercicios - Día 10
+
+### Ejercicios: Nivel 1
+
+1. Implementa iteraciones de 0 a 10 usando while y for.
+2. Implementa iteraciones de 10 a 0 usando while y for.
+3. Escribe un bucle que llame a `print()` 7 veces para producir este triángulo:
+ ```py
+ #
+ ##
+ ###
+ ####
+ #####
+ ######
+ #######
+ ```
+
+4. Usa bucles anidados para producir la siguiente salida:
+
+ ```sh
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ # # # # # # # #
+ ```
+5. Usando un bucle, produce la siguiente salida:
+ ```sh
+ 0 x 0 = 0
+ 1 x 1 = 1
+ 2 x 2 = 4
+ 3 x 3 = 9
+ 4 x 4 = 16
+ 5 x 5 = 25
+ 6 x 6 = 36
+ 7 x 7 = 49
+ 8 x 8 = 64
+ 9 x 9 = 81
+ 10 x 10 = 100
+ ```
+6. Recorre con for la lista `['Python', 'Numpy','Pandas','Django', 'Flask']` e imprime cada elemento.
+7. Recorre con for de 0 a 100 e imprime todos los números pares.
+8. Recorre con for de 0 a 100 e imprime todos los números impares.
+
+### Ejercicios: Nivel 2
+
+1. Usa un for para sumar los números de 0 a 100.
+ ```sh
+ The sum of all numbers is 5050.
+ ```
+2. Usa un for para sumar por separado los impares y los pares de 0 a 100.
+ ```sh
+ The sum of all odd numbers is 2500. And the sum of all even numbers is 2550.
+ ```
+
+### Ejercicios: Nivel 3
+
+1. Ve a la carpeta data y usa el archivo [countries.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries.py). Itera los países y extrae aquellos que contienen la cadena `land`.
+2. Dada la lista `fruits = ['banana', 'orange', 'mango', 'lemon']`, invierte los elementos usando un bucle.
+3. Ve a la carpeta data y usa el archivo [countries-data.py](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries-data.py).
+ 1. ¿Cuántos idiomas distintos hay en los datos?
+ 2. ¿Cuál es el idioma usado por más países?
+ 3. Encuentra los diez países con mayor población.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 9](./09_conditionals_sp.md) | [Día 11 >>](./11_functions_sp.md)
\ No newline at end of file
diff --git a/Spanish/11_functions_sp.md b/Spanish/11_functions_sp.md
new file mode 100644
index 000000000..75a9c716e
--- /dev/null
+++ b/Spanish/11_functions_sp.md
@@ -0,0 +1,458 @@
+
+
+[<< Día 10](./10_loops_sp.md) | [Día 12 >>](./12_modules_sp.md)
+
+
+
+- [📘 Día 11](#-día-11)
+ - [Funciones](#funciones)
+ - [Definir funciones](#definir-funciones)
+ - [Declarar y llamar a una función](#declarar-y-llamar-a-una-función)
+ - [Función sin parámetros](#función-sin-parámetros)
+ - [Funciones que retornan valores - Parte 1](#funciones-que-retornan-valores---parte-1)
+ - [Funciones con parámetros](#funciones-con-parámetros)
+ - [Pasar argumentos por clave y valor](#pasar-argumentos-por-clave-y-valor)
+ - [Funciones que retornan valores - Parte 2](#funciones-que-retornan-valores---parte-2)
+ - [Funciones con parámetros por defecto](#funciones-con-parámetros-por-defecto)
+ - [Número arbitrario de argumentos](#número-arbitrario-de-argumentos)
+ - [Parámetros por defecto y arbitrarios en funciones](#parámetros-por-defecto-y-arbitrarios-en-funciones)
+ - [Función como parámetro de otra función](#función-como-parámetro-de-otra-función)
+ - [💻 Ejercicios: Día 11](#-ejercicios-día-11)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 11
+
+## Funciones
+
+Hasta ahora hemos aprendido muchas funciones integradas de Python. En esta sección nos centraremos en funciones definidas por el usuario. ¿Qué es una función? Antes de crear funciones, entendamos qué es y por qué las necesitamos.
+
+### Definir funciones
+
+Una función es un bloque de código reutilizable o una sentencia de programación que realiza una tarea específica. Para definir o declarar una función, Python provee la palabra clave def. La sintaxis para definir funciones es la siguiente. El código dentro de la función solo se ejecuta cuando la llamamos o la invocamos.
+
+### Declarar y llamar a una función
+
+Cuando creamos una función, decimos que la declaramos. Cuando la usamos, decimos que la llamamos o invocamos. Las funciones pueden tener parámetros o no.
+
+```py
+# Sintaxis
+# Declarar una función
+def function_name():
+ codes
+ codes
+# Llamar a una función
+function_name()
+```
+
+### Función sin parámetros
+
+Una función puede declararse sin parámetros.
+
+**Ejemplo:**
+
+```py
+def generate_full_name ():
+ first_name = 'Asabeneh'
+ last_name = 'Yetayeh'
+ space = ' '
+ full_name = first_name + space + last_name
+ print(full_name)
+generate_full_name () # Llamar a una función
+
+def add_two_numbers ():
+ num_one = 2
+ num_two = 3
+ total = num_one + num_two
+ print(total)
+add_two_numbers()
+```
+
+### Funciones que retornan valores - Parte 1
+
+Una función también puede devolver un valor; si una función no tiene return, devuelve None. Reescribamos las funciones anteriores usando return. A partir de ahora, cuando llamemos a la función y la imprimamos, obtendremos un valor.
+
+```py
+def generate_full_name ():
+ first_name = 'Asabeneh'
+ last_name = 'Yetayeh'
+ space = ' '
+ full_name = first_name + space + last_name
+ return full_name
+print(generate_full_name())
+
+def add_two_numbers ():
+ num_one = 2
+ num_two = 3
+ total = num_one + num_two
+ return total
+print(add_two_numbers())
+```
+
+### Funciones con parámetros
+
+En una función podemos pasar diferentes tipos de datos (números, cadenas, booleanos, listas, tuplas, diccionarios o sets) como parámetros.
+
+- Parámetro único: si una función necesita un parámetro, la llamamos con un argumento.
+
+```py
+ # Sintaxis
+ # Declarar una función
+ def function_name(parameter):
+ codes
+ codes
+ # Llamar a la función
+ print(function_name(argument))
+```
+
+**Ejemplo:**
+
+```py
+def greetings (name):
+ message = name + ', welcome to Python for Everyone!'
+ return message
+
+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 area_of_circle (r):
+ PI = 3.14
+ area = PI * r ** 2
+ return area
+print(area_of_circle(10))
+
+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
+```
+
+- Dos parámetros: una función puede no tener parámetros o tener uno o varios. Si necesita dos parámetros, la llamamos con dos argumentos.
+
+```py
+ # Sintaxis
+ # Declarar una función
+ def function_name(para1, para2):
+ codes
+ codes
+ # Llamar a la función
+ print(function_name(arg1, arg2))
+```
+
+**Ejemplo:**
+
+```py
+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'))
+
+def sum_two_numbers (num_one, num_two):
+ sum = num_one + num_two
+ return sum
+print('Sum of two numbers: ', sum_two_numbers(1, 9))
+
+def calculate_age (current_year, birth_year):
+ age = current_year - birth_year
+ return age;
+
+print('Age: ', calculate_age(2021, 1819))
+
+def weight_of_object (mass, gravity):
+ weight = str(mass * gravity)+ ' N' # El valor necesita convertirse a cadena primero
+ return weight
+print('Weight of an object in Newtons: ', weight_of_object(100, 9.81))
+```
+
+### Pasar argumentos por clave y valor
+
+Si pasamos argumentos por clave=valor, el orden de los parámetros no importa.
+
+```py
+# Sintaxis
+# Declarar una función
+def function_name(para1, para2):
+ codes
+ codes
+# Llamar a la función
+print(function_name(para1 = 'John', para2 = 'Doe')) # el orden de los parámetros no importa
+```
+
+**Ejemplo:**
+
+```py
+def print_fullname(firstname, lastname):
+ space = ' '
+ full_name = firstname + space + lastname
+ print(full_name)
+print(print_fullname(firstname = 'Asabeneh', lastname = 'Yetayeh'))
+
+def add_two_numbers (num1, num2):
+ total = num1 + num2
+ print(total)
+print(add_two_numbers(num2 = 3, num1 = 2)) # el orden no importa
+```
+
+### Funciones que retornan valores - Parte 2
+
+Si no retornamos un valor en una función, por defecto devuelve _None_. Para devolver un valor usamos la palabra clave _return_ seguida de la variable a retornar. Podemos devolver cualquier tipo de dato desde una función.
+
+- Devolver cadenas:
+ **Ejemplo:**
+
+```py
+def print_name(firstname):
+ return firstname
+print_name('Asabeneh') # Asabeneh
+
+def print_full_name(firstname, lastname):
+ space = ' '
+ full_name = firstname + space + lastname
+ return full_name
+print_full_name(firstname='Asabeneh', lastname='Yetayeh')
+```
+
+- Devolver números:
+
+**Ejemplo:**
+
+```py
+def add_two_numbers (num1, num2):
+ total = num1 + num2
+ return total
+print(add_two_numbers(2, 3))
+
+def calculate_age (current_year, birth_year):
+ age = current_year - birth_year
+ return age;
+print('Age: ', calculate_age(2019, 1819))
+```
+
+- Devolver booleanos:
+ **Ejemplo:**
+
+```py
+def is_even (n):
+ if n % 2 == 0:
+ print('even')
+ return True # la instrucción return detiene la ejecución adicional en la función
+ return False
+print(is_even(10)) # True
+print(is_even(7)) # False
+```
+
+- Devolver listas:
+ **Ejemplo:**
+
+```py
+def find_even_numbers(n):
+ evens = []
+ for i in range(n + 1):
+ if i % 2 == 0:
+ evens.append(i)
+ return evens
+print(find_even_numbers(10))
+```
+
+### Funciones con parámetros por defecto
+
+A veces pasamos valores por defecto a los parámetros. Si no proporcionamos un argumento al llamar la función, se usa el valor por defecto.
+
+```py
+# Sintaxis
+# Declarar una función
+def function_name(param = value):
+ codes
+ codes
+# Llamar a la función
+function_name()
+function_name(arg)
+```
+
+**Ejemplo:**
+
+```py
+def greetings (name = 'Peter'):
+ message = name + ', welcome to Python for Everyone!'
+ return message
+print(greetings())
+print(greetings('Asabeneh'))
+
+def generate_full_name (first_name = 'Asabeneh', last_name = 'Yetayeh'):
+ space = ' '
+ full_name = first_name + space + last_name
+ return full_name
+
+print(generate_full_name())
+print(generate_full_name('David','Smith'))
+
+def calculate_age (birth_year,current_year = 2021):
+ age = current_year - birth_year
+ return age;
+print('Age: ', calculate_age(1821))
+
+def weight_of_object (mass, gravity = 9.81):
+ weight = str(mass * gravity)+ ' N' # gravedad promedio en la superficie de la Tierra
+ return weight
+print('Weight of an object in Newtons: ', weight_of_object(100)) # 9.81 - gravedad promedio en la Tierra
+print('Weight of an object in Newtons: ', weight_of_object(100, 1.62)) # gravedad en la Luna
+```
+
+### Número arbitrario de argumentos
+
+Si no sabemos cuántos argumentos se pasarán a la función, podemos usar un parámetro con * para aceptar un número arbitrario de argumentos.
+
+```py
+# Sintaxis
+# Declarar una función
+def function_name(*args):
+ codes
+ codes
+# Llamar a la función
+function_name(param1, param2, param3,..)
+```
+
+**Ejemplo:**
+
+```py
+def sum_all_nums(*nums):
+ total = 0
+ for num in nums:
+ total += num # equivalente a total = total + num
+ return total
+print(sum_all_nums(2, 3, 5)) # 10
+```
+
+### Parámetros por defecto y arbitrarios en funciones
+
+```py
+def generate_groups (team,*args):
+ print(team)
+ for i in args:
+ print(i)
+print(generate_groups('Team-1','Asabeneh','Brook','David','Eyob'))
+```
+
+### Función como parámetro de otra función
+
+```py
+# Puedes pasar una función como argumento
+def square_number (n):
+ return n * n
+def do_something(f, x):
+ return f(x)
+print(do_something(square_number, 3)) # 27
+```
+
+🌕 Has avanzado mucho. ¡Sigue así! Has completado el desafío del día 11 y ya llevas 11 pasos en el camino al éxito. Ahora realiza algunos ejercicios para ejercitar la mente y la práctica.
+
+## Testimonios
+
+Es hora de expresar tu opinión sobre el autor y 30DaysOfPython. Puedes dejar tu testimonio en este [enlace](https://testimonify.herokuapp.com/).
+
+## 💻 Ejercicios: Día 11
+
+### Ejercicios: Nivel 1
+
+1. Declara una función _add_two_numbers_. Debe aceptar dos parámetros y devolver su suma.
+2. La fórmula del área de un círculo es: area = π x r x r. Escribe una función _area_of_circle_ que la calcule.
+3. Escribe una función llamada add_all_nums que acepte un número arbitrario de argumentos y sume todos. Verifica que todos los elementos sean de tipo numérico. Si no, devuelve un mensaje apropiado.
+4. La temperatura en Celsius (°C) se puede convertir a Fahrenheit (°F) con: °F = (°C x 9/5) + 32. Escribe una función _convert_celsius_to_fahrenheit_.
+5. Escribe una función llamada check_season que acepte un mes y devuelva la estación: otoño, invierno, primavera o verano.
+6. Escribe una función llamada calculate_slope que devuelva la pendiente de una ecuación lineal.
+7. La ecuación cuadrática se calcula como: ax² + bx + c = 0. Escribe una función _solve_quadratic_eqn_ que calcule las soluciones.
+8. Declara una función llamada print_list que acepte una lista y imprima cada elemento.
+9. Declara una función llamada reverse_list que acepte un arreglo y devuelva su reverso (usa un bucle).
+
+```py
+print(reverse_list([1, 2, 3, 4, 5]))
+# [5, 4, 3, 2, 1]
+print(reverse_list1(["A", "B", "C"]))
+# ["C", "B", "A"]
+```
+
+10. Declara una función capitalize_list_items que acepte una lista y devuelva una lista con los elementos en mayúscula.
+11. Declara una función add_item que acepte una lista y un ítem. Debe devolver la lista con el ítem agregado al final.
+
+```py
+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]
+```
+
+12. Declara una función remove_item que acepte una lista y un ítem. Debe devolver la lista con el ítem eliminado.
+
+```py
+food_staff = ['Potato', 'Tomato', 'Mango', 'Milk'];
+print(remove_item(food_staff, 'Mango')) # ['Potato', 'Tomato', 'Milk'];
+numbers = [2, 3, 7, 9];
+print(remove_item(numbers, 3)) # [2, 7, 9]
+```
+
+13. Declara una función sum_of_numbers que acepte un número y sume todos los números en ese rango.
+
+```py
+print(sum_of_numbers(5)) # 15
+print(sum_all_numbers(10)) # 55
+print(sum_all_numbers(100)) # 5050
+```
+
+14. Declara una función sum_of_odds que acepte un número y sume todos los impares en ese rango.
+15. Declara una función sum_of_even que acepte un número y sume todos los pares en ese rango.
+
+### Ejercicios: Nivel 2
+
+1. Declara una función evens_and_odds que acepte un entero positivo y calcule la cantidad de pares e impares en ese número.
+
+```py
+ print(evens_and_odds(100))
+ # La cantidad de números pares es 50.
+ # La cantidad de números impares es 50.
+```
+
+2. Llama a tu función factorial que acepte un entero y devuelva su factorial.
+3. Llama a tu función _is_empty_ que acepte un argumento y verifique si está vacío.
+4. Escribe distintas funciones que acepten listas y calculen: media, mediana, moda, rango, varianza y desviación estándar.
+
+### Ejercicios: Nivel 3
+
+1. Escribe una función is_prime que verifique si un número es primo.
+2. Escribe una función que verifique si todos los ítems en una lista son únicos.
+3. Escribe una función que verifique si todos los ítems en una lista son del mismo tipo de dato.
+4. Escribe una función que verifique si una variable proporcionada es un nombre de variable válido en Python.
+5. Accede al archivo de datos countries-data.py.
+
+- Crea una función llamada the_most_spoken_languages que devuelva las 10 o 20 lenguas más habladas en el mundo, ordenadas de mayor a menor.
+- Crea una función llamada the_most_populated_countries que devuelva los 10 o 20 países más poblados del mundo, ordenados de mayor a menor.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 10](./10_loops_sp.md) | [Día 12 >>](./12_modules_sp.md)
diff --git a/Spanish/12_modules_sp.md b/Spanish/12_modules_sp.md
new file mode 100644
index 000000000..085a0258a
--- /dev/null
+++ b/Spanish/12_modules_sp.md
@@ -0,0 +1,302 @@
+
+
+[<< Día 11](./11_functions_sp.md) | [Día 13 >>](./13_list_comprehension_sp.md)
+
+
+
+- [📘 Día 12](#-día-12)
+ - [Módulos](#módulos)
+ - [¿Qué es un módulo?](#¿qué-es-un-módulo?)
+ - [Crear módulos](#crear-módulos)
+ - [Importar módulos](#importar-módulos)
+ - [Importar funciones desde un módulo](#importar-funciones-desde-un-módulo)
+ - [Importar funciones y renombrarlas](#importar-funciones-y-renombrarlas)
+ - [Importar módulos incorporados](#importar-módulos-incorporados)
+ - [Módulo OS](#módulo-os)
+ - [Módulo sys](#módulo-sys)
+ - [Módulo statistics](#módulo-statistics)
+ - [Módulo math](#módulo-math)
+ - [Módulo string](#módulo-string)
+ - [Módulo random](#módulo-random)
+ - [💻 Ejercicios: Día 12](#-ejercicios-día-12)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 12
+
+## Módulos
+
+### ¿Qué es un módulo?
+
+Un módulo es un archivo que contiene un conjunto de código o funciones que se pueden incluir en una aplicación. Un módulo puede ser un archivo con una sola variable, una función o una biblioteca de gran escala.
+
+### Crear módulos
+
+Para crear un módulo, escribimos código en un script de Python y lo guardamos con extensión .py. En la carpeta del proyecto crea un archivo llamado mymodule.py. Escribamos algo de código en ese archivo.
+
+```py
+# archivo mymodule.py
+def generate_full_name(firstname, lastname):
+ return firstname + ' ' + lastname
+```
+
+En el directorio del proyecto crea un archivo main.py e importa mymodule.py.
+
+### Importar módulos
+
+Para importar archivos usamos la palabra clave import y el nombre del archivo.
+
+```py
+# archivo main.py
+import mymodule
+print(mymodule.generate_full_name('Asabeneh', 'Yetayeh')) # Asabeneh Yetayeh
+```
+
+### Importar funciones desde un módulo
+
+Podemos tener muchas funciones en un archivo y podemos importar cada una por separado.
+
+```py
+# archivo main.py
+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'])
+```
+
+### Importar funciones y renombrarlas
+
+Durante la importación también podemos renombrar nombres.
+
+```py
+# archivo main.py
+from mymodule import generate_full_name as fullname, sum_two_nums as total, person as p, gravity as g
+print(fullname('Asabneh','Yetayeh'))
+print(total(1, 9))
+mass = 100
+weight = mass * g
+print(weight)
+print(p)
+print(p['firstname'])
+```
+
+## Importar módulos incorporados
+
+Al igual que otros lenguajes, podemos importar módulos usando la palabra clave import. A continuación importamos algunos módulos incorporados que usamos con frecuencia. Algunos módulos comunes son: math, datetime, os, sys, random, statistics, collections, json, re
+
+### Módulo OS
+
+El módulo os de Python permite automatizar muchas tareas del sistema operativo. El módulo OS ofrece funciones para crear, cambiar directorio de trabajo, eliminar directorios (carpetas), obtener su contenido y reconocer/cambiar el directorio actual.
+
+```py
+# importar módulo
+import os
+# crear directorio
+os.mkdir('directory_name')
+# cambiar el directorio actual
+os.chdir('path')
+# obtener el directorio actual
+os.getcwd()
+# eliminar directorio
+os.rmdir()
+```
+
+### Módulo sys
+
+El módulo sys provee funciones y variables para interactuar con diferentes partes del entorno de ejecución de Python. La función sys.argv devuelve la lista de argumentos de la línea de comandos pasados al script de Python. El elemento en el índice 0 de esa lista es siempre el nombre del script, el índice 1 es el primer argumento pasado desde la línea de comandos.
+
+Ejemplo archivo script.py:
+
+```py
+import sys
+#print(sys.argv[0], argv[1],sys.argv[2]) # esta línea imprimirá: nombre_archivo argumento1 argumento2
+print('Welcome {}. Enjoy {} challenge!'.format(sys.argv[1], sys.argv[2]))
+```
+
+Para ver cómo funciona el script, en la línea de comandos escribe:
+
+```sh
+python script.py Asabeneh 30DaysOfPython
+```
+
+Resultado:
+
+```sh
+Welcome Asabeneh. Enjoy 30DayOfPython challenge!
+```
+
+Algunos comandos útiles de sys:
+
+```py
+# salir del script
+sys.exit()
+# conocer el tamaño máximo de un entero
+sys.maxsize
+# conocer la ruta de módulos
+sys.path
+# conocer la versión de Python en uso
+sys.version
+```
+
+### Módulo statistics
+
+El módulo statistics proporciona funciones de estadísticas para datos numéricos. Algunas funciones comunes definidas en este módulo: mean, median, mode, stdev, etc.
+
+```py
+from statistics import * # importar todo del módulo statistics
+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
+```
+
+### Módulo math
+
+Contiene muchas operaciones matemáticas y constantes.
+
+```py
+import math
+print(math.pi) # 3.141592653589793, constante pi
+print(math.sqrt(2)) # 1.4142135623730951, raíz cuadrada
+print(math.pow(2, 3)) # 8.0, potencia
+print(math.floor(9.81)) # 9, redondeo hacia abajo
+print(math.ceil(9.81)) # 10, redondeo hacia arriba
+print(math.log10(100)) # 2, logaritmo base 10
+```
+
+Ahora que hemos importado el módulo math con muchas funciones útiles, podemos ver qué funciones contiene usando help(math) o dir(math). Si sólo queremos importar funciones específicas podemos hacerlo así:
+
+```py
+from math import pi
+print(pi)
+```
+
+También podemos importar múltiples funciones:
+
+```py
+from math import pi, sqrt, pow, floor, ceil, log10
+print(pi) # 3.141592653589793
+print(sqrt(2)) # 1.4142135623730951
+print(pow(2, 3)) # 8.0
+print(floor(9.81)) # 9
+print(ceil(9.81)) # 10
+print(math.log10(100)) # 2
+```
+
+Si queremos importar todas las funciones del módulo matemático podemos usar *.
+
+```py
+from math import *
+print(pi) # 3.141592653589793, constante pi
+print(sqrt(2)) # 1.4142135623730951, raíz cuadrada
+print(pow(2, 3)) # 8.0, potencia
+print(floor(9.81)) # 9, redondeo hacia abajo
+print(ceil(9.81)) # 10, redondeo hacia arriba
+print(math.log10(100)) # 2
+```
+
+También podemos renombrar funciones al importarlas.
+
+```py
+from math import pi as PI
+print(PI) # 3.141592653589793
+```
+
+### Módulo string
+
+El módulo string es muy útil. Los siguientes ejemplos muestran algunos usos.
+
+```py
+import string
+print(string.ascii_letters) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+print(string.digits) # 0123456789
+print(string.punctuation) # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+```
+
+### Módulo random
+
+Ahora que sabes importar módulos, familiaricémonos con random. El módulo random nos da números aleatorios entre 0 y 0.9999. El módulo tiene muchas funciones; aquí usamos random y randint.
+
+```py
+from random import random, randint
+print(random()) # no necesita parámetros; devuelve un valor entre 0 y 0.9999
+print(randint(5, 20)) # devuelve un entero aleatorio en [5, 20] (inclusive)
+```
+
+🌕 ¡Has llegado muy lejos. Sigue así! Acabas de completar el desafío del Día 12 y has dado 12 pasos hacia algo grandioso. Ahora ejercita tu mente y tus músculos.
+
+## 💻 Ejercicios: Día 12
+
+### Ejercicios: Nivel 1
+
+1. Escribe una función que genere un random_user_id de seis caracteres/dígitos.
+ ```py
+ print(random_user_id());
+ '1ee33d'
+ ```
+2. Modifica la tarea anterior. Declara una función llamada user_id_gen_by_user. No acepta argumentos, pero pide dos entradas: una es la cantidad de caracteres por ID y la otra es cuántos IDs generar.
+
+```py
+print(user_id_gen_by_user()) # entrada del usuario: 5 5
+#salida:
+#kcsy2
+#SMFYb
+#bWmeq
+#ZXOYh
+#2Rgxf
+
+print(user_id_gen_by_user()) # 16 5
+#1GCSgPLMaBAVQZ26
+#YD7eFwNQKNs7qXaT
+#ycArC5yrRupyG00S
+#UbGxOFI7UXSWAyKN
+#dIV0SSUTgAdKwStr
+```
+
+3. Escribe una función llamada rgb_color_gen. Debe generar un color RGB (cada valor en el rango 0-255).
+
+```py
+print(rgb_color_gen())
+# rgb(125,244,255) - la salida debe estar en este formato
+```
+
+### Ejercicios: Nivel 2
+
+1. Escribe una función list_of_hexa_colors que devuelva una lista con cualquier cantidad de colores hexadecimales (seis dígitos hexadecimales después de #; el sistema hex usa 0-9 y a-f).
+2. Escribe una función list_of_rgb_colors que devuelva una lista con cualquier cantidad de colores RGB.
+3. Escribe una función generate_colors que pueda generar cualquier cantidad de colores hexadecimales o RGB.
+
+```py
+ generate_colors('hexa', 3) # ['#a3e12f','#03ed55','#eb3d2b']
+ generate_colors('hexa', 1) # ['#b334ef']
+ generate_colors('rgb', 3) # ['rgb(5, 55, 175','rgb(50, 105, 100','rgb(15, 26, 80']
+ generate_colors('rgb', 1) # ['rgb(33,79, 176)']
+```
+
+### Ejercicios: Nivel 3
+
+1. Llama a tu función shuffle_list, que recibe una lista y devuelve la lista mezclada.
+2. Escribe una función que devuelva una lista de siete números aleatorios únicos en el rango 0-9.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 11](./11_functions_sp.md) | [Día 13 >>](./13_list_comprehension_sp.md)
diff --git a/Spanish/13_list_comprehension_sp.md b/Spanish/13_list_comprehension_sp.md
new file mode 100644
index 000000000..b0e00d35c
--- /dev/null
+++ b/Spanish/13_list_comprehension_sp.md
@@ -0,0 +1,207 @@
+
+
30 Días de Python: Día 13 - Comprensiones de listas
+
+[<< Día 12](./12_modules_sp.md) | [Día 14 >>](./14_higher_order_functions_sp.md)
+
+
+
+- [📘 Día 13](#📘-día-13)
+ - [Comprensiones de listas](#comprensiones-de-listas)
+ - [Funciones lambda](#funciones-lambda)
+ - [Crear una función lambda](#crear-una-función-lambda)
+ - [Funciones lambda dentro de otra función](#lambda-dentro-de-otra-función)
+ - [💻 Ejercicios: Día 13](#💻-ejercicios-día-13)
+
+# 📘 Día 13
+
+## Comprensiones de listas
+
+En Python, las comprensiones de listas son una forma concisa de crear listas a partir de secuencias. Es una manera corta de crear nuevas listas a partir de secuencias. Las comprensiones de listas son más rápidas que iterar sobre listas con un bucle for.
+
+```py
+# sintaxis
+[i for i in iterable if expresión]
+```
+
+**Ejemplo 1**
+
+Por ejemplo, si quieres convertir una cadena en una lista de caracteres, puedes hacerlo de varias formas. Veamos algunas:
+
+```py
+# un método
+language = 'Python'
+lst = list(language) # convertir la cadena en lista
+print(type(lst)) # list
+print(lst) # ['P', 'y', 't', 'h', 'o', 'n']
+
+# segunda forma: comprensión de listas
+lst = [i for i in language]
+print(type(lst)) # list
+print(lst) # ['P', 'y', 't', 'h', 'o', 'n']
+```
+
+**Ejemplo 2**
+
+Por ejemplo, si quieres generar una lista de números:
+
+```py
+# generar números
+numbers = [i for i in range(11)] # genera números de 0 a 10
+print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+# también puedes hacer operaciones matemáticas durante la iteración
+squares = [i * i for i in range(11)]
+print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
+
+# también se pueden generar listas de tuplas
+numbers = [(i, i * i) for i in range(11)]
+print(numbers) # [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
+```
+
+**Ejemplo 3**
+
+Las comprensiones de listas pueden combinarse con expresiones if:
+
+```py
+# generar números pares
+even_numbers = [i for i in range(21) if i % 2 == 0] # genera pares de 0 a 20
+print(even_numbers) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
+
+# generar números impares
+odd_numbers = [i for i in range(21) if i % 2 != 0] # genera impares de 0 a 20
+print(odd_numbers) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
+
+# filtrar números: obtengamos los pares positivos
+numbers = [-8, -7, -3, -1, 0, 1, 3, 4, 5, 7, 6, 8, 10]
+positive_even_numbers = [i for i in range(21) if i % 2 == 0 and i > 0]
+print(positive_even_numbers) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
+
+# aplanar una lista 2D
+list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
+flattened_list = [number for row in list_of_lists for number in row]
+print(flattened_list) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
+```
+
+## Funciones lambda
+
+Las funciones lambda son pequeñas funciones anónimas sin nombre. Pueden aceptar cualquier número de argumentos, pero solo una expresión. Las funciones lambda son similares a las funciones anónimas en JavaScript. Son útiles cuando necesitamos una función anónima dentro de otra función.
+
+### Crear una función lambda
+
+Para crear una función lambda usamos la palabra clave lambda, seguido de uno o más parámetros y luego una expresión. La función lambda no usa return explícito; devuelve la expresión implícitamente.
+
+```py
+# sintaxis
+x = lambda param1, param2, param3: param1 + param2 + param3
+print(x(arg1, arg2, arg3))
+```
+
+**Ejemplo:**
+
+```py
+# función nombrada
+def add_two_nums(a, b):
+ return a + b
+
+print(add_two_nums(2, 3)) # 5
+
+# con lambda
+add_two_nums = lambda a, b: a + b
+print(add_two_nums(2, 3)) # 5
+
+# lambda autoejecutable
+print((lambda a, b: a + b)(2, 3)) # 5
+
+square = lambda x: x ** 2
+print(square(3)) # 9
+cube = lambda x: x ** 3
+print(cube(3)) # 27
+
+# múltiples variables
+multiple_variable = lambda a, b, c: a ** 2 - 3 * b + 4 * c
+print(multiple_variable(5, 5, 3)) # 22
+```
+
+### Funciones lambda dentro de otra función
+
+Uso de lambda dentro de otra función:
+
+```py
+def power(x):
+ return lambda n: x ** n
+
+cube = power(2)(3) # la función power ahora se usa con dos pares de paréntesis
+print(cube) # 8
+two_power_of_five = power(2)(5)
+print(two_power_of_five) # 32
+```
+
+🌕 Sigue con el buen trabajo. Mantente motivado; el cielo es tu límite. Has completado el desafío del Día 13 y has dado 13 pasos hacia algo grandioso. Ahora ejercita tu mente y sigue practicando.
+
+## 💻 Ejercicios: Día 13
+
+1. Usa una comprensión de listas para filtrar los números negativos y ceros de la siguiente lista:
+ ```py
+ numbers = [-4, -3, -2, -1, 0, 2, 4, 6]
+ ```
+2. Aplana la siguiente lista de listas a una lista unidimensional:
+
+ ```py
+ list_of_lists = [[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]]
+
+ Salida:
+ [1, 2, 3, 4, 5, 6, 7, 8, 9]
+ ```
+
+3. Crea la siguiente lista de tuplas usando una comprensión de listas:
+ ```py
+ [(0, 1, 0, 0, 0, 0, 0),
+ (1, 1, 1, 1, 1, 1, 1),
+ (2, 1, 2, 4, 8, 16, 32),
+ (3, 1, 3, 9, 27, 81, 243),
+ (4, 1, 4, 16, 64, 256, 1024),
+ (5, 1, 5, 25, 125, 625, 3125),
+ (6, 1, 6, 36, 216, 1296, 7776),
+ (7, 1, 7, 49, 343, 2401, 16807),
+ (8, 1, 8, 64, 512, 4096, 32768),
+ (9, 1, 9, 81, 729, 6561, 59049),
+ (10, 1, 10, 100, 1000, 10000, 100000)]
+ ```
+4. Aplana la siguiente estructura en una nueva lista:
+ ```py
+ countries = [[('Finlandia', 'Helsinki')], [('Suecia', 'Estocolmo')], [('Noruega', 'Oslo')]]
+ Salida:
+ [['Finlandia', 'FIN', 'Helsinki'], ['Suecia', 'SWE', 'Estocolmo'], ['Noruega', 'NOR', 'Oslo']]
+ ```
+5. Convierte la siguiente lista en una lista de diccionarios:
+ ```py
+ countries = [[('Finlandia', 'Helsinki')], [('Suecia', 'Estocolmo')], [('Noruega', 'Oslo')]]
+ Salida:
+ [{'País': 'Finlandia', 'Ciudad': 'Helsinki'},
+ {'País': 'Suecia', 'Ciudad': 'Estocolmo'},
+ {'País': 'Noruega', 'Ciudad': 'Oslo'}]
+ ```
+6. Convierte la siguiente lista en una lista de cadenas concatenadas:
+ ```py
+ names = [[('Asabeneh', 'Yetayeh')], [('David', 'Smith')], [('Donald', 'Trump')], [('Bill', 'Gates')]]
+ Salida:
+ ['Asabeneh Yetayeh', 'David Smith', 'Donald Trump', 'Bill Gates']
+ ```
+7. Escribe una función lambda que calcule la pendiente o la ordenada al origen de una función lineal.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 12](./12_modules_sp.md) | [Día 14 >>](./14_higher_order_functions_sp.md)
diff --git a/Spanish/14_higher_order_functions_sp.md b/Spanish/14_higher_order_functions_sp.md
new file mode 100644
index 000000000..d4e0e9101
--- /dev/null
+++ b/Spanish/14_higher_order_functions_sp.md
@@ -0,0 +1,370 @@
+
+
30 Días de Python: Día 14 - Funciones de orden superior
+
+[<< Día 13](./13_list_comprehension_sp.md) | [Día 15 >>](./15_python_type_errors_cn_sp.md)
+
+
+
+- [📘 Día 14](#-día-14)
+ - [Funciones de orden superior](#funciones-de-orden-superior)
+ - [Funciones como parámetros](#funciones-como-parámetros)
+ - [Funciones como valor de retorno](#funciones-como-valor-de-retorno)
+ - [Closures en Python](#closures-en-python)
+ - [Decoradores en Python](#decoradores-en-python)
+ - [Crear decoradores](#crear-decoradores)
+ - [Aplicar varios decoradores a una función](#aplicar-varios-decoradores-a-una-función)
+ - [Aceptar parámetros en decoradores](#aceptar-parámetros-en-decoradores)
+ - [Funciones integradas de orden superior](#funciones-integradas-de-orden-superior)
+ - [Python - función map](#python---función-map)
+ - [Python - función filter](#python---función-filter)
+ - [Python - función reduce](#python---función-reduce)
+ - [💻 Ejercicios: Día 14](#-ejercicios-día-14)
+ - [Ejercicios: Básico](#ejercicios-básico)
+ - [Ejercicios: Intermedio](#ejercicios-intermedio)
+ - [Ejercicios: Avanzado](#ejercicios-avanzado)
+
+# 📘 Día 14
+
+## Funciones de orden superior
+
+En Python, las funciones son tratadas como ciudadanos de primera clase; se pueden hacer las siguientes operaciones con funciones:
+
+- Una función puede recibir una o más funciones como parámetros
+- Una función puede ser el valor de retorno de otra función
+- Una función puede ser modificada
+- Una función puede asignarse a una variable
+
+En esta sección discutiremos:
+
+1. Pasar funciones como parámetros
+2. Devolver funciones como valores de retorno
+3. Usar closures y decoradores en Python
+
+### Funciones como parámetros
+
+```py
+def sum_numbers(nums): # función normal
+ return sum(nums) # usa la función incorporada sum
+
+def higher_order_function(f, lst): # pasar función como argumento
+ summation = f(lst)
+ return summation
+result = higher_order_function(sum_numbers, [1, 2, 3, 4, 5])
+print(result) # 15
+```
+
+### Funciones como valor de retorno
+
+```py
+def square(x): # función que devuelve el cuadrado
+ return x ** 2
+
+def cube(x): # función que devuelve el cubo
+ return x ** 3
+
+def absolute(x): # función que devuelve el valor absoluto
+ if x >= 0:
+ return x
+ else:
+ return -(x)
+
+def higher_order_function(type): # función de orden superior que devuelve una función
+ if type == 'square':
+ return square
+ elif type == 'cube':
+ return cube
+ elif type == 'absolute':
+ return absolute
+
+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
+```
+
+En los ejemplos anteriores se observa que la función de orden superior devuelve distintas funciones según el parámetro pasado.
+
+## Closures en Python
+
+Python permite que una función anidada acceda al ámbito de su función envolvente externa. Esto se conoce como closure. Un closure en Python se crea al anidar una función dentro de otra función envolvente y devolver la función interna. Veamos un ejemplo.
+
+**Ejemplo:**
+
+```py
+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
+```
+
+## Decoradores en Python
+
+Un decorador es un patrón de diseño que permite añadir nueva funcionalidad a un objeto sin modificar su estructura. Los decoradores normalmente se usan aplicándolos antes de la definición de la función que se desea decorar.
+
+### Crear decoradores
+
+Para crear un decorador necesitamos una función externa que contenga una función envoltura interna.
+
+**Ejemplo:**
+
+```py
+# función normal
+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
+
+# Implementando lo anterior con sintaxis de decorador
+
+'''Esta función decoradora es una función de orden superior que acepta una función como argumento'''
+def uppercase_decorator(function):
+ def wrapper():
+ func = function()
+ make_uppercase = func.upper()
+ return make_uppercase
+ return wrapper
+
+@uppercase_decorator
+def greeting():
+ return 'Welcome to Python'
+print(greeting()) # WELCOME TO PYTHON
+```
+
+### Aplicar varios decoradores a una función
+
+```py
+'''Estas funciones decoradoras son funciones de orden superior que reciben funciones como argumento'''
+
+# primer decorador
+def uppercase_decorator(function):
+ def wrapper():
+ func = function()
+ make_uppercase = func.upper()
+ return make_uppercase
+ return wrapper
+
+# segundo decorador
+def split_string_decorator(function):
+ def wrapper():
+ func = function()
+ splitted_string = func.split()
+ return splitted_string
+ return wrapper
+
+@split_string_decorator
+@uppercase_decorator # en este caso el orden importa, ya que .upper() no funciona sobre una lista
+def greeting():
+ return 'Welcome to Python'
+print(greeting()) # ['WELCOME', 'TO', 'PYTHON']
+```
+
+### Aceptar parámetros en decoradores
+
+A menudo necesitamos que nuestras funciones acepten parámetros; por eso definimos decoradores que también los aceptan.
+
+```py
+def decorator_with_parameters(function):
+ def wrapper_accepting_parameters(para1, para2, para3):
+ function(para1, para2, para3)
+ print("I live in {}".format(para3))
+ return wrapper_accepting_parameters
+
+@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')
+```
+
+## Funciones integradas de orden superior
+
+En esta sección veremos algunas funciones integradas de orden superior como map(), filter() y reduce().
+Las funciones lambda se pueden pasar como argumentos; su caso de uso ideal es con map, filter y reduce.
+
+### Python - función map
+
+map() es una función integrada que recibe una función y un iterable como parámetros.
+
+```py
+ # sintaxis
+ map(function, iterable)
+```
+
+**Ejemplo 1**
+
+```py
+numbers = [1, 2, 3, 4, 5] # iterable
+def square(x):
+ return x ** 2
+numbers_squared = map(square, numbers)
+print(list(numbers_squared)) # [1, 4, 9, 16, 25]
+# Usemos lambda
+numbers_squared = map(lambda x : x ** 2, numbers)
+print(list(numbers_squared)) # [1, 4, 9, 16, 25]
+```
+
+**Ejemplo 2**
+
+```py
+numbers_str = ['1', '2', '3', '4', '5'] # iterable
+numbers_int = map(int, numbers_str)
+print(list(numbers_int)) # [1, 2, 3, 4, 5]
+```
+
+**Ejemplo 3**
+
+```py
+names = ['Asabeneh', 'Lidiya', 'Ermias', 'Abraham'] # iterable
+
+def change_to_upper(name):
+ return name.upper()
+
+names_upper_cased = map(change_to_upper, names)
+print(list(names_upper_cased)) # ['ASABENEH', 'LIDIYA', 'ERMIAS', 'ABRAHAM']
+
+# Usemos lambda
+names_upper_cased = map(lambda name: name.upper(), names)
+print(list(names_upper_cased)) # ['ASABENEH', 'LIDIYA', 'ERMIAS', 'ABRAHAM']
+```
+
+map itera sobre el iterable y devuelve un nuevo iterable transformado.
+
+### Python - función filter
+
+filter() llama a la función especificada que retorna un valor booleano para cada elemento del iterable y filtra los elementos que cumplen la condición.
+
+```py
+ # sintaxis
+ filter(function, iterable)
+```
+
+**Ejemplo 1**
+
+```py
+# filtremos solo los pares
+numbers = [1, 2, 3, 4, 5] # iterable
+
+def is_even(num):
+ if num % 2 == 0:
+ return True
+ return False
+
+even_numbers = filter(is_even, numbers)
+print(list(even_numbers)) # [2, 4]
+```
+
+**Ejemplo 2**
+
+```py
+numbers = [1, 2, 3, 4, 5] # iterable
+
+def is_odd(num):
+ if num % 2 != 0:
+ return True
+ return False
+
+odd_numbers = filter(is_odd, numbers)
+print(list(odd_numbers)) # [1, 3, 5]
+```
+
+```py
+# filtrar nombres largos
+names = ['Asabeneh', 'Lidiya', 'Ermias', 'Abraham'] # iterable
+def is_name_long(name):
+ if len(name) > 7:
+ return True
+ return False
+
+long_names = filter(is_name_long, names)
+print(list(long_names)) # ['Asabeneh']
+```
+
+### Python - función reduce
+
+reduce() se define en el módulo functools; es necesario importarla desde allí. Al igual que map y filter, recibe una función y un iterable. Sin embargo, no devuelve otro iterable sino un único valor acumulado.
+
+**Ejemplo 1**
+
+```py
+numbers_str = ['1', '2', '3', '4', '5'] # iterable
+def add_two_nums(x, y):
+ return int(x) + int(y)
+
+total = reduce(add_two_nums, numbers_str)
+print(total) # 15
+```
+
+## 💻 Ejercicios: Día 14
+
+```py
+countries = ['Estonia', 'Finland', 'Sweden', 'Denmark', 'Norway', 'Iceland']
+names = ['Asabeneh', 'Lidiya', 'Ermias', 'Abraham']
+numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+```
+
+### Ejercicios: Básico
+
+1. Explica la diferencia entre map, filter y reduce.
+2. Explica la diferencia entre funciones de orden superior, closures y decoradores.
+3. Define la función que llama (ver ejemplo).
+4. Imprime cada país de la lista countries usando un bucle for.
+5. Imprime cada nombre de la lista names usando un bucle for.
+6. Imprime cada número de la lista numbers usando un bucle for.
+
+### Ejercicios: Intermedio
+
+1. Usa map para convertir cada país en countries a mayúsculas y genera una nueva lista.
+2. Usa map para elevar al cuadrado cada número en numbers y genera una nueva lista.
+3. Usa map para convertir cada nombre en names a mayúsculas y genera una nueva lista.
+4. Usa filter para filtrar países que contienen 'land'.
+5. Usa filter para filtrar países con exactamente seis caracteres.
+6. Usa filter para filtrar países con seis o más caracteres.
+7. Usa filter para filtrar países que comienzan con 'E'.
+8. Encadena dos o más iteradores de lista (por ejemplo arr.map(callback).filter(callback).reduce(callback)).
+9. Declara una función get_string_lists que reciba una lista y devuelva una lista con solo los elementos de tipo cadena.
+10. Usa reduce para sumar todos los números en la lista numbers.
+11. Usa reduce para concatenar todos los países en una oración: Estonia, Finland, Sweden, Denmark, Norway, and Iceland are north European countries.
+12. Declara una función categorize_countries que retorne una lista de países que siguen un patrón común (puedes ver la lista de países en el archivo countries.js del repositorio, por ejemplo 'land', 'ia', 'island', 'stan').
+13. Crea una función que devuelva un diccionario donde las claves sean la primera letra de los nombres de país y el valor sea el número de países que comienzan con esa letra.
+14. Declara una función get_first_ten_countries que devuelva los primeros diez países de la lista countries.js en la carpeta data.
+15. Declara una función get_last_ten_countries que devuelva los últimos diez países de la lista.
+
+### Ejercicios: Avanzado
+
+1. Usando el archivo countries_data.py (https://github.com/Asabeneh/30-Days-Of-Python/blob/master/data/countries-data.py), completa lo siguiente:
+ - Ordena los países por nombre, capital y población.
+ - Ordena y obtiene los diez idiomas más usados.
+ - Ordena y obtiene los diez países con mayor población.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 13](./13_list_comprehension_sp.md) | [Día 15 >>](./15_python_type_errors_cn_sp.md)
diff --git a/Spanish/15_python_type_errors_sp.md b/Spanish/15_python_type_errors_sp.md
new file mode 100644
index 000000000..f11334efa
--- /dev/null
+++ b/Spanish/15_python_type_errors_sp.md
@@ -0,0 +1,343 @@
+# Desafío de programación Python: Día 15 - Errores (excepciones) en Python
+
+- [Día 15](#día-15)
+ - [Tipos de error en Python](#tipos-de-error-en-python)
+ - [SyntaxError (Error de sintaxis)](#syntaxerror-error-de-sintaxis)
+ - [NameError (Error de nombre)](#nameerror-error-de-nombre)
+ - [IndexError (Error de índice)](#indexerror-error-de-índice)
+ - [ModuleNotFoundError (Módulo no encontrado)](#modulenotfounderror-módulo-no-encontrado)
+ - [AttributeError (Error de atributo)](#attributeerror-error-de-atributo)
+ - [KeyError (Error de clave)](#keyerror-error-de-clave)
+ - [TypeError (Error de tipo)](#typeerror-error-de-tipo)
+ - [ImportError (Error de importación)](#importerror-error-de-importación)
+ - [ValueError (Error de valor)](#valueerror-error-de-valor)
+ - [ZeroDivisionError (Error de división por cero)](#zerodivisionerror-error-de-división-por-cero)
+ - [💻 Ejercicios - Día 15](#-ejercicios---día-15)
+
+# 📘 Día 15
+
+## Tipos de error en Python
+
+Al escribir código, con frecuencia cometemos errores tipográficos u otros errores comunes. Si nuestro código falla, el intérprete de Python muestra un mensaje que nos da retroalimentación sobre dónde ocurrió el problema y cuál es el tipo de error. A veces incluso sugiere posibles soluciones. Conocer los distintos tipos de errores en el lenguaje nos ayudará a depurar más rápido y a mejorar nuestras habilidades de programación.
+
+Revisemos los tipos de error más comunes uno por uno. Primero, abre el intérprete interactivo de Python. Ve a la terminal de tu equipo e ingresa 'python'. Se abrirá el intérprete interactivo de Python.
+
+### SyntaxError (Error de sintaxis)
+
+**Ejemplo 1: SyntaxError**
+
+```python
+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 "", line 1
+ print 'hello world'
+ ^
+SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello world')?
+>>>
+```
+
+Como ves, cometimos un error de sintaxis porque olvidamos encerrar la cadena entre paréntesis; Python incluso sugiere la corrección. Arreglémoslo.
+
+```python
+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 "", line 1
+ print 'hello world'
+ ^
+SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello world')?
+>>> print('hello world')
+hello world
+>>>
+```
+
+Ese fue un SyntaxError. Tras corregirlo, el código se ejecuta correctamente. Veamos otros tipos de errores.
+
+### NameError (Error de nombre)
+
+**Ejemplo 1: NameError**
+
+```python
+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 "", line 1, in
+NameError: name 'age' is not defined
+>>>
+```
+
+El mensaje indica que el nombre age no está definido. En efecto, no hemos declarado age pero intentamos imprimirlo. Solucionémoslo declarando la variable y asignándole un valor.
+
+```python
+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 "", line 1, in
+NameError: name 'age' is not defined
+>>> age = 25
+>>> print(age)
+25
+>>>
+```
+
+Ese fue un NameError. Lo depuramos definiendo la variable.
+
+### IndexError (Error de índice)
+
+**Ejemplo 1: IndexError**
+
+```python
+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.
+>>> numbers = [1, 2, 3, 4, 5]
+>>> numbers[5]
+Traceback (most recent call last):
+ File "", line 1, in
+IndexError: list index out of range
+>>>
+```
+
+En este ejemplo Python lanzó un IndexError porque los índices válidos de la lista son 0 a 4; el índice 5 está fuera de rango.
+
+### ModuleNotFoundError (Módulo no encontrado)
+
+**Ejemplo 1: ModuleNotFoundError**
+
+```python
+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 "", line 1, in
+ModuleNotFoundError: No module named 'maths'
+>>>
+```
+
+Aquí añadí intencionadamente una 's' extra a math, lo que produjo un ModuleNotFoundError. Corrijámoslo quitando la 's'.
+
+```python
+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 "", line 1, in
+ModuleNotFoundError: No module named 'maths'
+>>> import math
+>>>
+```
+
+Lo hemos corregido y ahora podemos usar el módulo math.
+
+### AttributeError (Error de atributo)
+
+**Ejemplo 1: AttributeError**
+
+```python
+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 "", line 1, in
+ModuleNotFoundError: No module named 'maths'
+>>> import math
+>>> math.PI
+Traceback (most recent call last):
+ File "", line 1, in
+AttributeError: module 'math' has no attribute 'PI'
+>>>
+```
+
+Aquí intenté acceder a math.PI en lugar de math.pi, lo que produjo un AttributeError porque ese atributo no existe. Corrijámoslo usando el nombre correcto:
+
+```python
+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 "", line 1, in
+ModuleNotFoundError: No module named 'maths'
+>>> import math
+>>> math.PI
+Traceback (most recent call last):
+ File "", line 1, in
+AttributeError: module 'math' has no attribute 'PI'
+>>> math.pi
+3.141592653589793
+>>>
+```
+
+Ahora la llamada devuelve el valor esperado.
+
+### KeyError (Error de clave)
+
+**Ejemplo 1: KeyError**
+
+```python
+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.
+>>> users = {'name':'Asab', 'age':250, 'country':'Finland'}
+>>> users['name']
+'Asab'
+>>> users['county']
+Traceback (most recent call last):
+ File "", line 1, in
+KeyError: 'county'
+>>>
+```
+
+Aquí hay un error de ortografía en la clave usada para obtener un valor del diccionario. Es un KeyError; la solución es usar la clave correcta.
+
+```python
+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.
+>>> user = {'name':'Asab', 'age':250, 'country':'Finland'}
+>>> user['name']
+'Asab'
+>>> user['county']
+Traceback (most recent call last):
+ File "", line 1, in
+KeyError: 'county'
+>>> user['country']
+'Finland'
+>>>
+```
+
+Error depurado; el código devuelve el resultado esperado.
+
+### TypeError (Error de tipo)
+
+**Ejemplo 1: TypeError**
+
+```python
+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 "", line 1, in
+TypeError: unsupported operand type(s) for +: 'int' and 'str'
+>>>
+```
+
+En este caso aparece un TypeError porque no podemos sumar un entero y una cadena. Una solución es convertir la cadena a int o float; otra es convertir el entero a cadena para concatenarlos. Probemos la primera solución:
+
+```python
+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 "", line 1, in
+TypeError: unsupported operand type(s) for +: 'int' and 'str'
+>>> 4 + int('3')
+7
+>>> 4 + float('3')
+7.0
+>>>
+```
+
+El error desaparece y obtenemos el resultado esperado.
+
+### ImportError (Error de importación)
+
+**Ejemplo 1: ImportError**
+
+```python
+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 "", line 1, in
+ImportError: cannot import name 'power' from 'math'
+>>>
+```
+
+El módulo math no tiene una función llamada power; la función correcta es pow. Corrijámoslo:
+
+```python
+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 "", line 1, in
+ImportError: cannot import name 'power' from 'math'
+>>> from math import pow
+>>> pow(2,3)
+8.0
+>>>
+```
+
+### ValueError (Error de valor)
+
+```python
+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.
+>>> int('12a')
+Traceback (most recent call last):
+ File "", line 1, in
+ValueError: invalid literal for int() with base 10: '12a'
+>>>
+```
+
+No podemos convertir la cadena dada a número porque contiene la letra 'a'.
+
+### ZeroDivisionError (Error de división por cero)
+
+```python
+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.
+>>> 1/0
+Traceback (most recent call last):
+ File "", line 1, in
+ZeroDivisionError: division by zero
+>>>
+```
+
+No podemos dividir un número por cero.
+
+Hemos revisado varios tipos de errores en Python; para más información, consulta la documentación oficial sobre excepciones en Python. Si te acostumbras a leer los mensajes de error, podrás corregir tus bugs rápidamente y convertirte en un mejor programador.
+
+🌕 Vas progresando. Has completado la mitad del camino hacia algo genial. Ahora haz algunos ejercicios para entrenar tu cerebro y tus manos.
+
+## 💻 Ejercicios - Día 15
+
+1. Abre tu intérprete interactivo de Python y prueba todos los ejemplos mostrados en esta sección.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 14](./14_higher_order_functions_sp.md) | [Día 16 >>](./16_python_datetime_sp.md)
\ No newline at end of file
diff --git a/Spanish/16_python_datetime_sp.md b/Spanish/16_python_datetime_sp.md
new file mode 100644
index 000000000..a76ab2a9a
--- /dev/null
+++ b/Spanish/16_python_datetime_sp.md
@@ -0,0 +1,192 @@
+# 30 Días de Python: Día 16 - datetime en Python
+
+- [Día 16](#-día-16)
+ - [Python *datetime*](#python-datetime)
+ - [Obtener información de *datetime*](#obtener-información-de-datetime)
+ - [Formatear fecha con *strftime*](#formatear-fecha-con-strftime)
+ - [Convertir cadena a fecha con *strptime*](#convertir-cadena-a-fecha-con-strptime)
+ - [Usar *date* desde *datetime*](#usar-date-desde-datetime)
+ - [Representar tiempo con objetos *time*](#representar-tiempo-con-objetos-time)
+ - [Calcular la diferencia entre dos puntos en el tiempo](#calcular-la-diferencia-entre-dos-puntos-en-el-tiempo)
+ - [Calcular diferencias con *timedelta*](#calcular-diferencias-con-timedelta)
+ - [💻 Ejercicios - Día 16](#-ejercicios---día-16)
+
+# 📘 Día 16
+
+## Python *datetime*
+
+Python tiene un módulo _datetime_ para trabajar con fechas y horas.
+
+```py
+import datetime
+print(dir(datetime))
+['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']
+```
+
+Con los comandos incorporados dir o help puedes ver las funciones disponibles de un módulo. Como ves, el módulo datetime tiene muchas clases y funciones; nos centraremos en _date_, _datetime_, _time_ y _timedelta_. Veámoslas una a una.
+
+### Obtener información de *datetime*
+
+```py
+from datetime import datetime
+now = datetime.now()
+print(now) # 2021-07-08 07:34:46.549883
+day = now.day # 8
+month = now.month # 7
+year = now.year # 2021
+hour = now.hour # 7
+minute = now.minute # 38
+second = now.second
+timestamp = now.timestamp()
+print(day, month, year, hour, minute)
+print('timestamp', timestamp)
+print(f'{day}/{month}/{year}, {hour}:{minute}') # 8/7/2021, 7:38
+```
+
+El timestamp, o Unix timestamp, es el número de segundos transcurridos desde el 1 de enero de 1970 UTC.
+
+### Formatear fecha con *strftime*
+
+```py
+from datetime import datetime
+new_year = datetime(2020, 1, 1)
+print(new_year) # 2020-01-01 00:00:00
+day = new_year.day
+month = new_year.month
+year = new_year.year
+hour = new_year.hour
+minute = new_year.minute
+second = new_year.second
+print(day, month, year, hour, minute) #1 1 2020 0 0
+print(f'{day}/{month}/{year}, {hour}:{minute}') # 1/1/2020, 0:0
+
+```
+
+Usa el método *strftime* para formatear fechas y horas; la documentación de formatos está [aquí](https://strftime.org/).
+
+```py
+from datetime import datetime
+# fecha y hora actual
+now = datetime.now()
+t = now.strftime("%H:%M:%S")
+print("Hora:", t)
+time_one = now.strftime("%m/%d/%Y, %H:%M:%S")
+# formato mm/dd/YY H:M:S
+print("Formato uno:", time_one)
+time_two = now.strftime("%d/%m/%Y, %H:%M:%S")
+# formato dd/mm/YY H:M:S
+print("Formato dos:", time_two)
+```
+
+```sh
+Hora: 01:05:01
+Formato uno: 12/05/2019, 01:05:01
+Formato dos: 05/12/2019, 01:05:01
+```
+
+A continuación se muestran los símbolos de _strftime_ usados para formatear tiempos, como se ve en la imagen de referencia.
+
+
+
+### Convertir cadena a fecha con *strptime*
+Aquí hay una [guía](https://www.programiz.com/python-programming/datetime/strptimet) que ayuda a entender los formatos.
+
+```py
+from datetime import datetime
+date_string = "5 December, 2019"
+print("date_string =", date_string)
+date_object = datetime.strptime(date_string, "%d %B, %Y")
+print("date_object =", date_object)
+```
+
+```sh
+date_string = 5 December, 2019
+date_object = 2019-12-05 00:00:00
+```
+
+### Usar *date* desde *datetime*
+
+```py
+from datetime import date
+d = date(2020, 1, 1)
+print(d)
+print('Fecha actual:', d.today()) # fecha actual
+# objeto date de hoy
+today = date.today()
+print("Año actual:", today.year) # 2019
+print("Mes actual:", today.month) # 12
+print("Día actual:", today.day) # 5
+```
+
+### Representar tiempo con objetos *time*
+
+```py
+from datetime import time
+# time(hour = 0, minute = 0, second = 0)
+a = time()
+print("a =", a)
+# time(hour, minute y second)
+b = time(10, 30, 50)
+print("b =", b)
+# time(hour, minute y second)
+c = time(hour=10, minute=30, second=50)
+print("c =", c)
+# time(hour, minute, second, microsecond)
+d = time(10, 30, 50, 200555)
+print("d =", d)
+```
+
+Salida:
+a = 00:00:00
+b = 10:30:50
+c = 10:30:50
+d = 10:30:50.200555
+
+### Calcular la diferencia entre dos puntos en el tiempo
+
+```py
+today = date(year=2019, month=12, day=5)
+new_year = date(year=2020, month=1, day=1)
+time_left_for_newyear = new_year - today
+# Tiempo hasta año nuevo: 27 days, 0:00:00
+print('Tiempo hasta año nuevo: ', time_left_for_newyear)
+
+t1 = datetime(year = 2019, month = 12, day = 5, hour = 0, minute = 59, second = 0)
+t2 = datetime(year = 2020, month = 1, day = 1, hour = 0, minute = 0, second = 0)
+diff = t2 - t1
+print('Tiempo hasta año nuevo:', diff) # Tiempo hasta año nuevo: 26 days, 23:01:00
+```
+
+### Calcular diferencias con *timedelta*
+
+```py
+from datetime import timedelta
+t1 = timedelta(weeks=12, days=10, hours=4, seconds=20)
+t2 = timedelta(days=7, hours=5, minutes=3, seconds=30)
+t3 = t1 - t2
+print("t3 =", t3)
+```
+
+```sh
+date_string = 5 December, 2019
+date_object = 2019-12-05 00:00:00
+t3 = 86 days, 22:56:50
+```
+
+🌕 Eres increíble. Has avanzado 16 pasos hacia la excelencia. Ahora haz algunos ejercicios para entrenar tu mente y tus manos.
+
+## 💻 Ejercicios - Día 16
+
+1. Obtén el día, mes, año, hora, minuto y timestamp actuales desde el módulo datetime.
+2. Formatea la fecha actual con el formato: "%m/%d/%Y, %H:%M:%S"
+3. Hoy es 5 de diciembre de 2019. Convierte esa cadena de fecha a un objeto datetime.
+4. Calcula la diferencia entre ahora y el próximo año nuevo.
+5. Calcula la diferencia entre el 1 de enero de 1970 y ahora.
+6. Piensa: ¿para qué puedes usar el módulo datetime? Por ejemplo:
+ - Análisis de series temporales
+ - Obtener timestamps para eventos en una aplicación
+ - Añadir la fecha de publicación en un blog
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 15](./15_python_type_errors_sp.md) | [Día 17 >>](./17_exception_handling_sp.md)
\ No newline at end of file
diff --git a/Spanish/17_exception_handling_sp.md b/Spanish/17_exception_handling_sp.md
new file mode 100644
index 000000000..2e9192c5a
--- /dev/null
+++ b/Spanish/17_exception_handling_sp.md
@@ -0,0 +1,284 @@
+# 30 Días de Python: Día 17 - Manejo de excepciones
+
+- [Día 17](#-día-17)
+ - [Manejo de excepciones](#manejo-de-excepciones)
+ - [Empacar y desempacar parámetros en Python](#empacar-y-desempacar-parámetros-en-python)
+ - [Desempaquetado](#desempaquetado)
+ - [Desempaquetar listas](#desempaquetar-listas)
+ - [Desempaquetar diccionarios](#desempaquetar-diccionarios)
+ - [Empaquetado](#empaquetado)
+ - [Empaquetar listas](#empaquetar-listas)
+ - [Empaquetar diccionarios](#empaquetar-diccionarios)
+ - [Expandir en Python](#expandir-en-python)
+ - [Enumerar (enumerate)](#enumerar-enumerate)
+ - [Zip](#zip)
+ - [Ejercicios: Día 17](#ejercicios-día-17)
+
+# 📘 Día 17
+
+## Manejo de excepciones
+
+Python utiliza _try_ y _except_ para manejar errores de forma elegante. Salir de forma controlada (o manejar errores con elegancia) es una buena práctica: el programa detecta una condición de error y la maneja adecuadamente, normalmente mostrando un mensaje descriptivo en la terminal o en un registro. Las excepciones suelen deberse a factores externos al programa (entrada errónea, nombre de archivo incorrecto, archivo no encontrado, fallos de I/O, etc.). El manejo adecuado de excepciones evita que las aplicaciones se bloqueen.
+
+En la sección anterior hemos cubierto los distintos tipos de errores en Python. Si usamos _try_ y _except_ correctamente, podemos impedir que esos errores hagan que el programa falle.
+
+
+
+```py
+try:
+ # si todo va bien, se ejecuta el código en este bloque
+except:
+ # si ocurre un error, se ejecuta el código en este bloque
+```
+
+**Ejemplo:**
+
+```py
+try:
+ print(10 + '5')
+except:
+ print('Ocurrió un error')
+```
+
+En el ejemplo anterior, el segundo operando es una cadena. Podemos convertirlo a int o float para sumarlo a un número; si no lo hacemos, se ejecutará el bloque _except_.
+
+**Ejemplo:**
+
+```py
+try:
+ name = input('Introduce tu nombre:')
+ year_born = input('¿En qué año naciste?:')
+ age = 2019 - year_born
+ print(f'Eres {name}. Tu edad es {age}.')
+except:
+ print('Ocurrió un error')
+```
+
+```sh
+Ocurrió un error
+```
+
+En el ejemplo anterior, se ejecuta el bloque de excepción, pero no sabemos exactamente qué pasó. Para identificar el problema podemos capturar tipos de excepción concretos.
+
+En el siguiente ejemplo capturamos y mostramos el tipo de error:
+
+```py
+try:
+ name = input('Introduce tu nombre:')
+ year_born = input('¿En qué año naciste?:')
+ age = 2019 - year_born
+ print(f'Eres {name}. Tu edad es {age}.')
+except TypeError:
+ print('Se produjo un error de tipo (TypeError)')
+except ValueError:
+ print('Se produjo un ValueError')
+except ZeroDivisionError:
+ print('Se produjo una división por cero (ZeroDivisionError)')
+```
+
+```sh
+Introduce tu nombre:Asabeneh
+¿En qué año naciste?:1920
+Se produjo un error de tipo (TypeError)
+```
+
+En el ejemplo anterior la salida será _TypeError_. Ahora añadamos bloques adicionales:
+
+```py
+try:
+ name = input('Introduce tu nombre:')
+ year_born = input('¿En qué año naciste?:')
+ age = 2019 - int(year_born)
+ print(f'Eres {name}. Tu edad es {age}.')
+except TypeError:
+ print('Se produjo un error de tipo (TypeError)')
+except ValueError:
+ print('Se produjo un ValueError')
+except ZeroDivisionError:
+ print('Se produjo una división por cero (ZeroDivisionError)')
+else:
+ print('Este bloque se ejecuta normalmente después de try')
+finally:
+ print('Este bloque siempre se ejecuta.')
+```
+
+```sh
+Introduce tu nombre:Asabeneh
+¿En qué año naciste?:1920
+Eres Asabeneh. Tu edad es 99.
+Este bloque se ejecuta normalmente después de try
+Este bloque siempre se ejecuta.
+```
+
+También podemos simplificar el manejo de excepción así:
+
+```py
+try:
+ name = input('Introduce tu nombre:')
+ year_born = input('¿En qué año naciste?:')
+ age = 2019 - int(year_born)
+ print(f'Eres {name}. Tu edad es {age}.')
+except Exception as e:
+ print(e)
+```
+
+## Empacar y desempacar parámetros en Python
+
+Usamos dos operadores:
+
+- * para tuplas/listas
+- ** para diccionarios
+
+Veamos un ejemplo. Supongamos que una función acepta parámetros separados, pero nosotros tenemos una lista. Podemos desempaquetarla y convertirla en argumentos.
+
+### Desempaquetado
+
+#### Desempaquetar listas
+
+```py
+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)) # TypeError: sum_of_five_nums() missing 4 required positional arguments: 'b', 'c', 'd', and 'e'
+```
+
+Al ejecutar lo anterior ocurre un error porque la función espera números separados, no una lista. Desempaquetemos la lista:
+
+```py
+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
+```
+
+También podemos usar desempaquetado con range(), que acepta inicio y fin:
+
+```py
+numbers = range(2, 7) # llamada normal con parámetros separados
+print(list(numbers)) # [2, 3, 4, 5, 6]
+args = [2, 7]
+numbers = range(*args) # llamada usando los parámetros desempaquetados desde la lista
+print(list(numbers)) # [2, 3, 4, 5, 6]
+```
+
+También podemos usar desempaquetado en asignaciones:
+
+```py
+countries = ['Finland', 'Sweden', 'Norway', 'Denmark', 'Iceland']
+fin, sw, nor, *rest = countries
+print(fin, sw, nor, rest) # Finland Sweden Norway ['Denmark', 'Iceland']
+numbers = [1, 2, 3, 4, 5, 6, 7]
+one, *middle, last = numbers
+print(one, middle, last) # 1 [2, 3, 4, 5, 6] 7
+```
+
+#### Desempaquetar diccionarios
+
+```py
+def unpacking_person_info(name, country, city, age):
+ return f'{name} vive en {city}, {country}. Tiene {age} años.'
+dct = {'name':'Asabeneh', 'country':'Finland', 'city':'Helsinki', 'age':250}
+print(unpacking_person_info(**dct)) # Asabeneh vive en Helsinki, Finland. Tiene 250 años.
+```
+
+### Empaquetado
+
+A veces no sabemos cuántos argumentos nos pasarán a una función. Podemos usar empaquetado para aceptar un número variable de argumentos.
+
+### Empaquetar listas
+
+```py
+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
+```
+
+#### Empaquetar diccionarios
+
+```py
+def packing_person_info(**kwargs):
+ # comprobar el tipo de kwargs: es un dict
+ # print(type(kwargs))
+ # imprimir los pares clave-valor
+ for key in kwargs:
+ print(f"{key} = {kwargs[key]}")
+ return kwargs
+
+print(packing_person_info(name="Asabeneh",
+ country="Finland", city="Helsinki", age=250))
+```
+
+```sh
+name = Asabeneh
+country = Finland
+city = Helsinki
+age = 250
+{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+```
+
+## Expandir en Python
+
+Al igual que en JavaScript, Python permite expandir listas usando el operador *. Veámoslo:
+
+```py
+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]
+```
+
+## Enumerar (enumerate)
+
+Si necesitamos los índices de una lista, usamos la función integrada enumerate.
+
+```py
+for index, item in enumerate([20, 30, 40]):
+ print(index, item)
+```
+
+```py
+for index, i in enumerate(countries):
+ print('hola')
+ if i == 'Finland':
+ print(f'El país {i} está en el índice {index}')
+```
+
+```sh
+0 20
+1 30
+2 40
+```
+
+## Zip
+
+A veces necesitamos combinar listas. Observa el ejemplo:
+
+```py
+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)
+```
+
+```sh
+[{'fruit': 'banana', 'veg': 'Tomato'}, {'fruit': 'orange', 'veg': 'Potato'}, {'fruit': 'mango', 'veg': 'Cabbage'}, {'fruit': 'lemon', 'veg': 'Onion'}, {'fruit': 'lime', 'veg': 'Carrot'}]
+```
+
+## Ejercicios: Día 17
+
+1. Crea en _countries.py_ funciones que usen los datos de _countries_data.py_:
+ - una función para encontrar los 10 idiomas más usados
+ - una función para encontrar los 10 países más poblados
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 16](./16_python_datetime_sp.md) | [Día 18 >>](./18_regular_expressions_sp.md)
\ No newline at end of file
diff --git a/Spanish/18_regular_expressions_sp.md b/Spanish/18_regular_expressions_sp.md
new file mode 100644
index 000000000..d4e452f49
--- /dev/null
+++ b/Spanish/18_regular_expressions_sp.md
@@ -0,0 +1,409 @@
+# 30 Días de Python: Día 18 - Expresiones regulares
+
+- [Día 18](#-día-18)
+ - [Expresiones regulares](#expresiones-regulares)
+ - [Módulo *re*](#módulo-re)
+ - [Métodos en el módulo *re*](#métodos-en-el-módulo-re)
+ - [Match (coincidencia al inicio)](#match-coincidencia-al-inicio)
+ - [Search (búsqueda)](#search-búsqueda)
+ - [Buscar todas las coincidencias con *findall*](#buscar-todas-las-coincidencias-con-findall)
+ - [Reemplazar subcadenas](#reemplazar-subcadenas)
+ - [Usar RegEx para dividir el texto](#usar-regex-para-dividir-texto)
+ - [Construir patrones RegEx](#construir-patrones-regex)
+ - [Corchetes](#corchetes)
+ - [Caracteres de escape en RegEx (\\)](#caracteres-de-escape-en-regex)
+ - [Una o más veces (+)](#una-o-más-veces-+)
+ - [Punto (.)](#punto-)
+ - [Cero o más veces (*)](#cero-o-más-veces-)
+ - [Cero o una vez (?)](#cero-o-una-vez-?)
+ - [Cuantificadores en RegEx](#cuantificadores-en-regex)
+ - [Circunflejo (^) en RegEx](#circunflejo-^)
+ - [💻 Ejercicios: Día 18](#-ejercicios-día-18)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 18
+
+## Expresiones regulares
+
+Las expresiones regulares (RegEx) son cadenas de texto especiales que ayudan a encontrar patrones en los datos. RegEx se puede usar para comprobar la existencia de ciertos patrones en diferentes tipos de datos. Para usar RegEx en Python debemos importar el módulo llamado *re*.
+
+### Módulo *re*
+
+Una vez importado el módulo, podemos usarlo para detectar o buscar patrones.
+
+```py
+import re
+```
+
+### Métodos en el módulo *re*
+
+Para buscar patrones usamos diferentes conjuntos de caracteres y funciones de *re*, que permiten buscar coincidencias dentro de una cadena.
+
+- *re.match()*: busca solo al inicio de la cadena; devuelve un objeto Match si hay coincidencia, sino None.
+- *re.search*: busca en cualquier parte de la cadena (incluyendo textos multilínea); devuelve el primer objeto Match encontrado o None.
+- *re.findall*: devuelve una lista con todas las coincidencias.
+- *re.split*: acepta una cadena y la divide en los puntos donde hay coincidencia, devolviendo una lista.
+- *re.sub*: reemplaza una o más coincidencias en una cadena.
+
+#### Match (coincidencia al inicio)
+
+```py
+# sintaxis
+re.match(substring, string, re.I)
+# substring es una cadena o patrón, string es el texto donde buscamos, re.I indica ignorar mayúsculas/minúsculas
+```
+
+```py
+import re
+
+txt = 'I love to teach python and javaScript'
+# Devuelve un objeto Match con span y match
+match = re.match('I love to teach', txt, re.I)
+print(match) #
+# Podemos usar span para obtener la posición inicial y final como tupla
+span = match.span()
+print(span) # (0, 15)
+# Tomamos inicio y fin desde span
+start, end = span
+print(start, end) # 0, 15
+substring = txt[start:end]
+print(substring) # I love to teach
+```
+
+Del ejemplo anterior se ve que el patrón buscado es *I love to teach*. La función match **solo** devuelve un objeto si el texto comienza con ese patrón.
+
+```py
+import re
+
+txt = 'I love to teach python and javaScript'
+match = re.match('I like to teach', txt, re.I)
+print(match) # None
+```
+
+Esa cadena no comienza con *I like to teach*, por eso match devuelve None.
+
+#### Search (búsqueda)
+
+```py
+# sintaxis
+re.search(substring, string, re.I)
+# substring es un patrón, string es el texto donde buscamos, re.I es la bandera para ignorar mayúsculas/minúsculas
+```
+
+```py
+import re
+
+txt = '''Python is the most beautiful language that a human being has ever created.
+I recommend python for a first programming language'''
+
+# Devuelve un objeto Match con span y match
+match = re.search('first', txt, re.I)
+print(match) #
+# Podemos usar span para obtener inicio y fin como tupla
+span = match.span()
+print(span) # (100, 105)
+# Tomamos inicio y fin
+start, end = span
+print(start, end) # 100 105
+substring = txt[start:end]
+print(substring) # first
+```
+
+Como puedes ver, search es más potente que match porque busca en todo el texto. search devuelve la primera coincidencia; para obtener todas las coincidencias usamos findall.
+
+#### Buscar todas las coincidencias con *findall*
+
+*findall()* devuelve todas las coincidencias como una lista.
+
+```py
+txt = '''Python is the most beautiful language that a human being has ever created.
+I recommend python for a first programming language'''
+
+# Devuelve una lista
+matches = re.findall('language', txt, re.I)
+print(matches) # ['language', 'language']
+```
+
+La palabra *language* aparece dos veces en el texto. Practiquemos más: vamos a buscar 'Python' y 'python' en el texto:
+
+```py
+txt = '''Python is the most beautiful language that a human being has ever created.
+I recommend python for a first programming language'''
+
+# Devuelve una lista
+matches = re.findall('python', txt, re.I)
+print(matches) # ['Python', 'python']
+```
+
+Usando re.I se ignora mayúsculas/minúsculas. Si no usamos la bandera, podemos escribir el patrón de otras formas:
+
+```py
+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('Python|python', txt)
+print(matches) # ['Python', 'python']
+
+#
+matches = re.findall('[Pp]ython', txt)
+print(matches) # ['Python', 'python']
+```
+
+#### Reemplazar subcadenas
+
+```py
+txt = '''Python is the most beautiful language that a human being has ever created.
+I recommend python for a first programming language'''
+
+match_replaced = re.sub('Python|python', 'JavaScript', txt, re.I)
+print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.
+# o bien
+match_replaced = re.sub('[Pp]ython', 'JavaScript', txt, re.I)
+print(match_replaced) # JavaScript is the most beautiful language that a human being has ever created.
+```
+
+Otro ejemplo: el siguiente texto es difícil de leer por los símbolos '%'. Reemplazarlos por cadena vacía limpia el texto.
+
+```py
+txt = '''%I a%m te%%a%%che%r% a%n%d %% I l%o%ve te%ach%ing.
+T%he%re i%s n%o%th%ing as r%ewarding a%s e%duc%at%i%ng a%n%d e%m%p%ow%er%ing p%e%o%ple.
+I fo%und te%a%ching m%ore i%n%t%er%%es%ting t%h%an any other %jobs.
+D%o%es thi%s m%ot%iv%a%te %y%o%u to b%e a t%e%a%cher?'''
+
+matches = re.sub('%', '', txt)
+print(matches)
+```
+
+```sh
+I am teacher and I love teaching.
+There is nothing as rewarding as educating and empowering people.
+I found teaching more interesting than any other jobs. Does this motivate you to be a teacher?
+```
+
+## Usar RegEx para dividir el texto
+
+```py
+txt = '''I am teacher and I love teaching.
+There is nothing as rewarding as educating and empowering people.
+I found teaching more interesting than any other jobs.
+Does this motivate you to be a teacher?'''
+print(re.split('\n', txt)) # dividir usando \n - salto de línea
+```
+
+```sh
+['I am teacher and I love teaching.', 'There is nothing as rewarding as educating and empowering people.', 'I found teaching more interesting than any other jobs.', 'Does this motivate you to be a teacher?']
+```
+
+## Construir patrones RegEx
+
+Para declarar una cadena usamos comillas simples o dobles. Para declarar un patrón RegEx usamos una cadena raw, escrita como r''.
+El siguiente patrón reconoce solo 'apple' en minúsculas; para ignorar mayúsculas/minúsculas reescribimos el patrón o añadimos la bandera re.I.
+
+```py
+import re
+
+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']
+
+# Para ignorar mayúsculas/minúsculas, añadimos la bandera
+matches = re.findall(regex_pattern, txt, re.I)
+print(matches) # ['Apple', 'apple']
+# o podemos usar un conjunto de caracteres
+regex_pattern = r'[Aa]pple' # esto permite Apple o apple
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['Apple', 'apple']
+```
+
+* []: un conjunto de caracteres
+ - [a-c] significa a o b o c
+ - [a-z] cualquier letra de a a z
+ - [A-Z] cualquier letra de A a Z
+ - [0-3] 0 o 1 o 2 o 3
+ - [0-9] cualquier dígito del 0 al 9
+ - [A-Za-z0-9] cualquier carácter alfanumérico: a-z, A-Z o 0-9
+
+### Corchetes
+
+Practiquemos más con corchetes. Recuerda usar re.I para búsquedas sin distinción entre mayúsculas y minúsculas.
+
+```py
+regex_pattern = r'[Aa]pple|[Bb]anana' # Apple o apple o Banana o banana
+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', 'banana', 'apple', 'banana']
+```
+
+Usando corchetes y alternación:
+```py
+regex_pattern = r'[a-zA-Z0-9]' # caracteres a-z, A-Z, 0-9
+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) # ['A', 'p', 'p', 'l', 'e', 'a', 'n', 'd', 'b', 'a', 'n', 'a', 'n', 'a', 'a', 'r', 'e',...]
+
+regex_pattern = r'\d' # \d es un metacarácter que representa dígitos
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6', '2', '0', '1', '9', '8', '2', '0', '2', '1']
+
+regex_pattern = r'\d+' # \d+ dígitos uno o más
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6', '2019', '8', '2021']
+```
+
+### Caracteres de escape en RegEx (\\)
+
+```py
+regex_pattern = r'\d+' # \d dígito, + uno o más
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6', '2019', '8', '2021']
+```
+
+Para buscar la barra invertida '\' en sí usamos doble backslash:
+```py
+regex_pattern = r'\\d' # busca literal '\d'
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+matches = re.findall(regex_pattern, txt)
+print(matches) # []
+```
+
+Si no hay '\d' literal en el texto, no se encuentran coincidencias.
+
+### Una o más veces (+)
+
+```py
+regex_pattern = r'\d+' # \d dígito, + uno o más
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6', '2019', '8', '2021']
+```
+
+### Punto (.)
+
+```py
+regex_pattern = r'[a].' # a seguido de cualquier carácter (excepto nueva línea)
+txt = '''Apple and banana are fruits'''
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['an', 'an', 'an', 'a ', 'ar']
+
+regex_pattern = r'[a].+' # a seguido de cualquier carácter una o más veces
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['and banana are fruits']
+```
+
+### Cero o más veces (*)
+
+Cero o más. Observa con atención el ejemplo.
+
+```py
+regex_pattern = r'[a].*' # a seguido de cualquier carácter cero o más veces
+txt = '''Apple and banana are fruits'''
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['and banana are fruits']
+```
+
+### Cero o una vez (?)
+
+Cero o una vez: puede existir o no.
+
+```py
+txt = '''I am not sure if there is a convention how to write the word e-mail.
+Some people write it as email others may write it as Email or E-mail.'''
+regex_pattern = r'[Ee]-?mail' # ? indica cero o una vez
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['e-mail', 'email', 'Email', 'E-mail']
+```
+
+### Cuantificadores en RegEx
+
+Con llaves podemos especificar la longitud del patrón:
+```py
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+regex_pattern = r'\d{4}' # exactamente 4 dígitos
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['2019', '2021']
+
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+regex_pattern = r'\d{1,4}' # entre 1 y 4 dígitos
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6', '2019', '8', '2021']
+```
+
+### Circunflejo (^) en RegEx
+
+- Indicar inicio
+
+```py
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+regex_pattern = r'^This' # ^ indica que empieza con 'This'
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['This']
+```
+
+- Negación dentro de corchetes
+
+```py
+txt = 'This regular expression example was made on December 6, 2019 and revised on July 8, 2021'
+regex_pattern = r'[^A-Za-z ]+' # ^ dentro de [] significa negación: no A-Z, no a-z, no espacio
+matches = re.findall(regex_pattern, txt)
+print(matches) # ['6,', '2019', '8,', '2021']
+```
+
+## 💻 Ejercicios: Día 18
+
+### Ejercicios: Nivel 1
+
+1. ¿Qué es una expresión regular?
+2. ¿Qué es una variable de expresión regular (regex variable)?
+3. Recrea patrones que:
+ a) Encuentren citas que contengan la palabra *talent* en un libro,
+ b) Encuentren fechas en formato _DD-MM-YYYY_, por ejemplo 12-01-2021,
+ c) Encuentren verbos en tiempo -ing en un texto.
+
+### Ejercicios: Nivel 2
+
+1. Escribe un patrón que valide un nombre de variable válido en Python.
+2. Limpia el siguiente texto eliminando etiquetas HTML.
+```python
+text = '''
+HTML
+Hypertext Markup Language (HTML) is the standard markup language for documents designed to be displayed in a web browser. It can be assisted by technologies such as Cascading Style Sheets (CSS) and scripting languages such as JavaScript.
+
+Web browsers receive HTML documents from a web server or from local storage and render the documents into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document.
+
+HTML elements are the building blocks of HTML pages. With HTML constructs, images and other objects such as interactive forms may be embedded into the rendered page. HTML provides a means to create structured documents by denoting structural semantics for text such as headings, paragraphs, lists, links, quotes and other items. HTML elements are delineated by tags, written using angle brackets. Tags such as and directly introduce content into the page. Other tags such as
surround and provide information about document text and may include other tags as sub-elements. Browsers do not display the HTML tags, but use them to interpret the content of the page.
+
+HTML can embed programs written in a scripting language such as JavaScript, which affects the behavior and content of web pages. Inclusion of CSS defines the look and layout of content. The World Wide Web Consortium (W3C), former maintainer of the HTML and current maintainer of the CSS standards, has encouraged the use of CSS over explicit presentational HTML since 1997.
+'''
+```
+
+### Ejercicios: Nivel 3
+
+1. Limpia el siguiente texto y, tras limpiarlo, calcula las tres palabras más frecuentes:
+
+```python
+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.'''
+```
+
+2. El siguiente texto contiene varias direcciones de correo electrónico. Escribe un patrón que encuentre o extraiga las direcciones de email válidas:
+
+```py
+email_address = '''
+asabeneh@gmail.com
+alex@yahoo.com
+kofi@yahoo.com
+doe@arc.gov
+asabeneh.com
+asabeneh@gmail
+alex@yahoo
+'''
+```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 17](./17_exception_handling_sp.md) | [Día 19 >>](./19_file_handling_sp.md)
\ No newline at end of file
diff --git a/Spanish/19_file_handling_sp.md b/Spanish/19_file_handling_sp.md
new file mode 100644
index 000000000..6711cf7f2
--- /dev/null
+++ b/Spanish/19_file_handling_sp.md
@@ -0,0 +1,526 @@
+# 30 Días de Python: Día 19 - Manejo de archivos
+
+- [Día 19](#-día-19)
+ - [Manejo de archivos](#manejo-de-archivos)
+ - [Abrir un archivo para lectura](#abrir-un-archivo-para-lectura)
+ - [Abrir un archivo para escritura y actualización](#abrir-un-archivo-para-escritura-y-actualización)
+ - [Eliminar archivos](#eliminar-archivos)
+ - [Tipos de archivos](#tipos-de-archivos)
+ - [Archivos con extensión txt](#archivos-con-extensión-txt)
+ - [Archivos con extensión json](#archivos-con-extensión-json)
+ - [Convertir JSON a diccionario](#convertir-json-a-diccionario)
+ - [Convertir diccionario a JSON](#convertir-diccionario-a-json)
+ - [Guardar como archivo JSON](#guardar-como-archivo-json)
+ - [Archivos con extensión csv](#archivos-con-extensión-csv)
+ - [Archivos con extensión xlsx](#archivos-con-extensión-xlsx)
+ - [Archivos con extensión xml](#archivos-con-extensión-xml)
+ - [💻 Ejercicios: Día 19](#-ejercicios-día-19)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 19
+
+## Manejo de archivos
+
+Hasta ahora hemos visto distintos tipos de datos en Python. Normalmente almacenamos datos en distintos formatos de archivo. Además de manejar archivos, en esta sección veremos diferentes formatos (.txt, .json, .xml, .csv, .tsv, .excel). Primero, familiaricémonos con el manejo de archivos usando un formato común (.txt).
+
+El manejo de archivos es una parte importante de la programación; nos permite crear, leer, actualizar y eliminar archivos. En Python usamos la función incorporada _open()_ para manipular archivos.
+
+```py
+# sintaxis
+open('filename', mode) # mode(r, a, w, x, t, b) puede ser lectura, escritura o actualización
+```
+
+- "r" - lectura - valor por defecto. Abre el archivo solo para lectura; si no existe genera un error.
+- "a" - append (añadir) - abre el archivo para agregar contenido al final; crea el archivo si no existe.
+- "w" - escritura - abre el archivo para escribir, sobrescribe si existe; crea el archivo si no existe.
+- "x" - crear - crea el archivo; si existe genera un error.
+- "t" - texto - valor por defecto. Modo texto.
+- "b" - binario - modo binario (por ejemplo para imágenes).
+
+### Abrir un archivo para lectura
+
+El modo por defecto de _open_ es lectura, así que no es necesario especificar 'r' o 'rt'. He creado un archivo llamado reading_file_example.txt en el directorio files. Veamos:
+
+```py
+f = open('./files/reading_file_example.txt')
+print(f) # <_io.TextIOWrapper name='./files/reading_file_example.txt' mode='r' encoding='UTF-8'>
+```
+
+Como en el ejemplo, al imprimir el objeto archivo obtenemos información sobre él. Un archivo abierto permite distintos métodos de lectura: _read()_, _readline_, _readlines_. Debemos cerrar el archivo con _close()_ cuando terminemos.
+
+- _read()_: lee todo el texto como una cadena. Podemos limitar el número de caracteres pasando un entero a *read(number)*.
+
+```py
+f = open('./files/reading_file_example.txt')
+txt = f.read()
+print(type(txt))
+print(txt)
+f.close()
+```
+
+```sh
+# salida
+
+This is an example to show how to open a file and read.
+This is the second line of the text.
+```
+
+En lugar de imprimir todo el texto, podemos leer solamente los primeros 10 caracteres:
+
+```py
+f = open('./files/reading_file_example.txt')
+txt = f.read(10)
+print(type(txt))
+print(txt)
+f.close()
+```
+
+```sh
+# salida
+
+This is an
+```
+
+- _readline()_: lee solo la primera línea
+
+```py
+f = open('./files/reading_file_example.txt')
+line = f.readline()
+print(type(line))
+print(line)
+f.close()
+```
+
+```sh
+# salida
+
+This is an example to show how to open a file and read.
+```
+
+- _readlines()_: lee todo el texto línea por línea y devuelve una lista de líneas
+
+```py
+f = open('./files/reading_file_example.txt')
+lines = f.readlines()
+print(type(lines))
+print(lines)
+f.close()
+```
+
+```sh
+# salida
+
+['This is an example to show how to open a file and read.\n', 'This is the second line of the text.']
+```
+
+Otra forma de obtener todas las líneas como lista es usar _splitlines()_:
+
+```py
+f = open('./files/reading_file_example.txt')
+lines = f.read().splitlines()
+print(type(lines))
+print(lines)
+f.close()
+```
+
+```sh
+# salida
+
+['This is an example to show how to open a file and read.', 'This is the second line of the text.']
+```
+
+Debemos cerrar los archivos después de abrirlos. Es fácil olvidarse; por eso existe la construcción _with_ que cierra automáticamente:
+
+```py
+with open('./files/reading_file_example.txt') as f:
+ lines = f.read().splitlines()
+ print(type(lines))
+ print(lines)
+```
+
+```sh
+# salida
+
+['This is an example to show how to open a file and read.', 'This is the second line of the text.']
+```
+
+### Abrir un archivo para escritura y actualización
+
+Para escribir en un archivo hay que pasar el modo a _open()_:
+
+- "a" - append - añade al final; crea el archivo si no existe.
+- "w" - write - sobrescribe el contenido; crea el archivo si no existe.
+
+Añadamos texto al archivo que hemos estado leyendo:
+
+```py
+with open('./files/reading_file_example.txt','a') as f:
+ f.write('Este texto debe añadirse al final')
+```
+
+Si el archivo no existe, el siguiente ejemplo creará uno nuevo:
+
+```py
+with open('./files/writing_file_example.txt','w') as f:
+ f.write('Este texto será escrito en el nuevo archivo creado')
+```
+
+### Eliminar archivos
+
+Como vimos anteriormente, podemos crear y eliminar directorios con el módulo _os_. Para eliminar archivos también usamos _os_.
+
+```py
+import os
+os.remove('./files/example.txt')
+```
+
+Si el archivo no existe, remove lanzará un error, por lo que es mejor comprobar:
+
+```py
+import os
+if os.path.exists('./files/example.txt'):
+ os.remove('./files/example.txt')
+else:
+ print('El archivo no existe')
+```
+
+## Tipos de archivos
+
+### Archivos con extensión txt
+
+Los archivos _txt_ son un formato muy común; ya vimos su uso más arriba. Ahora pasemos a JSON.
+
+### Archivos con extensión json
+
+JSON significa JavaScript Object Notation. Es básicamente una representación en cadena de un objeto JavaScript o de un diccionario Python.
+
+_Ejemplo:_
+
+```py
+# diccionario
+person_dct= {
+ "name":"Asabeneh",
+ "country":"Finland",
+ "city":"Helsinki",
+ "skills":["JavaScript", "React","Python"]
+}
+# JSON: la forma en cadena del diccionario
+person_json = "{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'skills': ['JavaScrip', 'React', 'Python']}"
+# Usamos triple comillas para que sea multilínea y más legible
+person_json = '''{
+ "name":"Asabeneh",
+ "country":"Finland",
+ "city":"Helsinki",
+ "skills":["JavaScript", "React","Python"]
+}'''
+```
+
+### Convertir JSON a diccionario
+
+Para convertir JSON a diccionario importamos el módulo json y usamos _loads_.
+
+```py
+import json
+# JSON
+person_json = '''{
+ "name": "Asabeneh",
+ "country": "Finland",
+ "city": "Helsinki",
+ "skills": ["JavaScript", "React", "Python"]
+}'''
+# Convertir la cadena JSON a diccionario
+person_dct = json.loads(person_json)
+print(type(person_dct))
+print(person_dct)
+print(person_dct['name'])
+```
+
+```sh
+# salida
+
+{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'skills': ['JavaScrip', 'React', 'Python']}
+Asabeneh
+```
+
+### Convertir diccionario a JSON
+
+Para convertir un diccionario a JSON usamos _dumps_.
+
+```py
+import json
+# diccionario en Python
+person = {
+ "name": "Asabeneh",
+ "country": "Finland",
+ "city": "Helsinki",
+ "skills": ["JavaScript", "React", "Python"]
+}
+# convertir diccionario a cadena JSON
+person_json = json.dumps(person, indent=4) # indent puede ser 2, 4, 8; formatea la salida
+print(type(person_json))
+print(person_json)
+```
+
+```sh
+# salida
+
+{
+ "name": "Asabeneh",
+ "country": "Finland",
+ "city": "Helsinki",
+ "skills": [
+ "JavaScript",
+ "React",
+ "Python"
+ ]
+}
+```
+
+### Guardar como archivo JSON
+
+También podemos guardar los datos en un archivo JSON:
+
+```py
+import json
+# diccionario en Python
+person = {
+ "name": "Asabeneh",
+ "country": "Finland",
+ "city": "Helsinki",
+ "skills": ["JavaScript", "React", "Python"]
+}
+with open('./files/json_example.json', 'w', encoding='utf-8') as f:
+ json.dump(person, f, ensure_ascii=False, indent=4)
+```
+
+En el ejemplo usamos encoding y ensure_ascii para manejar caracteres no ASCII. Ejemplo con caracteres no ASCII:
+
+```py
+import json
+person = {
+ "name": "Mark Firenze",
+ "country": "Spain",
+ "city": "Madrid",
+ "skills": ["JavaScript", "React", "Python"]
+}
+with open('./files/json_example.json', 'w', encoding='utf-8') as f:
+ json.dump(person, f, ensure_ascii=False, indent=4)
+```
+
+Leamos el archivo JSON que acabamos de crear:
+
+```py
+import json
+with open('./files/json_example.json', 'r', encoding='utf-8') as f:
+ person = json.load(f)
+ print(person)
+```
+
+```sh
+# salida
+{'name': 'Mark Firenze', 'country': 'Spain', 'city': 'Madrid', 'skills': ['JavaScript', 'React', 'Python']}
+```
+
+### Archivos con extensión csv
+
+CSV significa Comma Separated Values (valores separados por comas). Es un formato sencillo para datos tabulares (como hojas de cálculo o bases de datos) muy común en ciencia de datos.
+
+_Ejemplo CSV:_
+
+```csv
+"name","country","city","skills"
+"Asabeneh","Finland","Helsinki","JavaScript"
+```
+
+Ejemplo de lectura:
+
+```py
+import csv
+with open('./files/csv_example.csv') as f:
+ csv_reader = csv.reader(f, delimiter=',') # w+ crea el archivo si no existe
+ line_count = 0
+ for row in csv_reader:
+ if line_count == 0:
+ print(f'Encabezados: {", ".join(row)}')
+ line_count += 1
+ else:
+ print(f'{row[0]} viene de {row[1]}, {row[2]}. Conoce {row[3]}')
+ line_count += 1
+ print(f'Procesadas {line_count} líneas.')
+```
+
+```sh
+# salida:
+Encabezados: name, country, city, skills
+Asabeneh viene de Finland, Helsinki. Conoce JavaScript
+Procesadas 2 líneas.
+```
+
+También podemos escribir CSV:
+
+```py
+import csv
+with open('./files/csv_example.csv', 'w', encoding='UTF8', newline='') as f:
+ writer = csv.writer(f)
+ # escribir encabezados
+ writer.writerow(['name', 'country', 'city', 'skills'])
+ # escribir datos
+ writer.writerow(['Asabeneh', 'Finland', 'Helsinki', 'JavaScript'])
+```
+
+### Archivos con extensión xlsx
+
+Para leer archivos Excel necesitamos instalar la librería xlrd (u otras alternativas). Ejemplo:
+
+```py
+import xlrd
+excel_book = xlrd.open_workbook('sample.xls')
+print(excel_book.nsheets)
+print(excel_book.sheet_names)
+```
+
+### Archivos con extensión xml
+
+XML es un lenguaje de marcado similar a HTML. Permite etiquetas personalizadas y se usa para datos estructurados. En Python hay varias librerías; aquí usamos xml.etree.ElementTree.
+
+_Ejemplo XML:_
+
+```xml
+
+
+ Asabeneh
+ Finland
+ Helsinki
+
+ JavaScript
+ React
+ Python
+
+
+```
+
+Usamos xml.etree.ElementTree para parsear:
+
+```py
+import xml.etree.ElementTree as ET
+tree = ET.parse('./files/xml_example.xml')
+root = tree.getroot()
+print('Etiqueta raíz:', root.tag)
+print('Atributos:', root.attrib)
+for child in root:
+ print('Campo: ', child.tag)
+```
+
+```sh
+# salida
+Etiqueta raíz: person
+Atributos: {'gender': 'female'}
+Campo: name
+Campo: country
+Campo: city
+Campo: skills
+```
+
+Obtener más detalles:
+
+```py
+import xml.etree.ElementTree as ET
+tree = ET.parse('./files/xml_example.xml')
+root = tree.getroot()
+print('Etiqueta raíz:', root.tag)
+print('Atributos:', root.attrib)
+for child in root:
+ print('Campo: ', child.tag)
+ if child.tag != 'skills':
+ print(child.text)
+ else:
+ for skill in child:
+ print(skill.text)
+```
+
+```sh
+# salida
+Etiqueta raíz: person
+Atributos: {'gender': 'female'}
+field: name
+Asabeneh
+field: country
+Finland
+field: city
+Helsinki
+field: skills
+JavaScript
+React
+Python
+```
+
+## 💻 Ejercicios: Día 19
+
+### Ejercicios: Nivel 1
+
+1. Escribe una función que reciba un parámetro (nombre de archivo) y cuente el número de palabras del archivo.
+2. Lee el archivo obama_speech.txt y cuenta las palabras.
+3. Lee michelle_obama_speech.txt y cuenta las palabras.
+4. Lee donald_speech.txt y cuenta las palabras.
+5. Lee melina_trump_speech.txt y cuenta las palabras.
+
+### Ejercicios: Nivel 2
+
+1. Extrae todos los archivos Python del directorio del curso:
+ a) Recorre la carpeta 30DaysOfPython, extrae todos los archivos .py y guarda sus nombres en files_list.txt
+ b) Crea un script llamado find_python.py que pueda ejecutarse desde la línea de comandos
+ c) Añade una opción --version para manejar argumentos de línea de comandos
+
+### Ejercicios: Nivel 3
+
+1. Crea un archivo JSON a partir del siguiente dataset:
+ ```py
+ python_libraries = [
+ {
+ "nombre_librería": "Django",
+ "creador": "Adrian Holovaty",
+ "primer_año_lanzamiento": 2005,
+ "versión": "4.0.2",
+ "uso": "Desarrollo web",
+ "descripción": "Django permite construir aplicaciones web mejores y más rápido."
+ },
+ {
+ "nombre_librería": "Flask",
+ "creador": "Armin Ronacher",
+ "primer_año_lanzamiento": 2010,
+ "versión": "2.0.2",
+ "uso": "Desarrollo web",
+ "descripción": "Flask es un micro framework WSGI para aplicaciones web."
+ },
+ {
+ "nombre_librería": "NumPy",
+ "creador": "Travis Oliphant",
+ "primer_año_lanzamiento": 2005,
+ "versión": "1.22.0",
+ "uso": "Cómputo científico",
+ "descripción": "NumPy es la biblioteca fundamental para el cómputo científico en Python."
+ },
+ {
+ "nombre_librería": "Pandas",
+ "creador": "Wes McKinney",
+ "primer_año_lanzamiento": 2008,
+ "versión": "1.4.0",
+ "uso": "Análisis de datos",
+ "descripción": "pandas es una librería open source para análisis y manipulación de datos."
+ },
+ {
+ "nombre_librería": "Matplotlib",
+ "creador": "John D. Hunter",
+ "primer_año_lanzamiento": 2003,
+ "versión": "3.5.1",
+ "uso": "Visualización de datos",
+ "descripción": "Matplotlib es una librería para crear visualizaciones estáticas, animadas e interactivas en Python."
+ }
+ ]
+ ```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 18](./18_regular_expressions_sp.md) | [Día 20 >>](./20_python_package_manager_sp.md)
\ No newline at end of file
diff --git a/Spanish/20_python_package_manager_sp.md b/Spanish/20_python_package_manager_sp.md
new file mode 100644
index 000000000..efebceb95
--- /dev/null
+++ b/Spanish/20_python_package_manager_sp.md
@@ -0,0 +1,308 @@
+# 30 Días de Python: Día 20 - PIP
+
+- [Día 20](#-día-20)
+ - [Python PIP - Gestor de paquetes de Python](#python-pip---gestor-de-paquetes-de-python)
+ - [¿Qué es PIP?](#¿qué-es-pip)
+ - [Instalar PIP](#instalar-pip)
+ - [Instalar paquetes con pip](#instalar-paquetes-con-pip)
+ - [Desinstalar paquetes](#desinstalar-paquetes)
+ - [Lista de paquetes](#lista-de-paquetes)
+ - [Mostrar información del paquete](#mostrar-información-del-paquete)
+ - [PIP Freeze](#pip-freeze)
+ - [Leer datos desde una URL](#leer-datos-desde-una-url)
+ - [Crear paquetes](#crear-paquetes)
+ - [Más información sobre paquetes](#más-información-sobre-paquetes)
+ - [Ejercicios: Día 20](#ejercicios-día-20)
+
+# 📘 Día 20
+
+## Python PIP - Gestor de paquetes de Python
+
+### ¿Qué es PIP?
+
+PIP significa Preferred Installer Program, que en español puede traducirse como «programa de instalación preferido». Usamos _pip_ para instalar paquetes de Python.
+Un paquete es una colección de módulos (o subpaquetes) que podemos instalar y luego importar en nuestras aplicaciones.
+En la práctica, en lugar de reescribir utilidades comunes, instalamos paquetes útiles y los importamos.
+
+### Instalar PIP
+
+Si aún no tienes pip instalado, instálalo ahora. En la terminal o símbolo del sistema ejecuta:
+
+```sh
+pip install pip
+```
+
+Comprueba si pip está instalado con:
+
+```sh
+pip --version
+```
+
+```py
+pip --version
+# ejemplo de salida:
+# pip 21.1.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.9.6)
+```
+
+Si ves un número diferente, significa que pip está instalado en tu sistema.
+
+### Instalar paquetes con pip
+
+Probemos a instalar _numpy_, una librería numérica de Python muy usada en ciencia de datos y aprendizaje automático.
+
+- NumPy ofrece:
+ - Potentes arrays N-dimensionales
+ - Operaciones vectorizadas (broadcasting)
+ - Herramientas para integrar con C/C++ y Fortran
+ - Funciones de álgebra lineal, transformadas de Fourier y generadores aleatorios
+
+```sh
+pip install numpy
+```
+
+Ejemplo de uso en el intérprete de Python:
+
+```py
+>>> 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 es otra librería muy usada para estructuras de datos y análisis. Instalémosla:
+
+```sh
+pip install pandas
+```
+
+```py
+>>> import pandas
+```
+
+Esta sección no pretende profundizar en NumPy o Pandas, sino solo mostrar cómo instalar e importar paquetes.
+
+Hay módulos de la librería estándar, por ejemplo _webbrowser_, que permiten abrir sitios web. No necesitan instalación.
+
+```py
+import webbrowser # módulo para abrir sitios web
+
+# lista de URLs de ejemplo
+url_lists = [
+ 'http://www.python.org',
+ 'https://www.linkedin.com/in/asabeneh/',
+ 'https://github.com/Asabeneh',
+ 'https://twitter.com/Asabeneh',
+]
+
+# abrir cada URL en una nueva pestaña
+for url in url_lists:
+ webbrowser.open_new_tab(url)
+```
+
+### Desinstalar paquetes
+
+Para eliminar un paquete instalado:
+
+```sh
+pip uninstall packagename
+```
+
+### Lista de paquetes
+
+Para listar los paquetes instalados en tu entorno:
+
+```sh
+pip list
+```
+
+### Mostrar información del paquete
+
+Para ver información de un paquete:
+
+```sh
+pip show packagename
+```
+
+Ejemplo:
+
+```sh
+pip show pandas
+```
+
+Salida de ejemplo:
+
+```txt
+Name: pandas
+Version: 1.2.3
+Summary: Powerful data structures for data analysis, time series, and statistics
+Home-page: http://pandas.pydata.org
+Author: None
+Author-email: None
+License: BSD
+Location: /usr/local/lib/python3.7/site-packages
+Requires: python-dateutil, pytz, numpy
+Required-by:
+```
+
+Si quieres más detalles puedes añadir --verbose.
+
+### PIP Freeze
+
+Genera una lista de paquetes instalados y sus versiones (útil para requirements.txt):
+
+```sh
+pip freeze
+```
+
+Salida de ejemplo:
+
+```txt
+docutils==0.11
+Jinja2==2.7.2
+MarkupSafe==0.19
+Pygments==1.6
+Sphinx==1.2.2
+```
+
+### Leer datos desde una URL
+
+A veces queremos leer datos desde una URL (por ejemplo APIs que devuelven JSON). Para eso usamos el paquete _requests_.
+
+Instálalo con:
+
+```sh
+pip install requests
+```
+
+En requests veremos métodos y atributos como _get()_, _status_code_, _headers_, _text_, _json()_:
+ - _get()_: solicita una URL y devuelve un objeto Response
+ - _status_code_: código HTTP de la respuesta
+ - _headers_: cabeceras de la respuesta
+ - _text_: contenido en texto
+ - _json()_: parsea JSON y devuelve estructuras de Python
+
+Ejemplo leyendo un archivo de texto desde la web:
+
+```py
+import requests # importar requests
+
+url = 'https://www.w3.org/TR/PNG/iso_8859-1.txt' # URL con texto
+
+response = requests.get(url) # solicitar URL
+print(response)
+print(response.status_code) # código de estado, 200 indica éxito
+print(response.headers) # cabeceras de la respuesta
+print(response.text) # contenido en texto
+```
+
+Ejemplo leyendo una API que devuelve JSON (API de países):
+
+```py
+import requests
+url = 'https://restcountries.eu/rest/v2/all' # API con información de países
+response = requests.get(url)
+print(response) # objeto Response
+print(response.status_code) # 200 indica éxito
+countries = response.json()
+print(countries[:1]) # imprimimos el primer país por brevedad
+```
+
+Veamos otro ejemplo con la API del Banco Mundial (datos de Etiopía):
+
+```py
+import requests
+from pprint import pp # pretty print para mostrar resultados legibles
+
+url = 'http://api.worldbank.org/countries/et?format=json' # API del Banco Mundial para Etiopía
+response = requests.get(url)
+print(response) # objeto Response
+print(response.status_code) # 200 indica éxito
+ethiopia_data = response.json()
+pp(ethiopia_data) # mostrar datos de forma legible
+```
+
+### Crear paquetes
+
+También podemos crear nuestros propios paquetes y subirlos a PyPI. Ejemplo simple: crea un directorio llamado mypackage con un __init__.py (puede estar vacío) y los siguientes módulos.
+
+```py
+# mypackage/arithmetics.py
+def add_numbers(*args):
+ total = 0
+ for num in args:
+ total += num
+ return total
+
+def subtract(a, b):
+ return (a - b)
+
+def multiple(a, b):
+ return a * b
+
+def division(a, b):
+ return a / b
+
+def remainder(a, b):
+ return a % b
+
+def power(a, b):
+ return a ** b
+```
+
+```py
+# mypackage/greet.py
+def greet_person(firstname, lastname):
+ return f'{firstname} {lastname}, welcome to 30DaysOfPython Challenge!'
+```
+
+__init__.py no es estrictamente necesario en Python ≥3.3, pero se recomienda para compatibilidad.
+
+Usando el paquete:
+
+```py
+from mypackage import arithmetics
+print(arithmetics.add_numbers(1, 2, 3, 5))
+print(arithmetics.subtract(5, 3))
+print(arithmetics.multiple(5, 3))
+print(arithmetics.division(5, 3))
+print(arithmetics.remainder(5, 3))
+print(arithmetics.power(5, 3))
+
+from mypackage import greet
+print(greet.greet_person('Juan', 'Pérez'))
+```
+
+### Más información sobre paquetes
+
+- Python tiene paquetes y módulos incorporados; otros deben instalarse.
+- pip es la herramienta recomendada para instalar y gestionar paquetes desde PyPI.
+- Para capturar las dependencias de un proyecto usa pip freeze > requirements.txt.
+- Para desinstalar: pip uninstall packagename o pip uninstall -r requirements.txt.
+- Virtualenv (y venv) permiten crear entornos aislados:
+ - Instalar virtualenv: pip install virtualenv
+ - Crear entornos aislados evita conflictos entre proyectos.
+
+## Ejercicios: Día 20
+
+1. Lee sobre entornos virtuales, crea uno e instala al menos un paquete dentro del entorno.
+
+2. Usa una API de países para obtener todos los datos y encuentra los 10 países más poblados.
+
+3. Encuentra todos los países cuyo idioma oficial sea inglés (código 'eng') a partir de los datos de la API.
+
+4. A partir de los datos de la API, encuentra los 10 países con mayor superficie.
+
+5. Encuentra todos los países recién listados (o filtrados según la API) y ordénalos por capital.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 19](./19_file_handling_sp.md) | [Día 21 >>](./21_classes_and_objects_sp.md)
\ No newline at end of file
diff --git a/Spanish/21_classes_and_objects_sp.md b/Spanish/21_classes_and_objects_sp.md
new file mode 100644
index 000000000..804d40ced
--- /dev/null
+++ b/Spanish/21_classes_and_objects_sp.md
@@ -0,0 +1,416 @@
+# 30 Días de Python: Día 21 - Clases y Objetos
+
+- [Día 21](#-día-21)
+ - [Clases y objetos](#clases-y-objetos)
+ - [Crear una clase](#crear-una-clase)
+ - [Crear un objeto](#crear-un-objeto)
+ - [Constructor de clase](#constructor-de-clase)
+ - [Métodos de instancia](#métodos-de-instancia)
+ - [Valores por defecto de los objetos](#valores-por-defecto-de-los-objetos)
+ - [Modificar valores por defecto de la clase](#modificar-valores-por-defecto-de-la-clase)
+ - [Herencia](#herencia)
+ - [Sobrescribir métodos de la clase padre](#sobrescribir-métodos-de-la-clase-padre)
+ - [💻 Ejercicios: Día 21](#-ejercicios-día-21)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 21
+
+## Clases y objetos
+
+Python es un lenguaje orientado a objetos. En Python todo es un objeto con atributos y métodos. Los números, cadenas, listas, diccionarios, tuplas, conjuntos, etc. que usamos en programas son instancias de las clases incorporadas correspondientes. Creamos clases para definir objetos. Una clase es como un constructor de objetos o un "molde" para crear objetos. Instanciamos una clase para crear un objeto. La clase define las propiedades y el comportamiento, mientras que el objeto representa la instancia.
+
+Desde el inicio de este reto hemos estado usando clases y objetos sin darnos cuenta. Cada elemento en un programa Python es un objeto perteneciente a alguna clase. Veamos que todo en Python pertenece a una clase:
+
+```py
+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)
+
+>>> string = 'string'
+>>> type(string)
+
+>>> boolean = True
+>>> type(boolean)
+
+>>> lst = []
+>>> type(lst)
+
+>>> tpl = ()
+>>> type(tpl)
+
+>>> set1 = set()
+>>> type(set1)
+
+>>> dct = {}
+>>> type(dct)
+
+```
+
+### Crear una clase
+
+Para crear una clase usamos la palabra clave class seguida del nombre de la clase y dos puntos. El nombre de la clase debe usar CamelCase.
+
+```sh
+# sintaxis
+class NombreClase:
+ # código aquí
+```
+
+**Ejemplo:**
+
+```py
+class Person:
+ pass
+print(Person)
+```
+
+```sh
+<__main__.Person object at 0x10804e510>
+```
+
+### Crear un objeto
+
+Creamos un objeto llamando a la clase:
+
+```py
+p = Person()
+print(p)
+```
+
+### Constructor de clase
+
+En el ejemplo anterior creamos un objeto de la clase Person. Sin embargo, una clase sin constructor no es muy útil en la práctica. Usamos el método especial __init__ como constructor en Python. __init__ recibe self, que es la referencia a la instancia actual.
+
+**Ejemplo:**
+
+```py
+class Person:
+ def __init__(self, name):
+ # self permite ligar parámetros a la instancia
+ self.name = name
+
+p = Person('Asabeneh')
+print(p.name)
+print(p)
+```
+
+```sh
+# salida
+Asabeneh
+<__main__.Person object at 0x2abf46907e80>
+```
+
+Añadamos más parámetros al constructor:
+
+```py
+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
+
+p = Person('Asabeneh', 'Yetayeh', 250, 'Finland', 'Helsinki')
+print(p.firstname)
+print(p.lastname)
+print(p.age)
+print(p.country)
+print(p.city)
+```
+
+```sh
+# salida
+Asabeneh
+Yetayeh
+250
+Finland
+Helsinki
+```
+
+### Métodos de instancia
+
+Un objeto puede tener métodos, que son funciones pertenecientes a esa instancia.
+
+**Ejemplo:**
+
+```py
+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} tiene {self.age} años. Vive en {self.city}, {self.country}.'
+
+p = Person('Asabeneh', 'Yetayeh', 250, 'Finland', 'Helsinki')
+print(p.person_info())
+```
+
+```sh
+# salida
+Asabeneh Yetayeh tiene 250 años. Vive en Helsinki, Finland.
+```
+
+### Valores por defecto de los objetos
+
+A veces queremos proporcionar valores por defecto a los parámetros del constructor para evitar errores cuando la clase se instancia sin argumentos.
+
+**Ejemplo:**
+
+```py
+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} tiene {self.age} años. Vive en {self.city}, {self.country}.'
+
+p1 = Person()
+print(p1.person_info())
+p2 = Person('John', 'Doe', 30, 'Nomanland', 'Noman city')
+print(p2.person_info())
+```
+
+```sh
+# salida
+Asabeneh Yetayeh tiene 250 años. Vive en Helsinki, Finland.
+John Doe tiene 30 años. Vive en Noman city, Nomanland.
+```
+
+### Modificar valores por defecto de la clase
+
+En el siguiente ejemplo todos los parámetros del constructor tienen valores por defecto y añadimos un atributo skills y un método add_skill para añadir habilidades.
+
+```py
+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
+ self.skills = []
+
+ def person_info(self):
+ return f'{self.firstname} {self.lastname} tiene {self.age} años. Vive en {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)
+```
+
+```sh
+# salida
+Asabeneh Yetayeh tiene 250 años. Vive en Helsinki, Finland.
+John Doe tiene 30 años. Vive en Noman city, Nomanland.
+['HTML', 'CSS', 'JavaScript']
+[]
+```
+
+### Herencia
+
+La herencia nos permite definir una clase que hereda el comportamiento de otra, facilitando la reutilización del código.
+
+```py
+# sintaxis
+class NombreSubclase(NombreSuperclase):
+ # código aquí
+```
+
+Ejemplo:
+
+```py
+class Student(Person):
+ pass
+
+s1 = Student('Eyob', 'Yetayeh', 30, 'Finland', 'Helsinki')
+s2 = Student('Lidiya', 'Teklemariam', 28, 'Finland', 'Espoo')
+print(s1.person_info())
+s1.add_skill('JavaScript')
+s1.add_skill('React')
+s1.add_skill('Python')
+print(s1.skills)
+print(s2.person_info())
+s2.add_skill('Organizing')
+s2.add_skill('Marketing')
+s2.add_skill('Digital Marketing')
+print(s2.skills)
+```
+
+```sh
+# salida
+Eyob Yetayeh tiene 30 años. Vive en Helsinki, Finland.
+['JavaScript', 'React', 'Python']
+Lidiya Teklemariam tiene 28 años. Vive en Espoo, Finland.
+['Organizing', 'Marketing', 'Digital Marketing']
+```
+
+No hemos definido nuevos métodos en Student, pero puede usar los métodos del padre Person. Student hereda el constructor __init__ y el método person_info de Person. Si queremos añadir comportamiento específico en la subclase, definimos nuevos métodos o redefinimos los existentes.
+
+```py
+class Student(Person):
+ def __init__(self, firstname='Asabeneh', lastname='Yetayeh', age=250, country='Finland', city='Helsinki', gender='male'):
+ self.gender = gender
+ super().__init__(firstname, lastname, age, country, city)
+ def person_info(self):
+ gender = 'él' if self.gender == 'male' else 'ella'
+ return f'{self.firstname} {self.lastname} tiene {self.age} años. {gender.capitalize()} vive en {self.city}, {self.country}.'
+
+s1 = Student('Eyob', 'Yetayeh', 30, 'Finland', 'Helsinki', 'male')
+s2 = Student('Lidiya', 'Teklemariam', 28, 'Finland', 'Espoo', 'female')
+print(s1.person_info())
+s1.add_skill('JavaScript')
+s1.add_skill('React')
+s1.add_skill('Python')
+print(s1.skills)
+print(s2.person_info())
+s2.add_skill('Organizing')
+s2.add_skill('Marketing')
+s2.add_skill('Digital Marketing')
+print(s2.skills)
+```
+
+```sh
+# salida
+Eyob Yetayeh tiene 30 años. Él vive en Helsinki, Finland.
+['JavaScript', 'React', 'Python']
+Lidiya Teklemariam tiene 28 años. Ella vive en Espoo, Finland.
+['Organizing', 'Marketing', 'Digital Marketing']
+```
+
+Podemos usar super() o el nombre de la clase padre para invocar el comportamiento del padre. En el ejemplo anterior sobrescribimos el método person_info en la subclase con una implementación distinta.
+
+### Sobrescribir métodos de la clase padre
+
+Como se mostró, podemos sobrescribir un método del padre definiendo en la subclase un método con el mismo nombre.
+
+## 💻 Ejercicios: Día 21
+
+### Ejercicios: Nivel 1
+
+1. Python tiene un módulo llamado _statistics_ que podemos usar para calcular estadísticas. Ahora intentemos desarrollar una clase que calcule count, sum, min, max, range, mean, median, mode, standard deviation, variance, frequency distribution y describe.
+
+```py
+class Statistics:
+ def __init__(self, data=[]):
+ self.data = data
+
+ def count(self):
+ # tu propia implementación
+ pass
+
+ def sum(self):
+ # tu propia implementación
+ pass
+
+ def min(self):
+ # tu propia implementación
+ pass
+
+ def max(self):
+ # tu propia implementación
+ pass
+
+ def range(self):
+ # tu propia implementación
+ pass
+
+ def mean(self):
+ # tu propia implementación
+ pass
+
+ def median(self):
+ # tu propia implementación
+ pass
+
+ def mode(self):
+ # tu propia implementación
+ pass
+
+ def standard_deviation(self):
+ # tu propia implementación
+ pass
+
+ def variance(self):
+ # tu propia implementación
+ pass
+
+ def frequency_distribution(self):
+ # tu propia implementación
+ pass
+
+ def describe(self):
+ # tu propia implementación
+ pass
+```
+
+```py
+# código de prueba
+data = [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]
+statistics = Statistics(data)
+print('Count:', statistics.count()) # 25
+print('Sum: ', statistics.sum()) # 730
+print('Min: ', statistics.min()) # 24
+print('Max: ', statistics.max()) # 38
+print('Range: ', statistics.range()) # 14
+print('Mean: ', statistics.mean()) # 29.2
+print('Median: ', statistics.median()) # 27
+print('Mode: ', statistics.mode()) # {'mode': 26, 'count': 5}
+print('Standard Deviation: ', statistics.standard_deviation()) # 4.2
+print('Variance: ', statistics.variance()) # 17.5
+print('Frequency Distribution: ', statistics.frequency_distribution()) # [(24, 2), (25, 1), (26, 5), (27, 4), (29, 1), (31, 2), (32, 3), (33, 2), (34, 2), (37, 2), (38, 1)]
+```
+
+### Ejercicios: Nivel 2
+
+1. Crea una clase llamada PersonAccount. Debe tener firstname, lastname, incomes, expenses como atributos y métodos para añadir ingresos, añadir gastos y calcular el balance.
+
+### Ejercicios: Nivel 3
+
+1. El siguiente código es una función; conviértelo en una clase con comportamiento equivalente.
+
+```python
+def print_products(*args, **kwargs):
+ for product in args:
+ print(product)
+ print(kwargs)
+ for key in kwargs:
+ print(f"{key}: {kwargs[key]}")
+
+print_products("apple", "banana", "orange", vegetable="tomato", juice="orange")
+```
+
+```sh
+apple
+banana
+orange
+{'vegetable': 'tomato', 'juice': 'orange'}
+vegetable: tomato
+juice: orange
+```
+
+2. En la clase PersonAccount diseña atributos firstname, lastname, incomes y expenses y añade métodos para calcular el ingreso neto de la persona.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 20](./20_python_package_manager_sp.md) | [Día 22 >>](./22_web_scraping_sp.md)
\ No newline at end of file
diff --git a/Spanish/22_web_scraping_sp.md b/Spanish/22_web_scraping_sp.md
new file mode 100644
index 000000000..43e5b858a
--- /dev/null
+++ b/Spanish/22_web_scraping_sp.md
@@ -0,0 +1,89 @@
+# 30 Días de Python: Día 22 - Web scraping
+
+- [Día 22](#-día-22)
+ - [Web scraping con Python](#web-scraping-con-python)
+ - [¿Qué es el web scraping?](#qué-es-el-web-scraping)
+ - [💻 Ejercicios: Día 22](#-ejercicios-día-22)
+
+# 📘 Día 22
+
+## Web scraping con Python
+
+### ¿Qué es el web scraping?
+
+Internet está lleno de datos que pueden utilizarse para distintos fines. Para recopilar esos datos necesitamos saber cómo extraerlos de sitios web.
+
+El web scraping es el proceso de extraer y recopilar datos de sitios web y almacenarlos en una máquina local o en una base de datos.
+
+En esta sección usaremos los paquetes requests y BeautifulSoup (versión 4).
+
+Para empezar necesitas _requests_,_beautifulsoup4_ y un _sitio web_:
+
+```sh
+pip install requests
+pip install beautifulsoup4
+```
+
+Para hacer scraping necesitas conocimientos básicos de etiquetas HTML y selectores CSS. Usamos etiquetas HTML,clases y/o IDs para localizar contenido en la página.
+Importemos requests y BeautifulSoup:
+
+```py
+import requests
+from bs4 import BeautifulSoup
+```
+
+Declaremos una variable url con el sitio que queremos scrapear:
+
+```py
+import requests
+from bs4 import BeautifulSoup
+url = 'https://archive.ics.uci.edu/ml/datasets.php'
+
+# Usamos requests.get para obtener datos de la URL
+response = requests.get(url)
+# Comprobar el estado
+status = response.status_code
+print(status) # 200 indica éxito
+```
+
+```sh
+200
+```
+
+Parsear el contenido con BeautifulSoup:
+
+```py
+import requests
+from bs4 import BeautifulSoup
+url = 'https://archive.ics.uci.edu/ml/datasets.php'
+
+response = requests.get(url)
+content = response.content # obtenemos todo el contenido del sitio
+soup = BeautifulSoup(content, 'html.parser') # BeautifulSoup nos permite parsear el HTML
+print(soup.title) # UCI Machine Learning Repository: Data Sets
+print(soup.title.get_text()) # UCI Machine Learning Repository: Data Sets
+print(soup.body) # muestra el cuerpo completo de la página
+print(response.status_code)
+
+tables = soup.find_all('table', {'cellpadding':'3'})
+# Localizamos tablas cuyo atributo cellpadding tenga el valor 3
+# Podemos usar id, class o etiquetas HTML para seleccionar elementos; consulta la documentación de BeautifulSoup para más información
+table = tables[0] # el resultado es una lista; tomamos el primer elemento
+for td in table.find('tr').find_all('td'):
+ print(td.text)
+```
+
+Si ejecutas este código verás que la extracción está incompleta.Puedes continuar para completarla,ya que forma parte del ejercicio 1.
+Consulta la documentación de BeautifulSoup para más detalles: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#quick-start
+
+🌕 Vas por muy buen camino.Solo te faltan ocho días para alcanzar una meta impresionante.Ahora haz los ejercicios para practicar.
+
+## 💻 Ejercicios: Día 22
+
+1. Raspa el siguiente sitio y guarda los datos como un archivo JSON (url = 'http://www.bu.edu/president/boston-university-facts-stats/').
+2. Extrae las tablas de esta URL (https://archive.ics.uci.edu/ml/datasets.php) y conviértelas a un archivo JSON.
+3. Raspa la tabla de presidentes y guarda los datos como JSON (https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States).Esta tabla no está muy bien estructurada,por lo que la extracción puede llevar tiempo.
+
+🎉 ¡Felicidades!🎉
+
+[<< Día 21](./21_classes_and_objects_sp.md) | [Día 23 >>](./23_virtual_environment_sp.md)
\ No newline at end of file
diff --git a/Spanish/23_virtual_environment_sp.md b/Spanish/23_virtual_environment_sp.md
new file mode 100644
index 000000000..fd66a3f17
--- /dev/null
+++ b/Spanish/23_virtual_environment_sp.md
@@ -0,0 +1,96 @@
+# 30 Días de Python: Día 23 - Entornos virtuales
+
+- [Día 23](#-día-23)
+ - [Configurar un entorno virtual](#configurar-un-entorno-virtual)
+ - [💻 Ejercicios: Día 23](#-ejercicios-día-23)
+
+# 📘 Día 23
+
+## Configurar un entorno virtual
+
+Al comenzar un proyecto es recomendable usar un entorno virtual. Un entorno virtual nos permite crear un entorno aislado o independiente, evitando conflictos de dependencias entre proyectos. Si ejecutas pip freeze en la terminal verás todos los paquetes instalados en la máquina. Con virtualenv solo tendrás acceso a los paquetes instalados en ese entorno específico. Abre tu terminal e instala virtualenv:
+
+```sh
+pip install virtualenv
+```
+
+Dentro de la carpeta 30DaysOfPython crea un directorio llamado flask_project.
+
+Una vez instalado virtualenv, entra en la carpeta del proyecto y crea el entorno virtual:
+
+Para Mac/Linux:
+```sh
+virtualenv venv
+```
+
+Para Windows:
+```sh
+python -m venv venv
+```
+
+A mí me gusta nombrar el entorno como venv, pero puedes elegir otro nombre. Usa ls (o dir en Windows) para comprobar que venv se creó:
+
+```sh
+ls
+# venv/
+```
+
+Activa el entorno virtual desde la carpeta del proyecto:
+
+Para Mac/Linux:
+```sh
+source venv/bin/activate
+```
+
+En Windows la activación puede variar según PowerShell o Git Bash.
+
+Para Windows PowerShell:
+```sh
+venv\Scripts\activate
+```
+
+Para Windows Git Bash:
+```sh
+venv\Scripts\. activate
+```
+
+Tras ejecutar el comando de activación,el prompt mostrará el nombre del entorno (venv) al inicio.Ejemplo:
+
+```sh
+(venv) user@host:~/Desktop/30DaysOfPython/flask_project$
+```
+
+Ahora,si ejecutas pip freeze no verás los paquetes globales;solo los del entorno.Instalemos Flask para este proyecto:
+
+```sh
+pip install Flask
+```
+
+Después,comprobemos los paquetes instalados:
+
+```sh
+pip freeze
+# ejemplo de salida:
+# Click==7.0
+# Flask==1.1.1
+# itsdangerous==1.1.0
+# Jinja2==2.10.3
+# MarkupSafe==1.1.1
+# Werkzeug==0.16.0
+```
+
+Cuando termines,ejecuta deactivate para salir del entorno activo:
+
+```sh
+deactivate
+```
+
+Los módulos necesarios para trabajar con Flask ya están instalados en el entorno del proyecto.Es buena práctica añadir venv al archivo .gitignore para no subir el entorno a GitHub.
+
+## 💻 Ejercicios: Día 23
+
+1. Crea un directorio de proyecto con un entorno virtual siguiendo el ejemplo anterior.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 22](./22_web_scraping_sp.md) | [Día 24 >>](./24_statistics_sp.md)
\ No newline at end of file
diff --git a/Spanish/24_statistics_sp.md b/Spanish/24_statistics_sp.md
new file mode 100644
index 000000000..191c245e1
--- /dev/null
+++ b/Spanish/24_statistics_sp.md
@@ -0,0 +1,564 @@
+# 30 Días de Python: Día 24 - Estadística
+
+- [Día 24](#-día-24)
+ - [Análisis estadístico con Python](#análisis-estadístico-con-python)
+ - [Estadística](#estadística)
+ - [Datos](#datos)
+ - [Módulo statistics](#módulo-statistics)
+- [NumPy](#numpy)
+ - [Importar NumPy](#importar-numpy)
+ - [Crear arrays con NumPy](#crear-arrays-con-numpy)
+ - [Crear arrays enteros con NumPy](#crear-arrays-enteros-con-numpy)
+ - [Crear arrays float con NumPy](#crear-arrays-float-con-numpy)
+ - [Crear arrays booleanos con NumPy](#crear-arrays-booleanos-con-numpy)
+ - [Crear arrays multidimensionales con NumPy](#crear-arrays-multidimensionales-con-numpy)
+ - [Convertir arrays de NumPy a listas](#convertir-arrays-de-numpy-a-listas)
+ - [Crear arrays desde tuplas](#crear-arrays-desde-tuplas)
+ - [Forma (shape) de arrays de NumPy](#forma-shape-de-arrays-de-numpy)
+ - [Tipo de datos de arrays de NumPy](#tipo-de-datos-de-arrays-de-numpy)
+ - [Tamaño (size) de arrays de NumPy](#tamaño-size-de-arrays-de-numpy)
+ - [Operaciones matemáticas con NumPy](#operaciones-matemáticas-con-numpy)
+ - [Suma](#suma)
+
+# 📘 Día 24
+
+## Análisis estadístico con Python
+
+## Estadística
+
+La estadística es la disciplina que estudia la recolección, organización, presentación, análisis, interpretación y comunicación de datos.
+La estadística es una rama de las matemáticas y es un conocimiento previo recomendable para ciencia de datos y machine learning. Es un campo muy amplio; en esta sección nos centraremos solo en las partes más relevantes.
+Al completar este reto puedes avanzar hacia desarrollo web, análisis de datos, machine learning o ciencia de datos. En algún punto de tu carrera profesional te enfrentarás a datos que necesitan ser procesados. Tener nociones de estadística te ayudará a tomar decisiones basadas en datos: como dice el dicho, "los datos nos hablan".
+
+## Datos
+
+¿Qué son los datos? Los datos son cualquier conjunto de caracteres recogidos y transformados con algún propósito, usualmente para análisis. Pueden ser texto, números, imágenes, audio o vídeo. Si los datos carecen de contexto son poco útiles para humanos o máquinas. Para extraer significado necesitamos herramientas que los procesen.
+
+El flujo de trabajo en análisis de datos, ciencia de datos o machine learning comienza siempre por los datos. Pueden provenir de fuentes externas o ser generados. Existen datos estructurados y no estructurados.
+
+Los datos pueden ser pequeños o masivos. Muchos de los formatos de datos que encontrarás ya se han presentado en la sección de manejo de archivos.
+
+## Módulo statistics
+
+El módulo _statistics_ de Python ofrece funciones para cálculos estadísticos sobre datos numéricos. No compite con bibliotecas avanzadas de terceros (NumPy, SciPy) ni con paquetes profesionales de estadística, sino que provee funcionalidades a un nivel similar al de calculadoras científicas o gráficas.
+
+# NumPy
+
+Como lenguaje general, Python se potencia con librerías como numpy, scipy, matplotlib y pandas, transformándose en un entorno potente para computación científica.
+
+NumPy es la librería central para computación científica en Python; ofrece arrays multidimensionales de alto rendimiento y herramientas para operar con ellos.
+
+Para trabajar con notebooks es recomendable usar Jupyter. Puedes instalar Anaconda para disponer de Jupyter y muchas librerías preinstaladas.
+
+```sh
+pip install numpy
+```
+
+## Importar NumPy
+
+Si usas Jupyter (recomendado), puedes seguir este notebook de ejemplo.
+
+```py
+# cómo importar numpy
+import numpy as np
+# cómo comprobar la versión de numpy
+print('numpy:', np.__version__)
+# ver métodos disponibles
+print(dir(np))
+```
+
+## Crear arrays con NumPy
+
+### Crear arrays enteros con NumPy
+
+```py
+# crear una lista de Python
+python_list = [1,2,3,4,5]
+
+# comprobar tipo
+print('Type:', type(python_list)) #
+print(python_list) # [1, 2, 3, 4, 5]
+
+two_dimensional_list = [[0,1,2], [3,4,5], [6,7,8]]
+print(two_dimensional_list) # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
+
+# crear un array NumPy desde la lista de Python
+numpy_array_from_list = np.array(python_list)
+print(type(numpy_array_from_list)) #
+print(numpy_array_from_list) # array([1, 2, 3, 4, 5])
+```
+
+### Crear arrays float con NumPy
+
+```py
+# lista de Python
+python_list = [1,2,3,4,5]
+
+numpy_array_from_list2 = np.array(python_list, dtype=float)
+print(numpy_array_from_list2) # array([1., 2., 3., 4., 5.])
+```
+
+### Crear arrays booleanos con NumPy
+
+```py
+numpy_bool_array = np.array([0, 1, -1, 0, 0], dtype=bool)
+print(numpy_bool_array) # array([False, True, True, False, False])
+```
+
+### Crear arrays multidimensionales con NumPy
+
+Un array de NumPy puede tener múltiples filas y columnas:
+
+```py
+two_dimensional_list = [[0,1,2], [3,4,5], [6,7,8]]
+numpy_two_dimensional_list = np.array(two_dimensional_list)
+print(type(numpy_two_dimensional_list))
+print(numpy_two_dimensional_list)
+```
+
+```sh
+
+[[0 1 2]
+ [3 4 5]
+ [6 7 8]]
+```
+
+### Convertir arrays de NumPy a listas
+
+```py
+# podemos usar tolist() para convertir un array a lista de Python
+np_to_list = numpy_array_from_list.tolist()
+print(type(np_to_list))
+print('Array 1D:', np_to_list)
+print('Array 2D: ', numpy_two_dimensional_list.tolist())
+```
+
+```sh
+
+Array 1D: [1, 2, 3, 4, 5]
+Array 2D: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
+```
+
+### Crear arrays desde tuplas
+
+```py
+# crear una tupla en Python
+python_tuple = (1,2,3,4,5)
+print(type(python_tuple)) #
+print('python_tuple: ', python_tuple) # python_tuple: (1, 2, 3, 4, 5)
+
+numpy_array_from_tuple = np.array(python_tuple)
+print(type(numpy_array_from_tuple)) #
+print('numpy_array_from_tuple: ', numpy_array_from_tuple) # numpy_array_from_tuple: [1 2 3 4 5]
+```
+
+### Forma (shape) de arrays de NumPy
+
+El método shape devuelve una tupla con la forma del array: filas y columnas. Si el array es 1D devuelve su longitud.
+
+```py
+nums = np.array([1, 2, 3, 4, 5])
+print(nums)
+print('Forma de nums: ', nums.shape)
+print(numpy_two_dimensional_list)
+print('Forma de numpy_two_dimensional_list: ', numpy_two_dimensional_list.shape)
+three_by_four_array = np.array([[0, 1, 2, 3],
+ [4,5,6,7],
+ [8,9,10, 11]])
+print(three_by_four_array.shape)
+```
+
+```sh
+[1 2 3 4 5]
+Forma de nums: (5,)
+[[0 1 2]
+ [3 4 5]
+ [6 7 8]]
+Forma de numpy_two_dimensional_list: (3, 3)
+(3, 4)
+```
+
+### Tipo de datos de arrays de NumPy
+
+Tipos de datos: str, int, float, complex, bool, list, None
+
+```py
+int_lists = [-3, -2, -1, 0, 1, 2,3]
+int_array = np.array(int_lists)
+float_array = np.array(int_lists, dtype=float)
+
+print(int_array)
+print(int_array.dtype)
+print(float_array)
+print(float_array.dtype)
+```
+
+```sh
+[-3 -2 -1 0 1 2 3]
+int64
+[-3. -2. -1. 0. 1. 2. 3.]
+float64
+```
+
+### Tamaño (size) de arrays de NumPy
+
+Para conocer el número de elementos de un array utilizamos size:
+
+```py
+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]])
+
+print('Tamaño:', numpy_array_from_list.size) # 5
+print('Tamaño:', two_dimensional_list.size) # 9
+```
+
+```sh
+Tamaño: 5
+Tamaño: 9
+```
+
+## Operaciones matemáticas con NumPy
+
+Los arrays de NumPy permiten operaciones vectorizadas sin necesidad de bucles.
+
+Operaciones disponibles:
+
+- Suma (+)
+- Resta (-)
+- Multiplicación (*)
+- División (/)
+- Módulo (%)
+- División entera (//)
+- Potencia (**)
+
+### Suma
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('Suma: ', numpy_array_from_list + 2)
+print('Suma: ', np.add(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+Suma: [3 4 5 6 7]
+Suma: [3 4 5 6 7]
+```
+
+### Resta
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('Resta: ', numpy_array_from_list - 2)
+print('Resta: ', np.subtract(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+Resta: [-1 0 1 2 3]
+Resta: [-1 0 1 2 3]
+```
+
+### Multiplicación
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('Multiplicación: ', numpy_array_from_list * 2)
+print('Multiplicación: ', np.multiply(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+Multiplicación: [ 2 4 6 8 10]
+Multiplicación: [ 2 4 6 8 10]
+```
+
+### División
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('División: ', numpy_array_from_list / 2)
+print('División: ', np.divide(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+División: [0.5 1. 1.5 2. 2.5]
+División: [0.5 1. 1.5 2. 2.5]
+```
+
+### Módulo
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('Módulo: ', numpy_array_from_list % 2)
+print('Módulo: ', np.mod(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+Módulo: [1 0 1 0 1]
+Módulo: [1 0 1 0 1]
+```
+
+### División entera
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('División entera: ', numpy_array_from_list // 2)
+print('División entera: ', np.floor_divide(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+División entera: [0 1 1 2 2]
+División entera: [0 1 1 2 2]
+```
+
+### Potencia
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5])
+print('Array original: ', numpy_array_from_list)
+print('Potencia: ', numpy_array_from_list ** 2)
+print('Potencia: ', np.power(numpy_array_from_list, 2))
+```
+
+```sh
+Array original: [1 2 3 4 5]
+Potencia: [ 1 4 9 16 25]
+Potencia: [ 1 4 9 16 25]
+```
+
+## Comprobar tipos de datos
+
+```py
+numpy_int_arr = np.array([1, 2, 3, 4])
+numpy_float_arr = np.array([1.1, 2.0, 3.2])
+numpy_bool_arr = np.array([-3, -2, 0, 1, 2, 3], dtype='bool')
+
+print(numpy_int_arr.dtype)
+print(numpy_float_arr.dtype)
+print(numpy_bool_arr.dtype)
+```
+
+```sh
+int64
+float64
+bool
+```
+
+## Convertir tipos
+
+Podemos convertir tipos con astype:
+
+```py
+numpy_int_arr = np.array([1, 2, 3, 4], dtype='float')
+numpy_int_arr.astype('int').dtype
+numpy_float_arr = np.array([1.1, 2.0, 3.2])
+numpy_float_arr.astype('int').dtype
+numpy_int_arr = np.array([-3, -2, 0, 1, 2, 3])
+numpy_int_arr.astype('bool').dtype
+```
+
+```sh
+int64
+int64
+bool
+```
+
+## Arrays multidimensionales
+
+Una de las ventajas de NumPy es el manejo de arrays multidimensionales:
+
+```py
+two_dimension_array = np.array([(1,2,3),(4,5,6), (7,8,9)])
+print(type(two_dimension_array))
+print(two_dimension_array)
+print('Forma: ', two_dimension_array.shape)
+print('Tamaño: ', two_dimension_array.size)
+print('Tipo de datos: ', two_dimension_array.dtype)
+```
+
+```sh
+
+[[1 2 3]
+ [4 5 6]
+ [7 8 9]]
+Forma: (3, 3)
+Tamaño: 9
+Tipo de datos: int64
+```
+
+### Acceder a elementos en arrays NumPy
+
+```py
+two_dimension_array = np.array([[1,2,3],[4,5,6], [7,8,9]])
+first_row = two_dimension_array[0]
+second_row = two_dimension_array[1]
+third_row = two_dimension_array[2]
+print('Primera fila:', first_row)
+print('Segunda fila:', second_row)
+print('Tercera fila: ', third_row)
+```
+
+```sh
+Primera fila: [1 2 3]
+Segunda fila: [4 5 6]
+Tercera fila: [7 8 9]
+```
+
+Obtener columnas:
+
+```py
+first_column= two_dimension_array[:,0]
+second_column = two_dimension_array[:,1]
+third_column = two_dimension_array[:,2]
+print('Primera columna:', first_column)
+print('Segunda columna:', second_column)
+print('Tercera columna: ', third_column)
+```
+
+```sh
+Primera columna: [1 4 7]
+Segunda columna: [2 5 8]
+Tercera columna: [3 6 9]
+```
+
+## Slicing en arrays NumPy
+
+El slicing es similar al de listas, pero admite dos dimensiones.
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+print('Array original:', numpy_array_from_list)
+
+# primer parámetro: inicio
+# segundo parámetro: parada
+# tercer parámetro: paso
+
+ten_first_items = numpy_array_from_list[0:10]
+print('Primeras 10:', ten_first_items)
+first_five_items = numpy_array_from_list[:5]
+print('Primeras 5:', first_five_items)
+last_five_items = numpy_array_from_list[5:]
+print('Últimas 5:', last_five_items)
+# índice negativo
+last_five_items = numpy_array_from_list[-5:]
+print('Últimas 5:', last_five_items)
+```
+
+```sh
+Array original: [ 1 2 3 4 5 6 7 8 9 10]
+Primeras 10: [ 1 2 3 4 5 6 7 8 9 10]
+Primeras 5: [1 2 3 4 5]
+Últimas 5: [ 6 7 8 9 10]
+Últimas 5: [ 6 7 8 9 10]
+```
+
+Seleccionar cada segundo elemento:
+
+```py
+every_two_item = numpy_array_from_list[::2]
+print('Cada dos elementos:', every_two_item)
+```
+
+```sh
+Cada dos elementos: [1 3 5 7 9]
+```
+
+Invertir array:
+
+```py
+reversed_array = numpy_array_from_list[::-1]
+print('Array invertido:', reversed_array)
+```
+
+```sh
+Array invertido: [10 9 8 7 6 5 4 3 2 1]
+```
+
+Slicing en 2D:
+
+```py
+two_dimension_array = np.array([[1,2,3],[4,5,6], [7,8,9]])
+print(two_dimension_array)
+print(two_dimension_array[1, 1])
+print(two_dimension_array[1, 1:3])
+print(two_dimension_array[1:3, 1:3])
+```
+
+```sh
+[[1 2 3]
+ [4 5 6]
+ [7 8 9]]
+5
+[5 6]
+[[5 6]
+ [8 9]]
+```
+
+## Concatenación de arrays en NumPy
+
+```py
+first_array = np.array([1, 2, 3])
+second_array = np.array([4, 5, 6])
+third_array = np.array([7, 8, 9])
+print('Primer array:', first_array)
+print('Segundo array:', second_array)
+print('Tercer array:', third_array)
+```
+
+```sh
+Primer array: [1 2 3]
+Segundo array: [4 5 6]
+Tercer array: [7 8 9]
+```
+
+### Concatenación horizontal
+
+```py
+horizontal_concat = np.hstack((first_array, second_array, third_array))
+print('Concatenación horizontal:', horizontal_concat)
+```
+
+```sh
+Concatenación horizontal: [1 2 3 4 5 6 7 8 9]
+```
+
+### Concatenación vertical
+
+```py
+vertical_concat = np.vstack((first_array, second_array, third_array))
+print('Concatenación vertical:', vertical_concat)
+```
+
+```sh
+Concatenación vertical:
+[[1 2 3]
+ [4 5 6]
+ [7 8 9]]
+```
+
+## Funciones comunes de NumPy
+
+### Mínimo, máximo, media, mediana y percentiles
+
+```py
+numpy_array_from_list = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+print('Mínimo:', numpy_array_from_list.min())
+print('Máximo:', numpy_array_from_list.max())
+print('Media:', numpy_array_from_list.mean())
+```
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 23](./23_virtual_environment_sp.md) | [Día 25 >>](./25_pandas_sp.md)
\ No newline at end of file
diff --git a/Spanish/25_pandas_sp.md b/Spanish/25_pandas_sp.md
new file mode 100644
index 000000000..b4940cce6
--- /dev/null
+++ b/Spanish/25_pandas_sp.md
@@ -0,0 +1,536 @@
+# 30 días de desafío de programación en Python: Día 25 - Pandas
+
+- [Día 25](#-día-25)
+ - [Pandas](#pandas)
+ - [InstalarPandas](#instalarpandas)
+ - [ImportarPandas](#importarpandas)
+ - [Crear serie de Pandas con índice por defecto](#crear-serie-de-pandas-con-índice-por-defecto)
+ - [Crear serie de Pandas con índice personalizado](#crear-serie-de-pandas-con-índice-personalizado)
+ - [Crear serie de Pandas a partir de un diccionario](#crear-serie-de-pandas-a-partir-de-un-diccionario)
+ - [Crear serie de Pandas constante](#crear-serie-de-pandas-constante)
+ - [Crear serie de Pandas con Linspace](#crear-serie-de-pandas-con-linspace)
+ - [DataFrames](#dataframes)
+ - [Crear DataFrame a partir de una lista de listas](#crear-dataframe-a-partir-de-una-lista-de-listas)
+ - [Crear DataFrame a partir de un diccionario](#crear-dataframe-a-partir-de-un-diccionario)
+ - [Crear DataFrame a partir de una lista de diccionarios](#crear-dataframe-a-partir-de-una-lista-de-diccionarios)
+ - [Leer archivos CSV con Pandas](#leer-archivos-csv-con-pandas)
+ - [Exploración de datos](#exploración-de-datos)
+ - [Modificar DataFrame](#modificar-dataframe)
+ - [Crear DataFrame](#crear-dataframe)
+ - [Añadir nueva columna](#añadir-nueva-columna)
+ - [Modificar valores de una columna](#modificar-valores-de-una-columna)
+ - [Formatear columnas del DataFrame](#formatear-columnas-del-dataframe)
+ - [Comprobar tipos de datos de columnas](#comprobar-tipos-de-datos-de-columnas)
+ - [Indexación booleana](#indexación-booleana)
+ - [Ejercicios: Día 25](#ejercicios-día-25)
+
+# 📘 Día 25
+
+## Pandas
+
+Pandas es una librería open source, de alto rendimiento y fácil de usar para el manejo y análisis de estructuras de datos en Python.
+Pandas aporta estructuras y herramientas para manejar datos tabulares: *Series* y *DataFrames*.
+Pandas proporciona utilidades para operaciones de datos como:
+
+- reshape (remodelar)
+- merge (fusionar)
+- sort (ordenar)
+- slice (rebanar)
+- aggregate (agregar)
+- interpolate (interpolar)
+
+Si usas Anaconda no es necesario instalar pandas.
+
+### InstalarPandas
+
+Para Mac:
+```sh
+pip install conda
+conda install pandas
+```
+
+Para Windows:
+```sh
+pip install conda
+pip install pandas
+```
+
+Las estructuras de datos de Pandas se basan en *Series* y *DataFrames*.
+
+Una *Serie* es una columna, mientras que un DataFrame es una tabla multidimensional compuesta por un conjunto de *Series*. Para crear una serie de Pandas, debemos usar un array unidimensional de NumPy o una lista de Python.
+Veamos un ejemplo de una serie:
+
+Serie de Pandas de nombres
+
+
+
+Serie de países
+
+
+
+Serie de ciudades
+
+
+
+Como puedes ver, una serie de Pandas es simplemente una columna de datos. Si queremos tener varias columnas, usamos un DataFrame. El siguiente ejemplo muestra un DataFrame de Pandas.
+
+Veamos un ejemplo de un DataFrame de Pandas:
+
+
+
+Un DataFrame es una colección de filas y columnas. Mira la tabla a continuación; tiene más columnas que el ejemplo anterior:
+
+
+
+A continuación, veremos cómo importar Pandas y cómo crear Series y DataFrames con Pandas.
+
+### Importar Pandas
+
+```python
+import pandas as pd # importar pandas como pd
+import numpy as np # importar numpy como np
+```
+
+### Crear serie de Pandas con índice por defecto
+
+```python
+nums = [1, 2, 3, 4,5]
+s = pd.Series(nums)
+print(s)
+```
+
+```sh
+0 1
+1 2
+2 3
+3 4
+4 5
+dtype: int64
+```
+
+### Crear serie de Pandas con índice personalizado
+
+```python
+nums = [1, 2, 3, 4, 5]
+s = pd.Series(nums, index=[1, 2, 3, 4, 5])
+print(s)
+```
+
+```sh
+1 1
+2 2
+3 3
+4 4
+5 5
+dtype: int64
+```
+
+```python
+fruits = ['Orange','Banana','Mango']
+fruits = pd.Series(fruits, index=[1, 2, 3])
+print(fruits)
+```
+
+```sh
+1 Orange
+2 Banana
+3 Mango
+dtype: object
+```
+
+### Crear serie de Pandas a partir de un diccionario
+
+```python
+dct = {'name':'Asabeneh','country':'Finland','city':'Helsinki'}
+```
+
+```python
+s = pd.Series(dct)
+print(s)
+```
+
+```sh
+name Asabeneh
+country Finland
+city Helsinki
+dtype: object
+```
+
+### Crear serie de Pandas constante
+
+```python
+s = pd.Series(10, index = [1, 2, 3])
+print(s)
+```
+
+```sh
+1 10
+2 10
+3 10
+dtype: int64
+```
+
+### Crear serie de Pandas con Linspace
+
+```python
+s = pd.Series(np.linspace(5, 20, 10)) # linspace(inicio, fin, número_de_elementos)
+print(s)
+```
+
+```sh
+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 DataFrame se puede crear de diferentes maneras:
+
+- Crear a partir de una lista de listas
+- Crear a partir de un diccionario
+- Crear a partir de una lista de diccionarios
+- Crear a partir de un archivo CSV
+
+### Crear DataFrame a partir de una lista de listas
+
+```python
+data = [
+ ['Asabeneh', 'Finland', 'Helsinki'],
+ ['David', 'UK', 'London'],
+ ['John', 'Sweden', 'Stockholm']
+]
+df = pd.DataFrame(data, columns=['Name', 'Country', 'City'])
+print(df)
+```
+
+```sh
+ Name Country City
+0 Asabeneh Finland Helsinki
+1 David UK London
+2 John Sweden Stockholm
+```
+
+### Crear DataFrame a partir de un diccionario
+
+```python
+data = {'Name': ['Asabeneh', 'David', 'John'], 'Country':[
+ 'Finland', 'UK', 'Sweden'], 'City': ['Helsinki', 'London', 'Stockholm']}
+df = pd.DataFrame(data)
+print(df)
+```
+
+```sh
+ Name Country City
+0 Asabeneh Finland Helsinki
+1 David UK London
+2 John Sweden Stockholm
+```
+
+### Crear DataFrame a partir de una lista de diccionarios
+
+```python
+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)
+```
+
+```sh
+ Name Country City
+0 Asabeneh Finland Helsinki
+1 David UK London
+2 John Sweden Stockholm
+```
+
+## Leer archivos CSV con Pandas
+
+Leamos el archivo en el directorio de datos, leeremos el archivo weight-height.csv pasando la ruta del archivo como parámetro a la función pd.read_csv(). Usemos el método head() para ver las primeras cinco filas.
+
+```python
+import pandas as pd
+
+df = pd.read_csv('./data/weight-height.csv')
+print(df.head()) # por defecto muestra las primeras 5 filas
+```
+
+```sh
+ Gender Height Weight
+0 Male 73.847017 241.893563
+1 Male 68.781904 162.310473
+2 Male 74.110105 212.740856
+3 Male 71.730978 220.042470
+4 Male 69.881796 206.349801
+```
+
+Veamos las últimas cinco filas usando el método tail():
+
+```python
+print(df.tail()) # últimas 5 filas
+```
+
+```sh
+ Gender Height Weight
+9995 Female 66.172652 136.777454
+9996 Female 67.067155 170.867906
+9997 Female 63.867992 128.475319
+9998 Female 69.034243 163.852461
+9999 Female 61.944246 113.649103
+```
+
+### Exploración de datos
+
+Obtenemos el número de filas y columnas con la propiedad shape:
+```python
+print(df.shape) # número de filas y columnas
+```
+
+```sh
+(10000, 3)
+```
+
+Como puedes ver, este conjunto de datos tiene 10000 filas y 3 columnas. Obtengamos más información sobre los datos:
+
+```python
+print(df.columns) # nombres de las columnas
+print(df.head(10)) # primeras 10 filas
+print(df.tail(10)) # últimas 10 filas
+print(df['Gender'].value_counts()) # contar cuántos hay de cada uno
+print(df.describe()) # resumen estadístico de los datos
+```
+
+```sh
+Index(['Gender', 'Height', 'Weight'], dtype='object')
+ Gender Height Weight
+0 Male 73.847017 241.893563
+1 Male 68.781904 162.310473
+2 Male 74.110105 212.740856
+3 Male 71.730978 220.042470
+4 Male 69.881796 206.349801
+5 Male 68.767792 152.212156
+6 Male 67.961960 183.927889
+7 Male 68.563817 175.929316
+8 Male 71.267570 196.028855
+9 Male 72.040119 205.801386
+ Gender Height Weight
+9990 Female 64.744846 139.725595
+9991 Female 62.109532 132.451630
+9992 Female 62.593008 130.727432
+9993 Female 62.100222 131.220717
+9994 Female 63.421888 133.330246
+9995 Female 66.172652 136.777454
+9996 Female 67.067155 170.867906
+9997 Female 63.867992 128.475319
+9998 Female 69.034243 163.852461
+9999 Female 61.944246 113.649103
+Gender
+Male 5000
+Female 5000
+Name: count, dtype: int64
+ Height Weight
+count 10000.000000 10000.000000
+mean 66.367560 161.440357
+std 3.847528 32.108439
+min 54.263133 64.700127
+25% 63.505620 135.818051
+50% 66.318070 161.212928
+75% 69.174262 187.169525
+max 78.998742 269.989699
+```
+
+## Modificar DataFrame
+
+### Crear DataFrame
+
+Primero, creemos un DataFrame usando lo que aprendimos anteriormente:
+
+```python
+# importar pandas y numpy
+import pandas as pd
+import numpy as np
+# datos
+data = [
+ {"Name": "Juan Pérez", "Country":"China", "City":"Shanghái"},
+ {"Name": "Luis", "Country":"China", "City":"Pekín"},
+ {"Name": "Carlos", "Country":"China", "City":"Cantón"}]
+# crear DataFrame
+df = pd.DataFrame(data)
+print(df)
+```
+
+```sh
+ Name Country City
+0 Juan Pérez China Shanghái
+1 Luis China Pekín
+2 Carlos China Cantón
+```
+
+### Añadir nueva columna
+
+```python
+weights = [74, 78, 69]
+df['Weight'] = weights
+df
+```
+
+```sh
+ Name Country City Weight
+0 Juan Pérez China Shanghái 74
+1 Luis China Pekín 78
+2 Carlos China Cantón 69
+```
+
+```python
+heights = [173, 175, 169]
+df['Height'] = heights
+df
+```
+
+```sh
+ Name Country City Weight Height
+0 Juan Pérez China Shanghái 74 173
+1 Luis China Pekín 78 175
+2 Carlos China Cantón 69 169
+```
+
+### Modificar valores de una columna
+
+Podemos modificar una columna de tres maneras:
+
+1. Asignación directa:
+```python
+df['Name'] = ['Miguel', 'Ana', 'Sofía']
+df
+```
+
+```sh
+ Name Country City Weight Height
+0 Miguel China Shanghái 74 173
+1 Ana China Pekín 78 175
+2 Sofía China Cantón 69 169
+```
+
+2. Modificando con loc:
+```python
+df.loc[1, 'Name'] = 'Lucía'
+df
+```
+
+```sh
+ Name Country City Weight Height
+0 Miguel China Shanghái 74 173
+1 Lucía China Pekín 78 175
+2 Sofía China Cantón 69 169
+```
+
+3. Modificando con iloc:
+```python
+print('Datos originales:\n', df)
+df.iloc[1, 0] = 'Paco'
+print('Datos modificados:\n', df)
+```
+
+```sh
+Datos originales:
+ Name Country City Weight Height
+0 Miguel China Shanghái 74 173
+1 Lucía China Pekín 78 175
+2 Sofía China Cantón 69 169
+Datos modificados:
+ Name Country City Weight Height
+0 Miguel China Shanghái 74 173
+1 Paco China Pekín 78 175
+2 Sofía China Cantón 69 169
+```
+
+### Formatear columnas del DataFrame
+
+```python
+# añadir columna BMI: peso(kg) / altura^2(m). Redondear a 2 decimales.
+df['BMI'] = np.round(df['Weight'] / ((df['Height'] * 0.01) ** 2), 2)
+print(df)
+```
+
+```sh
+ Name Country City Weight Height BMI
+0 Miguel China Shanghái 74 173 24.73
+1 Paco China Pekín 78 175 25.47
+2 Sofía China Cantón 69 169 24.16
+```
+
+## Comprobar tipos de datos de columnas
+
+```python
+print(df.dtypes)
+```
+
+```sh
+Name object
+Country object
+City object
+Weight int64
+Height int64
+BMI float64
+dtype: object
+```
+
+### Indexación booleana
+
+```python
+# crear DataFrame
+df = pd.DataFrame({
+ 'name': ['Juan', 'Luis', 'Carlos', 'Pedro'],
+ 'country': ['China', 'Estados Unidos', 'Reino Unido', 'España'],
+ 'age': [25, 15, 22, 28],
+ 'empleado': [True, False, True, False]
+})
+
+print(df)
+```
+
+```sh
+ name country age empleado
+0 Juan China 25 True
+1 Luis Estados Unidos 15 False
+2 Carlos Reino Unido 22 True
+3 Pedro España 28 False
+```
+
+Filtrando edad > 20 y empleado == True:
+```python
+print(df[(df['age'] > 20) & (df['empleado'] == True)])
+```
+
+```sh
+ name country age empleado
+0 Juan China 25 True
+2 Carlos Reino Unido 22 True
+```
+
+## Ejercicios: Día 25
+
+1. Lee el archivo [hacker_news.csv](../data/hacker_news.csv) y muestra las primeras cinco filas.
+2. Obtén la columna de títulos.
+3. Obtén el número de filas y columnas.
+4. Obtén las primeras diez y las últimas diez filas.
+5. Obtén la segunda y cuarta fila, columnas 2 a 4.
+6. Filtra las filas cuyo tema sea Python.
+7. Cuenta cuántas filas tienen tema Python.
+8. Filtra las filas con votos mayores a 200.
+9. Ordena el DataFrame por votos (ascendente).
+10. Ordena el DataFrame por votos (descendente).
+11. Excluye las filas con tema Python y ordena por votos.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 24](./24_statistics_sp.md) | [Día 26 >>](./26_python_web_sp.md)
\ No newline at end of file
diff --git a/Spanish/26_python_web_sp.md b/Spanish/26_python_web_sp.md
new file mode 100644
index 000000000..cf4fa826e
--- /dev/null
+++ b/Spanish/26_python_web_sp.md
@@ -0,0 +1,816 @@
+# 30 días de desafío de programación en Python: Día 26 - Programación web con Python
+
+- [Día 26](#-día-26)
+ - [Programación web con Python](#programación-web-con-python)
+ - [Flask](#flask)
+ - [Estructura de carpetas](#estructura-de-carpetas)
+ - [Configurar el proyecto](#configurar-el-proyecto)
+ - [Crear rutas](#crear-rutas)
+ - [Crear plantillas](#crear-plantillas)
+ - [Script de Python](#script-de-python)
+ - [Navegación](#navegación)
+ - [Crear plantilla base](#crear-plantilla-base)
+ - [Servir archivos estáticos](#servir-archivos-estáticos)
+ - [Despliegue](#despliegue)
+ - [Crear cuenta en Heroku](#crear-cuenta-en-heroku)
+ - [Iniciar sesión en Heroku](#iniciar-sesión-en-heroku)
+ - [Crear requirements y Procfile](#crear-requirements-y-procfile)
+ - [Enviar el proyecto a Heroku](#enviar-el-proyecto-a-heroku)
+ - [Ejercicios: Día 26](#ejercicios-día-26)
+
+# 📘 Día 26
+
+## Programación web con Python
+
+Python es un lenguaje de programación versátil que se puede utilizar para una variedad de propósitos. En esta sección, veremos cómo usar Python para el desarrollo web. Python tiene muchos marcos web disponibles. Django y Flask son los más populares. Hoy, aprenderemos a usar Flask para el desarrollo web.
+
+### Flask
+
+Flask es un marco de desarrollo web escrito en Python. Flask utiliza el motor de plantillas Jinja2. Flask también se puede usar con otras bibliotecas modernas de frontend como React.
+
+Si aún no has instalado el paquete virtualenv, instálalo primero. Un entorno virtual permitirá aislar las dependencias del proyecto de las dependencias de la máquina local.
+
+#### Estructura de carpetas
+
+Después de completar todos los pasos, la estructura de archivos de tu proyecto debería ser la siguiente:
+
+```sh
+├── Procfile
+├── app.py
+├── env
+│ ├── bin
+├── requirements.txt
+├── static
+│ └── css
+│ └── main.css
+└── templates
+ ├── about.html
+ ├── home.html
+ ├── layout.html
+ ├── post.html
+ └── result.html
+```
+
+### Configurar el proyecto
+
+Comienza a usar Flask siguiendo estos pasos.
+
+Paso 1: Instala virtualenv con el siguiente comando.
+
+```sh
+pip install virtualenv
+```
+
+Paso 2:
+
+```sh
+asabeneh@Asabeneh:~/Desktop$ mkdir python_for_web
+asabeneh@Asabeneh:~/Desktop$ cd python_for_web/
+asabeneh@Asabeneh:~/Desktop/python_for_web$ virtualenv venv
+asabeneh@Asabeneh:~/Desktop/python_for_web$ source venv/bin/activate
+(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ pip freeze
+(env) asabeneh@Asabeneh:~/Desktop/python_for_web$ pip install Flask
+(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$
+```
+
+Hemos creado un directorio de proyecto llamado python_for_web. Dentro del proyecto, hemos creado un entorno virtual llamado *venv*, que puede tener cualquier nombre. Luego, activamos el entorno virtual. Usamos pip freeze para verificar los paquetes instalados en el directorio del proyecto. El resultado de pip freeze está vacío porque aún no se han instalado paquetes.
+
+Ahora, creemos el archivo app.py en el directorio del proyecto y escribamos el siguiente código. El archivo app.py será el archivo principal del proyecto. El siguiente código contiene el módulo flask y el módulo os.
+
+### Crear rutas
+
+Ruta de inicio.
+
+```py
+# importar flask
+from flask import Flask
+import os # importar el módulo del sistema operativo
+
+app = Flask(__name__)
+
+@app.route('/') # este decorador crea la ruta de inicio
+def home ():
+ return '
'
+
+
+if __name__ == '__main__':
+ # usamos variables de entorno para despliegue
+ # funciona tanto para producción como para desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Para ejecutar la aplicación flask, ingresa python app.py en el directorio principal de la aplicación flask.
+
+Después de ejecutar _python app.py_, verifica el puerto 5000 de tu localhost.
+
+Agreguemos una ruta adicional creando la ruta "acerca de".
+
+```py
+# importar flask
+from flask import Flask
+import os # importar el módulo del sistema operativo
+
+app = Flask(__name__)
+
+@app.route('/') # este decorador crea la ruta de inicio
+def home ():
+ return '
'
+
+if __name__ == '__main__':
+ # usamos variables de entorno para despliegue
+ # funciona tanto para producción como para desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Ahora, hemos agregado la ruta acerca de en el código anterior. ¿Pero qué pasa si queremos renderizar un archivo HTML en lugar de una cadena? Podemos renderizar un archivo HTML usando la función *render_template*. Creamos una carpeta llamada templates en el directorio del proyecto y dentro de ella, creamos home.html y about.html. También importamos *render_template* desde flask.
+
+### Crear plantillas
+
+Crea archivos HTML dentro de la carpeta templates.
+
+home.html
+
+```html
+
+
+
+
+
+ Página principal
+
+
+
+
+
+
+```
+
+### Script de Python (con render_template)
+
+app.py
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo del sistema operativo
+
+app = Flask(__name__)
+
+@app.route('/') # este decorador crea la ruta de inicio
+def home ():
+ return render_template('home.html')
+
+@app.route('/about')
+def about():
+ return render_template('about.html')
+
+if __name__ == '__main__':
+ # usamos variables de entorno para despliegue
+ # funciona tanto para producción como para desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Como puedes ver, para acceder a diferentes páginas o navegar, necesitamos un sistema de navegación. Agreguemos un enlace para cada página, o creemos un diseño que usemos para cada página.
+
+### Navegación
+
+```html
+
+```
+
+Ahora, podemos navegar entre páginas usando los enlaces anteriores. Creamos una página adicional para manejar los datos del formulario. Puedes nombrarla como quieras, yo prefiero llamarla post.html.
+
+Podemos inyectar datos en el archivo HTML usando el motor de plantillas Jinja2.
+
+```py
+# importar flask
+from flask import Flask, render_template, request, redirect, url_for
+import os # importar el módulo del sistema operativo
+
+app = Flask(__name__)
+
+@app.route('/') # este decorador crea la ruta de inicio
+def home ():
+ techs = ['HTML', 'CSS', 'Flask', 'Python']
+ name = '30 días de desafío de programación en Python'
+ return render_template('home.html', techs=techs, name=name, title='Página principal')
+
+@app.route('/about')
+def about():
+ name = '30 días de desafío de programación en Python'
+ return render_template('about.html', name=name, title='Acerca de nosotros')
+
+@app.route('/post')
+def post():
+ name = 'Artículos sobre programación'
+ path = request.path
+ return render_template('post.html', name=name, path=path, title='Artículos')
+
+if __name__ == '__main__':
+ # usamos variables de entorno para despliegue
+ # funciona tanto para producción como para desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+home.html
+
+```html
+
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+```
+
+En el mundo real, no repetiríamos el código HTML en todas las páginas. En su lugar, crearíamos una plantilla base y las demás heredarían de ella. Usemos la herencia (plantillas). Ahora, en lugar de tres archivos diferentes, necesitamos crear un archivo de diseño llamado layout.html. Luego, otros archivos heredarán de él.
+
+### Crear plantilla base (layout)
+
+layout.html
+
+```html
+
+
+
+
+
+
+
+ {% if title %}
+ 30 Días de Python - {{ title}}
+ {% else %}
+ 30 Días de Python
+ {% endif %}
+
+
+
+
+
+
+
+ {% block content %} {% endblock %}
+
+
+
+```
+
+En el diseño anterior, hemos creado una plantilla común que puede ser utilizada por todas las páginas que heredan de ella. Dentro del diseño, podemos ver los enlaces de navegación. Usamos las etiquetas {% block content %}{% endblock %} para permitir que las subplantillas agreguen contenido.
+
+home.html
+
+```html
+{% extends 'layout.html' %} {% block content %}
+
+
Bienvenido de vuelta a {{name}}
+
+ Este proyecto fue construido usando las siguientes tecnologías:
+ Flask, Python
+ y HTML, CSS
+
+ Este desafío es un desafío de programación de 30 días diseñado para ayudarte a aprender el lenguaje de programación Python, resolviendo un problema de Python cada día.
+
+
+{% endblock %}
+```
+
+#### Servir archivos estáticos
+
+A continuación se muestra el archivo main.css, que colocaremos en el directorio static/css:
+
+```css
+/* === GENERAL === */
+body {
+ margin: 0;
+ padding: 0;
+ font-family: "Lato", sans-serif;
+ background-color: #f0f8ea;
+}
+
+.container {
+ max-width: 80%;
+ margin: auto;
+ padding: 30px;
+}
+
+ul {
+ list-style-type: none;
+ padding: 0;
+}
+
+.tech {
+ color: #5bbc2e;
+}
+
+/* === HEADER === */
+header {
+ background-color: #5bbc2e;
+}
+
+.menu-container {
+ display: flex;
+ justify-content: space-between;
+ padding: 20px 30px;
+}
+
+.brand-name {
+ color: white;
+ font-weight: 800;
+ font-size: 24px;
+}
+
+.nav-lists {
+ display: flex;
+}
+
+.nav-list {
+ margin-right: 15px;
+}
+
+.nav-link {
+ text-decoration: none;
+ color: white;
+ font-weight: 300;
+}
+
+/* === FORM === */
+
+form {
+ margin: 30px 0;
+ border: 1px solid #ddd;
+ padding: 30px;
+ border-radius: 10px;
+}
+
+form > div {
+ margin-bottom: 15px;
+}
+
+input {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid #ddd;
+ border-radius: 5px;
+ outline: 0;
+ font-size: 16px;
+ box-sizing: border-box;
+ margin-top: 5px;
+}
+
+button {
+ padding: 12px 24px;
+ border: 0;
+ background-color: #5bbc2e;
+ color: white;
+ border-radius: 10px;
+ font-size: 16px;
+ outline: 0;
+ cursor: pointer;
+}
+
+button:hover {
+ background-color: #4b9c25;
+}
+```
+
+### Despliegue
+
+#### Crear cuenta en Heroku
+
+Heroku ofrece un servicio de alojamiento gratuito. Si deseas desplegar una aplicación, debes tener una cuenta en Heroku.
+
+#### Iniciar sesión en Heroku
+
+```sh
+asabeneh@Asabeneh:~/Desktop/python_for_web$ heroku login
+heroku: Press any key to open up the browser to login or q to exit:
+Opening browser to https://cli-auth.heroku.com/auth/cli/browser/ec0972d5-d8c6-4adf-b004-a42a22dd09a8
+Logging in... done
+Logged in as asabeneh@gmail.com
+asabeneh@Asabeneh:~/Desktop/python_for_web$
+```
+
+#### Crear requirements y Procfile
+
+Antes de desplegar la aplicación, necesitamos informar a Heroku qué dependencias instalar y cómo ejecutar la aplicación. Heroku utiliza el archivo requirements.txt para obtener información sobre las dependencias de la aplicación. Usa el comando pip freeze para listar todas las dependencias y sus versiones, y escríbelas en requirements.txt.
+
+```sh
+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
+asabeneh@Asabeneh:~/Desktop/python_for_web$ pip freeze > requirements.txt
+```
+
+Procfile le dice a Heroku cómo ejecutar la aplicación. En este caso, usamos Gunicorn como servidor HTTP WSGI para ejecutar aplicaciones web en Python. Necesitamos agregar Gunicorn a nuestras dependencias.
+
+```sh
+asabeneh@Asabeneh:~/Desktop/python_for_web$ pip install gunicorn
+asabeneh@Asabeneh:~/Desktop/python_for_web$ pip freeze > requirements.txt
+```
+
+Ahora, creemos un Procfile y agreguemos el siguiente contenido:
+
+```sh
+web: gunicorn app:app
+```
+
+#### Enviar el proyecto a Heroku
+
+```sh
+asabeneh@Asabeneh:~/Desktop/python_for_web$ heroku create 30-days-of-python-app
+Creating ⬢ 30-days-of-python-app... done
+https://30-days-of-python-app.herokuapp.com/ | https://git.heroku.com/30-days-of-python-app.git
+asabeneh@Asabeneh:~/Desktop/python_for_web$ git init
+Initialized empty Git repository in /home/asabeneh/Desktop/python_for_web/.git/
+asabeneh@Asabeneh:~/Desktop/python_for_web$ heroku git:remote -a 30-days-of-python-app
+set git remote heroku to https://git.heroku.com/30-days-of-python-app.git
+asabeneh@Asabeneh:~/Desktop/python_for_web$ echo -e "venv\n.vscode" > .gitignore
+asabeneh@Asabeneh:~/Desktop/python_for_web$ git add .
+asabeneh@Asabeneh:~/Desktop/python_for_web$ git commit -m "primer aplicación web en python"
+[master (root-commit) 9dfcc6a] primer aplicación web en python
+ 9 files changed, 403 insertions(+)
+ create mode 100644 .gitignore
+ create mode 100644 Procfile
+ create mode 100644 app.py
+ create mode 100644 requirements.txt
+ create mode 100644 static/css/main.css
+ create mode 100644 templates/about.html
+ create mode 100644 templates/home.html
+ create mode 100644 templates/layout.html
+ create mode 100644 templates/post.html
+ create mode 100644 templates/result.html
+asabeneh@Asabeneh:~/Desktop/python_for_web$ git push heroku master
+Enumerating objects: 14, done.
+Counting objects: 100% (14/14), done.
+Delta compression using up to 2 threads
+Compressing objects: 100% (12/12), done.
+Writing objects: 100% (14/14), 6.08 KiB | 1.52 MiB/s, done.
+Total 14 (delta 2), reused 0 (delta 0)
+remote: Compressing source files... done.
+remote: Building source:
+remote:
+remote: -----> Python app detected
+remote: -----> Installing python-3.6.10
+remote: -----> Installing pip
+remote: -----> Installing dependencies with Pipenv 2018.5.18…
+remote: Installing dependencies from Pipfile.lock (872ae5)…
+remote: -----> Installing SQLite3
+remote: -----> $ python manage.py collectstatic --noinput
+remote: Traceback (most recent call last):
+remote: File "manage.py", line 10, in
+remote: from app import app
+remote: ModuleNotFoundError: No module named 'app'
+remote:
+remote: ! Error while running '$ python manage.py collectstatic --noinput'.
+remote: See traceback above for details.
+remote:
+remote: You may need to update application code to resolve this error.
+remote: Or, you can disable collectstatic for this application:
+remote:
+remote: $ heroku config:set DISABLE_COLLECTSTATIC=1
+remote:
+remote: https://devcenter.heroku.com/articles/django-assets
+remote: -----> Discovering process types
+remote: Procfile declares types -> web
+remote:
+remote: -----> Compressing...
+remote: Done: 55.7M
+remote: -----> Launching...
+remote: Released v3
+remote: https://30-days-of-python-app.herokuapp.com/ deployed to Heroku
+remote:
+remote: Verifying deploy... done.
+To https://git.heroku.com/30-days-of-python-app.git
+ * [new branch] master -> master
+asabeneh@Asabeneh:~/Desktop/python_for_web$
+```
+
+Como puedes ver, hemos creado con éxito nuestra primera aplicación web, la hemos desplegado y la hemos alojado en Heroku. Puedes probar esta aplicación usando este [enlace](https://30-days-of-python-app.herokuapp.com/).
+
+Sin más preámbulos, realicemos algunos ejercicios para reforzar lo aprendido.
+
+## Ejercicios: Día 26
+
+1. Crea una aplicación Flask llamada "Calculadora de calificaciones". El usuario ingresa la nota y el nombre de la asignatura, y la aplicación debe mostrar un mensaje según la nota:
+ - Si nota ≥ 90: "¡Excelente! Tu calificación en [Asignatura] es [Nota]".
+ - Si 80 ≤ nota < 90: "¡Muy bien! Tu calificación en [Asignatura] es [Nota]".
+ - Si 70 ≤ nota < 80: "Regular. Tu calificación en [Asignatura] es [Nota]".
+ - Si 60 ≤ nota < 70: "Aprobaste. Tu calificación en [Asignatura] es [Nota]".
+ - Si nota < 60: "¡Necesitas esforzarte más! Tu calificación en [Asignatura] es [Nota]".
+
+2. Crea una aplicación "Calculadora de IMC" que calcule el índice de masa corporal (IMC = peso(kg) / altura(m)²) y muestre el estado según el IMC:
+ - IMC < 18.5: "Bajo peso"
+ - 18.5 ≤ IMC < 24.9: "Peso saludable"
+ - 25 ≤ IMC < 29.9: "Sobrepeso"
+ - IMC ≥ 30: "Obesidad"
+
+3. Crea una aplicación de blog donde los usuarios puedan añadir, editar y eliminar publicaciones.
+
+4. Crea una aplicación "Gestor de tareas" donde los usuarios puedan añadir, ver y eliminar tareas.
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 25](./25_pandas_sp.md) | [>> Día 27](./27_python_with_mongodb_sp.md)
\ No newline at end of file
diff --git a/Spanish/27_python_with_mongodb_sp.md b/Spanish/27_python_with_mongodb_sp.md
new file mode 100644
index 000000000..8bcd854c3
--- /dev/null
+++ b/Spanish/27_python_with_mongodb_sp.md
@@ -0,0 +1,630 @@
+# Reto de 30 días de Python: Día 27 - Python y MongoDB
+
+- [Día 27](#-día-27)
+- [Python y MongoDB](#python-y-mongodb)
+ - [MongoDB](#mongodb)
+ - [Comparación entre SQL y NoSQL](#comparación-entre-sql-y-nosql)
+ - [Obtener la cadena de conexión (URI de MongoDB)](#obtener-la-cadena-de-conexión-uri-de-mongodb)
+ - [Conectar una aplicación Flask a un clúster de MongoDB](#conectar-una-aplicación-flask-a-un-clúster-de-mongodb)
+ - [Crear base de datos y colecciones](#crear-base-de-datos-y-colecciones)
+ - [Insertar múltiples documentos en una colección](#insertar-múltiples-documentos-en-una-colección)
+ - [Consultas en MongoDB](#consultas-en-mongodb)
+ - [Buscar usando una consulta](#buscar-usando-una-consulta)
+ - [Buscar con modificadores](#buscar-con-modificadores)
+ - [Limitar la cantidad de documentos](#limitar-la-cantidad-de-documentos)
+ - [Buscar con ordenamiento](#buscar-con-ordenamiento)
+ - [Actualizar usando una consulta](#actualizar-usando-una-consulta)
+ - [Eliminar documentos](#eliminar-documentos)
+ - [Eliminar una colección](#eliminar-una-colección)
+ - [💻 Ejercicio: Día 27](#-ejercicio-día-27)
+
+# 📘 Día 27
+
+# Python y MongoDB
+
+Python es una tecnología backend que puede conectarse a distintas bases de datos. Puede conectarse a bases de datos SQL y NoSQL. En esta sección conectaremos Python con la base de datos MongoDB, que es una base de datos NoSQL.
+
+## MongoDB
+
+MongoDB es una base de datos NoSQL. MongoDB almacena datos en documentos tipo JSON, lo que hace a MongoDB muy flexible y escalable. Veamos la terminología que difiere entre bases de datos SQL y NoSQL. La siguiente tabla mostrará la diferencia entre SQL y NoSQL.
+
+### Comparación entre SQL y NoSQL
+
+
+
+En esta sección nos centraremos en la base de datos NoSQL MongoDB. Regístrate en [MongoDB](https://www.mongodb.com/) haciendo clic en registrarse y luego en la página siguiente confirma el registro.
+
+
+
+Rellena el formulario y haz clic en continuar..
+
+
+
+Elige el plan gratuito
+
+
+
+Elige la región gratuita más cercana y ponle un nombre a tu clúster.
+
+
+
+Ahora se ha creado un sandbox gratuito
+
+
+
+Permitir el acceso desde todos los hosts locales
+
+
+
+Agregar usuario y contraseña
+
+
+
+Crear enlace URI de MongoDB
+
+
+
+Selecciona el driver para Python 3.6 o superior
+
+
+
+### Obtener la cadena de conexión (URI de MongoDB)
+
+Copia la cadena de conexión; obtendrás algo similar a esto:
+
+```sh
+mongodb+srv://asabeneh:@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority
+```
+
+No te preocupes por esta URL; es la forma de conectar tu aplicación con MongoDB.
+Reemplaza el marcador de contraseña con la contraseña que creaste al añadir el usuario.
+
+Ejemplo:
+
+```sh
+mongodb+srv://asabeneh:123123123@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority
+```
+
+En este ejemplo reemplacé todo y la contraseña es 123123123; el nombre de la base de datos es *thirty_days_python*. Esto solo es un ejemplo; tu contraseña debe ser más segura.
+
+Python necesita drivers para acceder a MongoDB. Usaremos _pymongo_ y _dnspython_ para conectar nuestra aplicación con la base de MongoDB. Instala pymongo y dnspython en tu directorio de proyecto:
+
+```sh
+pip install pymongo dnspython
+```
+
+Para usar el URI mongodb+srv:// debes instalar el módulo "dnspython". dnspython es un paquete de utilidades DNS para Python que soporta prácticamente todos los tipos de registros.
+
+### Conectar una aplicación Flask a un clúster de MongoDB
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+MONGODB_URI = 'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+client = pymongo.MongoClient(MONGODB_URI)
+print(client.list_database_names())
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Al ejecutar el código anterior obtendremos las bases de datos por defecto de MongoDB.
+
+```sh
+['admin', 'local']
+```
+
+### Crear base de datos y colecciones
+
+Creemos una base de datos; si la base de datos y la colección no existen en MongoDB, se crearán. Crearemos una base de datos llamada *thirty_days_of_python* y una colección *students*.
+
+Formas de crear la base de datos:
+
+```sh
+db = client.name_of_database # podemos crear la base de datos así, o usar la segunda forma
+db = client['name_of_database']
+```
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+MONGODB_URI = 'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+client = pymongo.MongoClient(MONGODB_URI)
+# crear la base de datos
+db = client.thirty_days_of_python
+# crear la colección students e insertar un documento
+db.students.insert_one({'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250})
+print(client.list_database_names())
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Después de crear la base de datos, también creamos la colección students y usamos *insert_one()* para insertar un documento.
+Ahora la base de datos *thirty_days_of_python* y la colección *students* han sido creadas y el documento insertado.
+Revisa tu clúster MongoDB y verás la base de datos y la colección, con un documento dentro.
+
+```sh
+['thirty_days_of_python', 'admin', 'local']
+```
+
+Si ves lo anterior en tu clúster, significa que has creado con éxito una base de datos y una colección.
+
+
+
+Si ves la imagen anterior, el documento fue creado con un ID largo como clave primaria. Cada vez que incrustamos un documento, MongoDB le asigna un ID único.
+
+### Insertar múltiples documentos en una colección
+
+*insert_one()* inserta un elemento a la vez; si queremos insertar múltiples documentos de una vez podemos usar *insert_many()* o un bucle for.
+Podemos usar un bucle for para insertar varios documentos a la vez.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+MONGODB_URI = 'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+client = pymongo.MongoClient(MONGODB_URI)
+
+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__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+### Consultas en MongoDB
+
+Los métodos *find()* y *findOne()* son formas comunes de buscar datos en una colección MongoDB. Son similares al SELECT en MySQL.
+Usemos _find_one()_ para obtener un documento de la colección.
+
+- *find_one({"_id": ObjectId("id")}): si no se proporciona id, devuelve la primera aparición.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+student = db.students.find_one()
+print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+```
+
+La consulta anterior devuelve la primera entrada, pero podemos usar un _id_ específico para ubicar un documento concreto. Por ejemplo, usemos el id de David para obtener el objeto David.
+'_id':ObjectId('5df68a23f106fe2d315bbc8c')
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+from bson.objectid import ObjectId # objeto 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'] # acceder a la base de datos
+student = db.students.find_one({'_id':ObjectId('5df68a23f106fe2d315bbc8c')})
+print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+```
+
+Hemos visto cómo usar _find_one()_. Veamos ahora _find()_.
+
+- _find()_: si no pasamos un objeto consulta devuelve todas las apariciones en la colección. El resultado es un objeto pymongo.cursor.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+
+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'] # acceder a la base de datos
+students = db.students.find()
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8d'), 'name': 'John', 'country': 'Sweden', 'city': 'Stockholm', 'age': 28}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+Podemos especificar los campos a devolver pasando un segundo objeto a _find({}, {})_. 0 significa excluir, 1 incluir; no se puede mezclar 0 y 1 excepto para _id.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+
+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'] # acceder a la base de datos
+students = db.students.find({}, {"_id":0, "name": 1, "country":1}) # 0 excluir, 1 incluir
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'name': 'Asabeneh', 'country': 'Finland'}
+{'name': 'David', 'country': 'UK'}
+{'name': 'John', 'country': 'Sweden'}
+{'name': 'Sami', 'country': 'Finland'}
+```
+
+### Buscar usando una consulta
+
+En MongoDB, find acepta un objeto de consulta. Podemos pasar ese objeto para filtrar los documentos que queremos.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+
+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'] # acceder a la base de datos
+
+query = {
+ "country":"Finland"
+}
+students = db.students.find(query)
+
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+### Buscar con modificadores
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+
+query = {
+ "city":"Helsinki"
+}
+students = db.students.find(query)
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+### Buscar con modificadores (combinados)
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+query = {
+ "country":"Finland",
+ "city":"Helsinki"
+}
+students = db.students.find(query)
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+Ejemplos con operadores:
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+query = {"age":{"$gt":30}}
+students = db.students.find(query)
+for student in students:
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+```
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+query = {"age":{"$lt":30}}
+students = db.students.find(query)
+for student in students:
+ print(student)
+```
+
+```sh
+{'_id': ObjectId('5df68a23f106fe2d315bbc8d'), 'name': 'John', 'country': 'Sweden', 'city': 'Stockholm', 'age': 28}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+### Limitar la cantidad de documentos
+
+Podemos usar el método _limit()_ para restringir el número de documentos devueltos.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+db.students.find().limit(3)
+```
+
+### Buscar con ordenamiento
+
+Por defecto el orden es ascendente. Podemos cambiar a descendente pasando -1.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+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__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Ascendente
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 250}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8d'), 'name': 'John', 'country': 'Sweden', 'city': 'Stockholm', 'age': 28}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+Descendente
+
+```sh
+{'_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}
+```
+
+### Actualizar usando una consulta
+
+Usaremos *update_one()* para actualizar un documento. Acepta dos objetos: la consulta y el nuevo valor.
+La primera persona, Asabeneh, tenía una edad poco razonable. Actualicemos la edad de Asabeneh.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+
+query = {'age':250}
+new_value = {'$set':{'age':38}}
+
+db.students.update_one(query, new_value)
+# verifiquemos el resultado para ver si la edad fue modificada
+for student in db.students.find():
+ print(student)
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 38}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8d'), 'name': 'John', 'country': 'Sweden', 'city': 'Stockholm', 'age': 28}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+Si queremos actualizar varios documentos a la vez usamos *update_many()*.
+
+### Eliminar documentos
+
+El método *delete_one()* elimina un documento. Acepta un objeto consulta y elimina la primera aparición.
+Eliminemos a John de la colección.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+
+query = {'name':'John'}
+db.students.delete_one(query)
+
+for student in db.students.find():
+ print(student)
+# verifiquemos el resultado
+
+app = Flask(__name__)
+if __name__ == '__main__':
+ # en despliegue usamos variables de entorno
+ # para que funcione tanto en producción como en desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+```sh
+{'_id': ObjectId('5df68a21f106fe2d315bbc8b'), 'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'age': 38}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8c'), 'name': 'David', 'country': 'UK', 'city': 'London', 'age': 34}
+{'_id': ObjectId('5df68a23f106fe2d315bbc8e'), 'name': 'Sami', 'country': 'Finland', 'city': 'Helsinki', 'age': 25}
+```
+
+Como puedes ver, John ha sido eliminado de la colección.
+
+Si queremos eliminar varios documentos usamos *delete_many()* con un objeto consulta. Si pasamos un objeto vacío *delete_many({})* eliminará todos los documentos en la colección.
+
+### Eliminar una colección
+
+Usando el método _drop()_ podemos eliminar una colección de la base de datos.
+
+```py
+# importar flask
+from flask import Flask, render_template
+import os # importar el módulo os
+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'] # acceder a la base de datos
+db.students.drop()
+```
+
+Ahora hemos eliminado la colección students de la base de datos.
+
+## 💻 Ejercicio: Día 27
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 26](./26_python_web_sp.md) | [Día 28 >>](./28_API_sp.md)
\ No newline at end of file
diff --git a/Spanish/28_API_sp.md b/Spanish/28_API_sp.md
new file mode 100644
index 000000000..d3466971b
--- /dev/null
+++ b/Spanish/28_API_sp.md
@@ -0,0 +1,140 @@
+# Reto de 30 días de Python: Día 28 - API
+
+- [Día 28](#-día-28)
+- [Interfaz de Programación de Aplicaciones (API)](#interfaz-de-programación-de-aplicaciones-api)
+ - [API](#api)
+ - [Construir una API](#construir-una-api)
+ - [HTTP (Protocolo de transferencia de hipertexto)](#http-protocolo-de-transferencia-de-hipertexto)
+ - [Estructura de HTTP](#estructura-de-http)
+ - [Línea inicial de solicitud (línea de estado)](#línea-inicial-de-solicitud-línea-de-estado)
+ - [Línea inicial de respuesta (línea de estado)](#línea-inicial-de-respuesta-línea-de-estado)
+ - [Campos de cabecera](#campos-de-cabecera)
+ - [Cuerpo del mensaje](#cuerpo-del-mensaje)
+ - [Métodos de solicitud](#métodos-de-solicitud)
+ - [💻 Ejercicio: Día 28](#-ejercicio-día-28)
+
+# 📘 Día 28
+
+# Interfaz de Programación de Aplicaciones (API)
+
+## API
+
+API son las siglas de Application Programming Interface (Interfaz de Programación de Aplicaciones). El tipo de API que veremos en esta sección es la Web API.
+Una Web API es una interfaz definida que permite la interacción entre organizaciones y las aplicaciones que consumen sus recursos; también actúa como un contrato de nivel de servicio (SLA) que especifica al proveedor de la funcionalidad y expone rutas o URLs de servicio a los usuarios de la API.
+
+En el contexto del desarrollo web, una API se define como un conjunto de especificaciones, por ejemplo mensajes de solicitud HTTP y la estructura de los mensajes de respuesta, normalmente en formato XML o JSON (JavaScript Object Notation).
+
+Las Web APIs han evolucionado de servicios web basados en SOAP y arquitecturas orientadas a servicios (SOA) hacia recursos web más directos en estilo REST.
+
+Los servicios de redes sociales y las Web APIs han permitido a la comunidad web compartir contenido y datos entre comunidades y plataformas.
+
+Con las APIs, el contenido creado en un lugar puede publicarse y actualizarse dinámicamente en múltiples lugares de la web.
+
+Por ejemplo, la REST API de Twitter permite a los desarrolladores acceder a los datos principales de Twitter, mientras que la Search API ofrece formas de interactuar con los datos de búsqueda y tendencias de Twitter.
+
+Muchas aplicaciones exponen endpoints de API. Algunos ejemplos de APIs son la [API de países](https://restcountries.eu/rest/v2/all) y la [API de razas de gatos](https://api.thecatapi.com/v1/breeds).
+
+En esta sección presentaremos una API RESTful que utiliza métodos de solicitud HTTP como GET, PUT, POST y DELETE para manejar datos.
+
+## Construir una API
+
+Una API RESTful es una interfaz que usa solicitudes HTTP para GET, PUT, POST y DELETE datos. En secciones anteriores aprendimos Python, Flask y MongoDB. Aprovecharemos ese conocimiento para desarrollar una API RESTful usando Python, Flask y la base de datos MongoDB. Toda aplicación con operaciones CRUD (Crear, Leer, Actualizar, Eliminar) suele exponer una API para crear datos en la base, obtener datos, actualizarlos o borrarlos.
+
+Para construir una API es útil entender el protocolo HTTP y el ciclo de solicitud-respuesta HTTP.
+
+## HTTP (Protocolo de transferencia de hipertexto)
+
+HTTP es el protocolo de comunicación establecido entre cliente y servidor. En este caso, el cliente es el navegador y el servidor es el lugar desde donde obtienes los datos. HTTP es un protocolo de red utilizado para transferir recursos en la web, como archivos HTML, imágenes, resultados de consultas, scripts u otros tipos de archivos.
+
+El navegador actúa como cliente HTTP porque envía solicitudes al servidor HTTP (servidor web), y el servidor responde al cliente.
+
+## Estructura de HTTP
+
+HTTP utiliza un modelo cliente-servidor. El cliente HTTP abre una conexión y envía un mensaje de solicitud al servidor HTTP; el servidor HTTP devuelve un mensaje de respuesta, es decir, el recurso solicitado. Cuando el ciclo solicitud-respuesta termina, el servidor cierra la conexión.
+
+
+
+Los formatos de los mensajes de solicitud y respuesta son similares. Ambos mensajes contienen:
+
+- Una línea inicial
+- Cero o más líneas de cabecera
+- Una línea en blanco (es decir, un CRLF por separado)
+- Un cuerpo de mensaje opcional (por ejemplo, un archivo, datos de formulario o la salida de una consulta)
+
+Navega por este sitio para ver un ejemplo de mensaje de solicitud y respuesta: https://thirtydaysofpython-v1-final.herokuapp.com/. Este sitio está desplegado en un dyno gratuito de Heroku y puede no estar disponible en algunos meses debido al alto tráfico. Apoyar este proyecto ayuda a mantener el servidor activo.
+
+
+
+## Línea inicial de solicitud (línea de estado)
+
+La línea inicial de la solicitud difiere de la de la respuesta.
+La línea de solicitud tiene tres partes separadas por espacios:
+
+- El nombre del método (GET, POST, HEAD)
+- La ruta del recurso solicitado
+- La versión HTTP utilizada. Por ejemplo: GET / HTTP/1.1
+
+GET es el método HTTP más común, usado para obtener o leer recursos, mientras que POST es un método común para crear recursos.
+
+### Línea inicial de respuesta (línea de estado)
+
+La línea inicial de la respuesta, llamada línea de estado, también tiene tres partes separadas por espacios:
+
+- La versión HTTP
+- El código de estado de la respuesta, que indica el resultado de la solicitud, junto con una razón que describe dicho código. Ejemplos de líneas de estado:
+ HTTP/1.0 200 OK
+ o
+ HTTP/1.0 404 Not Found
+ **Nota:**
+
+Los códigos de estado más comunes son:
+200 OK: la solicitud fue exitosa y el recurso generado (por ejemplo un archivo o la salida de un script) se devuelve en el cuerpo del mensaje.
+500 Error del servidor
+La lista completa de códigos de estado HTTP puede encontrarse [aquí](https://httpstatuses.com/). También puedes verla [aquí](https://httpstatusdogs.com/).
+
+### Campos de cabecera
+
+Como se observa en la captura anterior, las líneas de cabecera proporcionan información sobre la solicitud o la respuesta, o sobre el objeto enviado en el cuerpo del mensaje.
+
+```sh
+GET / HTTP/1.1
+Host: thirtydaysofpython-v1-final.herokuapp.com
+Connection: keep-alive
+Pragma: no-cache
+Cache-Control: no-cache
+Upgrade-Insecure-Requests: 1
+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
+Sec-Fetch-User: ?1
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
+Sec-Fetch-Site: same-origin
+Sec-Fetch-Mode: navigate
+Referer: https://thirtydaysofpython-v1-final.herokuapp.com/post
+Accept-Encoding: gzip, deflate, br
+Accept-Language: en-GB,en;q=0.9,fi-FI;q=0.8,fi;q=0.7,en-CA;q=0.6,en-US;q=0.5,fr;q=0.4
+```
+
+### Cuerpo del mensaje
+
+Un mensaje HTTP puede llevar un cuerpo después de las cabeceras. En una respuesta, este es el lugar donde el recurso solicitado se devuelve al cliente (el uso más común del cuerpo). Si hay un error, puede contener texto explicativo. En una solicitud, es el lugar donde se envían los datos introducidos por el usuario o los archivos subidos al servidor.
+
+Si un mensaje HTTP contiene un cuerpo, normalmente hay cabeceras que describen ese cuerpo, en particular:
+
+Content-Type: indica el tipo MIME de los datos en el cuerpo (text/html, application/json, text/plain, text/css, image/gif).
+Content-Length: indica el número de bytes en el cuerpo del mensaje.
+
+### Métodos de solicitud
+
+GET, POST, PUT y DELETE son los métodos HTTP que usaremos para implementar la API y las operaciones CRUD.
+
+1. GET: el método GET se usa para recuperar y obtener información desde el servidor dado un URI. Las solicitudes GET deben únicamente recuperar datos y no producir otros efectos.
+2. POST: las solicitudes POST se usan para crear datos y enviar datos al servidor, por ejemplo al crear una nueva entrada con un formulario HTML o subir archivos.
+3. PUT: reemplaza la representación actual completa del recurso objetivo con la carga enviada; lo usamos para modificar o actualizar datos.
+4. DELETE: elimina datos.
+
+## 💻 Ejercicio: Día 28
+
+1. Lee recursos sobre APIs y HTTP
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 27](./27_python_with_mongodb_sp.md) | [Día 29 >>](./29_building_API_sp.md)
diff --git a/Spanish/29_building_API_sp.md b/Spanish/29_building_API_sp.md
new file mode 100644
index 000000000..b5fd3df9c
--- /dev/null
+++ b/Spanish/29_building_API_sp.md
@@ -0,0 +1,468 @@
+# Reto de 30 días de Python: Día 29 - Construyendo una API
+
+- [Día 29](#día-29)
+- [Construyendo una API](#construyendo-una-api)
+ - [Estructura de la API](#estructura-de-la-api)
+ - [Obtener datos con GET](#obtener-datos-con-get)
+ - [Obtener un documento por ID](#obtener-un-documento-por-id)
+ - [Crear datos con POST](#crear-datos-con-post)
+ - [Actualizar con PUT](#actualizar-con-put)
+ - [Eliminar documentos con DELETE](#eliminar-documentos-con-delete)
+- [💻 Ejercicio: Día 29](#-ejercicio-día-29)
+
+## Día 29
+
+## Construyendo una API
+
+En esta sección presentaremos una API RESTful que utiliza métodos HTTP como GET, PUT, POST y DELETE para manejar datos.
+
+Una API RESTful es una interfaz de programación de aplicaciones (API) que usa solicitudes HTTP para GET, PUT, POST y DELETE datos. En secciones anteriores aprendimos Python, Flask y MongoDB. Aprovecharemos ese conocimiento para desarrollar una API RESTful usando Python, Flask y MongoDB. Toda aplicación con operaciones CRUD (Crear, Leer, Actualizar, Eliminar) suele exponer una API para crear datos en la base, obtener datos, actualizarlos o borrarlos.
+
+Los navegadores solo manejan solicitudes GET. Por eso necesitamos una herramienta que nos permita manejar todos los métodos (GET, POST, PUT, DELETE).
+
+Ejemplos de APIs:
+
+- API de países: https://restcountries.eu/rest/v2/all
+- API de razas de gatos: https://api.thecatapi.com/v1/breeds
+
+[Postman](https://www.getpostman.com/) es una herramienta muy popular en el desarrollo de APIs. Si quieres seguir esta sección, descarga [Postman](https://www.getpostman.com/). Una alternativa a Postman es [Insomnia](https://insomnia.rest/download).
+
+
+
+### Estructura de la API
+
+Un endpoint de API es una URL que ayuda a recuperar, crear, actualizar o eliminar un recurso. La estructura suele ser:
+Ejemplo de endpoint:
+https://api.twitter.com/1.1/lists/members.json
+Este endpoint devuelve los miembros de una lista específica. Las listas privadas muestran miembros solo si el usuario autenticado posee la lista.
+El nombre de la empresa va seguido de la versión y del propósito de la API.
+Métodos:
+Métodos HTTP: método y URL
+
+La API usa los siguientes métodos HTTP para operar sobre objetos:
+
+```sh
+GET para recuperar objetos
+POST para crear objetos y operaciones relacionadas
+PUT para actualizar objetos
+DELETE para eliminar objetos
+```
+
+Construiremos una API para recopilar información sobre estudiantes de 30DaysOfPython. Recogemos nombre, país, ciudad, año de nacimiento, habilidades y biografía.
+
+Para implementar esta API utilizaremos:
+
+- Postman
+- Python
+- Flask
+- MongoDB
+
+### Obtener datos con GET
+
+En este paso usaremos datos ficticios y los devolveremos como JSON. Para retornarlos como JSON usaremos el módulo json y Response.
+
+```py
+# importar flask
+
+from flask import Flask, Response
+import json
+
+app = Flask(__name__)
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+ student_list = [
+ {
+ 'name':'Asabeneh',
+ 'country':'Finland',
+ 'city':'Helsinki',
+ 'skills':['HTML', 'CSS','JavaScript','Python']
+ },
+ {
+ 'name':'David',
+ 'country':'UK',
+ 'city':'London',
+ 'skills':['Python','MongoDB']
+ },
+ {
+ 'name':'John',
+ 'country':'Sweden',
+ 'city':'Stockholm',
+ 'skills':['Java','C#']
+ }
+ ]
+ return Response(json.dumps(student_list), mimetype='application/json')
+
+
+if __name__ == '__main__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Si solicitas http://localhost:5000/api/v1.0/students en el navegador obtendrás:
+
+
+
+Si solicitas la misma URL en Postman obtendrás:
+
+
+
+En lugar de datos ficticios, conectaremos la aplicación Flask a MongoDB y obtendremos datos desde la base.
+
+```py
+# importar flask
+
+from flask import Flask, Response
+import json
+import pymongo
+
+
+app = Flask(__name__)
+
+#
+MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+#Nota: nunca incluyas credenciales reales en el código.
+client = pymongo.MongoClient(MONGODB_URI)
+db = client['thirty_days_of_python'] # acceder a la base de datos
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+
+ return Response(json.dumps(student), mimetype='application/json')
+
+
+if __name__ == '__main__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Al conectar Flask con MongoDB podemos obtener la colección students de la base thirty_days_of_python:
+
+```sh
+[
+ {
+ "_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
+ }
+]
+```
+
+### Obtener un documento por ID
+
+Podemos acceder a un documento individual por su ID. Por ejemplo, accedamos a Asabeneh:
+http://localhost:5000/api/v1.0/students/5df68a21f106fe2d315bbc8b
+
+```py
+# importar flask
+
+from flask import Flask, Response
+import json
+from bson.objectid import ObjectId
+import json
+from bson.json_util import dumps
+import pymongo
+
+
+app = Flask(__name__)
+
+#
+MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+#Nota: nunca incluyas credenciales reales en el código.
+client = pymongo.MongoClient(MONGODB_URI)
+db = client['thirty_days_of_python'] # acceder a la base de datos
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+
+ return Response(json.dumps(student), mimetype='application/json')
+@app.route('/api/v1.0/students/', methods = ['GET'])
+def single_student (id):
+ student = db.students.find({'_id':ObjectId(id)})
+ return Response(dumps(student), mimetype='application/json')
+
+if __name__ == '__main__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+Respuesta de ejemplo:
+
+```sh
+[
+ {
+ "_id": {
+ "$oid": "5df68a21f106fe2d315bbc8b"
+ },
+ "name": "Asabeneh",
+ "country": "Finland",
+ "city": "Helsinki",
+ "age": 38
+ }
+]
+```
+
+### Crear datos con POST
+
+Usamos el método POST para crear datos.
+
+```py
+# importar flask
+
+from flask import Flask, Response, Request
+import json
+from bson.objectid import ObjectId
+import json
+from bson.json_util import dumps
+import pymongo
+from datetime import datetime
+
+
+
+app = Flask(__name__)
+
+#
+MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+#Nota: nunca incluyas credenciales reales en el código.
+client = pymongo.MongoClient(MONGODB_URI)
+db = client['thirty_days_of_python'] # acceder a la base de datos
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+
+ return Response(json.dumps(student), mimetype='application/json')
+@app.route('/api/v1.0/students/', 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__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+### Actualizar con PUT
+
+```py
+# importar flask
+
+from flask import Flask, Response
+import json
+from bson.objectid import ObjectId
+import json
+from bson.json_util import dumps
+import pymongo
+from datetime import datetime
+
+
+app = Flask(__name__)
+
+#
+MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+#Nota: nunca incluyas credenciales reales en el código.
+client = pymongo.MongoClient(MONGODB_URI)
+db = client['thirty_days_of_python'] # acceder a la base de datos
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+
+ return Response(json.dumps(student), mimetype='application/json')
+@app.route('/api/v1.0/students/', 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/', methods = ['PUT']) # este decorador crea la ruta para actualizar
+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, {"$set": student})
+ # return Response(dumps({"result":"a new student has been created"}), mimetype='application/json')
+ return
+def update_student (id):
+if __name__ == '__main__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+### Eliminar documentos con DELETE
+
+```py
+# importar flask
+
+from flask import Flask, Response
+import json
+from bson.objectid import ObjectId
+import json
+from bson.json_util import dumps
+import pymongo
+from datetime import datetime
+
+
+app = Flask(__name__)
+
+#
+MONGODB_URI='mongodb+srv://asabeneh:your_password@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'
+#Nota: nunca incluyas credenciales reales en el código.
+client = pymongo.MongoClient(MONGODB_URI)
+db = client['thirty_days_of_python'] # acceder a la base de datos
+
+@app.route('/api/v1.0/students', methods = ['GET'])
+def students ():
+
+ return Response(json.dumps(student), mimetype='application/json')
+@app.route('/api/v1.0/students/', 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/', methods = ['PUT']) # este decorador crea la ruta para actualizar
+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, {"$set": student})
+ # return Response(dumps({"result":"a new student has been created"}), mimetype='application/json')
+ return ;
+@app.route('/api/v1.0/students/', methods = ['DELETE'])
+def delete_student (id):
+ db.students.delete_one({"_id":ObjectId(id)})
+ return
+if __name__ == '__main__':
+ # usado en despliegue
+ # para que funcione en producción y desarrollo
+ port = int(os.environ.get("PORT", 5000))
+ app.run(debug=True, host='0.0.0.0', port=port)
+```
+
+## 💻 Ejercicio: Día 29
+
+1. Implementa los ejemplos anteriores y desarrolla [esta API](https://thirtydayofpython-api.herokuapp.com/)
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 28](./28_API_sp.md) | [Día 30 >>](./30_conclusions_sp.md)
\ No newline at end of file
diff --git a/Spanish/30_conclusions_sp.md b/Spanish/30_conclusions_sp.md
new file mode 100644
index 000000000..67bedf52a
--- /dev/null
+++ b/Spanish/30_conclusions_sp.md
@@ -0,0 +1,22 @@
+# Reto de 30 días de Python: Día 30 - Conclusiones
+
+- [Día 30](#día-30)
+ - [Resumen](#resumen)
+ - [Testimonios](#testimonios)
+
+# Día 30
+
+## Resumen
+
+Al preparar este material aprendí mucho y ustedes me motivaron a hacer más. Felicidades por llegar hasta aquí. Si has completado todos los ejercicios y proyectos, ahora tienes la capacidad de avanzar en análisis de datos, ciencia de datos, aprendizaje automático o desarrollo web. [Apoya al autor para más material educativo](https://www.paypal.com/paypalme/asabeneh).
+
+## Testimonios
+
+Ahora es el momento de compartir tus pensamientos sobre el autor y el reto de 30 días de Python. Puedes dejar tu testimonio en este [enlace](https://www.asabeneh.com/testimonials).
+
+Enviar comentarios/retroalimentación:
+http://thirtydayofpython-api.herokuapp.com/feedback
+
+🎉 ¡Felicidades! 🎉
+
+[<< Día 29](./29_building_API_sp.md)
\ No newline at end of file
diff --git a/Spanish/README_sp.md b/Spanish/README_sp.md
new file mode 100644
index 000000000..510461b08
--- /dev/null
+++ b/Spanish/README_sp.md
@@ -0,0 +1,454 @@
+# 🐍 30 Días de Python
+
+| # Día | Tema |
+| ------ | :--------------------------------------------------------------------------------------: |
+| 01 | [Introducción](./readme_sp.md) |
+| 02 | [Variables y funciones integradas](./02_variables_builtin_functions_sp.md) |
+| 03 | [Operadores](./03_operators_sp.md) |
+| 04 | [Cadenas](./04_strings_sp.md) |
+| 05 | [Listas](./05_lists_sp.md) |
+| 06 | [Tuplas](./06_tuples_sp.md) |
+| 07 | [Conjuntos](./07_sets_sp.md) |
+| 08 | [Diccionarios](./08_dictionaries_sp.md) |
+| 09 | [Condicionales](./09_conditionals_sp.md) |
+| 10 | [Bucles](./10_loops_sp.md) |
+| 11 | [Funciones](./11_functions_sp.md) |
+| 12 | [Módulos](./12_modules_sp.md) |
+| 13 | [Comprensión de listas](./13_list_comprehension_sp.md) |
+| 14 | [Funciones de orden superior](./14_higher_order_functions_sp.md) |
+| 15 | [Errores de tipo](./15_python_type_errors_sp.md) |
+| 16 | [Fechas y horas en Python](./16_python_datetime_sp.md) |
+| 17 | [Manejo de excepciones](./17_exception_handling_sp.md) |
+| 18 | [Expresiones regulares](./18_regular_expressions_sp.md) |
+| 19 | [Manejo de archivos](./19_file_handling_sp.md) |
+| 20 | [Gestor de paquetes](./20_python_package_manager_sp.md) |
+| 21 | [Clases y objetos](./21_classes_and_objects_sp.md) |
+| 22 | [Web scraping](./22_web_scraping_sp.md) |
+| 23 | [Entornos virtuales](./23_virtual_environment_sp.md) |
+| 24 | [Estadística](./24_statistics_sp.md) |
+| 25 | [Pandas](./25_pandas_sp.md) |
+| 26 | [Python en la web](./26_python_web_sp.md) |
+| 27 | [Python y MongoDB](./27_python_with_mongodb_sp.md) |
+| 28 | [API](./28_API_sp.md) |
+| 29 | [Construir API](./29_building_API_sp.md) |
+| 30 | [Conclusiones](./30_conclusions_sp.md) |
+
+🧡🧡🧡 Feliz codificación 🧡🧡🧡
+
+
+Ayuda al autor a crear más material educativo
+
+
+
+[Ir al Día 2 >>](./02_variables_builtin_functions_sp.md)
+
+
+
+- [🐍 30 Días de Python](#-30-días-de-python)
+- [📘 Día 1](#-día-1)
+ - [¡Bienvenido!](#¡bienvenido!)
+ - [Introducción](#introducción)
+ - [¿Por qué elegir Python?](#¿por-qué-elegir-python?)
+ - [Configuración del entorno](#configuración-del-entorno)
+ - [Instalar Python](#instalar-python)
+ - [Python Shell](#python-shell)
+ - [Instalar Visual Studio Code](#instalar-visual-studio-code)
+ - [Cómo usar Visual Studio Code](#cómo-usar-visual-studio-code)
+ - [Fundamentos de Python](#fundamentos-de-python)
+ - [Sintaxis de Python](#sintaxis-de-python)
+ - [Indentación en Python](#indentación-en-python)
+ - [Comentarios](#comentarios)
+- [Ejemplo: comentario de una sola línea](#ejemplo-comentario-de-una-sola-línea)
+- [Ejemplo: comentario multilínea (docstring)](#ejemplo-comentario-multilínea-docstring)
+ - [Tipos de datos](#tipos-de-datos)
+ - [Números](#números)
+ - [Cadenas](#cadenas)
+ - [Booleanos](#booleanos)
+ - [Listas](#listas)
+ - [Diccionarios](#diccionarios)
+ - [Tuplas](#tuplas)
+ - [Conjuntos](#conjuntos)
+ - [Comprobar tipos de datos](#comprobar-tipos-de-datos)
+ - [Archivos Python](#archivos-python)
+ - [💻 Ejercicios - Día 1](#-ejercicios---día-1)
+ - [Ejercicios: Nivel 1](#ejercicios-nivel-1)
+ - [Ejercicios: Nivel 2](#ejercicios-nivel-2)
+ - [Ejercicios: Nivel 3](#ejercicios-nivel-3)
+
+# 📘 Día 1
+
+## ¡Bienvenido!
+
+**Felicidades** por decidir participar en el desafío de programación _30 Días de Python_. En este reto aprenderás todo lo necesario para convertirte en programador Python y la mayoría de los conceptos de programación. Al finalizar el reto recibirás un certificado del desafío _30DaysOfPython_.
+
+Si quieres participar activamente, únete al grupo de Telegram [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython).
+
+## Introducción
+
+Python es un lenguaje de programación de alto nivel, de propósito general. Es un lenguaje de código abierto, interpretado y orientado a objetos. Python fue creado por el programador holandés Guido van Rossum. El nombre del lenguaje proviene del show cómico británico _Monty Python's Flying Circus_. La primera versión se lanzó el 20 de febrero de 1991. Este desafío de 30 días te ayudará a aprender progresivamente la versión más reciente de Python, Python 3. Cada día cubre un tema diferente con explicaciones claras, ejemplos del mundo real, y muchos ejercicios y proyectos prácticos.
+
+El reto es adecuado para principiantes y profesionales que quieran aprender Python. Completar el reto puede tomar de 30 a 100 días; los miembros activos del grupo de Telegram tienen más probabilidades de terminarlo.
+
+Este reto fue escrito inicialmente en inglés sencillo, y luego traducido al chino. El reto es motivador, accesible y desafiante. Requiere dedicación para completarlo. Si aprendes mejor con vídeos, visita el canal Washera en YouTube:
+Washera YouTube channel. Puedes empezar por el video [Python for absolute beginners](https://youtu.be/OCCWZheOesI). Suscríbete, deja tus preguntas en los comentarios y sé proactivo; el autor te podrá notar.
+
+El autor aprecia tus comentarios, que compartas el contenido y la retroalimentación sobre el reto 30DaysOfPython. Puedes dejar feedback aquí: [link](https://www.asabeneh.com/testimonials)
+
+## ¿Por qué elegir Python?
+
+Python es un lenguaje con sintaxis cercana al lenguaje humano, sencillo y fácil de aprender y usar.
+Python es usado en muchas industrias y empresas (incluido Google). Se usa para desarrollar aplicaciones web, de escritorio, administración de sistemas y librerías de aprendizaje automático. Python está ampliamente adoptado en la comunidad de ciencia de datos y machine learning. Si esto no te convence, ¡es hora de empezar!
+
+## Configuración del entorno
+
+### Instalar Python
+
+Para ejecutar scripts escritos en Python necesitas instalar Python. Visita la página de descargas de Python: [https://www.python.org/](https://www.python.org/).
+
+Si usas Windows haz clic en el botón marcado en la imagen.
+
+[](https://www.python.org/)
+
+Si usas macOS haz clic en el botón marcado en la imagen.
+
+[](https://www.python.org/)
+
+Para comprobar si Python está instalado, abre la terminal y ejecuta:
+
+```shell
+python --version
+```
+
+
+
+En mi terminal aparece Python 3.7.5. Tu versión puede variar, pero debe ser 3.6 o superior. Si ves la versión, Python está instalado. Continúa al siguiente apartado.
+
+### Python Shell
+
+Python es un lenguaje interpretado, no necesita compilación. Se ejecuta línea por línea. Python incluye el Python Shell (intérprete interactivo), también llamado REPL (Read Eval Print Loop). Se usa para ejecutar comandos Python individuales y ver resultados al instante.
+
+El Python Shell espera código Python. Al escribir código lo interpreta y muestra el resultado.
+Abre la terminal o el símbolo del sistema (cmd) y escribe:
+
+```shell
+python
+```
+
+
+
+El intérprete interactivo de Python estará abierto y mostrará el prompt >>> para que escribas comandos Python. Escribe tu primer script y pulsa Enter.
+Veamos un ejemplo en el Shell interactivo.
+
+
+
+Genial: escribiste tu primer script en el Shell interactivo. ¿Cómo salir del Shell?
+Para salir escribe **exit()** y pulsa Enter.
+
+
+
+Ahora sabes cómo abrir y cerrar el intérprete interactivo.
+
+Si escribes código inválido, Python mostrará un error. Probemos un error intencional:
+
+
+
+El error indica Syntax Error: Invalid Syntax. Usar x para multiplicar no es válido en Python; el operador correcto es el asterisco (*). El error señala exactamente lo que hay que corregir.
+
+El proceso de encontrar y corregir errores se llama depuración (debugging). Reemplazamos x por * y volvemos a ejecutar:
+
+
+
+El error se corrige y el código produce el resultado esperado. Verás errores así a diario; aprender a depurar es esencial. Para depurar bien debes reconocer los tipos de errores: SyntaxError, IndexError, NameError, ModuleNotFoundError, KeyError, ImportError, AttributeError, TypeError, ValueError, ZeroDivisionError, etc. Los explicaremos más adelante.
+
+Practiquemos más en el Python Shell. Abre la terminal y escribe python.
+
+
+
+Con el Shell abierto hagamos operaciones matemáticas básicas: suma, resta, multiplicación, división, módulo y potencia.
+
+Antes de programar, hagamos algunos cálculos:
+
+- 2 + 3 = 5
+- 3 - 2 = 1
+- 3 * 2 = 6
+- 3 / 2 = 1.5
+- 3 ** 2 = 9
+
+En Python también tenemos:
+
+- 3 % 2 = 1 => resto de la división
+- 3 // 2 = 1 => división entera (sin resto)
+
+Conviértelo a código Python en el Shell. Primero escribe un comentario.
+
+Un comentario es texto ignorado por Python. Sirve para documentar y mejorar la legibilidad. En Python los comentarios empiezan con #.
+Así se escribe un comentario en Python:
+
+```python
+# Los comentarios comienzan con una almohadilla
+# Este es un comentario en Python porque empieza con (#)
+```
+
+
+
+Antes de continuar, practica más: cierra el Shell con _exit()_ y vuelve a abrirlo; escribe texto en el Shell:
+
+
+
+### Instalar Visual Studio Code
+
+El Python Shell está bien para probar fragmentos, pero para proyectos más grandes se usan editores de código. En este reto usaremos Visual Studio Code. VS Code es un editor de texto de código abierto muy popular. Recomiendo instalar Visual Studio Code, aunque puedes usar otro editor si lo prefieres.
+
+[](https://code.visualstudio.com/)
+
+Si ya tienes Visual Studio Code, veamos cómo usarlo.
+Si prefieres vídeos, mira el tutorial de instalación y configuración de VS Code para Python: https://www.youtube.com/watch?v=bn7Cx4z-vSo
+
+#### Cómo usar Visual Studio Code
+
+Abre Visual Studio Code haciendo doble clic en su icono. Aparecerá la interfaz. Interactúa con los iconos marcados en la imagen.
+
+
+
+Crea en el escritorio una carpeta llamada 30DaysOfPython. Ábrela con Visual Studio Code.
+
+
+
+
+
+Dentro del proyecto verás accesos para crear archivos y carpetas. Yo creé el primer archivo helloworld.py; tú puedes hacer lo mismo.
+
+
+
+Cuando termines de programar puedes cerrar el proyecto desde el editor:
+
+
+
+¡Enhorabuena! El entorno está listo. ¡Manos a la obra!
+
+## Fundamentos de Python
+
+### Sintaxis de Python
+
+Los scripts Python se pueden escribir en el Shell interactivo o en un editor. Los archivos Python usan la extensión .py.
+
+### Indentación en Python
+
+La indentación son espacios en blanco en el código. En muchos lenguajes se usa para mejorar legibilidad; en Python se usa para definir bloques de código. En otros lenguajes se usan llaves. Un error común en Python es el error de indentación.
+
+
+
+### Comentarios
+
+Los comentarios son importantes para la legibilidad. Python no ejecuta el texto dentro de comentarios.
+Cualquier texto que comience con # en Python es un comentario.
+
+# Ejemplo: comentario de una sola línea
+
+```shell
+# Este es el primer comentario
+# Este es el segundo comentario
+# Python se está apoderando del mundo
+```
+
+# Ejemplo: comentario multilínea (docstring)
+
+Se pueden usar comillas triples para comentarios multilínea si no se asignan a una variable.
+
+```shell
+"""Este es un comentario multilínea
+Los comentarios multilínea ocupan varias líneas.
+Python se está apoderando del mundo
+"""
+```
+
+### Tipos de datos
+
+Python tiene varios tipos de datos. Empecemos por los más comunes. Veremos otros tipos más en detalle en secciones posteriores. A continuación un resumen para familiarizarte.
+
+#### Números
+
+- Enteros: ... -3, -2, -1, 0, 1, 2, 3 ...
+- Flotantes: ... -3.5, -2.25, -1.0, 0.0, 1.1, 2.2, 3.5 ...
+- Complejos: 1 + j, 2 + 4j
+
+#### Cadenas
+
+Texto entre comillas simples o dobles; para multilínea se usan comillas triples.
+
+**Ejemplos:**
+
+```py
+'Asabeneh'
+'Finland'
+'Python'
+'I love teaching'
+'I hope you are enjoying the first day of 30DaysOfPython Challenge'
+```
+
+#### Booleanos
+
+True o False. Deben estar en mayúscula.
+
+**Ejemplo:**
+
+```python
+True # ¿La luz está encendida? Si sí, el valor es True
+False # ¿La luz está encendida? Si no, el valor es False
+```
+
+#### Listas
+
+Lista ordenada que puede contener distintos tipos, similar a un array en JavaScript.
+
+**Ejemplos:**
+
+```py
+[0, 1, 2, 3, 4, 5] # todos números
+['Banana', 'Orange', 'Mango', 'Avocado'] # todos cadenas
+['Finland','Estonia', 'Sweden','Norway'] # todos cadenas (países)
+['Banana', 10, False, 9.81] # mezcla de tipos
+```
+
+#### Diccionarios
+
+Colección no ordenada de pares clave:valor.
+
+**Ejemplo:**
+
+```py
+{
+'first_name':'Asabeneh',
+'last_name':'Yetayeh',
+'country':'Finland',
+'age':250,
+'is_married':True,
+'skills':['JS', 'React', 'Node', 'Python']
+}
+```
+
+#### Tuplas
+
+Colección ordenada e inmutable.
+
+**Ejemplo:**
+
+```py
+('Asabeneh', 'Pawel', 'Brook', 'Abraham', 'Lidiya') # nombres
+```
+
+```py
+('Earth', 'Jupiter', 'Neptune', 'Mars', 'Venus', 'Saturn', 'Uranus', 'Mercury') # planetas
+```
+
+#### Conjuntos
+
+Colección no ordenada que almacena elementos únicos (sin duplicados).
+
+**Ejemplos:**
+
+```py
+{2, 4, 3, 5}
+{3.14, 9.81, 2.7} # el orden en un set no importa
+```
+
+Detallaremos cada tipo de dato en secciones posteriores.
+
+### Comprobar tipos de datos
+
+Usa la función built-in **type** para comprobar el tipo de una variable. En la imagen puedes ver ejemplos:
+
+
+
+### Archivos Python
+
+Abre tu carpeta de proyecto 30DaysOfPython (créala si no existe). Dentro crea helloworld.py. Repite lo que hicimos en el Shell pero usando print() para ver resultados en consola desde un archivo.
+
+En el intérprete se imprime sin print, pero en VS Code debes usar la función _print()_. Ejemplo de uso: _print('argumento1', 'argumento2')_.
+
+**Ejemplo:** archivo helloworld.py
+
+```py
+# Día 1 - Desafío 30DaysOfPython
+
+print(2 + 3) # Suma (+)
+print(3 - 1) # Resta (-)
+print(2 * 3) # Multiplicación (*)
+print(3 / 2) # División (/)
+print(3 ** 2) # Potencia (**)
+print(3 % 2) # Módulo (%)
+print(3 // 2) # División entera (//)
+
+# Comprobar tipos de datos
+print(type(10)) # entero
+print(type(3.14)) # flotante
+print(type(1 + 3j)) # complejo
+print(type('Asabeneh')) # cadena
+print(type([1, 2, 3])) # lista
+print(type({'name':'Asabeneh'})) # diccionario
+print(type({9.8, 3.14, 2.7})) # conjunto
+print(type((9.8, 3.14, 2.7))) # tupla
+```
+
+Para ejecutar el archivo: en VS Code usa el botón verde o en la terminal escribe _python helloworld.py_.
+
+
+
+Genial. Completaste el Día 1. Practica con los ejercicios siguientes.
+
+## 💻 Ejercicios - Día 1
+
+### Ejercicios: Nivel 1
+
+1. Comprueba la versión de Python que usas.
+2. Abre el Python Shell e intenta con los operandos 3 y 4:
+ - Suma (+)
+ - Resta (-)
+ - Multiplicación (*)
+ - Módulo (%)
+ - División (/)
+ - Potencia (**)
+ - División entera (//)
+3. En el Python Shell escribe las siguientes cadenas:
+ - Tu nombre
+ - Tu apellido
+ - Tu país
+ - Estoy disfrutando 30 días de Python
+4. Comprueba el tipo de los siguientes datos:
+ - 10
+ - 9.8
+ - 3.14
+ - 4 - 4j
+ - ['Asabeneh', 'Python', 'Finland']
+ - Tu nombre
+ - Tu apellido
+ - Tu país
+
+### Ejercicios: Nivel 2
+
+1. Crea en la carpeta 30DaysOfPython una carpeta llamada day_1. Dentro crea helloworld.py y repite las preguntas 1, 2, 3 y 4. Recuerda usar _print()_ en archivos. Navega a la carpeta donde guardaste el archivo y ejecútalo.
+
+### Ejercicios: Nivel 3
+
+1. Escribe ejemplos para distintos tipos de datos en Python: números (enteros, flotantes, complejos), cadenas, booleanos, listas, tuplas, conjuntos y diccionarios.
+2. Calcula la distancia euclídea entre (2, 3) y (10, 8): [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance).
+
+🎉 ¡Felicidades! 🎉
+
+[Ir al Día 2 >>](./02_variables_builtin_functions_sp.md)
diff --git a/Spanish/readme.md b/Spanish/readme.md
new file mode 100644
index 000000000..bea18435f
--- /dev/null
+++ b/Spanish/readme.md
@@ -0,0 +1,457 @@
+# 🐍 30 Days Of Python
+
+|# Day | Topics |
+|------|:---------------------------------------------------------:|
+| 01 | [Introducción](./readme.md)|
+| 02 | [Variables, funciones integradas](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)|
+| 03 | [Operadores](./03_Day_Operators/03_operators.md)|
+| 04 | [Strings](./04_Day_Strings/04_strings.md)|
+| 05 | [Lists](./05_Day_Lists/05_lists.md)|
+| 06 | [Tuplas](./06_Day_Tuples/06_tuples.md)|
+| 07 | [Sets](./07_Day_Sets/07_sets.md)|
+| 08 | [Diccionarios](./08_Day_Dictionaries/08_dictionaries.md)|
+| 09 | [Condicionales](./09_Day_Conditionals/09_conditionals.md)|
+| 10 | [Bucles](./10_Day_Loops/10_loops.md)|
+| 11 | [Funciones](./11_Day_Functions/11_functions.md)|
+| 12 | [Módulos](./12_Day_Modules/12_modules.md)|
+| 13 | [Lista de comprensión](./13_Day_List_comprehension/13_list_comprehension.md)|
+| 14 | [Funciones de orden superior](./14_Day_Higher_order_functions/14_higher_order_functions.md)|
+| 15 | [Errores de tipo Python](./15_Day_Python_type_errors/15_python_type_errors.md)|
+| 16 | [Fecha y hora de Python](./16_Day_Python_date_time/16_python_datetime.md) |
+| 17 | [Manejo de excepciones](./17_Day_Exception_handling/17_exception_handling.md)|
+| 18 | [Expresiones regulares](./18_Day_Regular_expressions/18_regular_expressions.md)|
+| 19 | [Manejo de archivos](./19_Day_File_handling/19_file_handling.md)|
+| 20 | [Administrador de paquetes de Python](./20_Day_Python_package_manager/20_python_package_manager.md)|
+| 21 | [Clases y Objetos](./21_Day_Classes_and_objects/21_classes_and_objects.md)|
+| 22 | [Raspado web](./22_Day_Web_scraping/22_web_scraping.md)|
+| 23 | [Ambiente virtual](./23_Day_Virtual_environment/23_virtual_environment.md)|
+| 24 | [Estadísticas](./24_Day_Statistics/24_statistics.md)|
+| 25 | [Pandas](./25_Day_Pandas/25_pandas.md)|
+| 26 | [Python web](./26_Day_Python_web/26_python_web.md)|
+| 27 | [Python con MongoDB](./27_Day_Python_with_mongodb/27_python_with_mongodb.md)|
+| 28 | [API](./28_Day_API/28_API.md)|
+| 29 | [Building API](./29_Day_Building_API/29_building_API.md)|
+| 30 | [Conclusiones](./30_Day_Conclusions/30_conclusions.md)|
+
+🧡🧡🧡 FELIZ CODIGO 🧡🧡🧡
+
+
+Support the author to create more educational materials
+
+
+
+[Dia 2 >>](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)
+
+
+
+- [🐍 30 Days Of Python](#-30-days-of-python)
+- [📘 Day 1](#-day-1)
+ - [Welcome](#welcome)
+ - [Introduction](#introduction)
+ - [Why Python ?](#why-python-)
+ - [Environment Setup](#environment-setup)
+ - [Installing Python](#installing-python)
+ - [Python Shell](#python-shell)
+ - [Installing Visual Studio Code](#installing-visual-studio-code)
+ - [How to use visual studio code](#how-to-use-visual-studio-code)
+ - [Basic Python](#basic-python)
+ - [Python Syntax](#python-syntax)
+ - [Python Indentation](#python-indentation)
+ - [Comments](#comments)
+ - [Data types](#data-types)
+ - [Number](#number)
+ - [String](#string)
+ - [Booleans](#booleans)
+ - [List](#list)
+ - [Dictionary](#dictionary)
+ - [Tuple](#tuple)
+ - [Set](#set)
+ - [Checking Data types](#checking-data-types)
+ - [Python File](#python-file)
+ - [💻 Exercises - Day 1](#-exercises---day-1)
+ - [Exercise: Level 1](#exercise-level-1)
+ - [Exercise: Level 2](#exercise-level-2)
+ - [Exercise: Level 3](#exercise-level-3)
+
+# 📘 Day 1
+
+## Welcome
+
+**Congratulations** for deciding to participate in a _30 days of Python_ programming challenge . In this challenge you will learn everything you need to be a python programmer and the whole concept of programming. In the end of the challenge you will get a _30DaysOfPython_ programming challenge certificate.
+
+If you would like to actively engage in the challenge, you may join the [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython) telegram group.
+
+## Introduction
+
+Python is a high-level programming language for general-purpose programming. It is an open source, interpreted, objected-oriented programming language. Python was created by a Dutch programmer, Guido van Rossum. The name of Python programming language was derived from a British sketch comedy series, _Monty Python's Flying Circus_. The first version was released on February 20, 1991. This 30 days of Python challenge will help you learn the latest version of Python, Python 3 step by step. The topics are broken down into 30 days, where each day contains several topics with easy-to-understand explanations, real-world examples, many hands on exercises and projects.
+
+This challenge is designed for beginners and professionals who want to learn python programming language. It may take 30 to 100 days to complete the challenge, people who actively participate on the telegram group have a high probability of completing the challenge.
+
+This challenge is easy to read, written in conversational English, engaging, motivating and at the same time, it is very demanding. You need to allocate much time to finish this challenge. If you are a visual learner, you may get the video lesson on Washera YouTube channel. You may start from [Python for Absolute Beginners video](https://youtu.be/OCCWZheOesI). Subscribe the channel, comment and ask questions on YouTube vidoes and be proactive, the author will eventually notice you.
+
+The author likes to hear your opinion about the challenge, share the author by expressing your thoughts about the 30DaysOfPython challenge. You can leave your testimonial on this [link](https://testimonial-vdzd.onrender.com/)
+
+## Why Python ?
+
+It is a programming language which is very close to human language and because of that it is easy to learn and use.
+Python is used by various industries and companies (including Google). It has been used to develop web applications, desktop applications, system adminstration, and machine learning libraries. Python is highly embraced language in the data science and machine learning community. I hope this is enough to convince you to start learning Python. Python is eating the world and you are killing it before it eats you.
+
+## Environment Setup
+
+### Installing Python
+
+To run a python script you need to install python. Let's [download](https://www.python.org/) python.
+If your are a windows user. Click the button encircled in red.
+
+[](https://www.python.org/)
+
+If you are a macOS user. Click the button encircled in red.
+
+[](https://www.python.org/)
+
+To check if python is installed write the following command on your device terminal.
+
+```shell
+python --version
+```
+
+
+
+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:
+
+```shell
+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.
+
+
+
+Well done, you wrote your first Python script on Python interactive shell. How do we close the Python interactive shell ?
+To close the shell, next to this symbol >> write **exit()** command and press Enter.
+
+
+
+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**.
+
+
+
+Our bug was fixed, the code ran and we got a result we were expecting. As a programmer you will see such kind of errors on daily basis. It is good to know how to debug. To be good at debugging you should understand what kind of errors you are facing. Some of the Python errors you may encounter are _SyntaxError_, _IndexError_, _NameError_, _ModuleNotFoundError_, _KeyError_, _ImportError_, _AttributeError_, _TypeError_, _ValueError_, _ZeroDivisionError_ etc. We will see more about different Python **_error types_** in later sections.
+
+Let us practice more how to use Python interactive shell. Go to your terminal or command prompt and write the word **python**.
+
+
+
+The Python interactive shell is opened. Let us do some basic mathematical operations (addition, subtraction, multiplication, division, modulus, exponential).
+
+Let us do some maths first before we write any Python code:
+
+- 2 + 3 is 5
+- 3 - 2 is 1
+- 3 \* 2 is 6
+- 3 / 2 is 1.5
+- 3 ** 2 is the same as 3 * 3
+
+In python we have the following additional operations:
+
+- 3 % 2 = 1 => which means finding the remainder
+- 3 // 2 = 1 => which means removing the remainder
+
+Let us change the above mathematical expressions to Python code. The Python shell has been opened and let us write a comment at the very beginning of the shell.
+
+A _comment_ is a part of the code which is not executed by python. So we can leave some text in our code to make our code more readable. Python does not run the comment part. A comment in python starts with hash(#) symbol.
+This is how you write a comment in python
+
+```shell
+ # comment starts with hash
+ # this is a python comment, because it starts with a (#) symbol
+```
+
+
+
+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.
+
+
+
+### Installing Visual Studio Code
+
+The Python interactive shell is good to try and test small script codes but it will not be for a big project. In real work environment, developers use different code editors to write codes. In this 30 days of Python programming challenge we will use visual studio code. Visual studio code is a very popular open source text editor. I am a fan of vscode and I would recommend to [download](https://code.visualstudio.com/) visual studio code, but if you are in favor of other editors, feel free to follow with what you have.
+
+[](https://code.visualstudio.com/)
+
+If you installed visual studio code, let us see how to use it.
+If you prefer a video, you can follow this Visual Studio Code for Python [Video tutorial](https://www.youtube.com/watch?v=bn7Cx4z-vSo)
+
+#### How to use visual studio code
+
+Open the visual studio code by double clicking the visual studio icon. When you open it you will get this kind of interface. Try to interact with the labeled icons.
+
+
+
+Create a folder named 30DaysOfPython on your desktop. Then open it using visual studio code.
+
+
+
+
+
+After opening it you will see shortcuts for creating files and folders inside of 30DaysOfPython project's directory. As you can see below, I have created the very first file, helloworld.py. You can do the same.
+
+
+
+After a long day of coding, you want to close your code editor, right? This is how you will close the opened project.
+
+
+
+Congratulations, you have finished setting up the development environment. Let us start coding.
+
+## Basic Python
+
+### Python Syntax
+
+A Python script can be written in Python interactive shell or in the code editor. A Python file has an extension .py.
+
+### 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 block of codes. In other programming languages curly brackets are used to create blocks of codes instead of indentation. One of the common bugs when writing python code is wrong indentation.
+
+
+
+### Comments
+
+Comments are very important to make the code more readable and to leave remarks in our code. Python does not run comment parts of our code.
+Any text starting with hash(#) in Python is a comment.
+
+**Example: Single Line Comment**
+
+```shell
+ # 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
+
+```shell
+"""This is multiline comment
+multiline comment takes multiple lines.
+python is eating the world
+"""
+```
+
+### Data types
+
+In Python there are several types of data types. Let us get started with the most common ones. Different data types will be covered in detail in other sections. For the time being, let us just go through the different data types and get familiar with them. You do not have to have a clear understanding now.
+
+#### 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:**
+
+```py
+'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:**
+
+```python
+ 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:**
+
+```py
+[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)
+['Banana', 10, False, 9.81] # different data types in the list - string, integer, boolean and float
+```
+
+#### Dictionary
+
+A Python dictionary object is an unordered collection of data in a key value pair format.
+
+**Example:**
+
+```py
+{
+'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:**
+
+```py
+('Asabeneh', 'Pawel', 'Brook', 'Abraham', 'Lidiya') # Names
+```
+
+```py
+('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:**
+
+```py
+{2, 4, 3, 5}
+{3.14, 9.81, 2.7} # order is not important in set
+```
+
+### Checking Data types
+
+To check the data type of certain data/variable we use the **type** function. In the following terminal you will see different python data types:
+
+
+
+### 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:**
+
+The file name is helloworld.py
+
+```py
+# Day 1 - 30DaysOfPython Challenge
+
+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(//)
+
+# Checking data types
+print(type(10)) # Int
+print(type(3.14)) # Float
+print(type(1 + 3j)) # Complex number
+print(type('Asabeneh')) # String
+print(type([1, 2, 3])) # List
+print(type({'name':'Asabeneh'})) # Dictionary
+print(type({9.8, 3.14, 2.7})) # Set
+print(type((9.8, 3.14, 2.7))) # Tuple
+```
+
+To run the python file check the image below. You can run the python file either by running the green button on Visual Studio Code or by typing _python helloworld.py_ in the terminal .
+
+
+
+🌕 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.
+
+## 💻 Exercises - Day 1
+
+### Exercise: Level 1
+
+1. Check the python version you are using
+2. Open the python interactive shell and do the following operations. The operands are 3 and 4.
+ - addition(+)
+ - subtraction(-)
+ - multiplication(\*)
+ - modulus(%)
+ - division(/)
+ - exponential(\*\*)
+ - floor division operator(//)
+3. Write strings on the python interactive shell. The strings are the following:
+ - Your name
+ - Your family name
+ - Your country
+ - I am enjoying 30 days of python
+4. Check the data types of the following data:
+ - 10
+ - 9.8
+ - 3.14
+ - 4 - 4j
+ - ['Asabeneh', 'Python', 'Finland']
+ - Your name
+ - Your family name
+ - Your country
+
+### Exercise: Level 2
+
+1. Create a folder named day_1 inside 30DaysOfPython folder. Inside day_1 folder, create a python file helloworld.py and repeat questions 1, 2, 3 and 4. Remember to use _print()_ when you are working on a python file. Navigate to the directory where you have saved your file, and run it.
+
+### Exercise: Level 3
+
+1. Write an example for different Python data types such as Number(Integer, Float, Complex), String, Boolean, List, Tuple, Set and Dictionary.
+2. Find an [Euclidian distance](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) between (2, 3) and (10, 8)
+
+🎉 CONGRATULATIONS ! 🎉
+
+[Day 2 >>](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)
diff --git a/Ukrainian/readme.md b/Ukrainian/readme.md
new file mode 100644
index 000000000..bc8a56298
--- /dev/null
+++ b/Ukrainian/readme.md
@@ -0,0 +1,454 @@
+# 🐍 30 днів з Python
+
+| № дня | Теми |
+|-------|:-------------------------------------------------------------------------------------------------------:|
+| 01 | [Вступ](./readme.md) |
+| 02 | [Variables, Built-in Functions](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md) |
+| 03 | [Operators](../03_Day_Operators/03_operators.md) |
+| 04 | [Strings](../04_Day_Strings/04_strings.md) |
+| 05 | [Lists](../05_Day_Lists/05_lists.md) |
+| 06 | [Tuples](../06_Day_Tuples/06_tuples.md) |
+| 07 | [Sets](../07_Day_Sets/07_sets.md) |
+| 08 | [Dictionaries](../08_Day_Dictionaries/08_dictionaries.md) |
+| 09 | [Conditionals](../09_Day_Conditionals/09_conditionals.md) |
+| 10 | [Loops](../10_Day_Loops/10_loops.md) |
+| 11 | [Functions](../11_Day_Functions/11_functions.md) |
+| 12 | [Modules](../12_Day_Modules/12_modules.md) |
+| 13 | [List Comprehension](../13_Day_List_comprehension/13_list_comprehension.md) |
+| 14 | [Higher Order Functions](../14_Day_Higher_order_functions/14_higher_order_functions.md) |
+| 15 | [Python Type Errors](../15_Day_Python_type_errors/15_python_type_errors.md) |
+| 16 | [Python Date time](../16_Day_Python_date_time/16_python_datetime.md) |
+| 17 | [Exception Handling](../17_Day_Exception_handling/17_exception_handling.md) |
+| 18 | [Regular Expressions](../18_Day_Regular_expressions/18_regular_expressions.md) |
+| 19 | [File Handling](../19_Day_File_handling/19_file_handling.md) |
+| 20 | [Python Package Manager](../20_Day_Python_package_manager/20_python_package_manager.md) |
+| 21 | [Classes and Objects](../21_Day_Classes_and_objects/21_classes_and_objects.md) |
+| 22 | [Web Scraping](../22_Day_Web_scraping/22_web_scraping.md) |
+| 23 | [Virtual Environment](../23_Day_Virtual_environment/23_virtual_environment.md) |
+| 24 | [Statistics](../24_Day_Statistics/24_statistics.md) |
+| 25 | [Pandas](../25_Day_Pandas/25_pandas.md) |
+| 26 | [Python web](../26_Day_Python_web/26_python_web.md) |
+| 27 | [Python with MongoDB](../27_Day_Python_with_mongodb/27_python_with_mongodb.md) |
+| 28 | [API](../28_Day_API/28_API.md) |
+| 29 | [Building API](../29_Day_Building_API/29_building_API.md) |
+| 30 | [Conclusions](../30_Day_Conclusions/30_conclusions.md) |
+
+🧡🧡🧡 ЩАСЛИВОГО ПРОГРАМУВАННЯ 🧡🧡🧡
+
+
+Підтримайте автора, щобм він створював більше навчальних матеріалів
+
+
+
+[<< Day 2](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md) | [Day 4 >>](../04_Day_Strings/04_strings.md)
+
+
+
+- [📘 3일차](#-3일차)
+ - [불리언](#불리언)
+ - [연산자](#연산자)
+ - [대입 연산자](#대입-연산자)
+ - [산술 연산자:](#산술-연산자)
+ - [비교 연산자](#비교-연산자)
+ - [논리 연산자](#논리-연산자)
+ - [💻 3일차: 실습](#-3일차-실습)
+
+# 📘 3일차
+
+## 불리언
+
+불리언 데이터 타입은 True 또는 False 두 값 중 하나를 나타냅니다. 비교 연산자를 사용하면 이 데이터 타입의 사용이 명확해질 것입니다. 첫 번째 문자 **T** 는 참, **F** 는 거짓으로 표현되는 자바 스크립트와 달리 대문자여야 합니다.
+**예시: 불리언 값**
+
+```py
+print(True)
+print(False)
+```
+
+## 연산자
+
+파이썬은 몇 가지 타입의 연산자를 지원합니다. 이 섹션에서 이것에 대해 알아볼 것입니다.
+
+### 대입 연산자
+
+대입 연산자는 변수에 값을 대입할 때 사용됩니다. = 로 예시를 들어보겠습니다. 수학에서 등호란 두 값이 동일하다는 것을 의미하지만, 파이썬에서는 특정 변수가 값을 가지고 있으며, 이 변수에 값을 대입한다고 합니다. 아래 표는 [w3school](https://www.w3schools.com/python/python_operators.asp)에서 가져온 다양한 유형의 파이썬 할당 연산자를 보여줍니다.
+
+
+
+### 산술 연산자:
+
+- 더하기(+): a + b
+- 빼기(-): a - b
+- 곱하기(*): a * b
+- 나누기(/): a / b
+- 나머지 연산(%): a % b
+- 버림 나눗셈(//): a // b
+- 지수(**): a ** b
+
+
+
+**예시: Integers**
+
+```py
+# Arithmetic Operations in Python
+# Integers
+
+print('Addition: ', 1 + 2) # 3
+print('Subtraction: ', 2 - 1) # 1
+print('Multiplication: ', 2 * 3) # 6
+print ('Division: ', 4 / 2) # 2.0 파이썬의 나누기는 부동 소수를 제공합니다.
+print('Division: ', 6 / 2) # 3.0
+print('Division: ', 7 / 2) # 3.5
+print('Division without the remainder: ', 7 // 2) # 3, 부동 소수 또는 나머지가 없는 값을 제공합니다.
+print ('Division without the remainder: ',7 // 3) # 2
+print('Modulus: ', 3 % 2) # 1, 나머지를 제공합니다.
+print('Exponentiation: ', 2 ** 3) # 9 2 * 2 * 2 를 의미합니다.
+```
+
+**예시: Floats**
+
+```py
+# Floating numbers
+print('Floating Point Number, PI', 3.14)
+print('Floating Point Number, gravity', 9.81)
+```
+
+**예시: 복소수**
+
+```py
+# Complex numbers
+print('Complex number: ', 1 + 1j)
+print('Multiplying complex numbers: ',(1 + 1j) * (1 - 1j))
+```
+
+변수를 선언하고 숫자 데이터 유형을 지정합니다. 여기서는 단일 문자 변수를 사용할 것이지만, 이런 유형의 변수를 선언하는 습관은 좋지 않다는 것을 기억하셔야 합니다. 변수 이름은 항상 기억해야 합니다.
+
+**Example:**
+
+```python
+# 첫 번째로 변수를 먼저 선언합니다.
+
+a = 3 # a는 변수의 이름이며 정수 데이터 타입입니다.
+b = 2 # b는 변수의 이름이며 정수 데이터 타입입니다.
+
+# 산술 연산 및 결과를 변수에 대입합니다.
+total = a + b
+diff = a - b
+product = a * b
+division = a / b
+remainder = a % b
+floor_division = a // b
+exponential = a ** b
+
+# sum 대신 total을 사용했어야 하지만 sum은 내장 함수입니다. 내장 함수를 재정의하지 않도록 하십시오.
+print(total) # 만약 몇몇 출력에 문자열로 표시를 하지 않는다면, 어디서 결과가 오는지 알지 못할 것입니다.
+print('a + b = ', total)
+print('a - b = ', diff)
+print('a * b = ', product)
+print('a / b = ', division)
+print('a % b = ', remainder)
+print('a // b = ', floor_division)
+print('a ** b = ', exponentiation)
+```
+
+**Example:**
+
+```py
+print('== Addition, Subtraction, Multiplication, Division, Modulus ==')
+
+# 값을 선언하고 함께 정리
+num_one = 3
+num_two = 4
+
+# 산술 연산
+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
+
+# 레이블로 값 출력
+print('total: ', total)
+print('difference: ', diff)
+print('product: ', product)
+print('division: ', div)
+print('remainder: ', remainder)
+```
+
+이제 점 연결을 시작하고 이미 알고 있는 계산 방법(면적, 부피, 밀도, 무게, 둘레, 거리, 힘)을 사용해 보겠습니다.
+
+**Example:**
+
+```py
+# 원의 넓이 계산
+radius = 10 # 원의 반지름
+area_of_circle = 3.14 * radius ** 2 # 두 개의 * 기호는 지수를 의미합니다
+print('Area of a circle:', area_of_circle)
+
+# 직사각형의 넓이 계산
+length = 10
+width = 20
+area_of_rectangle = length * width
+print('Area of rectangle:', area_of_rectangle)
+
+# 개체의 무게 계산
+mass = 75
+gravity = 9.81
+weight = mass * gravity
+print(weight, 'N') # 무게에 단위 추가
+
+# 액체의 밀도 계산
+mass = 75 # in Kg
+volume = 0.075 # in cubic meter
+density = mass / volume # 1000 Kg/m^3
+
+```
+
+### 비교 연산자
+
+프로그래밍에서 우리는 비교 연산자를 사용하여 두 값을 비교합니다. 우리는 값이 다른 값보다 크거나 작거나 같은지 확인합니다. 다음 표는[w3shool](https://www.w3schools.com/python/python_operators.asp)에서 가져온 파이썬의 비교 연산자를 보여줍니다.
+
+
+**Example: 비교 연산자**
+
+```py
+print(3 > 2) # 참, 3이 2보다 크기 때문에
+print(3 >= 2) # 참, 3이 2보다 크기 때문에
+print(3 < 2) # 거짓, 3이 더 크기 때문에
+print(2 < 3) # 참, 2가 3보다 작기 때문에
+print(2 <= 3) # 참, 2가 3보다 작기 때문에
+print(3 == 2) # 거짓, 3과 2는 같지 않기 때문에
+print(3 != 2) # 참, 3은 2와 다르기 때문에
+print(len('mango') == len('avocado')) # 거짓
+print(len('mango') != len('avocado')) # 참
+print(len('mango') < len('avocado')) # 참
+print(len('milk') != len('meat')) # 거짓
+print(len('milk') == len('meat')) # 참
+print(len('tomato') == len('potato')) # 참
+print(len('python') > len('dragon')) # 거짓
+
+
+# 무언가를 비교하면 참 또는 거짓이 됩니다.
+
+print('True == True: ', True == True)
+print('True == False: ', True == False)
+print('False == False:', False == False)
+```
+
+위의 비교 연산자 외에 파이썬은 다음과 같은 연산자를 사용합니다:
+
+- _is_: 두 변수가 동일할 경우 참을 반환합니다.(x is y)
+- _is not_: 두 변수가 동일하지 않을 경우 참을 반환합니다.(x is not y)
+- _in_: 제시된 목록에 특정 항목이 포함된 경우 참을 반환합니다.(x in y)
+- _not in_: 제시된 목록에 특정 항목이 없으면 참을 반환합니다.(x in y)
+
+```py
+print('1 is 1', 1 is 1) # 참 - 데이터 값이 동일하기 때문에
+print('1 is not 2', 1 is not 2) # 참 - 1과 2는 다르기 때문에
+print('A in Asabeneh', 'A' in 'Asabeneh') # 참 - 문자열에서 A를 찾을 수 있습니다
+print('B in Asabeneh', 'B' in 'Asabeneh') # 거짓 - 대문자 B가 없습니다
+print('coding' in 'coding for all') # 참 - coding이라는 단어를 coding for all이 가지고 있기 때문에
+print('a in an:', 'a' in 'an') # 참
+print('4 is 2 ** 2:', 4 is 2 ** 2) # 참
+```
+
+### 논리 연산자
+
+다른 프로그래밍 언어와 달리 파이썬은 논리 연산자를 위해 _and_, _or_, _not_ 키워드를 사용합니다. 논리 연산자는 다음과 같은 조건문을 결합하는 데 사용됩니다.
+
+
+
+```py
+print(3 > 2 and 4 > 3) # 참 - 두 개의 문장이 참이기 때문에
+print(3 > 2 and 4 < 3) # 거짓 - 두 번째 문장이 거짓이기 때문에
+print(3 < 2 and 4 < 3) # 거짓 - 두 가지 문장 모두 거짓이기 때문에
+print('True and True: ', True and True)
+print(3 > 2 or 4 > 3) # 참 - 두 가지 문장 모두 참이기 때문에
+print(3 > 2 or 4 < 3) # 참 - 두 가지 중 하나의 문장이 참이기 때문에
+print(3 < 2 or 4 < 3) # 거짓 - 두 가지 문장 모두 거짓이기 때문에
+print('True or False:', True or False)
+print(not 3 > 2) # 거짓 - 3이 2보다 큰 것은 참이기 때문에, 참이 아닐 경우 거짓을 줍니다.
+print(not True) # 거짓 - 부정으로 참에서 거짓으로 바뀝니다.
+print(not False) # True
+print(not not True) # True
+print(not not False) # False
+
+```
+
+🌕 당신은 무한한 에너지를 가지고 있어요. 여러분은 이제 막 3일차 도전을 마쳤고 위대함으로 가는 길에 세 걸음 앞서 있습니다. 이제 여러분의 뇌와 근육을 위한 운동을 하세요.
+
+## 💻 3일차 실습
+
+1. 나이를 정수 변수로 선언합니다.
+2. 자신의 키를 플로트 변수로 선언합니다.
+3. 복소수를 저장하는 변수 선언합니다.
+4. 삼각형의 밑면과 높이를 입력하도록 사용자에게 지시하는 스크립트를 작성하고 이 삼각형의 면적(면적 = 0.5 x b x h)을 계산합니다.
+
+```py
+ Enter base: 20
+ Enter height: 10
+ The area of the triangle is 100
+```
+
+5. 삼각형의 측면 a, 측면 b, 측면 c를 입력하라는 메시지를 표시하는 스크립트를 작성합니다. 삼각형의 둘레(지름 = a + b + c)를 계산합니다.
+
+```py
+Enter side a: 5
+Enter side b: 4
+Enter side c: 3
+The perimeter of the triangle is 12
+```
+
+6. 프롬프트를 사용하여 직사각형의 길이와 너비를 가져옵니다. 면적(면적 = 길이 x 폭) 및 둘레(면적 = 2 x (길이 + 폭)) 계산합니다.
+7. 프롬프트를 사용하여 원의 반지름을 구합니다. 면적(면적 = 픽스 r x r)과 원주(c = 2 x 픽스 r)를 계산합니다. 여기서 pi = 3.14입니다.
+8. y = 2x-2의 기울기, x-제곱 및 y-제곱을 계산합니다.
+9. 기울기는 (m = y2-y1/x2-x1)입니다. 기울기와 [유클리드 거리](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) 점(2,2)과 점(6,10) 사이를 구합니다.
+10. 과제 8과 9의 기울기를 비교합니다.
+11. y 값(y = x^2 + 6x + 9)을 계산합니다. 다른 x 값을 사용하고 y 값이 0이 되는 x 값을 계산해 보십시오.
+12. 'python'과 'dragon'의 길이를 찾아 거짓 비교를 합니다.
+13. _and_ 연산자를 사용하여 'python'과 'dragon' 모두에 'on'이 있는지 확인합니다.
+14. _나는 이 강좌가 전문용어로 가득하지 않기를 바랍니다. _in_ 연산자를 사용하여 _jargon_ 이 문장에 있는지 확인합니다.
+15. dragon과 python 모두 'On'이 없습니다.
+16. _python_ 텍스트의 길이를 찾아서 값을 float로 변환하고 문자열로 변환합니다.
+17. 짝수는 2로 나누고 나머지는 0입니다. 파이썬을 사용하여 숫자가 짝수인지 아닌지 어떻게 확인하겠습니까?
+18. 7 x 3의 나눗셈 버림이 2.7의 int 변환값과 동일한지 확인합니다.
+19. '10'의 유형이 10의 유형과 동일한지 확인합니다.
+20. if int('9.8')이 10과 같은지 확인합니다.
+21. 사용자에게 시간 및 시간당 요금을 입력하도록 요청하는 스크립트를 작성합니다. 그 사람의 급여를 계산합니까?
+
+```py
+Enter hours: 40
+Enter rate per hour: 28
+Your weekly earning is 1120
+```
+
+22. 사용자에게 년 수를 입력하도록 요청하는 스크립트를 작성합니다. 사람이 살 수 있는 시간을 초 단위로 계산합니다. 사람이 100년을 살 수 있다고 가정합시다.
+
+```py
+Enter number of years you have lived: 100
+You have lived for 3153600000 seconds.
+```
+
+23. 다음을 표시하는 파이썬 스크립트를 작성합니다.
+
+```py
+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
+```
+
+🎉 축하합니다 ! 🎉
+
+[<< Day 2](../02_Day_Variables_builtin_functions/02_variables_builtin_functions.md) | [Day 4 >>](../04_Day_Strings/04_strings.md)
diff --git a/korean/readme.md b/korean/readme.md
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/korean/readme.md
@@ -0,0 +1 @@
+
diff --git a/numpy.md b/numpy.md
index 97298e678..857f40f36 100644
--- a/numpy.md
+++ b/numpy.md
@@ -256,7 +256,7 @@ print('The size:', two_dimensional_list.size) # 3
## Mathematical Operation using numpy
-Numpy array is not like exactly like python list. To do mathematical operation in pyhton list we have to loop through the items but numpy can allow to do any mathematical operation without looping.
+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 (+)
diff --git a/old_files/readme19-21.md b/old_files/readme19-21.md
index d9a0f350a..72c910832 100644
--- a/old_files/readme19-21.md
+++ b/old_files/readme19-21.md
@@ -1,15 +1,15 @@

-🧳 [Part 1: Day 1 - 3](https://github.com/Asabeneh/30-Days-Of-Python)
-🧳 [Part 2: Day 4 - 6](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme4-6.md)
-🧳 [Part 3: Day 7 - 9](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme7-9.md)
-🧳 [Part 4: Day 10 - 12](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme10-12.md)
-🧳 [Part 5: Day 13 - 15](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme13-15.md)
-🧳 [Part 6: Day 16 - 18](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme16-18.md)
-🧳 [Part 7: Day 19 - 21](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme19-21.md)
-🧳 [Part 8: Day 22 - 24](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md)
-🧳 [Part 9: Day 25 - 27](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme25-27.md)
-🧳 [Part 10: Day 28 - 30](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme28-30.md)
+🧳 [Part 1: Day 1 - 3](https://github.com/Asabeneh/30-Days-Of-Python)
+🧳 [Part 2: Day 4 - 6](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme4-6.md)
+🧳 [Part 3: Day 7 - 9](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme7-9.md)
+🧳 [Part 4: Day 10 - 12](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme10-12.md)
+🧳 [Part 5: Day 13 - 15](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme13-15.md)
+🧳 [Part 6: Day 16 - 18](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme16-18.md)
+🧳 [Part 7: Day 19 - 21](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme19-21.md)
+🧳 [Part 8: Day 22 - 24](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md)
+🧳 [Part 9: Day 25 - 27](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme25-27.md)
+🧳 [Part 10: Day 28 - 30](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme28-30.md)
---
@@ -856,7 +856,7 @@ The folder structure of your package should look like this:
Now let's open the python interactive shell and try the package we have created:
```sh
asabeneh@Asabeneh:~/Desktop/30DaysOfPython$ python
-Python 3.7.5 (default, Nov 1 2019, 02:16:32)
+Python 3.7.5 (default, Nov 1 2019, 02:16:32)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from mypackage import arithmetics
@@ -875,10 +875,10 @@ Type "help", "copyright", "credits" or "license" for more information.
>>> from mypackage import greet
>>> greet.greet_person('Asabeneh', 'Yetayeh')
'Asabeneh Yetayeh, welcome to 30DaysOfPython Challenge!'
->>>
+>>>
```
As you can see our package works perfect. The package folder contains a special file called __init__.py which stores the package's content. If we put __init__.py in the package folder, python start recognizes it as a package.
-The __init__.py exposes specified resources from its modules to be imported to other python files. An empty __init__.py file makes all functions available when a package is imported. The __init__.py is essential for the folder to be recognized by Python as a package.
+The __init__.py exposes specified resources from its modules to be imported to other python files. An empty __init__.py file makes all functions available when a package is imported. The __init__.py is essential for the folder to be recognized by Python as a package.
### Further information about packages
@@ -930,8 +930,6 @@ Let's check if everything in python is class:
```py
Last login: Tue Dec 10 09:35:28 on console
-asabeneh@Asabeneh:~$ pyhton
--bash: pyhton: command not found
asabeneh@Asabeneh:~$ python
Python 3.7.5 (default, Nov 1 2019, 02:16:32)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
@@ -1167,7 +1165,7 @@ Lidiya Teklemariam is 28 year old. He lives in Espoo, Finland.
['Organizing', 'Marketing', 'Digital Marketing']
```
-We didn't call the _**init**()_ constructor in the child class. If we didn't call it we can access all the properties but if we call it once we access the parent properties by calling _super_.
+We didn't call the _**init**()_ constructor in the child class. If we didn't call it we can access all the properties but if we call it once we access the parent properties by calling _super_.
We can write add a new method to the child or we can overwrite the parent class 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.
### Overriding parent method
@@ -1242,7 +1240,7 @@ Standard Deviation: 4.2
Frequency Distribution: [(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)]
```
1. Create a class called PersonAccount. It has firstname, lastname, incomes, expenses properties and it has total_income, total_expense, account_info,add_income, add_expense and account_balance methods. Incomes is a set of incomes and its description and the same goes for expenses.
-
+
[<< Part 6 ](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme16-18.md) | [Part 8 >>](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md)
----
\ No newline at end of file
+---
diff --git a/old_files/readme25-27.md b/old_files/readme25-27.md
index 2570dd989..d1b9583b9 100644
--- a/old_files/readme25-27.md
+++ b/old_files/readme25-27.md
@@ -1,15 +1,15 @@

-🧳 [Part 1: Day 1 - 3](https://github.com/Asabeneh/30-Days-Of-Python)
-🧳 [Part 2: Day 4 - 6](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme4-6.md)
-🧳 [Part 3: Day 7 - 9](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme7-9.md)
-🧳 [Part 4: Day 10 - 12](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme10-12.md)
-🧳 [Part 5: Day 13 - 15](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme13-15.md)
-🧳 [Part 6: Day 16 - 18](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme16-18.md)
-🧳 [Part 7: Day 19 - 21](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme19-21.md)
-🧳 [Part 8: Day 22 - 24](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md)
-🧳 [Part 9: Day 25 - 27](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme25-27.md)
-🧳 [Part 10: Day 28 - 30](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme28-30.md)
+🧳 [Part 1: Day 1 - 3](https://github.com/Asabeneh/30-Days-Of-Python)
+🧳 [Part 2: Day 4 - 6](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme4-6.md)
+🧳 [Part 3: Day 7 - 9](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme7-9.md)
+🧳 [Part 4: Day 10 - 12](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme10-12.md)
+🧳 [Part 5: Day 13 - 15](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme13-15.md)
+🧳 [Part 6: Day 16 - 18](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme16-18.md)
+🧳 [Part 7: Day 19 - 21](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme19-21.md)
+🧳 [Part 8: Day 22 - 24](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md)
+🧳 [Part 9: Day 25 - 27](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme25-27.md)
+🧳 [Part 10: Day 28 - 30](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme28-30.md)
- [📘 Day 25](#%f0%9f%93%98-day-25)
- [Pandas](#pandas)
@@ -83,11 +83,11 @@ Let's see an example of a series:
Names pandas Series
-
+
Countries Series
-
+
Cities Series
@@ -249,7 +249,7 @@ Pandas data frames can be created in different ways.
```python
data = [
- ['Asabeneh', 'Finland', 'Helsink'],
+ ['Asabeneh', 'Finland', 'Helsink'],
['David', 'UK', 'London'],
['John', 'Sweden', 'Stockholm']
]
@@ -638,7 +638,7 @@ heights
2 74.110105
3 71.730978
4 69.881796
- ...
+ ...
9995 66.172652
9996 67.067155
9997 63.867992
@@ -666,7 +666,7 @@ weights
2 212.740856
3 220.042470
4 206.349801
- ...
+ ...
9995 136.777454
9996 170.867906
9997 128.475319
@@ -690,7 +690,7 @@ len(heights) == len(weights)
```python
-heights.describe() # give statisical information about height data
+heights.describe() # give statistical information about height data
```
@@ -811,9 +811,9 @@ df.describe() # describe can also give statistical information from a datafrom
Modifying a DataFrame
* We can create a new DataFrame
- * We can create a new column and add to DataFrame,
- * we can remove an existing column from DataFrame,
- * we can modify an existing column from DataFrame,
+ * We can create a new column and add to DataFrame,
+ * we can remove an existing column from DataFrame,
+ * we can modify an existing column from DataFrame,
* we can change the data type of column values from DataFrame
### Create a DataFrame
@@ -1102,7 +1102,7 @@ def calculate_bmi ():
b = w/(h*h)
bmi.append(b)
return bmi
-
+
bmi = calculate_bmi()
```
@@ -1483,7 +1483,7 @@ df
-The person in the first row lives 250 years. It is unlikely for someone to live 250 years. Either it is a typo or the data is cooked. So lets fill that data with average of the columns without including outlier.
+The person in the first row lives 250 years. It is unlikely for someone to live 250 years. Either it is a typo or the data is cooked. So lets fill that data with average of the columns without including outlier.
mean = (34 + 29)/ 2
@@ -1629,12 +1629,12 @@ df[df['Ages'] < 120]
```python
df['Ages'] = df[df['Ages'] > 120]
-
-
+
+
```
## Exercises: Day 25
-1. Read the hacker_ness.csv file from data directory
+1. Read the hacker_ness.csv file from data directory
1. Get the first five rows
1. Get the last five rows
1. Get the title column as pandas series
@@ -2194,7 +2194,7 @@ Select the free plan

-Choose the proximate free region and give any name for you cluster.
+Choose the proximate free region and give any name for you cluster.

@@ -2768,4 +2768,3 @@ Now, we have deleted the students collection from the database.
[<< Part 8 ](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme22-24.md) | [Part 10 >>](https://github.com/Asabeneh/30-Days-Of-Python/blob/master/readme28-30.md)
---
-
diff --git a/old_files/readme7-9.md b/old_files/readme7-9.md
index 6d531e4c2..61fd4d271 100644
--- a/old_files/readme7-9.md
+++ b/old_files/readme7-9.md
@@ -760,11 +760,11 @@ else:
```
1. Write a code which give grade to students according to theirs scores:
```sh
- 80-100, A
- 70-89, B
- 60-69, C
- 50-59, D
- 0 -49, F
+ 90-100, A
+ 80-89, B
+ 70-79, C
+ 60-69, D
+ 0-59, F
```
1. Check if the season is Autumn, Winter, Spring or Summer. If the user input is:
September, October or November, the season is Autumn.
diff --git a/readme.md b/readme.md
index 76a8f85b6..e382f28c4 100644
--- a/readme.md
+++ b/readme.md
@@ -1,4 +1,4 @@
-# 🐍 30 Days Of Python
+# 🐍 30 Days Of Python
|# Day | Topics |
|------|:---------------------------------------------------------:|
@@ -15,11 +15,11 @@
| 11 | [Functions](./11_Day_Functions/11_functions.md)|
| 12 | [Modules](./12_Day_Modules/12_modules.md)|
| 13 | [List Comprehension](./13_Day_List_comprehension/13_list_comprehension.md)|
-| 14 | [Higher Order Functions](./14_Day_Higher_order_functions/14_higher_order_functions.md)|
-| 15 | [Python Type Errors](./15_Day_Python_type_errors/15_python_type_errors.md)|
-| 16 | [Python Date time](./16_Day_Python_date_time/16_python_datetime.md) |
-| 17 | [Exception Handling](./17_Day_Exception_handling/17_exception_handling.md)|
-| 18 | [Regular Expressions](./18_Day_Regular_expressions/18_regular_expressions.md)|
+| 14 | [Higher Order Functions](./14_Day_Higher_order_functions/14_higher_order_functions.md)|
+| 15 | [Python Type Errors](./15_Day_Python_type_errors/15_python_type_errors.md)|
+| 16 | [Python Date time](./16_Day_Python_date_time/16_python_datetime.md) |
+| 17 | [Exception Handling](./17_Day_Exception_handling/17_exception_handling.md)|
+| 18 | [Regular Expressions](./18_Day_Regular_expressions/18_regular_expressions.md)|
| 19 | [File Handling](./19_Day_File_handling/19_file_handling.md)|
| 20 | [Python Package Manager](./20_Day_Python_package_manager/20_python_package_manager.md)|
| 21 | [Classes and Objects](./21_Day_Classes_and_objects/21_classes_and_objects.md)|
@@ -33,13 +33,78 @@
| 29 | [Building API](./29_Day_Building_API/29_building_API.md)|
| 30 | [Conclusions](./30_Day_Conclusions/30_conclusions.md)|
-🧡🧡🧡 HAPPY CODING 🧡🧡🧡
+🧡🧡🧡 HAPPY CODING 🧡🧡🧡
+---
-Support the author to create more educational materials
-
+
💖 Sponsors
+
+
Our amazing sponsors for supporting my open-source contribution and the 30 Days of Challenge series!
+---
+
+### 🙌 Become a Sponsor
+
+You can support this project by becoming a sponsor on **[GitHub Sponsors](https://github.com/sponsors/asabeneh)** or through [PayPal](https://www.paypal.me/asabeneh).
+
+Every contribution, big or small, makes a huge difference. Thank you for your support! 🌟
+
+---
+
+🇧🇷 [Portuguese](./Portuguese/README.md)
+🇨🇳 [中文](./Chinese/README.md)
[Day 2 >>](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)

- [🐍 30 Days Of Python](#-30-days-of-python)
+ - [🙌 Become a Sponsor](#-become-a-sponsor)
- [📘 Day 1](#-day-1)
- [Welcome](#welcome)
- [Introduction](#introduction)
@@ -93,32 +161,35 @@
## Welcome
-**Congratulations** for deciding to participate in a _30 days of Python_ programming challenge . In this challenge you will learn everything you need to be a python programmer and the whole concept of programming. In the end of the challenge you will get a _30DaysOfPython_ programming challenge certificate.
+**Congratulations** for deciding to participate in a _30 days of Python_ programming challenge. In this challenge, you will learn everything you need to be a python programmer and the whole concept of programming. In the end of the challenge you will get a _30DaysOfPython_ programming challenge certificate.
-If you would like to actively engage in the challenge, you may join the [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython) telegram group.
+If you would like to actively engage in the challenge, you may join the [30DaysOfPython challenge](https://t.me/ThirtyDaysOfPython) telegram group.
## Introduction
-Python is a high-level programming language for general-purpose programming. It is an open source, interpreted, objected-oriented programming language. Python was created by a Dutch programmer, Guido van Rossum. The name of Python programming language was derived from a British sketch comedy series, *Month Python's Flying Circus*. The first version was released on February 20, 1991. This 30 days of Python challenge will help you learn the latest version of Python, Python 3 step by step. The topics are broken down into 30 days, where each day contains several topics with easy-to-understand explanations, real-world examples, many hands on exercises and projects.
+Python is a high-level programming language for general-purpose programming. It is an open source, interpreted, object-oriented programming language. Python was created by a Dutch programmer, Guido van Rossum. The name of the Python programming language was derived from a British sketch comedy series, *Monty Python's Flying Circus*. The first version was released on February 20, 1991. This 30 days of Python challenge will help you learn the latest version of Python, Python 3 step by step. The topics are broken down into 30 days, where each day contains several topics with easy-to-understand explanations, real-world examples, and many hands on exercises and projects.
+
+This challenge is designed for beginners and professionals who want to learn python programming language. It may take 30 to 100 days to complete the challenge. People who actively participate in the telegram group have a high probability of completing the challenge.
-This challenge is designed for beginners and professionals who want to learn python programming language. It may take 30 to 100 days to complete the challenge, people who actively participate on the telegram group have a high probability of completing the challenge.
-If you are a visual learner or in favor of videos, you may get started with this [Python for Absolute Beginners video](https://www.youtube.com/watch?v=11OYpBrhdyM).
+This challenge is easy to read, written in conversational English, engaging, motivating and at the same time, it is very demanding. You need to allocate much time to finish this challenge. If you are a visual learner, you may get the video lesson on Washera YouTube channel. You may start from [Python for Absolute Beginners video](https://youtu.be/OCCWZheOesI). Subscribe the channel, comment and ask questions on YouTube videos and be proactive, the author will eventually notice you.
+
+The author likes to hear your opinion about the challenge, share the author by expressing your thoughts about the 30DaysOfPython challenge. You can leave your testimonial on this [link](https://www.asabeneh.com/testimonials)
## Why Python ?
-It is a programming language which is very close to human language and because of that it is easy to learn and use.
-Python is used by various industries and companies (including Google). It has been used to develop web applications, desktop applications, system adminstration, and machine learning libraries. Python is highly embraced language in the data science and machine learning community. I hope this is enough to convince you to start learning Python. Python is eating the world and you are killing it before it eats you.
+It is a programming language which is very close to human language and because of that, it is easy to learn and use.
+Python is used by various industries and companies (including Google). It has been used to develop web applications, desktop applications, system administration, and machine learning libraries. Python is a highly embraced language in the data science and machine learning community. I hope this is enough to convince you to start learning Python. Python is eating the world and you are killing it before it eats you.
## Environment Setup
### Installing Python
To run a python script you need to install python. Let's [download](https://www.python.org/) python.
-If your are a windows user. Click the button encircled in red.
+If your are a windows user, click the button encircled in red.
[](https://www.python.org/)
-If you are a macOS user. Click the button encircled in red.
+If you are a macOS user, click the button encircled in red.
[](https://www.python.org/)
@@ -130,7 +201,7 @@ python --version

-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.
+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 manage to see the python version, well done. Python has been installed on your machine. Continue to the next section.
### Python Shell
@@ -151,7 +222,7 @@ Let us write our very first script on the Python scripting shell.

Well done, you wrote your first Python script on Python interactive shell. How do we close the Python interactive shell ?
-To close the shell, next to this symbol >> write **exit()** command and press Enter.
+To close the shell, next to this symbol >>> write **exit()** command and press Enter.

@@ -163,27 +234,27 @@ Python will give you results if you write scripts that Python understands, if no
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 process of identifying and removing errors from a program is called _debugging_. Let us debug it by putting * in place of **x**.

-Our bug was fixed, the code ran and we got a result we were expecting. As a programmer you will see such kind of errors on daily basis. It is good to know how to debug. To be good at debugging you should understand what kind of errors you are facing. Some of the Python errors you may encounter are *SyntaxError*, *IndexError*, *NameError*, *ModuleNotFoundError*, *KeyError*, *ImportError*, *AttributeError*, *TypeError*, *ValueError*, *ZeroDivisionError* etc. We will see more about different Python **_error types_** in later sections.
+Our bug was fixed, the code ran and we got a result we were expecting. As a programmer you will see such kind of errors on daily basis. It is good to know how to debug. To be good at debugging you should understand what kind of errors you are facing. Some of the Python errors you may encounter are _SyntaxError_, _IndexError_, _NameError_, _ModuleNotFoundError_, _KeyError_, _ImportError_, _AttributeError_, _TypeError_, _ValueError_, _ZeroDivisionError_ etc. We will see more about different Python **_error types_** in later sections.
Let us practice more how to use Python interactive shell. Go to your terminal or command prompt and write the word **python**.

-The Python interactive shell is opened. Let us do some basic mathematical operations (addition, subtraction, multiplication, division, modulus, exponential).
+The Python interactive shell is opened. Let us do some basic mathematical operations (addition, subtraction, multiplication, division, modulus, exponentiation).
Let us do some maths first before we write any Python code:
-- 2 + 3 = 5
-- 3 - 2 = 1
-- 3 \* 2 = 6
-- 3 / 2 = 1.5
-- 3 ^ 2 = 3 x 3 = 9
+- 2 + 3 is 5
+- 3 - 2 is 1
+- 3 * 2 is 6
+- 3 / 2 is 1.5
+- 3 ** 2 is the same as 3 * 3
-In python we have the following additional operations:
+In python, we have the following additional operations:
- 3 % 2 = 1 => which means finding the remainder
- 3 // 2 = 1 => which means removing the remainder
@@ -206,7 +277,7 @@ Before we move on to the next section, let us practice more on the Python intera
### Installing Visual Studio Code
-The Python interactive shell is good to try and test small script codes but it will not be for a big project. In real work environment, developers use different code editors to write codes. In this 30 days of Python programming challenge we will use visual studio code. Visual studio code is a very popular open source text editor. I am a fan of vscode and I would recommend to [download](https://code.visualstudio.com/) visual studio code, but if you are in favor of other editors, feel free to follow with what you have.
+The Python interactive shell is good to try and test small script codes but it will not be for a big project. In real work environment, developers use different code editors to write codes. In this 30 days of Python programming challenge, we will use Visual Studio Code. Visual Studio Code is a very popular open source text editor. I am a fan of vscode and I would recommend to [download](https://code.visualstudio.com/) visual studio code, but if you are in favor of other editors, feel free to follow with what you have.
[](https://code.visualstudio.com/)
@@ -225,7 +296,7 @@ Create a folder named 30DaysOfPython on your desktop. Then open it using visual

-After opening it you will see shortcuts for creating files and folders inside of 30DaysOfPython project's directory. As you can see below, I have created the very first file, helloworld.py. You can do the same.
+After opening it, you will see shortcuts for creating files and folders inside of 30DaysOfPython project's directory. As you can see below, I have created the very first file, `helloworld.py`. You can do the same.

@@ -243,14 +314,13 @@ A Python script can be written in Python interactive shell or in the code editor
### 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 block of codes. In other programming languages curly brackets are used to create blocks of codes instead of indentation. One of the common bugs when writing python code is wrong 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 are very important to make the code more readable and to leave remarks in our code. Python does not run comment parts of our code.
-Any text starting with hash(#) in Python is a comment.
+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**
@@ -327,7 +397,7 @@ Python list is an ordered collection which allows to store different data type i
#### Dictionary
-A Python dictionary object is an unordered collection of data in a key value pair format.
+A Python dictionary object is an unordered collection of data in a key value pair format.
**Example:**
@@ -335,8 +405,8 @@ A Python dictionary object is an unordered collection of data in a key value pai
{
'first_name':'Asabeneh',
'last_name':'Yetayeh',
-'country':'Finland',
-'age':250,
+'country':'Finland',
+'age':250,
'is_married':True,
'skills':['JS', 'React', 'Node', 'Python']
}
@@ -379,11 +449,11 @@ To check the data type of certain data/variable we use the **type** function. In
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.
+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:**
-The file name is helloworld.py
+The file name is `helloworld.py`
```py
# Day 1 - 30DaysOfPython Challenge
@@ -407,7 +477,7 @@ print(type({9.8, 3.14, 2.7})) # Set
print(type((9.8, 3.14, 2.7))) # Tuple
```
-To run the python file check the image below. You can run the python file either by running the green button on Visual Studio Code or by typing *python helloworld.py* in the terminal .
+To run the python file check the image below. You can run the python file either by running the green button on Visual Studio Code or by typing _python helloworld.py_ in the terminal .

@@ -448,8 +518,8 @@ To run the python file check the image below. You can run the python file either
### Exercise: Level 3
1. Write an example for different Python data types such as Number(Integer, Float, Complex), String, Boolean, List, Tuple, Set and Dictionary.
-2. Find an [Euclidian distance](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) between (2, 3) and (10, 8)
+2. Find an [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance#:~:text=In%20mathematics%2C%20the%20Euclidean%20distance,being%20called%20the%20Pythagorean%20distance.) between (2, 3) and (10, 8)
🎉 CONGRATULATIONS ! 🎉
-[Day 2 >>](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)
\ No newline at end of file
+[Day 2 >>](./02_Day_Variables_builtin_functions/02_variables_builtin_functions.md)