野路子程序猿
  • 博客介绍
  • TensorFlow
    • TensorFlow数据读取
    • TensorBoard的使用
  • 弱监督学习
    • 论文: Snorkel DryBell: A Case Study in Deploying Weak Supervision at Industrial Scale
  • NLP之语言模型
    • 统计语言模型
    • 论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • NLP之关键词提取
    • 改进TF-IDF算法
    • 论文: 基于文档主题结构的关键词抽取方法研究
      • 1. 引言
      • 2. 基于文档内部信息构建主题的关键词抽取方法
      • 3. 基于隐含主题模型构建主题的关键词抽取方法
      • 4. 利用隐含主题模型和文档结构的关键词抽取方法
      • 5. 基于文档与关键词主题一致性的关键词抽取方法
  • 深度学习
    • 《深度学习与神经网络》笔记
      • 1. 使用神经网络识别手写数字
      • 2. 反向传播算法
      • 3. 如何提高神经网络学习算法的效果
      • 4. 神经网络可以实现任意函数的直观解释
      • 5. 深度神经网络学习过程中的梯度消失问题
      • 6. 深度学习
  • RNN
    • RNN常见结构
  • attention机制
    • 简述Attention机制及其在深度学习中的应用
    • 论文: Attention Is All You Need
  • Spark
    • Spark ML下实现的多分类AdaBoost + NaiveBayes算法
  • Python
    • Python函数式编程
  • 线性代数
    • 《Immersive Linear Algebra》笔记
      • 4. 向量叉乘(外积)
  • 机器学习
    • 指数分布族和广义线性回归
    • 条件随机场CRF
    • 信息论基本概念
  • 过拟合
    • Early Stopping
Powered by GitBook
On this page
  • 1.偏函数
  • 2.装饰器

Was this helpful?

  1. Python

Python函数式编程

喜欢函数式编程,因为优雅~

python中万物皆对象,因此可以像处理平常变量一样方便的处理函数对象。下面介绍一些常用的基于python的函数式编程api。

1.偏函数

偏函数的作用是给函数的参数指定默认参数。

import functools
int('12345', base=8)
>>> 5349
int2 = functools.partial(int, base=2)
int2('1000000')
>>> 64

简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。上面的int2函数就是将base置为2的int函数。

最后,需要说明的是创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入: max2 = functools.partial(max, 10) 然后调用: max2(5, 6, 7) 此时,10会作为*args的一部分加到左边,相当于

args = (10, 5, 6, 7)
max(*args)

然后结果自然是10。而之前的base=2则是通过**kw传入的。

2.装饰器

装饰器的作用在于对已有函数进行封装,并添加一些额外的功能

def inner(f):
    def wrapper(*args, **kwargs):
        rv = f(*args, **kwargs)
        print("tic toc!")
        return rv
    return wrapper

上面定义了一个inner装饰器,它构建一个函数对象wrapper,然后在里面实现了调用原始函数f后打印“tic toc!”的功能。

分析一下这段代码的组成:

f是要被装饰的函数,wrapper是装饰器返回的函数。因此wrapper能够接受的参数必须包含被修饰函数f 所能够接受的参数。如果想要新增参数,只要对wrapper函数添加额外的参数即可。但是如果wrapper函数缺少f函数必须传入的参数,调用就会报错。 通过这样的方式,我们不光可以让f函数具备额外的功能,还可以使它可以接受更多的参数。

def inner(f):
    def wrapper(a, b, c):
        print(c)
        return f(a, b)
    return wrapper

@inner
def f(a, b):
    print(a+b)
    return a+b

# 原始的f只能接受2个参数,被修饰后可以接受3个参数
f(1, 2, 10)
>>>10
>>>3

事实上,装饰器本身也可以传入参数:

def ntimes(n):
  def inner(f):
    def wrapper(*args, **kwargs):
      for _ in range(n):
        rv = f(*args, **kwargs)
      return rv
    return wrapper
  return inner

上面的装饰器inner,接受函数f作为参数进行装饰,返回wrapper。而外围的ntimes接受传入的参数n控制函数的执行次数,起到修饰这个装饰器inner的作用。

@ntimes(3)
def add(x, y):
  print(x + y)
  return x + y

输出的语句表明该代码确实执行了 3 次。

PreviousPythonNext线性代数

Last updated 5 years ago

Was this helpful?