一 python自动化基础能力:3.python基础上之数据类型,函数(11)


l = [1,2,3,4,5,6,7,8,9,10]def even(i):if i % 2 == 0:return Truedef tri(i):if i % 3 == 0:return Truedef evenlist(func,lst):new_list = []for item in lst:#判断item的奇偶if func(item):new_list.append(item)return new_listprint(evenlist(even,l))print(evenlist(tri,l))
即为高级函数,打印
[2, 4, 6, 8, 10][3, 6, 9]
16.闭包
闭包将函数作为返回值返回,也是一种高级函数 。
def fn():#函数内部再定义一个函数def inner():print('In fn2()')#将inner()函数作为返回值返回return innerprint(fn())
打印.inner at >
def fn():#函数内部再定义一个函数def inner():print('In fn2()')#将inner()函数作为返回值返回return innerr = fn()r()
打印In fn2() 。
解释:r其实就是fn()返回的函数inner对象,再调用,就会打印,所以这个函数总是能返回fn()函数内部的变量,如下:
def fn():a= 10#函数内部再定义一个函数def inner():print('In fn2()')print(a)#将inner()函数作为返回值返回return innerr = fn()r()
打印
In fn2()10
r是调用fn()后返回的函数,是在fn()内部定义的,并不是全局函数,所以这个函数总是能访问到fn()函数内部的变量 。
闭包的好处:
通过闭包可以创建一些只有当前函数可以访问到的对象(可以将一些私有的数据藏到闭包中) 。
应用:
nums = []def average(n):nums.append(n)return sum(nums)/len(nums)print(average(10))print(average(20))print(average(30))
打印
10.015.020.0
不好的地方:nums是全局变量,会被任意访问到,可能会出现被修改、覆盖,从而导致本身的nums改变导致错误 。
所以形成闭包:
def op_avg():nums = []def average(n):nums.append(n)return sum(nums)/len(nums)return averageavg = op_avg()print(avg(10))print(avg(20))print(avg(30))
结果与上面相同 。
总结:
形成闭包的条件:
1.函数嵌套;
2.将内部函数作为返回值返回;
3.内部函数必须使用外部函数的变量 。
闭包可以确保数据的安全 。
17.装饰器 17.1 装饰器的出现背景
def add(a,b):#求任意两个数的和print('Start...')r = a + bprint('End...')return rdef multiply(a,b):# 求任意两个数的积print('Start...')r = a * bprint('End...')return rr = add(1,2)print(r)
打印
Start...End...3
这是添加了提示开始和结束的输出,但是如果函数较多,会出现一些问题:
def fn():print('In fn()')def fn2():print('Start...')fn()print('End...')fn2()
打印
Start...In fn()End...
又如
def add(a,b):#求任意两个数的和r = a + breturn rdef new_add(a,b):print('Start...')r = add(a,b)print('End...')return rr = new_add(1,2)print(r)
打印
Start...End...3
很显然,会出现一定问题,每扩展一个函数会定义一个新的函数,很麻烦 。