• 21-高级属性之内建方法(2)


    函数式编程

    map

    #map(f, I) 等价于对I的每个元素I(i)都执行f, 然后再把所有f(I(i))拼接成一个Iterator并返回
    #map传入函数和一个Iterable(一个序列),返回一个Iterator
    #注意到Iterator是惰性序列,只有被调用才能被获取,要通过诸如list,for等等 迭代出来
    def f(x):
        return x*x
    L = list(map(f, [1, 2, 3, 4]))   
    print(L)
    L2 = list(map(str, L)) #把数字转化成数字字符串
    print(L2)
    

    reduce

    有个小特点:map和filter都是返回一个Iterator,而唯有reduce返回一个{非Iterator}的Iterable

    #  reduce(f,[x1,x2,x3,x4]) 等价于 f(f(f(x1,x2),x3),x4)
    # reduce接收一个函数和Iterable,返回一个非Iterator的Iterable对象{非惰性序列}
    from functools import reduce    #reduce在functools模块,要先导入
    def add(x,y):
        return x+y
    print(reduce(add, [1,2,3,4,5]))
    print("
    ")
    
    def fn(x,y):
        return 10*x+y
    print(reduce(fn, [1,2,3,4,5]))
    print('
    ')
    

    map+reduce 把str转化成int

    def char2num(c):
        digits = {'0':0, '1':1, '2':2, '3':3, '4':4, 
        '5':5, '6':6, '7':7, '8':8, '9':9}
        return digits[c]
    num = reduce(fn, map(char2num, "123456"))
    print(num,'
    ')
    
    #改进版1
    digits = {'0':0, '1':1, '2':2, '3':3, '4':4, 
        '5':5, '6':6, '7':7, '8':8, '9':9}
    def str2num(str):
        def fn(x,y):
            return x*10+y
        def char2num(c):
            return digits[c]
        return reduce(fn, map(char2num, str))
    print(str2num("1234567890"), '
    ')
    
    #lamda简化版
    #前面已经定义过digits和char2num,此处不定义fn,而是把fn,直接用lamda表达式来替代
    def str2num_2(str):
        return reduce(lambda x,y: x*10+y, map(char2num, str))
        #return reduce(lambda x,y: x*10+y, map(lambda c: digits[c], str)) #把char2num也用lamda表达式简化
    print(str2num_2("456789"), '
    ')
    
    #print("a".upper())
    #lamda x: x.upper() 字母变大写
    

    写廖晓峰的三个作业

    #1.用map把name中的各个名字标准化:首字母大写,其余字母小写#
    '''
    #最开始的尝试,失败
    def name2stander(name):
        #return map(lambda x,y: x.upper(),y.lower(), name[:][0], name[:][1:])
        #map(lambda x: x.upper(), name[:][0])
        #map(lambda y: y.lower(), name[:][1:])
        return name
    name = ['haO', 'ZhaN', 'HangZHOU']
    #print(name[0][0])
    print(name)
    print(name[:])
    print(list(name[:][0]))
    #print(name2stander(name), '
    ')
    '''
    
    #后来成功的尝试
    def fup(str):
        return str[0].upper()+str[1:].lower()
    #print(fup("aBcDh"))
    #上面的fup可以用这个代替:lambda str: str[0].upper()+str[1:].lower()
    def name2stander(name):
        return list(map(fup, name))
    name = ['haO', 'ZhaNG', 'HangZHOU']
    print(name2stander(name), '
    ')
    
    #对上一个版本进行lambda优化{基本是完美版}
    def n2s(name):
        return list(map((lambda str: (str[0].upper()+str[1:].lower())), name))
    name2 = ['zHAng', 'haO', 'ZHEjianG']
    print(n2s(name2))
    print('
    ')
    
    ##########作业2##########################################
    #传入一个list,利用reduce求积
    def prod(list):
        return reduce((lambda x,y: x*y), list)
        
    Li = [1, 5, 7, 2]
    print(prod(Li), '
    ')
    
    ##########作业3##########################################
    #利用map和reduce,把"123.456"转化成123.456
    #测试下123.456的处理
    str = "123.456"
    digits = {'0':0, '1':1, '2':2, '3':3, '4':4, 
        '5':5, '6':6, '7':7, '8':8, '9':9}
    '''
    for i in range(len(str)):
        if (str[i]=='.'):
            break
    print(i) #说明前面有i个数,小数点后面有len(str)-i位,
    '''
    #写个函数求i
    def GetDotRank(str):
        for i in range(len(str)):
            if (str[i] == '.'):
                return i
    #map的功能就是把'123.456'转化成[1,2,3,4,5,6],再分成两个list[1,2,3]与[6,5,4,0]
    L = list(map((lambda x: digits[x] if (x!='.') else 0), str))
    print(L, '
    ')
    DotRank = GetDotRank(str)
    print(DotRank,'
    ')
    L1,L2 = L[0:DotRank], L[-1:DotRank-1:-1] #[lo:hi:step]等价于[lo, hi),步长为step{1为默认,其余步长比如-1均不可以省略}
    print(L1,'
    ', L2, '
    ')
    #小数点前面的reduce(lambda x,y: 10*x+y, [1, 2, 3])
    a = reduce((lambda x,y: 10*x+y), L1)
    #小数点后面的reduce(lambda x,y: 0.1*x+y, [6, 5, 4,0])
    b = reduce((lambda x,y: 0.1*x+y), L2)
    #再把两者相加
    print(a, b, a+b,'
    ')
    
    #############最后定义个str2float解决这个问题####################
    digits = {'0':0, '1':1, '2':2, '3':3, '4':4, 
        '5':5, '6':6, '7':7, '8':8, '9':9}
    def str2float(str):
        def GetDotRank(str):
            for i in range(len(str)):
                if (str[i] == '.'):
                    return i
    
        L = list(map((lambda x: digits[x] if (x!='.') else 0), str))
        L1,L2 = L[0:GetDotRank(str)], L[-1:(GetDotRank(str)-1):-1] #[lo:hi:step]等价于[lo, hi),步长为step
        a = reduce((lambda x,y: 10*x+y), L1)
        b = reduce((lambda x,y: 0.1*x+y), L2)
        return a+b
    str = "123.456"
    print(str2float(str), '
    ')
  • 相关阅读:
    一个不确定内容的数组,统计每个元素出现的次数的方法
    WebStorm配置TSLint
    angualr 项目环境搭建
    angular6 导出json数据到excal表
    angular6 引用echart第一次数据不显示解决
    angular6 开发实践基础知识汇总
    angular6实现对象转换数组对象
    angular 实现左侧和顶部固定定位布局
    ASP.NET MVC 全局异常
    IOC容器之Autofac
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504480.html
Copyright © 2020-2023  润新知