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
很显然,会出现一定问题,每扩展一个函数会定义一个新的函数,很麻烦 。
- 最神秘的三座陵墓,一座不能挖,一座不敢挖,另一座挖不动
- 明明是一代传奇词人,偏偏无奈生在帝王家
- 一个开创出了盛世,同时也是历史上最大的败家子的帝王
- 宋仁宗:历史上最宽仁的皇帝之一却也难过美人关
- 一条杆棒等身齐:揭开太祖赵匡胤的武功有多高
- 乾隆皇帝一生最大的过错是什么?他为何这样做
- 三国十大家门不幸的美女:最后一个让人脊背发凉
- 【地图学】二、地图矢量化
- 【批量改文件夹中的图片名称-python】
- 60升电热水器功率一般多大