第五天 关于作用域和三个重要函数
作用域 例1、 def test1(): print('in the test1') def test(): print('in the test') return test1() res = test() print(res) >>> in the test in the test1 None 例2、 name = "alex" def foo(): name = 'linhaifeng' def bar(): name = 'wupeiqi' print(name) return bar a = foo() print(a) #返回bar的地址 a() #执行bar 例3、 def foo(): name = 'lhf' def bar(): name = 'wupeiqi' print(name) def tt(): print(name) return tt return bar r1 = foo() print(r1) #返回bar()的地址 r2 = r1() print(r2)#返回tt()的地址 r3 = r2() print(r3)#返回none ################匿名函数 lambda 匿名函数不嫩太复杂 一行搞定 例1、 def calc(x): return x+1 res = calc(10) print(res) >>>11 func = lambda x:x+1 print(func(10)) >>>11 函数式编程 编程方法论:面向过程:基本编程单位也是函数 分析过程 一步一步 函数式=编程语言定义的函数+数学意义的函数 特点:不使用变量、不修改变量 例1、def foo(n): print(n) def bar(name): print('my name is %s' %name) foo(bar('alex')) >>>my name is alex None 高阶函数:1、函数的参数为是一个函数名 2、返回名包含函数 尾递归:在最后一步调用函数 三大内置函数 map函数:例1、num_1 = [1,2,3,4,5,6] 顺序不变 每个数据处理一遍 基础def map_test(array): ret = [] for i in array: ret.append(i ** 2) print(ret) return ret map_test(num_1) 高级 def add_one(x): return x+1 def map_test(func,array): ret = [] for i in array: ret.append(func(i)) print(ret) return ret map_test(add_one,num_1) 终极def map_test(func,array): ret = [] for i in array: ret.append(func(i)) print(ret) return ret map_test(lambda x:x+1,num_1) map(func,array) 进行迭代 一个迭代器 得到一个可迭代的对象 print(list(map(lambda x:x+1,num_1))) filter函数:筛选 初级def filter_test(array): ret = [] for p in array: if not p.startswith('sb'): #startswith ret.append(p) return ret res = filter_test(moive_people) print(res) 高级def filter_test(func,array): ret = [] for p in array: if not func(i): #startswith ret.append(p) return ret res = filter_test(moive_people) print(res) 终极print(list(filter(lambda n:n.startswith('sb'),moive_people))) #返回true 值 reduce函数:num_list = [1,2,4,5] 一个序列转化为一个值 # def mutiple(x,y): # return x*y def reduce_test(func,array,int=None): res =array.pop(0) if int!=None: for num in array: res = func(res, num) return res*int else: for num in array: res = func(res,num) return res print(reduce_test(lambda x,y:x*y,num_list,7)) from functools import reduce print(reduce(lambda x,y:x+y,num_list)) map() 处理序列中每一个列表,得到的结果是一个迭代器,该迭代器元素个数及位置 与原来一样 filter()遍历序列中的每一个元素,判断每个元素得到布尔值,如果是 True则保留下来 people = [ {'name':'alex','age':1000}, {'name':'wupeiqi','age':10000}, {'name':'yuanhao','age':9000}, {'name':'linhaifeng','age':18} ] print(list(filter(lambda p:p['age']<=18,people))) reduce 面向对象