Python学习:函数式编程

2017-05-17  本文已影响6人  _kk_

高阶函数:

变量可以指向函数,函数的名字就是变量,函数可以作为其他函数的参数;
map,reduce,filter和swift一样,写法稍有差别。

map:
def f(x):
    return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
需要注意的是:此处的r并非list,而是一个Iterator惰性序列,要转为list,需要

li = list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce:
from functools import reduce
def add(x, y):
     return x + y
reduce(add, [1, 3, 5, 7, 9])
25
filter:
def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
sorted:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)

其中key是可以自定义的排序函数
比如,我们需要按照名字中第二个字母排序

M = sorted(['bob', 'about', 'Zoo', 'Credit'], key=itemgetter(1))
['about', 'bob', 'Zoo', 'Credit']

函数作为返回值:闭包

def customer_sum(*args):
    def summ():
        pre = 0
        for item in args:
            pre = pre + item
        return pre
    return summ

cu_sum = customer_sum(1,10,15)

print(cu_sum())
26

函数内部定义函数,并引用了自身局部变量,我们正定义的这个函数为闭包,被引用的变量为闭合变量

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
因为所有通过同一个函数创建的闭包中引用的局部变量是共享的,切闭包不会是返回立即执行。

匿名函数:

lambda表示匿名函数

a = lambda x,y: x * x + y * y
print(a(2,5))

装饰器:

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。原理就是高阶函数,把原来的函数包装在一个高级函数,返回。只不过需要把被包装的函数名传到外层函数@functools.wraps(func)

def log(text = 'excuate'):
    def decorator(func):
        @functools.wraps(func)
        def wap(*args,**kw):
            print(text)
            print('%s' % func.__name__)
            return func(*args,**kw)
        return wap
    return decorator

@log('装饰器')
def pStr():
    print('hahahahhhahah')
pStr()

@log()
def pName():
    print("KK")
pName()

装饰器
pStr
hahahahhhahah

excuate
pName
KK

偏函数:

偏函数解决的问题
在不改变原有函数的基础上把某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
列如:

利用一个   int('10000',base=2)   定义一个不需要传base的二进制字符串转十进制的函数;

int2 = functools.partial(int, base=2)
int2('1000000')
64
上一篇 下一篇

猜你喜欢

热点阅读