python函数(三) 最后更新时间:2021年01月07日 ##### 高阶函数 高阶函数需满足条件: - 函数名作为参数传入。 - 函数名作为返回值。 ##### 闭包 闭包的定义需要满足以下三个条件: - 在一个外函数中定义了一个内函数。 - 内函数里运用了外函数的临时变量。 - 并且外函数的返回值是内函数的引用。 示例: ```python def outside(age): print("name:kirito") def inside(n): return "age:"+str(n + age) return inside a = outside(6) print(a(10)) # ==>name:kirito # ==>age:16 ``` 总结: 闭包它是一种现象。 一般情况下,函数执行完毕,临时变量将会被释放。 但此时,外函数发现自己的临时变量将来会被使用,所以外函数结束时,返回内函数引用的同时,将外函数的临时变量与内函数绑定。这也是为什么外函数结束了,内函数依然可以继续使用外函数的临时变量的原因。 ##### 装饰器 装饰器 (@) 是一种语法糖,主要用于在函数或类的基础上添加一些可重用的额外功能。从应用开发的角度来看的话,我们使用装饰器来对我们的应用代码进行功能性扩展和包装,以提高代码的可重用性和可维护性。 示例: ```python import time def t(fun): def times(): start = time.time() fun() end = time.time() print(f"所用时间:{end-start}") return times @t def kirito(): print("蓄力中…") time.sleep(0.5) print("蓄力中……") time.sleep(0.5) print("星爆气流斩!") time.sleep(1) kirito() # ==>蓄力中… # ==>蓄力中…… # ==>星爆气流斩! # ==>所用时间:2.0013954639434814 ``` #### 推导式 Python 中有一种特有的语法,就是推导式(又称为解析式)。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导: - 列表(list)推导式 - 字典(dict)推导式 - 集合(set)推导式 ##### 列表推导式 - [out_express **for** out_express **in** input_list] 示例: ```python li=[i/2 for i in range(1,21)] print(li) # ==>[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0] ``` - [out_express **for** out_express **in** input_list **if** out_express_condition] 示例: 非推导式写法: ```python l = [21,-31,24,232,-13,-12,32] li=list(map(lambda x:x**2,filter(lambda x:x<0,l))) print(li) # ==>[961, 169, 144] ``` 推导式写法: ```python l = [21,-31,24,232,-13,-12,32] li=[i**2 for i in l if i<0] print(li) # ==>[961, 169, 144] ``` - [i **for** row **in **matrix **for** i **in** row] ##### 字典推导式 - {out_exp_key: out_exp_value for out_exp in input_list} 示例: ```python sao=["name","age","skill"] kirito=["kirito", 16, "星爆气流斩"] a = {i:n for i in sao for n in kirito} print(a) # ==>{'name': '星爆气流斩', 'age': '星爆气流斩', 'skill': '星爆气流斩'} ``` ##### 集合推导式 - {out_exp_res for out_exp in input_set} 示例: ```python sao=["kirito", 16, "星爆气流斩"] a = {i for i in sao} print(a) # ==>{16, 'kirito', '星爆气流斩'} ``` ###### 注意: - 没有元组推导式,(i for i in range(10)) 返回的是 generator object ##### 问题: ###### 问题一: 过滤掉该列表names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]长度小于或等于3的字符串列表,并将剩下的转换成大写字母。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210107133541701.png) 回答: 写法1: ```python names = ["jerry","hansen","Amy","Wendy","Tom","Bob"] print([i.upper() for i in names if len(i)>3]) # ==>['Jerry', 'Hansen', 'Wendy'] ``` 写法2: ```python names = ["jerry","hansen","Amy","Wendy","Tom","Bob"] print(list(map(lambda x:x.upper(),filter(lambda x:len(x)>3,names)))) # ==>['Jerry', 'Hansen', 'Wendy'] ``` ###### 问题二: 求(x,y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表。 效果如下:[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)] ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021010713355429.png) 回答: ```python a=[(x,y+1) for x in range(0,5,2) for y in range(0,3,2)] print(a) # ==>[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)] ``` ###### 问题三: [ 'Bob','JOHN','alice','bob','ALICE','James','Bob','JAMES','jAMeS' ]该列表很紊乱,实现去重,以及将名字格式统一成首字母大写(str.capitalize())。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210107133612595.png) 回答: ```python names = [ 'Bob','JOHN','alice','bob','ALICE','James','Bob','JAMES','jAMeS' ] print(set([i.capitalize() for i in names])) # ==>['James', 'Alice', 'John', 'Bob'] ```
Comments | NOTHING