zoukankan      html  css  js  c++  java
  • python基础-函数式编程

    python基础-函数式编程 

    高阶函数:map , reduce ,filter,sorted

    匿名函数:  lambda


     1.1函数式编程

    面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

    函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来,得出想要的结果,只要是输入时确定的,输出就是确定的。

    1.2高阶函数

    能把函数作为参数传入,这样的函数就称为高阶函数。

    1.2.1函数即变量

    以python的内置函数print()为列,调用该函数一下代码

    复制代码
    >>> print("hello world")
    hello world
    
    #只写print
    >>> print
    <built-in function print>
    
    #可见print("hello world")是函数调用,而print是函数本身
    复制代码

    要获得函数调用执行的结果,我们把结果赋值给变量:

    >>> aa = abs(-20)
    >>> aa
    20

    如果把函数本身赋值给变量

    >>> p = print
    >>> p
    <built-in function print>
    
    #函数本身可以赋值给变量,变量可以指向函数

    我们通过变量来调用这个print函数,验证结果如下

    >>> p("check")
    check

    总结:函数名也是变量,对于print()这个内置函数,完全可以把函数名print看成变量,它指向一个可以打印任何东西的函数

    注:实际程序代码绝不能这么写,上面只是为了举例说明,要恢复print函数,请重启python的交互环境

    1.2.2传入函数

    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一函数作为函数,这种函数就称为高阶函数,

    函数的返回值是一个函数名,也是高阶函数。

    例如:一个简单的高阶函数

    复制代码
    def add(x,y,z):
        return abs(x)+abs(y)
    aa = add(12,23,abs)   #函数执行的结果 赋值给 aa
    print(aa) #查看aa的值
    #35 
    
    #注,abs()函数是求一个整数的绝对值
    复制代码

    1.3匿名函数

    什么是匿名函数:

    在python中有一个匿名函数lambda,匿名函数就是指:无需定义标识符(函数名)的函数或子程序。

    定义lambda表达式:

    复制代码
    lambda  arguments:express    
    
    #arguments 参数(可以有多个参数)
    #express 表达式
    
    #lambda返回值是一个函数的地址,也就是函数对象
    aa = lambda  arguments:express  #把的到lambda函数地址,赋值给变量aa
    
    查看这个lambda函数地址   ,用aa(argument)   查看这个函数的值
    复制代码

     PS1:

    普通函数定义,求数字平方

    1 def pf(x=0):
    2     return x**2
    3 print(pf(3))

     PS2:

    lambda函数,求数字平方

    1 aa = lambda x:x**2
    2 print(aa(4))
    3 #16

    总结:

    1.lambda函数可以参数可以有多个,包含的表达式不能超过一个,不要试图向lambda函数中塞入太多东西,如果你需要做复杂的功能,应该定义一个普通函数,想定义什么就定义什么。

    2.lambda函数用在需要封装特殊的,非重用代码上,避免令我们的代码充斥大量的单行函数。

    1.4map函数

    map()函数,map映射  

    map(func,iterable)

    map()函数接受两个参数,一个是函数,一个可迭代的对象(iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的 可迭代的对象 的结果返回

    例:有个函数,f(x) = x+1 把得到的数字 加1    要把这个函数作用在一个[1,2,3,4,5,6]上

    复制代码
    number = [1,2,3,4,5,6]
    #1.用普通函数定义方法
    def add_one(x):
        return x+1
    def map_test(func,arrey):
        res = []
        for i in arrey:
            i = func(i)
            res.append(i)
        return res
    print(map_test(add_one,number))
    #[2, 3, 4, 5, 6, 7]
    
    
    #2.用lambda函数定义的得到结果,借助1定义的map_test函数
    print(map_test(lambda x:x+1,number))
    #[2, 3, 4, 5, 6, 7]
    
    #3.用map()本身函数去定义
    print(list(map(lambda x:x+1 ,number)))
    #[2, 3, 4, 5, 6, 7]
    
    #注:map()得出的结果是一个iterator ,需要用list()函数让它个整个序列都计算出来返回一个list
    复制代码

    我们可能会想,写一个循环,也可以计算出结果,但要实现多个功能,是不是也要写多个循环 例:得出每个列表中元素的平方或则n次方

    map()作为高阶函数,事实上把运算规则抽象了,不但可以计算简单的 f(x) = x+1 ,也能计算更复杂的函数。

    总结:map() 处理序列中的每个元素,得到的结果是一个 iterator ,需通过list(iteratro),该list元素个数,与原来位置一样。

    1.5reduce函数

    在python2可以直接用reduce()函数

    在python3需要调用reduce模块

    from functools import reduce
    reduce(function, sequence, initial=None)  #该函数的默认用法

    reduce函数,将function作用sequence序列的元素,每次携带一对(先前的结果以及下一序列的元素),连续的将现有的结果和下一个作用在获得的随后的结果上,最后得到我们的序列为一个最终结果的返回值。

    PS1:

     1 number1 = [2,3,4,10]
     2 #1.普通函数定义
     3 def chengfa(x,y):
     4     return x*y  #返回得到两个数相乘的结果
     5 def reduce_test(func,seq,init=None):
     6     if init is None:
     7         res = seq.pop(0)   #seq删除第一个元素,并获取删除这个元素 赋值给res
     8     else:
     9         res = init
    10     for i in seq:
    11         res = func(res,i)  #循环一次,执行func这个函数
    12     return res
    13 print(reduce_test(chengfa,number1))
    14 #240
    15 print(reduce_test(chengfa,number1,10))
    16 #2400
    17 
    18 #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果
    19 
    20 #2.lambda函数,借助reduce_test()函数定义
    21 print(reduce_test(lambda x,y:x*y,number1,init=3))
    22 #720
    23 
    24 #3.使用reduce(),结合lambda()
    25 print(reduce(lambda x,y:x*y, number1))
    26 #240
    27 
    28 得到列表所有元素,相乘的结果
    29 
    30 number1 = [2,3,4,10]
    31 #1.普通函数定义
    32 def chengfa(x,y):
    33     return x*y  #返回得到两个数相乘的结果
    34 def reduce_test(func,seq,init=None):
    35     if init is None:
    36         res = seq.pop(0)   #seq删除第一个元素,并获取删除这个元素 赋值给res
    37     else:
    38         res = init
    39     for i in seq:
    40         res = func(res,i)  #循环一次,执行func这个函数
    41     return res
    42 print(reduce_test(chengfa,number1))
    43 #240
    44 print(reduce_test(chengfa,number1,10))
    45 #2400
    46 
    47 #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果
    48 
    49 #2.lambda函数,借助reduce_test()函数定义
    50 print(reduce_test(lambda x,y:x*y,number1,init=3))
    51 #720
    52 
    53 #3.使用reduce(),结合lambda()
    54 from functools import reduce
    55 print(reduce(lambda x,y:x*y, number1))
    56 #240
    57 
    58 得到列表所有元素,相乘的结果

     PS2:

    得到1-100的和

    1 print(reduce(lambda x,y:x+y,range(1,101)))

    1.6filter函数

    filter()函数用于过滤序列和map()类似,filter()也接受一个函数和一个序列(可迭代的对象,也就是能被for循环),和map()不同的是,fillter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    示例:

     1 aa = ['A', '', 'B', None, 'C', '  ']
     2 #1.自定义函数测试
     3 def not_empty(s):
     4     return  s and s.strip()
     5 def filter_test(func,iter):
     6     res = []
     7     for i in iter:
     8         i = func(i)
     9         if i:
    10             res.append(i)
    11     return res
    12 print(filter_test(not_empty,aa))
    13 
    14 #['A', 'B', 'C']
    15 
    16 #2.filter内置函数测试
    17 print(list(filter(not_empty,aa)))
    18 #['A', 'B', 'C']
    19 
    20 #把列表中空字符串,空元素,都去掉

    filter()这个函数,关键在于正确实现一个筛选函数,

    注:filter()函数返回的是一个iterator,内存地址,需要看内存地址的值, 用list()函数或得该地址的值  

    1.7sorted函数

    sorted()函数也是一个高阶函数,它可以接收key

    sorted排序,排序是比较元素的大小,如果是数字可以直接比较,如果是字符串或则两个dict(字典)?

    sorted()传入的参数是可迭代的对象,返回值的对象是一个列表

    示例:数字默认排序

    1 aa = [11,-10,20,21,30,-40]
    2 print(sorted(aa))

    备注:接收一个key函数来实现自定义排序

    示例:根据绝对值大小来进行排序

    1 aa = [11,-10,20,21,30,-40]
    2 print(sorted(aa,key=abs))
    3 #[-10, 11, 20, 21, 30, -40]

    示例:字符串排序

    1 print(sorted("hello"))
    2 #['e', 'h', 'l', 'l', 'o']
    3 
    4 print(sorted(["hello","ho","haha"]))
    5 # ['haha', 'hello', 'ho']

    备注:默认情况下,对字符串排序是按照ASCII编码表的大小进行比较的

     

    最后总结:

    python内置的几个高阶函数:map() ,reduce(),filter,sorted()

  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/nulige/p/6143244.html
Copyright © 2011-2022 走看看