美文网首页
函数式编程

函数式编程

作者: 咸鱼有梦想呀 | 来源:发表于2018-09-30 15:43 被阅读0次

高阶函数

  • map()
    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

例如,将一个函数f(x)=x2作用于一个list。就可以用map实现。

运行效果

map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把list所有数字转为字符串

list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
运行效果图
  • reduce()
    reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

例如:一个序列求和

序列求和

python有内置的求和函数sum(),用reduce似乎多此一举

sum()求和

小练习:
1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:

# -*- coding: utf-8 -*-
def normalize(name):
   name=name[0].upper()+name[1:].lower()
   return name
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
运行结果

2.编写一个prod()函数,可以接受一个list并利用reduce()求积:

运行结果
  • filter()
    Python内建的filter()函数用于过滤序列。
    map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例如:在一个list中只保留奇数:


fliter应用

注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

练习:
回数是指从左向右读和从右向左读都是一样的数,例如12321,909。利用filter()筛选出回数:

def is_palindrome(n):
    nn = str(n) #转成字符串
    return nn == nn[::-1] #反转字符串并对比原字符串返回true/false
运行结果
  • sorted()
    排序算法

Python内置的sorted()函数就可以对list进行排序

shorted排序

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
例如绝对值排序:

sorted排序

key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。
要想字符串排序忽略字母大小,就要加一个条件即可实现:

排序

如果要进行反向排序,只需要传入第三个参数reverse=True

反向排序

练习:
假设用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序:

def by_name(t):
    return t[0].lower()
L=[('Dob',75),('Adam',92),('Bart',66),('Cisa',88)]  
L1=sorted(L,key=by_name)
print(L1)   
运行结果

再按成绩从高到低排序:

def by_scort(t):
    return t[1]
L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
L1=sorted(L,key=by_scort,reverse=True)
print(L1) 
运行结果

返回函数

函数作为返回值,就叫返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

不需要立刻求和,而是在后面的代码中,根据需要再计算,可以不返回求和的结果,而是返回求和的函数:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数

返回函数说明

在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数,f1()f2()的调用结果互不影响。

匿名函数

关键字lambda表示匿名函数

例如:


匿名函数

匿名函数

lambda x: x * x

就是函数

def f(x):
    x * x

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

相关文章

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • 函数式编程(一)—— 前置知识

    为什么要学函数式编程? 什么是函数式编程?函数式编程和面向对象编程的不同对于函数式编程思维方式的理解: 函数式编程...

  • 二十二、函数式编程、面向协议式编程

    函数式编程(Functional Prigramming) 函数式编程 函数式编程(Functional Prig...

  • Python中的函数式编程

    函数式编程 说到函数式编程,我们的重点在于为什么要采用函数式编程,而不是什么是函数式编程。 函数式编程的优点:一、...

  • RxSwift-初探

    函数响应式编程 一:函数式 函数式编程简称FP(Functional Programming),函数式编程就是一种...

  • 《Kotlin入门实战》CH5 | 函数与函数式编程

    函数与函数式编程 函数式编程与命令式编程最大的不同是:函数式编程的焦点在于数据的映射,命令式编程(imperati...

  • 函数响应式编程思想 & RxSwift 核心逻辑(一)

    函数响应式编程思想 函数响应式编程思想即是将函数式编程和响应式编程相结合。 函数式编程 顾名思义,就是像函数一样的...

  • RxJava系列|RxJava简介(一)

    函数响应式编程 函数式编程是一种编程范式。 常见的编程范式有:命令式编程、函数式编程和逻辑式编程。 面向对象就是一...

  • 了解C# 函数式编程

    什么是函数式编程 函数式编程是一种编程范式,维基百科对函数式编程定义如下: 函数式编程(英语:functional...

网友评论

      本文标题:函数式编程

      本文链接:https://www.haomeiwen.com/subject/zjceoftx.html