这周我继续Python 的学习,接下来是我的一些笔记(接上一篇):
一,高阶函数
1.filter
filter接收的是一个函数和一个序列,作用是过滤序列,实现筛选,把传入函数依次作用于序列中的每个元素,根据返回值是Ture还是False决定元素要保留还是舍去
注意:必须用list()函数获得结果并返回list
#在一个list中删除偶数保留奇数
def is_odd(n):
return n%2==1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10])))
#输出[1,3,5,7,9]
#删掉序列中的空字符串
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty,['a','B',None,'c',' '])))
#输出:['a','B','c']
2.sorted
排序作用:
list=[-16,19,23,-33,24]
print(sorted(list))
#输出[-33, -16, 19, 23, 24]
可用key()函数进行自定义排序:
list=[-16,19,23,-33,24]
print(sorted(list,key=abs))
#输出[-16, 19, 23, 24, -33]
#字符串排序
print(sorted(['about','Zoo','Creat','bob']))
#默认情况下字符串的排序是按照ASSIC表的大小排的,其中'Z'<'a'
#输出 ['Creat', 'Zoo', 'about', 'bob']
#字符串排序(忽视大小写的排序)
print(sorted(['about','Zoo','Creat','bob'],key=str.lower))
#输出 ['about', 'bob', 'Creat', 'Zoo']
#反向排序 之 字符串排序(忽视大小写的排序)
print(sorted(['about','Zoo','Creat','bob'],key=str.lower,reverse=True))
#输出 ['Zoo', 'Creat', 'bob', 'about']
二,返回函数
高阶函数除了可以将函数作为参数外还能将函数作为结果值返回。
注意:
返回的函数没有被立即执行,要直到被调用时才执行。且每次调用都会返回新的函数哪怕传入相同的参数,调用结果也不相互影响。
闭包:
一种程序结构,即在外部函数中定义一个内部函数,内部函数可以引用外部函数的局部变量和参数,返回内部函数后,外部函数的参数和变量就会被保存在内部函数中。
注意:
返回闭包时不要引用循环变量或者后续会发生变化的变量,如果非要使用,可以再次定义一个函数,将该函数的参数与当前的循环变量绑定。
def lazy_sum(*arg):
def sum():
ans=0
for n in arg:
ans=ans+n
return ans
return sum
f1=lazy_sum(1,3,5,7,9)
f2=lazy_sum(1,3,5,7,9)
print(f1)#输出函数:<function lazy_sum.<locals>.sum at 0x000001675D182FC0>
print(f1())#输出25
print(f1==f2)#输出False
def count():
fs=[]
for i in range(1,4):#每次循环都形成一个新的函数
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3=count()#新的函数不会每次都立即执行,而是等到运行到f3再一起输出
#但此时,i=3,故输出的全部为9
print(f1())
print(f2())
print(f3())
def count():
def f(j):
def g():
return j*j
return g#注意不能写成g()会报错
fs=[]
for i in range(1,4):
fs.append(f(i))
return fs
f1,f2,f3=count()
print(f1())
print(f2())
print(f3())
#输出 1,4,9
nonlocal 非局部说明:
使用闭包时,内部函数引用外部函数的局部变量,如果只是调用外部函数的变量,则返回的闭包函数调用一切正常,但如果对外部函数的变量进行赋值,则解释器会把外部函数变量当作内部函数变量,这时就需要加上nonlocal声明,防止报错。
def inc():
x=0
def fn():
return x+1#直接返回外层变量,调用一切正常
return fn
f=inc()
print(f())
print(f())
#输出 1,1
def inc():
x=0
def fn():
nonlocal x #注意格式:没有冒号,不要漏写x
x=x+1
return x
return fn
f=inc()
print(f())
print(f())
#输出:1,2
三,匿名函数lambda
用法格式:
lambda+参数+:
特点:
只有一个表达式,没有return,表达式的结果就是返回值
注意:
匿名函数可以赋值给一个变量;可以把匿名函数作为返回值返回。
print(list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])))
#输出:[1, 4, 9, 16, 25, 36, 49, 64, 81]
#注意用map()时前面也要有list(),使结果返回一个list
def build(x, y):
return lambda: x * x + y * y
f=build(1,2)
print(f())
#输出:5