• 函数编程(二)


    在python中有许多函数具有函数式编程的特征。

    lambda函数可以很好地和使用这些函数的应用程序结合起来,因为它们都带了一个可执行的函数对象。

    lambda表达式提供了迅速创造这些函数的机制。

    一、filter

    filter在给定一个对象的序列和一个“过滤”函数的基础上,每个序列元素都通过这个过滤器进行筛选,保留函数返回为真的对象。

    filter函数为已知的序列的每个元素调用给定布尔函数。每个filter返回的非零(true)值元素添加到一个列表中。

    返回的对象是一个从原始队列中“过滤后”的队列。

    注意:filter()在python三种改了,返回的是一个可迭代的对象。

    #!/usr/bin/env python
    from random import randint   #调用函数
    
    def odd(n):
        return n % 2   #定义一个整数的函数
    
    allNums = []
    for eachNum in range(9):
        allNums.append(randint (1,99))  #随机生成9个值
    allFilter = []
    
    for eachone in filter(odd,allNums):
        allFilter.append(eachone)  #用odd将allNums过滤
    
    print(allFilter)
    
    #虽然使用filter有些多余,但是重要的是思想。

    执行结果:

    #随机返回一些奇数值
    [root@7 script]# python 11-7-21.py
    [9, 25, 69]
    [root@7 script]# python 11-7-21.py
    [55, 83, 41]
    [root@7 script]# python 11-7-21.py
    [67, 9, 35, 85, 11]

    第一次改写:odd()能够用一个lambda表达式替换。

    #!/usr/bin/env python
    from random import randint
    allNums = []
    for eachNum in range(9):
        allNums.append(randint(1,99))
    
    allones = []
    for eachone in filter(lambda n:n%2,allNums): #使用匿名函数直接生成,而且也没有保留函数的必要。
        allones.append(eachone)
    
    print(allones)

    第二次改写:一个列表就可以替代filter函数

    #!/usr/bin/env python
    from random import randint
    allNums = []
    for eachNum in range(9):
        allNums.append(randint(1,99))
    
    eachones =[]
    for eachone in [n for n in allNums if n%2]:  
        eachones.append(eachone)
    
    print(eachones)

    第三次改写:

    #!/usr/bin/env python
    from random import randint as ri
    eachones = []
    for eachone in [n for n in [ri(1,99) for i in range(9)] if n%2]:
        eachones.append(eachone)    #函数都可以不要了
    
    print(eachones)

    二、map()

    map()和filter()有点类似,都可以通过函数来梳理数据。

    在最简单的形式中,map()带一个函数和队列,将函数作用在序列的每个元素上,然后创建由每次函数应用组成的返回值列表。

    >>> for i in map((lambda x:x+2),[0,1,2,3,4,5]):
    ...     print(i)
    ... 
    2
    3
    4
    5
    6
    7
    >>> for i in map(lambda x,y:x+y,[1,3,5],[2,4,6]):
    ...     print(i)
    ... 
    3
    7
    11
    >>> for i in map(lambda x,y:(x+y,x-y),[1,3,5],[2,4,6]):
    ...     print(i)
    ... 
    (3, -1)
    (7, -1)
    (11, -1)
  • 相关阅读:
    成功交付离岸项目
    利用CSP探测网站登陆状态
    Web NFC API
    HTML/W3C-WHATWG-Differences
    MIT教授将网页开发整合为完整独立的程式语言Ur/Web
    移动端前端开发调试
    从0到100——知乎架构变迁史
    C++之再续前缘(一)——C++基础(与C语言的差异)(上)
    又爱又恨系列之枚举enum
    数据结构之队列(三)——循环队列
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7764637.html
Copyright © 2020-2023  润新知