Python的函数式编程

一、函数式编程

  什么是函数式编程?

  函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,比起面向过程,函数式更加注重的是执行结果而非执行的过程,代表语言有:Haskell、Erlang。而python并不是一门函数式编程语言,但是仍为我们提供了很多函数式编程好的特性,如lambda,map,reduce,filter

# 匿名函数
# 1、def用于定义有名函数
# func = 函数的内存地址
# def func(x,y):
#     return x + y
# print(func)  # <function func at 0x000001E2154D95E0>

# 2、lambda用于定义匿名函数  目的:精简.不要写return
# lambda x,y:x+y
# print(lambda x,y:x+y)  # <function <lambda> at 0x000001E2154D9670>

# 3、调用匿名函数
# 方式一:内存地址(),匿名lambda造出来的就是一个内存地址。
# res = (lambda x,y:x+y)(1,2)
# print(res)  # 3

# 方式二:匿名函数的就是没有名字,不要这样做了。
func = lambda x,y:x+y
res = func(1,2)
print(res)

# 匿名函数应用场景:匿名函数在定义出来后立刻调用,适用于临时调用一次,更多是是将匿名与其他函数配合使用。
# 匿名函数的应用
salaries = {
    "siry":3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
# 需求1:找出薪资最高的那个人
# 使用max()函数取出最大值
# res = max([3,343,35,63,3,3,2,21])
# print(res)  # 343

# 迭代出的内容  比较的值
# 'siry'  3000
# 'tom'   7000
# 'lili'  10000
# 'jack'  2000
# res = max(salaries)
# print(res)  # 为啥是tom?比较的是名字首字母

# 使用key值比较
# def func(k):
#     return salaries[k]
# res = max(salaries,key=func)  # 返回值=func('siry')
# print(res)  # lili

# 针对func设计成匿名函数
res = max(salaries,key=lambda k:salaries[k])
print(res)
# 排序:关键字sorted()的使用,
salaries = {
    "siry":3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
res = sorted([1,2,3,42,14,1,41,4])
print(res)  # [1, 1, 2, 3, 4, 14, 41, 42]

res1 = sorted(salaries)
print(res1)  # ['jack', 'lili', 'siry', 'tom ']

res = sorted(salaries,key=lambda k:salaries[k])
print(res)  # 按工资排序:['jack', 'siry', 'tom', 'lili']
# 排序:关键字sorted()的使用,
# salaries = {
#     "siry":3000,
#     'tom':7000,
#     'lili':10000,
#     'jack':2000
# }
# res = sorted([1,2,3,42,14,1,41,4])
# print(res)  # [1, 1, 2, 3, 4, 14, 41, 42]
#
# res1 = sorted(salaries)
# print(res1)  # ['jack', 'lili', 'siry', 'tom']
# reverse有个默认值,可以改变排列顺序
# res = sorted(salaries,key=lambda k:salaries[k],reverse=True)
# print(res)  # 按工资排序:['jack', 'siry', 'tom', 'lili']

# 映射:map()关键字的使用(了解)
# l = ['lsj','tiantian','tianjing','wenying']
# # 列表生成式
# new_l = (name + '_n' for name in l)
# print(new_l)  # <generator object <genexpr> at 0x00000298321CF6D0>
#
# res= map(lambda name:name+'_n',l)
# print(res)  # # 生成器:<map object at 0x00000298321C2130>

# 过滤器:filter的应用(了解)
# l = ['lsj_n','tiantian','tianjing_n','wenying']
# res = (name for name in l if name.endswith('n'))
# print(res)  # <generator object <genexpr> at 0x000002279B26F660>

# res = filter(lambda name:name.endswith('n'),l)
# print(res)  # 与上面的类似生成一个迭代器:<filter object at 0x000001FEC1C46B20>

# reduce()的应用,多用于合并操作(了解)
from functools import reduce
res = reduce(lambda x,y:x+y,[1,2,3],10)  # 11 13 16
print(res)  # 16

res = reduce(lambda x,y:x+y,['a','b','c'])  # 11 13 16
print(res)  # abc