Python学习笔记系列——高阶函数(filter/sorted)

一、filter

#filter()函数用于过滤序列。和map()类似,也接收一个函数和一个序列,把函数依次作用于每个元素,根据返回值是True还是False决定是否保留该元素。
#filter()函数返回的是一个Iterator,即惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
def odd(n):
    return n%2==1
ms=list(filter(odd,[1,2,3,4,5,6,7,8,9,10])) #保留奇数
print(ms)

#一、过滤空字符串
def not_empty(s):
    return s and s.strip()
ms=list(filter(not_empty,['Zc',' ','BOOM',None,'BLOG']))
print(ms)

#二、生成范围素数数组
#构造一个从3开始的奇数序列
def _odd_iter():
    n=1
    while True:
        n=n+2
        yield n
#筛选函数
def _not_divisible(n):
    return lambda x:x % n !=0
#定义一个生成器,不断返回下一个素数
def primes():
    yield 2
    it = _odd_iter()  #初始序列
    while True:
        n=next(it)  #返回序列的第一个数
        yield n
        it = filter(_not_divisible(n),it)  #构造新序列
#输出1000以内的素数
for n in  primes():
    if n <1000:
        print(n)
    else:
        break

上面这个用生成器写素数数组的,我这种菜鸡是真的看不懂,没思路。下面是找群里某蓝色兔头专业代言雀巢咖啡三十年的java&Python双料大佬给我写了个简单的:

def test(num):
    num_list = [True] * num
    num_list[0] = False
    for i in range(2, num+1):
        for j in range(i+i, num+1, i):
            num_list[j-1] = False
    return [x+1 for x in range(len(num_list)) if num_list[x]]

print(test(100))

 

二、sorted

#sorted()可以对list进行排序,还可以接收一个key()函数实现自定义排序.
#key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
ms=sorted([35,-9,-20,23,2],key=abs)  #按绝对值大小排序

#默认情况下,对字符串排序,是按照ASCII的大小来比较的
ms1=sorted(['boom','axure','Zero','Cat'])                     #['axure', 'boom', 'Cat', 'Zero']
ms2=sorted(['boom','axure','Zero','Cat'],key=str.upper)       #['Zero', 'Cat', 'boom', 'axure']

#反向排序,加参数reverse
ms3=sorted(['boom','axure','Zero','Cat'],key=str.upper,reverse=True)

 三、练习

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
#按照名字排序
def by_name(n):
    return n[0]
print(by_name(L))
L2 = sorted(L, key=by_name)
print(L2)

#按照成绩降序
def by_score(n):
    return n[1]
L2 = sorted(L, key=by_score,reverse=True)
print(L2)

 

posted @ 2018-11-29 18:34  zzz紫川  阅读(309)  评论(0编辑  收藏  举报