20-高级特性之内建方法(1)

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,'\n')#结果为:[1, 4, 9]
print(list(m),'\n')#结果为:[1, 4, 9]

#函数需要两个参数
m = map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])
print(list(m),'\n')#结果为:[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,'\n')
r = reduce(lambda x, y: x+y, [1,2,3,4],5) #15
print(r,'\n')
r = reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd') #'ddaabbcc'
print(r,'\n') 

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),'\n')
f = filter(None, "hello")
print(list(f),'\n')

sorted

  • 传入一个Iterable对象I和排序参数 [key=..., reverse=.. ] #命名关键字参数

  • {注意key参数可以传入一个自定义函数f} 等价于 对每一个I(i)都先执行f,再对f(I)进行排序,最后把这个f(I)的顺序映射到I

    1.普通数值型

    L1 = [36,5,-12,9,-21]
    L1 = sorted(L1)
    print(L1,'\n')
    L1 = sorted(L1, key=abs)
    print(L1,'\n')
    L1 = sorted(L1, key=abs, reverse=True)
    print(L1, '\n')

    2.普通字符串

    L2 = ['bob', 'about', 'Zoo', 'Credit'] #依据ASCI码
    L2 = sorted(L2) #没有忽略大小写 A<a{就ASCI而言}
    print(L2,'\n')
    L2 = sorted(L2, key=str.lower) #把所有str都lower或者upper,即忽略大小写
    print(L2, '\n')
    L2 = sorted(L2, key=str.upper, reverse=True)
    print(L2, '\n')

    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,'\n')
    L3 = sorted(L3, key=fn, reverse=True)
    print(L3, '\n')

    根据分数进行排序

    def fn_score(t):
    return t[1]
    L3 = sorted(L3,key=fn_score,reverse=True)
    print(L3,'\n')

匿名函数

  • 1.lambda表达式即为一个匿名函数
  • 2.注意两点:
  • lambda不能写return,表达式的结果即为返回值
  • lambda本质上是个函数对象,所以可以用来当参数使:被赋给其他变量,被传入函数,或者被返回
f = lambda x: x*x
print(f,'\n')
print(f(2),f(4),'\n')

def fn(x,y):
    return (lambda x,y: x*x+y*y)
f2 = fn(3,4)      #只是返回一个函数
print(f2,'\n', f2(3,4),'\n') #f2(3,4)才是调用了函数

#得到[1,20)的所有奇数
L = list(filter((lambda x: x%2==1), range(1,20)))
print(L,'\n')
posted @ 2018-03-04 13:39  hzhang_NJU  阅读(109)  评论(0编辑  收藏  举报