Python 函数式进阶

函数式编程

即使道路坎坷不平,车轮也要前进;即使江河波涛汹涌,船只也航行。

函数赋值给变量

在 Python 中,所有的对象都可以赋值给变量,包括函数.


def sey_hello(name='Today'):
    return name+'hello'

f = say_hello()

函数作为函数参数

一切对象都可以作为函数的参数,包括另一个函数.接受函数作为参数的函数,称为高阶函数.


def filter_nums(nums,want_it):
    return [n for n in nums if want_it(n)]

函数 filter_nums 用来筛选数字,它接受两个参数.nums 是包含所有带筛选数字的列表 want_it 是一个函数,用来决定数字是否保留


def want_it(num):
    return num %2 == 0

这里 want_it 接受一个数字作为参数,这个数字是 2 的倍数,则返回 True 否则返回 False

匿名函数 lambda 表达式

在 Python 中可以通过 lambda 表达式来便捷的定义一个功能简单的函数,这个函数只有实现没有名字,所以叫做匿名函数


lambda 参数1,参数2,参数n:函数实现

使用上述表达式定义一个匿名函数,这个匿名函数可以接受若干参数,参数写在冒号前(:),多个参数用逗号分隔,其实现写在冒号后(:)


f = lambda x: x**2

f(4)

# 16

通过上述例子可以发现 lambda 表达式中并没有 return 关键字,但是结果被返回出来.匿名函数的函数实现的执行结果会作为它的返回值,无需使用 return 关键字

从功能上来看 lambda x: x**2 等价于


def no_name(x):
    return x**2

map()和 filter()

Python 内置两个非常还用的高阶函数 map() 和 filter()

filter()

filter()用于可从迭代对象中筛选元素


filter(筛选函数,可迭代对象)

filter() 依次对可迭代对象中的每个元素调用筛选函数,如果返回值为 True,则当前这个元素保留,否则依次被排除.最终返回一个包含所有被保留元素的迭代器

显然这里的筛选函数可以用 lambda 表达式创建

比如从[‘a’,’b’,’cd’,’111’,’12345’,’1234567’]中选出长度为奇数的字符串


filter(lambda x: len(x)%2===1,['a','b','cd','111','12345','1234567'])

map()

map()依次对可迭代对象中的每个元素调用处理函数,最终返回一个包含处理过后的元素迭代器


map(lambda x:x.upper(),['a','b'])

map()和 filter()区别


res1 = map(lambda n: n > 5, range(10))
lt1 = list(res1)
print(lt1)
# [False, False, False, False, False, False, True, True, True, True]

res2 = filter(lambda n: n > 5, range(10))
lt = list(res2)
print(lt)
# [6, 7, 8, 9]

filter 是通过 True 和 False 组成的迭代器将可迭代对象不符合条件的元素过滤掉

而 map 返回的是 True 和 False 组成的迭代器


文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录