zoukankan      html  css  js  c++  java
  • python-函数式编程与内置函数

    #编程方法论:

    • 面向对象
    • 面向过程

        没有返回值的函数。

        一步一步来,可读性强。

    • 函数式编程

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

        代码简洁但可读性差

        风格:不使用变量保存状态,不修改变量

    面向过程和函数式编程的方式举例:

      实现y = 2 * x + 1

    #面向过程
    def func(x):
        res = 2 * x
        res += 1
        return res
    
    #函数式编程
    def func(x):
        return 2 * x + 1

    #高阶函数:

      满足函数传入的参数是一个函数,或其返回值中包含函数的函数被称为高阶函数。如:

    ###函数传入的参数是一个函数名###
    def foo(n):         #是高阶函数,传入的是函数bar
        print(n)
    def bar(name):      #不是高阶函数,传入的是字符串’alex’
        print('my name is %s' %name)
    foo(bar)
    foo(bar('alex'))
    
    ###返回值中包含函数###
    def test1():         #是高阶函数,返回值是函数test1
        print('from test1')
        return test1
    def test2():         #是高阶函数,返回值也是函数test1
        print('from handle')
        return test1()

    #函数式编程中三个重要函数的应用:

      1.map函数:

    map函数:将可迭代对象元素分别代入作为参数的函数,并将每个元素被参数函数处理后的结果返回生成一个迭代器。(即依次将列表中各个元素进行处理,并返回一个新的列表,不过该新列表为一个迭代器(迭代器只能被使用一次,随用随删))

    实例如下:

    num_1 = [1,2,10,5,3,7]            #其它可迭代对象也可以
    res = map(lambda x:x-1, num_1)    #返回一个迭代器。前面参数可以是函数或lambda,后面参数可以是任意可迭代对象
    print(res)                        #直接返回其结果将不是预期的值
    # --> <map object at 0x014521F0>
    print(list(res))      #转换成list类型,就可看结果
    for i in res:          #或者使用for循环,依次输出其res值
         print(i)
    print(list(res))       #使用map函数得到的结果只能读取一次,随用随删
    # --> <map object at 0x032E21F0>   #本段代码中第一次print的res
    # --> [0, 1, 9, 4, 2, 6]           #第二个print的list(res)
    # --> []                           #第四个print的list(res),可看出已经是空集了,且第三次for循环也没有输出任何值(迭代器特点)

      2.filter函数:

    filter函数:把可迭代对象的元素分别代入作为参数的函数,若返回值为True则保留该元素,否则删除该元素,最终返回一个迭代器。

    实例如下:

    movie_people = ['sb_alex','sb_wupeiqi','linhiafeng','yuanhao_sb']  #可迭代对象
    res = filter(lambda n:not n.endswith('sb'), movie_people)          #筛选出不是以sb结尾的字符串  
    print(list(res))
    # --> ['sb_alex', 'sb_wupeiqi', 'linhiafeng']
    res = filter(lambda n:not (n.endswith('sb') or n.startswith('sb')), movie_people)   #筛选出开头和结尾都不是sb的字符串
    print(list(res))
    # --> ['linhiafeng']

      3.reduce函数:

    reduce函数:不同于map或filter函数,reduce函数中作为参数的函数的参数需要两个值,且其返回值不是迭代器。其作用是将作为参数的可迭代对象的元素,保持两个一组传入作为参数的函数,最终返回一个值。

    如当调用 reduce(lambda x,y:x+y, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

    1.先计算头两个元素:1+3,结果为4;
    2.再把结果和第3个元素计算:4+5,结果为9;
    3.再把结果和第4个元素计算:9+7,结果为16;
    4.再把结果和第5个元素计算:16+9,结果为25;
    5.由于没有更多的元素了,计算结束,返回结果25。
    若加入了第三个参数:reduce(lambda x,y:x+y, [1, 3, 5, 7, 9],100),则第一轮计算是:

    100+1,结果为101;
    ……

    实例如下:

    from functools import reduce          #导入reduce函数
    num_1 = [1,2,3]
    print(reduce(lambda x,y:x+y, num_1, 2))  #在2的基础上求num_1元素的和
    # --> 8  (2 + 1 + 2 + 3)
    print(reduce(lambda x,y:x*y, num_1, 2))  #在2的基础上求num_1元素的积
    #--> 12  (2 * 1 * 2 * 3)

    #几个重要的内置函数:

    ## divmod函数:

    print(divmod(10,6)) #实际意义:网页搜索结果分页,总共10条,每页应显示6个
    # -->  (1, 4)       #说明可分满一整页,且多4条

    ## eval函数:

      eval函数有两种用法,均作用于字符串,一个与字典有关,另一个与数学表达式有关

    dic_str = "{'name':'alex','age':18}"  #定义一个包含了字典格式的字符串
    print(eval(dic_str))                  #eval函数可将上述格式的字符串中字典格式的转换成字典
    # --> {'name': 'alex', 'age': 18}
    express = "1 + 2 * 3 - 2"         #定义一个数学表达式格式的字符串
    print(eval(express))              #eval函数可将上述格式的字符串中的数学表达式的值算出来
    # --> 5

    ## hash函数:

            可哈希(hash)的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型,不同的具体数据的哈希值不一样,相同数据的哈希值一样。借此可用来保证文件传输安全(只要文件在传输过程中受到改变,则其hash值将变化)

    hash('alex')

    ## zip函数:

      zip函数需要传入两个序列(列表、元组、字符串)作为参数,返回值为两个序列中各个元素一一对应所构成的若干元组。

    p = {'name':'alex','age':18,'gender':'none'}
    print(list(zip(p.keys(),p.values())))
    # --> [('name', 'alex'), ('age', 18), ('gender', 'none')]
    print(list(zip('hello','12345')))
    # --> [('h', '1'), ('e', '2'), ('l', '3'), ('l', '4'), ('o', '5')]

    ##三个进制转换:

    bin(12) #10进制->2进制
    hex(12) #10进制->16进制
    oct(12) #10进制->8进制
  • 相关阅读:
    setTimeout的时间设为0的问题
    nodejs的简单服务器程序
    使用Promise规定来处理ajax请求的结果
    使用myfocus制作焦点图
    给Array添加删除重复元素函数
    css派生选择器
    Javascript 参数传递
    Node.js 搞Javascript开发的无论如何要尝试一下
    CSS九宫格带边框的多种实现
    80%人会答错的JS基础面试题
  • 原文地址:https://www.cnblogs.com/yu-long/p/9976289.html
Copyright © 2011-2022 走看看