python---高阶函数
###################################
############# 高阶函数 #############
###################################
1.函数
1)函数本身也可以赋值给变量,即:变量可以指向函数。
In [1]: abs(-10)
In [4]: x
Out[4]: 10
In [5]: f = abs
In [6]: f(-10)
Out[6]: 10
In [7]: f
Out[7]: <function abs>

2)函数名其实就是指向函数的变量!
In [8]: abs(-10)
Out[8]: 10
In [9]: abs = 1
In [10]: abs(-10)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-c432e3f1fd6c> in <module>()
----> 1 abs(-10)
TypeError: 'int' object is not callable
2.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
In [2]: def func(x,y,f):
...: print f(x),f(y)
...:
In [3]: func(-2,-10,abs)
2 10

In [1]: def f(x):
...: return x*x
...:
In [2]: map(f,range(1,10))
Out[2]: [1, 4, 9, 16, 25, 36, 49, 64, 81]

In [4]: map(str,list)
Out[4]: ['1', '2', '3']

In [5]: def add(x,y):
...: return x+y
...:
In [6]: reduce(add,[2,3,4]) # 2+3=5-->5+4=9
Out[6]: 9
In [7]: def fn(x,y):
...: return x * 10 + y
...:
In [8]: reduce(fn,[1,2,5,6]) # 1*10+2=12-->12*10+5=125-->125*10+6=1256
Out[8]: 1256
In [1]: str = '12345'
In [2]: def fn(x,y):
...: return x * 10 + y
...:
In [3]: def char2int(x):
...: return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5}[x]
...:
In [4]: map(char2int,'12345')
Out[4]: [1, 2, 3, 4, 5]
In [5]: reduce(fn,map(char2int,'12345'))
Out[5]: 12345

1)在一个 list 中,删掉偶数,只保留奇数:
In [6]: def isodd(n):
...: return n % 2 == 1
...:
In [7]: filter(isodd,range(10))
Out[7]: [1, 3, 5, 7, 9]
....: return s and s.strip()
....:
In [20]: filter(noempty,['1','','A',None,' '])
Out[20]: ['1', 'A']
l = range(1,101)
def delprimenum(str):
if str == 1:
return str
for i in range(2,int(math.sqrt(str)+1)):
if str%i == 0:
return str
print filter(delprimenum,l)

x < y, return -1
x == y, return 0
x > y, return 1
1)默认正序
In [1]: t = (12,34,5,43,2)
In [2]: sorted(t)
Out[2]: [2, 5, 12, 34, 43]

2)倒序排序
In [3]: def reversed_cmp(x,y):
...: if x>y:
...: return -1
...: elif x<y:
...: return 1
...: else:
...: return 0
...:
In [4]: sorted(t,reversed_cmp)
Out[4]: [43, 34, 12, 5, 2]

3)字符串排序
按照ASCII码排序:
In [5]: li = ['hello','linux','apple']
In [6]: sorted(li)
Out[6]: ['apple', 'hello', 'linux']
In [7]: li = ['hello','linux','apple','Hello']
In [8]: sorted(li)
Out[8]: ['Hello', 'apple', 'hello', 'linux']
....: lower1 = x.lower()
....: lower2 = y.lower()
....: if lower1 < lower2:
....: return -1
....: elif lower1 > lower2:
....: return 1
....: else:
....: return 0
....:
In [13]: li
Out[13]: ['hello', 'linux', 'apple', 'Hello']
In [14]: sorted(li,ignore_case_cmp)
Out[14]: ['apple', 'hello', 'Hello', 'linux']

7.函数作为返回值
1)高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
def wrap_sum(*args):
def my_sum():
sum_num = 0
for i in args: 3# for循环,依次相加
if not isinstance(i,(int,float)):
print "ERROR TYPE"
sum_num = sum_num + i
return sum_num 4# 返回sum_num值
return my_sum 2# 返回my_sum,调用my_sum
f = wrap_sum(1,2,3,6) 1# 调用wrap_sum函数,返回的并不是求和结果,而是my_sum函数
print f() 5# 调用函数 f 时,才真正计算求和的结果
结果:12
def my_sum():
sum_num = 0
for i in args:
if not isinstance(i,(int,float)):
print "ERROR TYPE"
sum_num = sum_num + i
return sum_num
return my_sum
f = wrap_sum(1,2,3,6)
f1 = wrap_sum(1,2,3,6)
print f == f1
结果:False

