2018.3.11
1.高阶函数举例
编写高阶函数,就是让函数的参数能够接收别的函数。
- 变量可以指向函数:
>>> f=abs
>>> f(-1)
1
- 传入参数可以是函数
def add(x, y, f):
return f(x) + f(y)
调用的时候, f 的位置传一个函数进去就好
2.map/reduce
map和reduce都是内置模块中的函数,介绍一下他们的功能和参数:
- map
map()函数接收两个参数,一个是函数,一个是Iteratable对象.作用是把函数作用在Iterator的每个元素上,并作为一个新的Iterator返回结果.
>>> def f(x):
... return x*x
...
>>> ans = map(f,[1,2,3,4,5])
>>> ans
<map object at 0x7f9546341240>
>>> list(ans)
[1, 4, 9, 16, 25]
# map应用举例
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
- reduce
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
可以看一个str转换成int的例子:使用reduce前需要从functools里import一下
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))
这个函数还可以用lambda写的更简单一点:
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 char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
3.sorted()
sorted函数用来对一个Iteraterable的对象进行排序,它还可以接收一个key函数来实现自定义的排序,接受一个bool值的reverse来表示升序和降序:sorted(iterable, key=None, reverse=False),如果不加False,则是返回一个升序的包含所有item的list.
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
4.函数作为返回值和闭包
返回的是函数,返回时不会进行调用.只有在之后调用时,返回的函数才会运行.
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
>>> 25
由此可以引出闭包结构,可以把闭包简单理解成”定义在一个函数内部的函数”.闭包的作用有两个:
1.读取函数内部的变量 2.让这些变量的值始终保持在内存中
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
5.匿名函数
以map为例子写一个带lambda的式子:
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
可以看到,这里没有传入一个函数,而是传入了一个lambda表达式,这就是一个匿名函数.和下面这个等价
def f(x):
return x * x
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果.当然也可以把匿名函数赋值给变量再进行调用
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
def build(x,y):
return lambda: x*x +y*y
f = build(1,5)
print f
print f()
# <function <lambda> at 0x025377F0>
# 26