Python学习笔记6 函数式编程_20170619

廖雪峰python3学习笔记:

 

# 高阶函数

  • 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针)
def add(x, y):
    return x+y
 
def mins(x, y):
    return x-y

# 高阶函数
def computex, y, f):
    return f(x) + f(y)
>>> computex(1,2,add)
3

>>> compute(4, 1, mins)
3

f = add
>>>f(1,2)
3

 

# map()  是一种高阶函数。第二个list参数内的元素都执行 f 操作

def f(x):
    return x*x

>>>map(f, [1,2,3,4,5])
[1,4,9,16,25]

 

# reduce  也是一种高阶函数。不好描述,看代码说明

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

 

# filter 高阶函数。过滤。第一个参数是true,保留。

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))

 

# sort 排序

>>>sorted([1,5,2,6,0])
[0,1,2,5,6]

>>>sorted([1,5,2,6,0], reverse = True)
[6, 5, 2, 1, 0]

>>>sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

>>>sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

 

# 函数作为函数的返回值

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)
# 不会被执行,lazy_sum 的函数实现和局部变量都保存在f中。

>>>f() # 才会执行
25
  • 闭包  相关的参数和变量(外部的)都包含在返回的函数(内部的)中的情况称为“闭包”。注意局部变量的值
# 廖雪峰的例子
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

# 调用
>>> f1()
9
>>> f2()
9
>>> f3()
9
# 因为f1f2f3中的局部变量都是i,但是当f3生成后,i的值是3

  返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。(廖雪峰)

 

# 匿名函数  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 输入参数x : 函数体x*x
>>> f = lambda x: x * x # 没有函数冲突问题
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

 

# 装饰器 (还不大理解其存在的意义)

在不修改函数的前提上,增加函数的功能。

# 来自廖雪峰的代码
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__) # 函数的名字属性
        return func(*args, **kw)
    return wrapper

@log         # @ 语法 相当于 now = log(now)
def now():
    print('2015-3-25')

# 调用
>>> now()
call now():
2015-3-25
            

 

# 偏函数(把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数)

# 数值转化
>>> int('12345', base=8) # 将字符串当做8进制数
5349
>>> int('12345', 16) # 16 进制
74565

# 偏函数
import functools
int2 = functools.partial(int, base=2) # 偏函数,固定参数为二进制转化。

# 调用
>>> int2('12345')
5349

 

posted @ 2017-06-20 22:17  路边的十元钱硬币  阅读(278)  评论(0编辑  收藏  举报