20-高级特性之内建方法(1) 1.普通数值型 2.普通字符串 3作业:根据名字对T进行排序 根据分数进行排序
map,reduce, filter, sorted
map(function, sequence[, sequence, ...])
根据提供的函数对指定序列做映射
- 第一个参数为一个函数对象(比如lambda表达式,比如一个普通函数)
- 第二个(或者更多)参数接收一个
Iterable对象
。- 对
I
中每一个元素执行f
,得到f(I(i))
- 把所有
f(I(i))
拼接成一个Itrator
,返回出去- 因为
Iterator
是惰性序列,需要用list()或者for
迭代出来
#函数需要一个参数
m = map(lambda x: x*x, [1, 2, 3])
print(m,'
')#结果为:[1, 4, 9]
print(list(m),'
')#结果为:[1, 4, 9]
#函数需要两个参数
m = map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])
print(list(m),'
')#结果为:[5, 7, 9]
def f1( x, y ):
return (x,y)
l1 = [ 0, 1, 2, 3, 4, 5, 6 ]
l2 = [ 'Sun', 'M', 'T', 'W', 'T', 'F', 'S' ]
l3 = map( f1, l1, l2 )
print(list(l3)) #结果为:[(0, 'Sun'), (1, 'M'), (2, 'T'), (3, 'W'), (4, 'T'), (5, 'F‘),(6, 'S’)]
reduce(function, sequence[, initial])对参数序列中元素进行累积
- 第一个参数为一个函数对象(比如lambda表达式,比如一个普通函数)
- 第二个参数(或者更多)接收一个
Iterable对象
reduce(f,[x1,x2,x3,x4]) 等价于 f(f(f(x1,x2),x3),x4)
- 很特殊的是,返回一个非Iterator的Iterable对象,即直接一次性获得所有结果{直接可打印输出}
#在Python 3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在functools模块里
#reduce返回的是一个非Iterator的Iterable,所以直接打印输出
from functools import reduce
r = reduce(lambda x, y: x+y, [1,2,3,4]) #10
print(r,'
')
r = reduce(lambda x, y: x+y, [1,2,3,4],5) #15
print(r,'
')
r = reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd') #'ddaabbcc'
print(r,'
')
filter(function or None, sequence)对指定序列执行过滤操作
- 第一个参数为一个函数对象(比如lambda表达式,比如一个普通函数)
- 第二个参数(或者更多)接收一个
Iterable对象
- 对I中没一个元素执行f,得到
f(I(i))
。根据f(I(i))
的返回值是True或False
来决定是否保留I(i)
。起到过滤器的功能。- 把过滤后的
I(i)
拼接成一个Itrator
,返回出去- 因为
Iterator
是惰性序列,需要用list()或者for
迭代出来
f = filter(lambda x: x%2, [1, 2, 3, 4])
print(list(f),'
')
f = filter(None, "hello")
print(list(f),'
')
sorted
-
传入一个
Iterable对象I
和排序参数[key=..., reverse=.. ]
#命名关键字参数 -
{注意key参数可以传入一个
自定义函数f
} 等价于 对每一个I(i)
都先执行f
,再对f(I)
进行排序,最后把这个f(I)
的顺序映射到I
L1 = [36,5,-12,9,-21]
L1 = sorted(L1)
print(L1,' ')
L1 = sorted(L1, key=abs)
print(L1,' ')
L1 = sorted(L1, key=abs, reverse=True)
print(L1, ' ')2.普通字符串
L2 = ['bob', 'about', 'Zoo', 'Credit'] #依据ASCI码
L2 = sorted(L2) #没有忽略大小写 A<a{就ASCI而言}
print(L2,' ')
L2 = sorted(L2, key=str.lower) #把所有str都lower或者upper,即忽略大小写
print(L2, ' ')
L2 = sorted(L2, key=str.upper, reverse=True)
print(L2, ' ')3作业:根据名字对T进行排序
L3 = [('Bob', 75),('Adam', 92),('Bart', 66),('Lisa', 88),('haoZhang',22)] #list里面嵌套tuple
def fn(t): #传入一个tuple
return t[0].lower() #返回名字的小写后的字符串
L3 = sorted(L3, key=fn)
print(L3,' ')
L3 = sorted(L3, key=fn, reverse=True)
print(L3, ' ')根据分数进行排序
def fn_score(t):
return t[1]
L3 = sorted(L3,key=fn_score,reverse=True)
print(L3,' ')
匿名函数
- 1.lambda表达式即为一个匿名函数
- 2.注意两点:
- lambda不能写return,表达式的结果即为返回值
- lambda本质上是个函数对象,所以可以用来当参数使:被赋给其他变量,被传入函数,或者被返回
f = lambda x: x*x
print(f,'
')
print(f(2),f(4),'
')
def fn(x,y):
return (lambda x,y: x*x+y*y)
f2 = fn(3,4) #只是返回一个函数
print(f2,'
', f2(3,4),'
') #f2(3,4)才是调用了函数
#得到[1,20)的所有奇数
L = list(filter((lambda x: x%2==1), range(1,20)))
print(L,'
')