1 函数式编程(FunctionalProgramming)
- 基于lambda演算的一种编程方式
- 程序中只有函数
- 函数可以作为参数,同样可以作为返回值
- 纯函数式编程语言: LISP, Haskell
- Python函数式编程只是借鉴函数式编程的一些特点,可以理解成一半函数式一半Python
- 需要讲述
- 高阶函数
- 返回函数
- 匿名函数
- 装饰器
- 偏函数
1.1 lambda表达式
- 函数: 最大程度复用代码
- 存在问题: 如果函数很小,很短,则会造成啰嗦
- 如果函数被调用次数少,则会造成浪费
- 对于阅读者来说,造成阅读流程的被迫中断
- lambda表达式(匿名函数):
- 一个表达式,函数体相对简单
- 不是一个代码块,仅仅是一个表达式
- 可以有参数,有多个参数也可以,用逗号隔开
# lambda表达式的用法
# 1. 以lambda开头
# 2. 紧跟一定的参数(如果有的话)
# 3. 参数后用冒号和表达式主题隔开
# 4. 只是一个表达式,所以,没有return
# 计算一个数字的100倍数
# 因为就是一个表达式,所以没有return
stm = lambda x: 100 * x
print(stm(89))
# 使用上跟函数调用一样
stm2 = lambda x,y,z: x + y*10 + z*100
print(stm2(4,5,6))
------------------
8900
654
1.2 高阶函数
-
把函数作为参数使用的函数
# 函数名称就是一个变量值 a = 100 print(a) # 打印变量值 def funA(): print("funA") print(funA) # 打印变量值 funB = funA # 变量赋值 funB() # 调用函数 --------------- 100 <function funA at 0x00000254D19511E0> funA
1.3 以上代码得出的结论:
- 函数名称是变量
- funA和funB指向同一片内存,只是名称不一样而已
- 函数名当变量,可被作为参数传入另一个函数(高阶函数)
1.4 高阶函数
# 高阶函数举例
# funA是普通函数,返回一个传入数字的100倍数字
def funA(n):
return n * 100
# 再写一函数,将传入参数乘以300倍,利用高阶函数
def funB(n):
return funA(n) * 3
print(funB(9))
# 写个高阶函数
def funC(n,f):
# 此函数是将n扩大3倍
return f(n) * 3
print(funC(9,funA)) # 传入funA为100倍,funC为3倍,相乘为300倍。
# 比较funC和funB,显然funC的写法优于funB
def funD(n):
return n * 10
# 需求变更,将n放大30倍,此时funB无法实现
print(funC(7,funD)) # 传入funD为10倍,funC为3倍,相乘为30倍。
----------------------------
2700
2700
210
1.4.1 系统高阶-map
- 原意是映射,把原集合或列表中,每个元素按一定规则进行操作,结果生成一个新集合或列表
- map函数系统提供具有映射功能的函数,返回值是一个迭代对象
# map举例
# 需求:原列表,每个元素乘10,并生成新列表
s1 = [i for i in range(10)]
print(s1)
s2 = []
for i in s1:
s2.append(i * 10)
print(s2)
# 利用map实现
def mulTen(n):
return n * 10
s3 = map(mulTen, s1)
print(type(s3))
print("-" * 37)
print(s3)
# map类型是可迭代结构,所以可以使用for遍历
for i in s3:
print(i)
# 以下列表生成式结果为空,为什么?
s4 = [i for i in s3]
print(s4)