美文网首页
Python函数式编程

Python函数式编程

作者: 云木杉 | 来源:发表于2018-12-27 17:29 被阅读0次

高阶函数

一个函数接收另一个函数做参数,这种函数称为高阶函数
函数式编程就是指这种高度抽象的编程范式。

def add(x,y,f):
    return f(x) + f(y)
print(add(-10,-20,abs))

map

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

def f(x):
    return x * x
r = map(f,[1,2,3,4,5,6,7,8,9])
print(list(r))

reduce

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

# reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
from functools import reduce
def add(x,y):
    return x * y
    
i = reduce(add,[1,2,3,4,5])
print(i)
from functools import reduce
def fn(x,y):
    return x * 10 + y

def char2num(s):
    digits = {'0':0,'1':1,'2':2,'3':3,'4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]

m = map(char2num,'13579')
r = reduce(fn,m)
print(r)

看不懂

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

filter Python内建用于过滤序列

filter()也接收一个函数和一个序列。与map不同的是 filter()把传入的函数依次作用于每个函数。

filter()返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

排序算法

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

def is_odd(n):
    return n % 2 == 1

l = list(filter(is_odd,[1,2,3,4,5,6,7,8,9]))
print(l)

返回函数

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = n + ax
        return ax
    return sum
f = lazy_sum(1,2,3);
l = lazy_sum(1,2,3);
print()
#<function lazy_sum.<locals>.sum at 0x0000000002167510>
print(f())
# 6
print(f == l)
# False 每次都返回新的参数,调用结果互不影响

匿名函数

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

def build(x,y):
    return lambda: x*x + y*y
#b = build(5,5)
#print(b)

装饰器

函数对象 abs._name,可以拿到函数的名字

比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
本质上,decorator就是一个返回函数的高阶函数。

def log(func):  #看不懂
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

偏函数

  • functools.partial就是帮助我们创建一个偏函数的
  • functools.partial作用就是,把一个函数的某些参数给固定住(也就是设置默认值)
#可以通过base进行进制转换
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565

import functools
int2 = functools.partial(int,base=2)
#print(int2('1000000'))


int2 = functools.partial(int, base=2)
int2('10010')
kw = { 'base': 2 }
int('10010', **kw)


max2 = functools.partial(max, 10)
max2(5, 6, 7)
args = (10, 5, 6, 7)
max(*args)

相关文章

  • 高阶python 函数式编程

    高阶python 函数式编程 - 函数式 函数式编程(FunctionalProgramming) - 基于lam...

  • Python函数式编程

    虽然 Python 不是函数式编程语言(是命令式编程语言),但是支持许多有价值的函数式编程工具。Python 提供...

  • Python函数式编程指南

    注:采转归档,自己学习查询使用 Python函数式编程指南(1):概述Python函数式编程指南(2):函数Pyt...

  • Python进阶语法——函数式编程、模块,面向对象

    一、 Python进阶学习 一、函数式编程 1.1函数式编程 1.2高阶函数 1.2.1 import mathd...

  • Python高阶函数

    本篇将介绍Python的函数式编程,介绍高阶函数的原理,更多内容请参考:Python学习指南 函数式编程 函数是P...

  • Python进阶笔记

    文|Seraph 函数式编程 1 纯函数式编程:不需要变量、没有副作用、测试简单2 Python不是纯函数式编程(...

  • python函数式编程

    函数式编程指引 — Python 3.7.3 文档

  • Python 中的函数式编程 - PyTips 0x02

    项目地址:https://git.io/pytips Python 中的函数式编程 函数式编程(英语:functi...

  • python必知必会7

    Python 支持函数式编程吗? 近些年来,由于函数式编程易于调试和测试的优点,函数式编程越来越受到关注。虽然 P...

  • 向量化

    python向量化本身做得不是很好需要借助函数式编程或者列表推导式实现 1 列表推导式 2 函数式编程

网友评论

      本文标题:Python函数式编程

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