from functools import reduce

find_my_sum = [5, 3, 19, 48, 2, 31, 29]

def sum_func(x, y):
    return x + y

total = reduce(sum_func, find_my_sum)

print(total)

"""
Explanation: Reduce
The reduce function continously applies a function to a sequence. Like map, reduce has the same genera syntax:
reduce(function, sequence)

Semantically, the initial call of reduce is actually where the difference between map() exists. Reduce takes the first two items from the sequence, and applies function on the items, returning a single item. Now, the list is dynamically changed so that the two previous items in the sequence are replaced with a single, combined item.
reduce(function, [item1, item2, item3, item4])
---&gt; [function(item1, item2), item3, item 4]
---&gt; [function(function(item1, item2), item3), item4]
---&gt; [function(function(function(item1, item2), item3) item4)]

The last arrow is the single combined item of all 4 items. Let's take a look at a few examples.
Example 1: Finding the sum of a list.
End of explanation
"""


word_lst = ["hello", "there", "martha", "how", "are", "you", "doing"]
sentence = reduce(lambda x,y: x + " " + y, word_lst)

"""
Explanation: Let's look at how it worked. First, we made a list, and defined the function. After we supplied the arguments, the reduce function spreaded as described above.
1. total = [5, 3, 19, 48, 2, 31, 29]
2. total = [sum_func(5, 3), 19, 48, 2, 31, 29]
3. total = [sum_func(8, 19), 48, 2, 31, 29]
4. total = [sum_func(27, 48), 2, 31, 29]
5. total = [sum_func(75, 2), 31, 29]
6. total = [sum_func(77, 31), 29]
7. total = [sum_func(108, 29)]
8. total = [137]
9. total = 137

Example 2 Creating a sentence out of a list of words.
End of explanation
"""


nums = [5, 5, 39, 29, 48, 98, 23, 48]
max_num = reduce(lambda num1,num2: num1 if num1 > num2 else num2, nums)

print(max_num)

"""
Explanation: Here, we used a lambda expressiont unpack two variables (both strings), and then continue to create a sentence as the reduce continously applies the function at hand.
Example 3 Finding the maximum of a sequence.
End of explanation
"""


