filter函数
过滤函数:对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
1 # 对一个列表进行过滤,偶数组成一个新列表
2
3 def isEcen(a):
4 return a % 2 == 0
5
6 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
7 r = filter(isEcen, l)
8 print(type(r)) # 类型为filter类型 可迭代 用for进行输出
9 print([i for i in r])
高阶函数 排序
把一个列表按照给定算法进行排序
1 a = [99, 4564, 45646 ,465346 ,213 ,4864 ,1231, 784351]
2 a1 = sorted(a) # 从小到大
3 print(a1)
4 a2 = sorted(a, reverse=True) # 从大到小
5 print(a2)
6
7 a = [846, -45, 4563453, -5644, 453]
8 al = sorted(a, key=abs, reverse=True) # abs为取绝对值;绝对值倒叙排序
9 print(al)
返回函数
函数可以返回具体的值
也可以返回一个函数作为结果
1 def a1(a):
2 print("a1")
3 return None
4 p = a1(3)
5 print(a)
6
7 def a2():
8 def a3():
9 print("a3")
10 return 3
11 return a3 # 函数a3作为返回值
12
13 pp = a2()
14 print(pp)
15 print(pp())
1 def a4(*args):
2 def a5():
3 i = 0
4 for n in args: # a5使用了外部a4的变量
5 i += n
6 return i
7 return a5 # 返回内部函数a5
8
9 ppp = a4(1, 2, 3, 4, 5, 6, 7)
10 print(ppp())
闭包
当一个函数在内部定义函数,并在内部的函数中应用外部函数的参数或者局部变量
当内部函数作为返回值的时候,相关参数和变量保存在返回的函数中,这种结构叫做闭包
1 def count():
2 fs = []
3 for i in range(1, 4):
4 def f():
5 return i * i
6 fs.append(f)
7 return fs
8 f1, f2, f3 = count()
9 print(f1())
10 print(f2())
11 print(f3())
12 '''
13 输出结果为三个9,造成这种情况的原因是返回函数引用了i,i并非立即执行,二十等到三个
14 函数都返回的时候才执行,而这个时候i已经变成了3,最终调用的时候都返回的是3*3
15 因此,返回函数不能引用任何循环变量
16 '''
解决方法
def count2():
def f(j):
def g():
return j * j
return g # 返回值为内部函数
fs = []
for i in range(1, 4):
fs.append(f(i))
return fs
b1, b2, b3 = count2()
print(b1())
print(b2())
print(b3())
装饰器
在不改变原有代码的基础上附加功能
可以装饰任何函数
1 import time
2 def ptime(f):
3 def wrapper(*args, **kwargs):
4 print("time: ",time.ctime())
5 return f(*args, **kwargs)
6 return wrapper
7
8 @ptime # 装饰器,语法@+新功能函数 此处相当于hello()=ptime(hello())
9 def hello():
10 print("hello world")
11
12 hello()
偏函数
参数固定的函数,相当于一个有特定参数的函数体
functools.partial的作用,把一个函数的某些参数固定,返回一个新函数
1 #把字符串转换为十进制数
2 print(int('123456'))
3 # 把八进制转换为十进制
4 print(int('123456',base=8))
用偏函数固定参数,实现上面的八进制转换为十进制
1 import functools
2
3 int8 = functools.partial(int, base=8)
4 print(int8('123456'))