【Python知识点】-函数式编程


1 函数式编程

1.1 匿名函数

关键字lambda表示匿名函数,冒号前面的 x 表示参数。冒号后面只能有一个表达式,不写return,返回值就是该表达式的结果。可以不必定义函数名,直接创建一个函数对象。返回函数的时候,也可以返回匿名函数。下面的代码是一个例子:

myabs = lambda x : -x if x < 0 else x
myabs(-2)

​输出如下:

2

1.2 返回函数

​Python的函数不但可以返回intstrlistdict等数据类型,还可以返回函数!

​比如,定义一个函数 f(),我们让它返回一个函数g,可以这样写:

def f():
    print('call f()...')
    def g(): # 定义函数g
        print('call g()...')
        return g # 返回函数g()

​上述代码中在函数f()内部又定义了一个函数g()。由于函数g() 也是一个对象,函数名g()就是指向函数g()的变量,所以,最外层函数f()可以返回变量g(),也就是函数g()本身.调用函数f(),我们会得到f()返回的一个函数:

x = f() # 调用f()

​输出如下:

call f()...

1.3 闭包

​在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问:

def g(): # 定义函数g
    print('call g()...')
def f():
    print('call f()...')
    return g # 返回函数g()

​将g()的定义移入函数f()内部,防止其他代码调用g()

def f():
    print('call f()...')
    def g(): # 定义函数g
        print('call g()...')
        return g # 返回函数g()

​像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包Closure。闭包的特点是返回的函数还引用了外层函数的局部变量。所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

1.4 偏函数

int()函数可以把字符串转换为整数。当仅传入字符串时,int()函数默认按十进制转换:

int('98')

输出如下:

98

函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做 N 进制的转换:

int('100', base = 8)

输出如下:

64

functools.partial就是创建一个偏函数的,可使用下面的代码创建一个新的函数:

import functools

int2 = functools.partial(int, base = 2)
int2('1000')

输出如下:

8

functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,函数调用的难度就降低了。

1.5 reduce函数

使用reduce(),需要导入functools包下的reduce

from functools import reduce

reduce()函数接收的参数是一个函数f和一个list,f必须接收两个参数。reduce()对list的每个元素反复调用函数f,并返回最终结果值。

下面是一个函数f:

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

调用reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:reduce(f, [1, 3, 5, 7, 9], 100),结果将变为125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。

1.6 filter函数

filter()函数接收一个函数f和一个list。函数f的作用是对每个元素进行判断,返回 True或 False。filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
要从一个list[1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

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

然后利用filter()函数过滤掉偶数:

list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))

输出如下:

[1, 7, 9, 17]

利用filter(),可以完成很多有用的功能。例如,删除None或者空字符串。下面的代码是一个判断字符串是否为空的函数:

def is_not_empty(s):
    return s and len(s.strip()) > 0

然后输入:

list(filter(is_not_empty, ['test', None, '', ' ', 'END']))

输出为:

['test', 'END']

2 Python学习需要注意的点

1、空值为None而不是NULL;
2、True或者False首字母要大写;
3、print()会依次打印每个字符串,遇到逗号,的话,会输出一个空格。下面的代码是一个例子:

print('A', 'B')

输出如下:

A B

4、Python把0、空字符串’'和None看成 False,其他数值和非空字符串都看成True。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章