#函数本身也可以赋值给变量,即:变量可以指向函数
f=
abs
#abs()和f()等价了 变量可以指向函数,函数名也是变量
g=f(-
10
)
#10
#变量可以指向函数,函数的参数能接收变量,那么
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
def
add(x,y,f):
#简单的高阶函数
return
f(x)+f(y)
g=add(-
1
,
5
,
abs
)
#6
(1)高阶函数
#map函数
#map()函数接收两个参数,一个是函数,一个是Iterable
# map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
L=[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]
def
f(x):
return
x*x
r=
map
(f,L)
#map()传入的第一个参数是f,即函数对象本身。
m=
list
(r)
#由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list
print
(m)
#[1, 4, 9, 16, 25, 36, 49, 64, 81]
r=
map
(
str
,L)
#把列表L的所有数字转化为字符串
#reduce函数
#reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,
# reduce把结果继续和序列的下一个元素做累积计算
from
functools
import
reduce
L=[
1
,
2
,
3
,
4
,
5
]
def
add(x,y):
return
x+y
m=reduce(add,L)
#15
#定义一个字符串转整数的函数(str2int)\
from
functools
import
reduce
DIGITS={
'0'
:
0
,
'1'
:
1
,
'2'
:
2
,
'3'
:
3
,
'4'
:
4
,
'5'
:
5
,
'6'
:
6
,
'7'
:
7
,
'8'
:
8
,
'9'
:
9
}
def
str2int(s):
def
fn(x,y):
return
10
*x+y
def
char2num(s):
return
DIGITS[s]
return
reduce(fn,
map
(char2num,s))
#filter()函数用于过滤序列
#filter()也接收一个函数和一个序列
#filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
def
is_odd(n):
#定义一个函数,在一个list中,删掉偶数,只保留奇数
return
n%
2
==
1
m=
list
(
filter
(is_odd,[
1
,
2
,
3
,
4
,
5
,
6
,
7
]))
#[1, 3, 5, 7]
#filter()函数返回的是一个Iterator,也就是一个惰性序列,
# 所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
#sorted()函数排序函数
#可以接收一个key函数来实现自定义的排序
L=[
11
,
2
,
4
,-
12
,-
15
,
17
]
m=
sorted
(L)
#[-15, -12, 2, 4, 11, 17]
m=
sorted
(L,
key
=
abs
)
#按绝对值大小排序,并按照对应关系返回list相应的元素[2, 4, 11, -12, -15, 17]
S=[
'Bob'
,
'Ann'
,
'cll'
,
'Zmm'
,
'alt'
]
s=
sorted
(S)
#对字符串排序,是按照ASCII的大小比较的['Ann', 'Bob', 'Zmm', 'alt', 'cll']
s=
sorted
(S,
key
=
str
.lower)
#实现忽略大小写的排序['alt', 'Ann', 'Bob', 'cll', 'Zmm']
s=
sorted
(S,
key
=
str
.lower,
reverse
=
True
)
#进行反向排序['Zmm', 'cll', 'Bob', 'Ann', 'alt']
(2)匿名函数
#lambda匿名函数
#匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
L=[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]
m=
list
(
map
(
lambda
x:x*x,L))
#关键字lambda表示匿名函数,冒号前面的x表示函数参数
print
(m)
#[1, 4, 9, 16, 25, 36, 49, 64, 81]
(3)partial偏函数
#partial偏函数
#functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数
import
functools
int2=functools.partial(
int
,
base
=
2
)
#二进制转换为十进制整数
m=int2(
'10000'
)
#16