############# 高阶函数 #############
###################################
1.函数
1)函数本身也可以赋值给变量,即:变量可以指向函数。
In [1]: abs(-10)
Out[1]: 10
In [2]: abs
Out[2]: <function abs>
In [4]: x
Out[4]: 10
In [5]: f = abs
In [6]: f(-10)
Out[6]: 10
In [7]: f
Out[7]: <function abs>
2)函数名其实就是指向函数的变量!
In [8]: abs(-10)
Out[8]: 10
In [9]: abs = 1
In [10]: abs(-10)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-c432e3f1fd6c> in <module>()
----> 1 abs(-10)
TypeError: 'int' object is not callable
上述操作发现:abs为函数名,给abs=1重新赋值后,abs已不是函数,而是一个整数。
2.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
In [2]: def func(x,y,f):
...: print f(x),f(y)
...:
In [3]: func(-2,-10,abs)
2 10
3.map函数
map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。map() 作为高阶函数,把运算规则抽象了。In [1]: def f(x):
...: return x*x
...:
In [2]: map(f,range(1,10))
Out[2]: [1, 4, 9, 16, 25, 36, 49, 64, 81]
练习: 把这list列表中的所有数字转为字符串;([1,2,3]---['1','2','3'])
In [3]: list = [1,2,3]In [4]: map(str,list)
Out[4]: ['1', '2', '3']
4.reduce函数
reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。In [5]: def add(x,y):
...: return x+y
...:
In [6]: reduce(add,[2,3,4]) # 2+3=5-->5+4=9
Out[6]: 9
In [7]: def fn(x,y):
...: return x * 10 + y
...:
In [8]: reduce(fn,[1,2,5,6]) # 1*10+2=12-->12*10+5=125-->125*10+6=1256
Out[8]: 1256
In [1]: str = '12345'
In [2]: def fn(x,y):
...: return x * 10 + y
...:
In [3]: def char2int(x):
...: return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5}[x]
...:
In [4]: map(char2int,'12345')
Out[4]: [1, 2, 3, 4, 5]
In [5]: reduce(fn,map(char2int,'12345'))
Out[5]: 12345
5.filter函数
filter() 也接收一个函数和一个序列。和 map() 不同的时,filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。1)在一个 list 中,删掉偶数,只保留奇数:
In [6]: def isodd(n):
...: return n % 2 == 1
...:
In [7]: filter(isodd,range(10))
Out[7]: [1, 3, 5, 7, 9]
2)把一个序列中的空字符串删掉
In [19]: def noempty(s):....: return s and s.strip()
....:
In [20]: filter(noempty,['1','','A',None,' '])
Out[20]: ['1', 'A']
3)用 filter()删除 1~100 的素数
import mathl = range(1,101)
def delprimenum(str):
if str == 1:
return str
for i in range(2,int(math.sqrt(str)+1)):
if str%i == 0:
return str
print filter(delprimenum,l)
6.sorted函数
排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:x < y, return -1
x == y, return 0
x > y, return 1
1)默认正序
In [1]: t = (12,34,5,43,2)
In [2]: sorted(t)
Out[2]: [2, 5, 12, 34, 43]
2)倒序排序
In [3]: def reversed_cmp(x,y):
...: if x>y:
...: return -1
...: elif x<y:
...: return 1
...: else:
...: return 0
...:
In [4]: sorted(t,reversed_cmp)
Out[4]: [43, 34, 12, 5, 2]
3)字符串排序
按照ASCII码排序:
In [5]: li = ['hello','linux','apple']
In [6]: sorted(li)
Out[6]: ['apple', 'hello', 'linux']
In [7]: li = ['hello','linux','apple','Hello']
In [8]: sorted(li)
Out[8]: ['Hello', 'apple', 'hello', 'linux']
忽略大小写排序:
In [12]: def ignore_case_cmp(x,y):....: lower1 = x.lower()
....: lower2 = y.lower()
....: if lower1 < lower2:
....: return -1
....: elif lower1 > lower2:
....: return 1
....: else:
....: return 0
....:
In [13]: li
Out[13]: ['hello', 'linux', 'apple', 'Hello']
In [14]: sorted(li,ignore_case_cmp)
Out[14]: ['apple', 'hello', 'Hello', 'linux']
7.函数作为返回值
1)高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
def wrap_sum(*args):
def my_sum():
sum_num = 0
for i in args: 3# for循环,依次相加
if not isinstance(i,(int,float)):
print "ERROR TYPE"
sum_num = sum_num + i
return sum_num 4# 返回sum_num值
return my_sum 2# 返回my_sum,调用my_sum
f = wrap_sum(1,2,3,6) 1# 调用wrap_sum函数,返回的并不是求和结果,而是my_sum函数
print f() 5# 调用函数 f 时,才真正计算求和的结果
结果:12
2)调用 wrap_sum() 时,每次调用都会返回一个新的函数,即使传入相同的参数。
def wrap_sum(*args):def my_sum():
sum_num = 0
for i in args:
if not isinstance(i,(int,float)):
print "ERROR TYPE"
sum_num = sum_num + i
return sum_num
return my_sum
f = wrap_sum(1,2,3,6)
f1 = wrap_sum(1,2,3,6)
print f == f1
结果:False