日常Python学习-4

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值