函数式编程>>高阶函数

1.map/reduce

map(func, list)

def fa(x):
    return x*x
list(map(fa,[1,2,3,4,5]))
#将fa这个函数,作用于list中的每一个【元素】
#map返回的是【生成器】,要直接“看到”值要用list强制输出

reduce(func, list)

from functools import reduce#使用reduce一定要有这一句
def fn(x,y):
    return x*10+y

def char2num(s):
    digits = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
    return digits[s]

reduce(fn,map(char2num,'13579'))
#reduce返回的是值

先用map,把‘13579’中每一个字符变成数字,并返回一个生成器
再用reduce,把fn函数作用于生成器中的每一个元素,but!reduce下的fn始终接收两个变量
计算过程:1x10+3=13,13x10+5=135,135x10+7=1357,1357x10+9=13579
把每一次计算的结果当做一个变量,传入下一次计算

2.filter

filter(func, list)

filter函数将函数作用于list中的每一个元素,并对返回的对象做真值判断【注:不是返回值只能是True/False,所有对象均可做真值判断】,再决定是否保留该元素(True留,False删)

def not_empty(s):
    return s and s.strip()

print(list(filter(not_empty,['A','','B',None,'C','   '])))
#filter返回的也是生成器,要用list+print强行“列出”
#筛选质数
def odd():
    n = 1
    while True:#无限循环
        n = n+2#生成从3开始的无限奇数列
        yield n#生成器,惰性,不占内存

def notdivisible(n):
    return lambda x:x % n > 0

def primes():
    yield 2
    it = odd()#初始序列
    while True:
        n = next(it)#it指向一个生成器,要用next()语句来得到下一个值,即新序列的第一个值
        yield n#无限质数生成器
        it = filter(notdivisible(n),it)#删除it生成器中n的倍数(可整除n)

i = print('请输入想得到的质数范围:')
 for n in primes():
     if n <= i:
         print(n)
    else:
        break
#practice 求回数-正数反数都一样的数
def huishu(n):
    if n < 10:
        return True
    else:
        s = str(n)
        for i in range(len(s)//2):
            if s[i] == s[len(s)-1-i]:
                return True
            else:
                return False
#一个更更更简单的方法......
def huishu(n):
    return str(n) == str(n)[::-1]

print(list(filter(huishu,range(1,200))))

3.sorted

sorted(list, key = func)

sorted([36, 5, -12, 9, -21],key=abs)#排序时用绝对值排,最后输出顺序时按对应的原数列输出
sorted(['bob','about','Zoo','Credit'],key = str.lower)
#key函数作用于前面每一个元素,并根据key的值进行排序,默认从小到大
sorted(['bob','about','Zoo','Credit'],key = str.lower,reverse = True)
#reverse = True配合sorted函数使用,表示从大到小排序
# [  ].reverse() 仅翻转序列,不按大小排序
#practice
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_name(s):
    return s[0]

def by_grade(s):
    return s[1]    

sorted(L,key = by_name)
sorted(L,key = by_grade, reverse = True)#成绩从高到低排
#思路:key要作用于L中每一个元素,L中元素是什么?是tuple。怎么取其中的值?t[i]

你可能感兴趣的:(Python入门)