# Python函数式编程 入门必备

### 1 Python 函数式编程

python 支持函数式编程，提到数式编程，大家首先想到的是多个函数内嵌。的确是这样。不过，要想入门函数式编程，里面涉及到的闭包，是不得不掌握的，换句话说，如果不了解闭包就使用函数式编程，那么，函数式编程的功能特性可能不会完全体现出来。

### 3 闭包示例

`def rundist(initx,inity):    cordx,cordy = initx,inity    def move(**kwargs):        pass    return move`

move函数的形参我们使用关键词参数kwargs，我们约定好它的两个参数为x,y，当传递过来x时，更新x方向的距离，如果都传过来，则说明x,y两个方向都有了移动。

`def move(**kwargs):    nonlocal cordx    nonlocal cordy    if 'x' in kwargs.keys():        cordx+=kwargs['x']     if 'y' in kwargs.keys():         cordy+=kwargs['y']         print('current position (%d,%d)' %(cordx,cordy)) `

`In [21]: def rundist(x,y):     ...:     cordx,cordy = x,y     ...:     def move(**kwargs):     ...:         nonlocal cordx     ...:         nonlocal cordy     ...:         if 'x' in kwargs.keys():     ...:             cordx+=kwargs['x']     ...:         if 'y' in kwargs.keys():     ...:             cordy+=kwargs['y']     ...:         print('current position (%d,%d)' %(cordx,cordy))     ...:     return move `

```In [22]: mv = rundist(0,0)
In [23]: mv(x=1,y=3)                                                            current position (1,3)
In [24]: mv(x=5)                                                                current position (6,3)
In [25]: mv(y=3)                                                                current position (6,6)```

### 4 闭包使用坑点

#### 4.1 nonlocal 作用

`In [21]: def rundist(x,y):     ...:     cordx,cordy = x,y     ...:     def move(**kwargs):     ...:         if 'x' in kwargs.keys():     ...:             cordx+=kwargs['x']     ...:         if 'y' in kwargs.keys():     ...:             cordy+=kwargs['y']     ...:         print('current position (%d,%d)' %(cordx,cordy))     ...:     return move `

```In [8]: mv = rundist(0,0)
In [9]: mv(x=1) ```

```UnboundLocalError                         Traceback (most recent call last)<ipython-input-9-3060599821a7> in <module>----> 1 mv(x=1)
<ipython-input-6-a5d76037d2c4> in move(**kwargs)      3     def move(**kwargs):      4         if 'x' in kwargs.keys():----> 5             cordx+=kwargs['x']      6         if 'y' in kwargs.keys():      7             cordy+=kwargs['y']
UnboundLocalError: local variable 'cordx' referenced before assignment```

#### 4.2 容易犯错

`In [10]: def run(x):     ...:     cordx = x     ...:     def move(x):     ...:         cordx+=x     ...:     return move `

#### 4.3 面试必考

`In [19]: def exfun():     ...:     funli = []     ...:     for i in range(3):     ...:         def intfun(x):     ...:            print( x*i)     ...:         funli.append(intfun)     ...:     return funli     ...:          ...:                                          `

```In [20]: funli = exfun()
In [21]: funli[0](5)                                                            10
In [22]: funli[1](5)                                                            10
In [23]: funli[2](5)                                                            10```

`In [32]: def exfun():      ...:     funli = []      ...:     for i in range(3):      ...:         def intfun(x,i=i):      ...:             print( x*i)      ...:        funli.append(intfun)      ...:     return funli      ...:                                                                      `

```In [34]: funli[0](5)                                                            0
In [35]: funli[1](5)                                                            5```

OK

`In [38]: def exfun():     ...:     return [lambda x: i*x for i in range(3)]`

`In [38]: def exfun():     ...:     return [lambda x,i=i: i*x for i in range(3)]`

0 条评论

• ### Ubuntu|GDB调试常用命令

backtrace（或bt）查看各级函数调用及参数finish连续运行到当前函数返回为止，然后停下来等待命令frame（或f） 帧编号选择栈帧info（或i） ...

• ### BAT面试题3：请问GBDT和XGBoost的区别是什么？

接下来，每天推送一道BAT的面试题，一般问到的这些知识点都是很重要的，所以知道的就再复习一下，不知道的希望这篇可以帮助到你。日积月累，你会在不知不觉中就步入机器...

• ### 1800字普林斯顿大学课程浓缩笔记：程序员必知的算法之查找和排序算法

老生常谈，偶尔遇到阐述这两类问题相关的极好素材，它们结合示意图，言简意赅，清晰明了。故分享出来。

• ### 一文读懂线性回归、岭回归和Lasso回归，算法面试必备！

本文介绍线性回归模型，从梯度下降和最小二乘的角度来求解线性回归问题，以概率的方式解释了线性回归为什么采用平方损失，然后介绍了线性回归中常用的两种范数来解决过拟合...

• ### 【机器学习】一文读懂线性回归、岭回归和Lasso回归

本文介绍线性回归模型，从梯度下降和最小二乘的角度来求解线性回归问题，以概率的方式解释了线性回归为什么采用平方损失，然后介绍了线性回归中常用的两种范数来解决过拟合...

• ### 一文读懂线性回归、岭回归和Lasso回归

本文介绍线性回归模型，从梯度下降和最小二乘的角度来求解线性回归问题，以概率的方式解释了线性回归为什么采用平方损失，然后介绍了线性回归中常用的两种范数来解决过拟合...

• ### 【机器学习】一文读懂线性回归、岭回归和Lasso回归

本文介绍线性回归模型，从梯度下降和最小二乘的角度来求解线性回归问题，以概率的方式解释了线性回归为什么采用平方损失，然后介绍了线性回归中常用的两种范数来解决过拟合...

• ### 【机器学习】一文读懂线性回归、岭回归和Lasso回归

本文介绍线性回归模型，从梯度下降和最小二乘的角度来求解线性回归问题，以概率的方式解释了线性回归为什么采用平方损失，然后介绍了线性回归中常用的两种范数来解决过拟合...

• ### PPT模板怎么导入？你必须试试这两招

我们在制作PPT时候需要套用一些模板。这样我们只需要修改文稿中的文字内容就可以制作完成PPT了。不仅可以节省时间，还能让我们的看起来PPT更加高大上。那么PPT...

• ### 2018年高教社杯全国大学生数学建模竞赛B题解题思路

图1是一个智能加工系统的示意图，由8台计算机数控机床（Computer Number Controller，CNC）、1辆轨道式自动引导车（Rail Guide...