#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 函数式编程-高阶函数-filter/sorted *
#****************************************************
print ("--------------------分割线------------------")
#============
# filter()
#============
'''
内建的filter()函数用于过滤序列
和map类似,filter()也接收一个函数和一个序列。和map()不同的是,filter
把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留
还是丢弃该元素。
'''
# 在一个list中,删除偶数,只保留奇数
def is_odd(n):
return n % 2 == 1
list_b = [1, 2, 3, 4, 5, 6, 7, 8]
print( list(filter(is_odd, list_b)) ) # [1, 3, 5, 7]
# 把一个序列中的空字符串删掉
def not_empty(s):
return s and s.strip()
list_c = ['A',' ','b','','d']
print( list(filter(not_empty, list_c)) ) # ['A', 'b', 'd']
# 使用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
# filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫
# filter()完成计算结果,需要用List()函数获得所有结果并返回list。
# 利用filter筛选出100-200以内的回数
def is_palindrome(n):
return str(n)==str(n)[::-1]
print( list(filter(is_palindrome, range(100,200))) )
# [101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
print ("--------------------分割线------------------")
#============
# sorted()
#============
# 对list中的数字进行排序
list_d = [-10, -25, 1, 50, 20]
print( sorted(list_d) ) # [-25, -10, 1, 20, 50]
# sorted()还可以接收一个key函数来实现自定义的排序,按绝对值大小排序
print( sorted(list_d, key=abs) ) # [1, -10, 20, -25, 50]
# 对字符串排序,按ASCII码排序
list_e = ['bob', 'about', 'Zoo', 'Card']
print( sorted(list_e) ) # ['Card', 'Zoo', 'about', 'bob']
# 忽略大小写,重新对字符串排序
print( sorted(list_e, key=str.lower) ) # ['about', 'bob', 'Card', 'Zoo']
# 忽略大小写,进行反向排序
print( sorted(list_e, key=str.lower, reverse=True) )
# ['Zoo', 'Card', 'bob', 'about']
'''
假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序:
'''
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0]
def by_score(t):
return t[1]
print( sorted(L, key=by_name) )
# [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
print( sorted(L, key=by_score) )
# [('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
# t[0],和t[1] 为什么就能直接用了元组的第一,二项?
# 因为key指定的函数将作用于L的四个元素而非作用与L上!
# 因为key指定的函数将作用于L的四个元素而非作用与L上!
# 因为key指定的函数将作用于L的四个元素而非作用与L上!