Python学习 10day__高级语法
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'))