2017.6.27 python学习 高阶函数

def hello(name):
    print ('hello',name)
def word(name):
    print ('Word',name)

1 变量可以指向函数

h = hello
print(h)# 函数本身
h('张三')# 函数调用

输出结果:

<function hello at 0x0000000002093E18>
hello 张三

2 函数名也是变量,函数名只是指向了一个具有特定功能的函数

hello = word('李四')

观察运行结果,就不在是输出hello 李四,而是输出word 李四
3 传入函数
变量可以指向函数,函数的参数可以接受变量,so,一个函数就可以接受另一个函数作为参数使用

def hello(value):
    return value
def helloword(x,y,func):
    print func(x)+func(y)

helloword('张三','李四',hello)

结果::张三 李四

高阶函数:就是把函数当做参数传递

4 map和reduce
map:接受两个参数,一个是函数,另一个是Iterable,map将传入的函数一次作用到序列的每一个元素,并把结果做为新的Iterator返回,这个函数只能接受一个参数

def func(x):
    return x+x
result = map(func,[x for x in range(1,10)])
print(list(result))

结果:[2, 4, 6, 8, 10, 12, 14, 16, 18]
reduce:同map一样,接受两个参数,一个参数是函数,另一个参数是Iterable,不同的是,reduce把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

from functools import reduce

def add(x,y):
    return x+y

L = reduce(add,[x for x in range(1,10)])
print(L)

5 filter
和map类似,接受一个函数和一个序列,将函数一次作用于每一个元素,不同的是,根据返回值是True还是False决定是否保留元素

def is_2(num):
    return num%2==0
l = filter(is_2,[x for x in range(1,10)])
print(list(l))

结果:[2, 4, 6, 8]
6 sorted排序
sorted:可以对list集合进行排序,它也是一个高阶函数,可以通过接受一个key函数实现自定义排序

def list_sorted():
    print(sorted([36,24,19,20,35]))

结果:[19, 20, 24, 35, 36]

def func(x):
    return x*10-2

print(list(sorted([36,-24,19,20,35],key=func)))

结果:[-24, 19, 20, 35, 36]
如果想进行反向排序:需要第三个参数reverse=False/True

7 返回函数,将函数当做返回值

def lazy_add(*args):
    def add(args):
        result = 0
        for a in args:
            result = result + a
        return result
    return add
r = lazy_add(1,2,3,4,5,6,7,8,9)
print(r)
#结果:<function lazy_add.<locals>.add at 0x00000000027CF9D8>
print(r())

结果:45

8 闭包
内部函数使用局部变量

def add():
    funcs=[]
    for i in range(1,5):
        def func():
            return i
        funcs.append(func)
    return funcs
for func in add():
    print(func())

结果:
4
4
4
4
为什么结果全是4喃??
在这里我自己模仿java的内存,在真正使用函数的时候,i所指向的内存中存储的值是4
注意:返回函数不要引用任何循环变量,或者后继会发生变化的变量
一定要引用循环变量,我觉得这个完全没有必要,都需要引用循环变量了,干嘛还这么麻烦的写闭包

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

9 匿名函数
关键字:lambda
例子:

list(map(lambda x:x*x,[x for x in range(1,10)]))

例子:

f = lambda x,y:x+y
print(f(1,2))

解释:lambda:关键字,冒号前边的是参数,后边的是表达式
10 装饰器
对某个函数进行增强,比如说,在执行函数的前后进行日志打印

def log(func):
    def wrapper(*args,**kw):
        print('开始登录')
        loggin = func(*args,**kw)
        print('登录结束')
        return loggin
    return wrapper
@log
def loggin():
    print('登录过程进行中')

loggin()

以上的日志是死日志,如果想要自定义日志文本,就需要参数

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('loggin')
def loggin():
    print('登录过程进行中')

loggin()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟阿达

成长总是需要时间和经历的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值