# 二、递归函数

```>>> sum([1,2,3,4])
10
>>> def mysum(l):
...     if not l:
...             return 0
...     else:
...             return l[0]+mysum(l[1:])
...
>>> mysum([1,2,3,4,5])
15```

```>>> def mysum(l):
...     return 0 if not l else l[0] + mysum(l[1:])
...```

### 循环VS递归

```>>> sum = 0
>>> l = [1,2,3,4,5]
>>> for i in l:
...     sum += i
...
>>> sum
15```

```>>> l = [1,2,[3,[4,5],6],[7,[8,[9]]],10]
>>> def sumtree(l):
...     sum = 0
...     for i in l:
...             if not isinstance(i,list):
...                     sum += i
...             else:
...                     sum += sumtree(i)
...     return sum
...
>>> sumtree(l)
55```

# 三、函数对象：属性和注解

### 间接函数调用：

```>>> def myprint(x):
...     print(x)
...
>>> myprint2 = myprint
>>> myprint2('Dora')
Dora```

```>>> def myfunc(func,text):
...     func(text)
...
>>> myfunc(myprint,'Dora')
Dora```

```>>> printing = [(myprint,'first'),(myprint,'second'),(myprint,'thrid')]
>>> for func,text in printing:
...     func(text)
...
first
second
thrid```

```>>> def make(food):
...     def myprint(quantity):
...     return myprint
...
>>> Cake = make('cake')
>>> Cake(10)

```>>> def myfunc(text):
...     print(text)
...
>>> dir(myfunc)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']```

```>>> myfunc.__name__
'myfunc'```

```>>> myfunc.__code__
<code object myfunc at 0x000002395FF8C5D0, file "<stdin>", line 1>
>>> dir(myfunc.__code__)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
>>> myfunc.__code__.co_varnames
('text',)
>>> myfunc.__code__.co_argcount
1```

```>>> myfunc.a = 10
>>> dir(myfunc)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'a']```

# 四、Python3.x中的函数注解

```>>> def myfunc(a:int,b:str):
...     return a + b
...
>>> myfunc(1,3)
4
>>> def myfunc(a:int,b:str) -> list:
...     return a + b
...
>>> myfunc(1,3)
4
>>> myfunc.__annotations__
{'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'list'>}```

# 五、匿名函数：lambda

```>>> lambda a:a*a
<function <lambda> at 0x00000239602732F0>
>>> myfunc = lambda a:a*a
>>> myfunc(3)
9
>>> (lambda a:a*a)(4)
16```

### 为什么要使用 lambda？

```>>> funclist = [lambda x : x**2,
...             lambda x : x**3,
...             lambda x : x**4]
>>> funclist[0](3)
9
>>> funclist[1](3)
27
>>> funclist[2](3)
81```

# 六、lambda 作用域

```>>> a = (lambda:1,print(2))
2
>>> def action(x):
...     return lambda y:x+y
...
>>> act =action(10)
>>> act(10)
20
>>> act = lambda x:lambda y :x+y
>>> act_rslt = act(20)
>>> act_rslt(10)
30
>>> (lambda x:lambda y:x+y)(20)(2)
22```

# 七、在序列中映射函数：map

```>>> l = [1,3,5]
>>> for i in range(3):
...     l[i] += 10
...
>>> l
[21, 23, 25]```

```>>> l = [1,3,5]
>>> l = list(map(lambda x: x +10,l))
>>> l
[11, 13, 15]```

map的第一个传递参数是函数，第二个是可迭代的对象，每个对象当做函数的输入，输出结合为可迭代的对象（Python2.x里是列表）

# 八、函数式编程工具（1）：filter

filter与map相似，但是针对返回的bool结果判断，结果为真，保留元素；结果为假，弃用元素。结果也是保存在可迭代的对象里，在Python2.x是存放列表里。

```>>> list(filter((lambda x : x > 1),[-1,-3,-5,1,3,5]))
[3, 5]```

```>>> list(filter((lambda x : x ),[-1,-3,-5,0,1,3,5]))
[-1, -3, -5, 1, 3, 5]```

# 九、函数式编程工具（2）：reduce

reduce函数是在functools里的，因此我们得import这个函数。

```>>> from functools import reduce
>>> reduce((lambda x, y: x + y), [1, 2, 3, 4])
10```

```>>> reduce((lambda x, y: x + y), 'test text')
'test text'
>>> reduce((lambda x, y: x + y), ['test', ' ', 'text'])
'test text'```

0 条评论

• ### CS学习笔记 | 14、powerup提权的方法

利用 PowerUp 进行提权需要首先导入 ps1 文件powershell-import PowerUp.ps1，再执行powershell Invoke-A...

• ### 经验总结 | VPS欠费后Hexo博客521无法访问

最近自己博客的VPS欠费了，但是充值之后，启动VPS发现博客依旧无法访问，经过多次排查后，最后的结果真的是哭笑不得，下面就记录一下我最后的解决办法。

• ### Python3学习笔记 | 十七、Python的语句与语法－文档

在之前章节中，介绍的一些方法等，都是不全的。对于一个类型，有多少个方法、或者参数、属性等，需要查看文档。下面介绍Python里几种文档形式。

• ### C++11——lambda表达式

定义： C++11新增了很多特性，lambda表达式（lambda expression）就是其中之一，很多语言都提供了 lambda 表达式，如 Pyth...

• ### 细说Python的lambda函数用法，建议收藏

在Python中有两种函数，一种是def定义的函数，另一种是lambda函数，也就是大家常说的匿名函数。今天我就和大家聊聊lambda函数，在Python编程中...

• ### Python lambda介绍

在学习python的过程中，lambda的语法时常会使人感到困惑，lambda是什么，为什么要使用lambda，是不是必须使用lambda？

• ### 生产者理论概述

先前介绍了消费者理论，本文将简要介绍生产者理论。 通过模型去拟合消费者和生产者的行为，然后在市场的大背景下去分析市场行为，这些构成了微观经济学的基本骨架。 ...

• ### 医学图像处理案例（六）——生成血管三维模型

在前面的文章中，已经分享了人体肋骨和肺组织分割生成三维模型的例子。今天将继续分享人体脑部血管分割并生成三维模型的案例。

• ### 【Python学习笔记之三】lambda表达式用法小结

除了def语句之外，Python还提供了一种生成函数对象的表达式形式。由于它与LISP语言中的一个工具很相似，所以称为lambda。就像def一样，这个表达式创...