zoukankan      html  css  js  c++  java
  • python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数

    函数式编程

    编程方法论:

    1.面向过程

    找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程

    (1).搜索目标,用户输入(配偶要求),按照要求到数据结构内检索合适的任务

    (2)表白,表白成功进入3,否则返回1

    (3)恋爱,恋爱成功进入4,否则返回1

    (4)见家长,同意进入5,否则返回1

    (5)结婚

    2.函数式编程

    函数式=编程语言定义的函数+数学意义的函数

      通俗来讲,函数式就是用编程语言去实现数学函数。这种函数内对象的永恒不变的,要么参数就是函数,要么返回值是函数,没有for和while循环,所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。

    高阶函数:

      函数接收的参数是一个函数名 或 返回值中包含函数

    #把函数当作参数传给另外一个函数
    def foo(n):
        print(n)
    
    def bar(n):
        print("my name is %s."%n)
    
    foo(bar)
    #foo(bar()) ##报错
    foo(bar('alex'))
    
    >>><function bar at 0x0000016DB13372F0>
    >>>my name is alex.
    None
    #返回值中包含函数
    def bar():
        print('from bar')
    
    def foo():
        print('from foo')
        return bar
    v=foo()
    v()
    
    >>>from foo
    >>>from bar

     尾递归:

     

    map函数:在原有列表中对元素加工,返回列表

    #获取列表中每个值的平方、自减一、自加一等逻辑
    num_l=[1,2,10,5,3,7]
    # v=[]
    # for i in num_l:
    #     v.append(i**2)
    # print(v)
    def add_one(n):
        return n+1
    
    def substract_one(n):
        return n-1
    
    def pf_one(n):
        return n**2
    #方法一:自己写逻辑 def map_test0(array): v=[] for i in num_l: v.append(i ** 2) return v print(map_test0(num_l)) >>>[1, 4, 100, 25, 9, 49] #####################
    #方法二:利用函数调用逻辑
    def map_test1(func,array): v=[] for i in array: v.append(func(i)) return v print(map_test1(add_one,num_l)) print(map_test1(lambda x:x+1,num_l))#匿名函数调用逻辑 >>>[2, 3, 11, 6, 4, 8] >>>[2, 3, 11, 6, 4, 8] print(map_test1(substract_one,num_l)) print(map_test1(lambda x:x-1,num_l)) >>>[0, 1, 9, 4, 2, 6] >>>[0, 1, 9, 4, 2, 6] print(map_test1(pf_one,num_l)) print(map_test1(lambda x:x**2,num_l)) >>>[1, 4, 100, 25, 9, 49] >>>[1, 4, 100, 25, 9, 49]

    map()方法:

    #方法三:python内置方法map()相当于map_test1()的逻辑,但返回值为可迭代对象,需添加到列表中
    v=map(lambda x:x+1,num_l)
    print(list(v))
    
    >>>[2, 3, 11, 6, 4, 8]
    #练习,将字符串转换成大写
    msg='renjingyue'
    v=map(lambda x:x.upper(),msg)
    print(list(v))
    
    >>>['R', 'E', 'N', 'J', 'I', 'N', 'G', 'Y', 'U', 'E']

     filter()函数:在原有列表中筛选,获得新的列表

    #过滤开头是sb的人
    movie_people=['sb_alex','sb_linhaifeng','gangniang']
    
    def filter_test(l):
        r=[]
        for p in l:
            if  not p.startswith('sb'):
                r.append(p)
        return r
    
    print(filter_test(movie_people))
    
    >>>['gangniang']
    #进阶版:
    def filter_test1(func,l):
        r=[]
        for p in l :
            if not func(p):
                r.append(p)
        return r
    print(filter_test1(lambda x:x.endswith('g'),movie_people))
    
    >>>['sb_alex']
    
    #############
    #filter内置函数,lambda返回True则添加进列表
    print(list(filter(lambda x:x.endswith('g'),movie_people)))
    
    >>>['sb_linhaifeng', 'gangniang']

     

    reduce()内置函数:将原有列表中元素压缩,获得一个值

    #将列表元素相乘或相加,初始值为变量
    num_l=[1,2,3,100]
    
    def add(a,b):
        return a+b
    
    def multi(a,b):
        return a*b
    
    def reduce_test(func,array,init=None):
        if init is None:
            r=array.pop(0)
        else:
            r=init
        for num in array:
            r=func(r,num)
        return r
    
    print(reduce_test(multi,num_l))
    print(reduce_test(lambda x,y:x*y,num_l))
    
    >>>600
    >>>600

    reduce()用法:

    from functools import reduce
    
    print(reduce(lambda x,y:x*y,num_l))
    
    >>>600

    总结:

    map():处理序列中的每个元素,得到的结果是一个‘列表’,该‘列表’元素个数及位置与原来一样

    filter():遍历序列中的每个元素,判断每个元素得到布尔值,如果True则留下来

    #例:过滤掉年纪超过100岁的人
    people=[
        {'name':'alex','age':1000},
        {'name':'wupei','age':10000},
        {'name':'ayua','age':9000},
        {'name':'rjy','age':18},
    ]
    
    def filter_1(dic):
        l=[]
        for i in dic:
            if  dic['age']<=100:
                l.append(i)
        return l
    
    
    print(list(filter(filter_1,people)))
    
    print(list(filter(lambda d:d['age']<=100,people)))
    
    >>>[{'name': 'rjy', 'age': 18}]
    >>>[{'name': 'rjy', 'age': 18}]

    reduce():处理一个序列,将序列进行所需求的(可定义的)合并操作

    from functools import reduce
    #计算0到100,初始值为0
    print(reduce(lambda x,y:x+y,range(0,101)))
    #计算0到100,初始值为100
    print(reduce(lambda x,y:x+y,range(0,101),100))
    
    >>>5050
    >>>5150

     内置函数:

    http://www.runoob.com/python/python-built-in-functions.html

    abs():取绝对值

    all():将序列中每个元素作bool运算,全真则为真,若迭代对象为空则为空

    any():将序列中每个元素作bool运算,有一个为真则为真

    bin():将数字转换为二进制

    bool():判断bool值,空,False,0都为False

    bytearray():

    bytes():将字符串转化为字节的形式   

        print(bytes('你好',encoding='utf-8'))    

         print(bytes('你好',encoding='utf-8').decode('utf-8'))

    chr():获取ascii表中内容

        chr(46)   >>>.

    dict(): 函数用于创建一个字典

    >>>dict()                        # 创建空字典
    {}
    >>> dict(a='a', b='b', t='t')     # 传入关键字
    {'a': 'a', 'b': 'b', 't': 't'}
    >>> dict(zip(['one', 'two', 'three'], [1, 2, 3]))   # 映射函数方式来构造字典
    {'three': 3, 'two': 2, 'one': 1} 
    >>> dict([('one', 1), ('two', 2), ('three', 3)])    # 可迭代对象方式来构造字典
    {'three': 3, 'two': 2, 'one': 1}
    

    dir():获取每个对象下有哪些方法
    divmod():10/3的结果3余1

    print(divmod(10,3))
    
    >>>(3,1)

     enumerate():enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

    >>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
    >>> list(enumerate(seasons))
    [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
    >>> list(enumerate(seasons, start=1))       # 下标从 1 开始
    [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
    
    
    #####################
    >>>i = 0
    >>> seq = ['one', 'two', 'three']
    >>> for element in seq:
    ...     print i, seq[i]
    ...     i +=1
    ... 
    0 one
    1 two
    2 three
    #####################
    >>>seq = ['one', 'two', 'three']
    >>> for i, element in enumerate(seq):
    ...     print i, element
    ... 
    0 one
    1 two
    2 three

    eval():1.提取字符串中的数据结构,2.用来执行一个字符串表达式,并返回表达式的值。

    hash():用于获取取一个对象(字符串或者数值等)的哈希值,可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型。哈希值对同一个变量在一次程序运行中的值是一样的,hash值的长度固定。
    help():查看方法帮助。

    hex():10进制转换成16进制

    oct():10进制转换成8进制

    isinstance():判断一个对象是不是所输入类型isinstance(1,int)

    globals():获取全部全局变量

    locals():获取当前局部变量

    zip():拉链,函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。返回的是列表的地址,需加list()返回列表

    p={'name':'alex','age':18,'gender':'male'}
    print(list(zip(p.keys(),p.values())))
    
    >>>[('name', 'alex'), ('age', 18), ('gender', 'male')]
    
    
    print(list(zip(['a','bv'],'wers')))
    
    >>>[('a', 'w'), ('bv', 'e')]

    max():获取最大值,传入的数据类型需为可迭代类型

    1.max函数处理的是可迭代对象,相当于一个for循环取出每个元素进行比较,注意:不同类型不能进行比较

    2.每个元素间进行比较,是从每个元素的第一个位置依次比较,如果这一个位置分出大小,后面的都不需要比较了,直接得出这两个元素的大小

    age_dic={'alex_age':18,'wpq':20,'zas':25,'lhf':10}
    
    #默认比较字典的key
    print(max(age_dic))
    
    print(max(age_dic.values()))
    
    # zip(age_dic.values(),age_dic.keys())
    print(max(zip(age_dic.values(),age_dic.keys())))
    
    
    >>>zas
    >>>25
    >>>(25, 'zas')
    l1=[
        (6,'a',),
        (9,'c',),
        (3,'a',),
        (5,'a',)
    ]
    print(max(l1))
    
    >>>(9, 'c')
    
    #不同类型数据无法比较大小,相同类型数据相当于遍历每个元素的大小
    #找到第一个元素最大后不继续比较大小了
    l2=['a10','b12','c10']
    print(list(max(l2)))
    
    >>>['c', '1', '0']
    #找出年龄最大的人
    people=[
        {'name':'alex','age':1000},
        {'name':'wupei','age':10000},
        {'name':'ayua','age':9000},
        {'name':'rjy','age':18},
    ]
    
    print(max(people,key=lambda dic:dic['age']))
    
    >>>{'name': 'wupei', 'age': 10000}

    min():获取最小值,与max()类似

    ord():传入一个字符,返回字符在ascii码表中的位置

    pow():

    print(pow(2,3))  # 2**3
    print(pow(3,3,2)) # 3**3%2取余
    
    >>>8
    >>>1

    reversed():反转序列元素

    round():四舍五入
    slice():定义切片

    l='hello'
    s1=slice(3,5)
    s2=slice(1,4,2)
    print(l[s1])
    print(l[s2])
    
    >>>lo
    >>>el

    sorted():排序,本质是比较大小,不同类型不能比较

    #找出年龄最大的人
    people=[
        {'name':'alex','age':1000},
        {'name':'wupei','age':10000},
        {'name':'ayua','age':9000},
        {'name':'rjy','age':18},
    ]
    
    print(sorted(people,key=lambda dic:dic['age']))
    
    
    name_dic={'alex':1000,'wp':200,'oo':20}
    print(sorted(name_dic))
    print(sorted(name_dic.keys()))
    print(sorted(name_dic.values()))
    
    print(sorted(name_dic,key=lambda key:name_dic[key]))
    
    print(sorted(zip(name_dic.values(),name_dic.keys())))
    
    >>>['alex', 'oo', 'wp']
    >>>['alex', 'oo', 'wp']
    >>>[20, 200, 1000]
    >>>['oo', 'wp', 'alex']
    >>>[(20, 'oo'), (200, 'wp'), (1000, 'alex')]

    import==》sys操作系统==》调用_import_()

    _import_()以字符串类型导入模块名

  • 相关阅读:
    firstresponder 后,键盘不显示
    performSelector
    setNeedsDisplay、setNeedsLayout 区别
    Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
    GCD介绍(一):基本概念和dispatch queues
    一些概念
    /mnt/sdcard /sdcard
    eclipse 导入已存在的工程文件出错
    ios 常用技巧
    ios nsstring去掉换行符
  • 原文地址:https://www.cnblogs.com/Manuel/p/10557714.html
Copyright © 2011-2022 走看看