高阶函数
高阶函数需满足条件:
- 函数名作为参数传入。
- 函数名作为返回值。
闭包
闭包的定义需要满足以下三个条件:
- 在一个外函数中定义了一个内函数。
- 内函数里运用了外函数的临时变量。
- 并且外函数的返回值是内函数的引用。
示例:
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总结:
闭包它是一种现象。
一般情况下,函数执行完毕,临时变量将会被释放。
但此时,外函数发现自己的临时变量将来会被使用,所以外函数结束时,返回内函数引用的同时,将外函数的临时变量与内函数绑定。这也是为什么外函数结束了,内函数依然可以继续使用外函数的临时变量的原因。
装饰器
装饰器 (@) 是一种语法糖,主要用于在函数或类的基础上添加一些可重用的额外功能。从应用开发的角度来看的话,我们使用装饰器来对我们的应用代码进行功能性扩展和包装,以提高代码的可重用性和可维护性。
示例:
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]
示例:
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]
示例:
非推导式写法:
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]推导式写法:
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}
示例:
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}
示例:
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的字符串列表,并将剩下的转换成大写字母。
回答:
写法1:
names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
print([i.upper() for i in names if len(i)>3]) # ==>['Jerry', 'Hansen', 'Wendy']写法2:
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)]
回答:
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())。
回答:
names = [ 'Bob','JOHN','alice','bob','ALICE','James','Bob','JAMES','jAMeS' ]
print(set([i.capitalize() for i in names])) # ==>['James', 'Alice', 'John', 'Bob'] 

Comments | NOTHING