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进制
  • 相关阅读:
    关于JSON可能出现的错误,待更/todo
    mongoose的安装与使用(书签记录) 2017
    HTTP的学习记录3--HTTPS和HTTP
    HTTP的学习记录(二)头部
    HTTP(一)概述
    LeetCode 455. Assign Cookies
    LeetCode 453. Minimum Moves to Equal Array Elements
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 447. Number of Boomerangs
    LeetCode 416. Partition Equal Subset Sum
  • 原文地址:https://www.cnblogs.com/yu-long/p/9976289.html
Copyright © 2011-2022 走看看