# 高阶函数
# 把函数当做一个参数传递给另外一个函数
# def foo(n):
# print(n)
#
# def bar(name):
# print(name)
#
# foo(bar('lei'))
# lei
# None
# 返回值包含一个函数
# def foo():
# print('foo1')
# return bar
# def bar():
# print('bar1')
# n = foo()
# n()
# foo1
# bar1
# map 函数
num_1 = [1,45,1,5,1,2,9]
num_2 = [3,4,5,61,5,6]
# def map_test(array):
# ret = []
# for i in array:
# ret.append(i**2)
# return ret
# ret = map_test(num_1)
# print(ret)
# def map_test(func,array):
# ret = []
# for i in array:
# res = func(i)
# ret.append(res)
# return ret
# ret = map_test(lambda x:x+1,num_1)
# print(ret) # [2, 46, 2, 6, 2, 3, 10]
# ret1 = map_test(lambda x:x**2,num_1)
# print(ret1) # [1, 2025, 1, 25, 1, 4, 81]
# res1 = map(lambda x:x+1,num_1)
# print(res1) # <map object at 0x00000000023D1A20>
# print(list(res1)) # [2, 46, 2, 6, 2, 3, 10]
# 使用一次就会清空了再用for不会出信息 再用print互不干扰
# for i in res1:
# print(i)
# filter 函数
movie = ['sb_1234','sb_245','3415']
# def file_test(array):
# ret = []
# for p in array:
# if not p.startswith('sb'):
# ret.append(p)
# return ret
# res = file_test(movie)
# print(res) # ['3415']
# def file_test(func,array):
# ret = []
# for p in array:
# if not func(p):
# ret.append(p)
# return ret
# res = file_test(lambda n:n.startswith('sb'),movie)
# print(res) # ['3415']
# movie = ['sb_1234','sb_245','3415']
# v = filter(lambda n:not n.startswith('sb'),movie)
# print(list(v)) # ['3415']
# from functools import reduce
# num_1 = [1,3,4,5]
# def reduce_test(func,array):
# res = array.pop(0)
# for num in array:
# res = func(res,num)
# return res
#
# print(reduce_test(lambda x,y:x*y,num_1)) # 60
# num_1 = [1,3,4,5]
# def reduce_test(func,array,init=None):
# if init is None:
# res = array.pop(0)
# else:
# res = init
# for num in array:
# res = func(res,num)
# return res
#
# print(reduce_test(lambda x,y:x*y,num_1,100)) # 6000
# reduce 函数
from functools import reduce
num_1 = [1,2,3,4,5]
print(reduce(lambda x,y:x+y,num_1,10)) # 25
print(reduce(lambda x,y:x+y,num_1)) # 15
# 总结
# map() 处理序列中每个元素,得到’列表‘,需要list,元素个数位置不变
# filter() 遍历整个序列元素,判断每个元素布尔值,True则保留下来
# reduce 处理一个序列,进行合并操作
from functools import reduce
print(reduce(lambda x,y:x+y,range(1,100))) # 4950