Python高阶函数
1)First class object
函数在python中是一等公民
函数是对象,可调用的对象。
函数可以作为普通变量、参数、返回值等。
2)高阶函数
数学概念,y=g(f(x))
高阶函数满足条件;(1)接受一个或者多个函数作为参数.(2)输出一个函数。
加括号和不加括号概念是完全不一样的。
3)高阶函数的事例
#def counter(base):
def inc(step=1):
nonlocal base
base +=step
return base
return inc
c=counter(10)
c1 = counter(10)
print(c())
print(c1())
高阶函数。
如果 c 不等于c1 也不是 is and == 为假。
如果 c()等于c1() is and == 是真值。
c is c1
False
c ==c1
False
c() is c1()
True
c() ==c1()
True
4)自定义sort函数。
#初步代码
def sort(iterable,reverse = False,key = None ):
lst = []
for x in iterable:
for i,y in enumerate(lst):
if x>y:
lst.insert(i,x)
break
else:
lst.append(x)
return lst
sort([1,5,6,7,4,3,2,9,8,0])
#out
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
#第二步优化:
def sort(iterable,reverse = False,key = lambda x,y:x>y ):
lst = []
for x in iterable:
for i,y in enumerate(lst):
#flag = True if x>y else False
if key(x,y):
lst.insert(i,x)
break
else:
lst.append(x)
return lst
sort([1,5,6,7,4,3,2,9,8,0])
#第三步
def sort(iterable,reverse = False,key = lambda x,y:x>y ):
lst = []
for x in iterable:
for i,y in enumerate(lst):
#flag = True if x>y else False
if key(x,y):
lst.insert(i,x)
break
else:
lst.append(x)
return lst
sort([1,5,6,7,4,3,2,9,8,0],key = lambda x,y:x<y)
#第四步
def sort
(iterable,reverse = False,key = lambda x,y:x>y ):
lst = []
for x in iterable:
for i,y in enumerate(lst):
flag = key(x,y) if not reverse else not key(x,y)
if flag:
lst.insert(i,x)
break
else:
lst.append(x)
return lst
sort([1,5,6,7,4,3,2,9,8,0],key = lambda x,y:x<y)
def sort1(iterable,reverse=False,key=None):
ret = []
for x in iterable:
for i,y in enumerate(ret):
if x > y:
ret.insert(i,x)
break
else:
ret.append(x)
return ret
print(sort1([2,3,5,7,6,8,9]))
利用索引,i,x这些。。
3) 内建函数-高阶函数。
sorted(iterable[,key][,reverse])
排序
(1)sorted(iterable[,key][,reverse]) 返回一个新的列表,对一个可迭代对象的所有元素进行排序,按照key定义的函数。reverse表示是否反转
Sorted(lst,key=lambda x: 6-1) 返回新的列表
List.sort(key=lambda x:6-1)就地修改。
(2)filter(function,iterable)
过滤函数
过滤可迭代对象的元素,返回一个迭代器
function一个具有一个参数的函数,返回bool。
#list(filter(lambda x: x%3==0,[1,9,55,150,-3,78,28,123]))
#out [9, 150, -3, 78, 123]
(3)map(func,*iterables)---map object
映射
对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器。
#list(map(lambda x:2*x+1,range(5)))
#out [1, 3, 5, 7, 9]
#dict(map(lambda x:(x%5,x),range(500)))
#{0: 495, 1: 496, 2: 497, 3: 498, 4: 499}
(1)filter(function or None,iterable)
(2)map函数一个参数的函数。后面假定送进来的是一个元素的对象。
一般送进去的参数都是使用lambda。 lambda使用的是一个参数。
map后面的可迭代元素后面只能出现一个元素。
dict(map(lambda x,y: (x,y),zip(‘abcdfe’,range(5))))
这种表达式是错误的,前面的形参是两个,但是后面的实参却是二元组,条件不满足。
浙公网安备 33010602011771号