#-*- coding:utf-8 -*-
'''
话说高阶函数:
能用函数作为参数的函数
称为高阶函数
'''
#函数作参
def f(x):
return x*x
#map函数为内置函数,意思为将第二个参数的list作用到f函数中
#最后的结果为一个list
print map(f,[1,2,3,4,5])
#reduce函数为内置函数,意思将第二参数的序列作用到add函数值
#将结果做累加计算,最后的结果为一个数
def add(x,y):
return x+y
print reduce(add,[1,2,3,4,5,6])
#给出一个整数的每个位置上的数,得到该整数
def fn(x,y):
return x*10+y
print reduce(fn,[1,2,3,4,5])
#字符串转int
print reduce(fn,map(int,'12345'))
def str2int(s):
def fn(x,y):
return x*10+y
return reduce(fn,map(int,s))
print str2int('123456')
'''
上面函数的调用步骤是:
1.得到reduce(fn,map(int,'123456'))
2.得到reduce(fn,[1,2,3,4,5,6])
3.得到reduce(x*10+y,[1,2,3,4,5,6])
4.得到123456
'''
def str2int2(s):
return reduce(lambda x,y:x*10+y,map(int,s))
print str2int2('1234567')
#排序
print sorted('313568')
print sorted((1,8,4,2,5))
print sorted([9,8,7,6,5,4,3])
print sorted(['name','Age','Sex','address'])
#sorted也是一个高阶函数,所以它也可以传函数来改变排序的算法
#倒序
def inverted_order(x,y):
if x>y:
return -1
elif x
return 1
else:
return 0
print sorted((1,8,4,2,5),inverted_order)
#改变字符串排序算法
#上面字符串排序是根据ascii码来判断大小
#由于大写字母都比小写字母的ascii码小,
#但是一般我们都是按照字母表的顺序排列
#下面来变换一下算法,忽略大小写
def alphabet(s1,s2):
l1 = s1.lower()
l2 = s2.lower()
if l1 < l2:
return -1
elif l2 < l1:
return 1
else:
return 0
print sorted(['name','Age','Sex','address'],alphabet)
'''
函数作为返回值
其实刚才在将字符串转int时就涉及到了
这种将函数作为返回值的形式
'''
def sum(*args):
sum = 0
for n in args:
sum+=n
return sum
print sum(1,2,3,4,5)
#改装成返回函数的形式
def sum_pack(*args):
def sum():
sum1 = 0
for n in args:
sum1+=n
return sum1
return sum
g = sum_pack(1,2,3,4,5)
print g
#
#g输出为函数,想打印结果要调用函数
print g()
'''
闭包的定义:
字函数自动获取父函数的变量和参数
进入我的地盘就是我的
而且每一次调用返回的函数
都不是同一个对象
'''
g1 = sum_pack(1,2,3,4,5)
g2 = sum_pack(1,2,3,4,5)
print g1==g2