函数式编程
即使道路坎坷不平,车轮也要前进;即使江河波涛汹涌,船只也航行。
函数赋值给变量
在 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 组成的迭代器