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)