2020-12-04-----python递归,闭包及装饰器,函数式编程,及高阶函数
目录
- 递归
- 函数式编程
- 高阶函数
- filter()
- 匿名函数
- map()
- sort()
- sorted()
- 闭包
- 装饰器
递归
递归简单理解为自己去调用自己
递归式函数,在函数中自己调用自己
无穷递归,如果这个函数被调用,程序就会溢出,效果类似于死循环
,递归的整体思想
两个条件
1.基线条件
问题可以分解为最小问题,直到不能分解。当满足基线条件时,递归就不会执行了
2.递归条件
将问题继续分解的条件
例子:尝试求10的阶乘(10!)
// An highlighted block
创建一个变量,可以用来求任意数的阶乘
def factorial(n):'''该函数用来求任意数的阶乘'''
创建一个变量来保存结果
result=n
for i in range(1,n)result *= i
return result
def factorial(n):if n==1:return 1return n*factorial(n-1)
print(factorial(10))
函数式编程
在python中,函数是一个一等对象
高阶函数
接收函数作为参数,或者将函数作为返回值的函数就是高阶函数
// An highlighted block
l=[1,2,3,4,5,6]
定义一个函数可以将指定列表中的所有的偶数保存到一个新的列表中返回
def fn(list):new_list=[]for n in list:if n%2==0:new_list.append(n)return new_list
filter()
可以从序列中过滤出符合条件元素,保存到一个新的序列
参数:
1.函数,根据该函数来过滤序列(可迭代的结构)
2。需要过滤的序列(可迭代的结构)
返回值:
过滤后的新序列
fn4是作为参数传递进filter()函数中
而fn4实际只有一个作用,就是作为filter()参数
filter()调用完毕以后,fn4就已经没用了
r=filter(fn4,l)
print®
匿名函数
lambda 函数列表:返回值
def fn5(a,b):
return a+b
1.第一种调用方法
(lambda fn6 a,b:a+b)(10,20)
第二种方式
fn6 = lambda a,b :a+b
print(fn6(10,20))
第三种方式
r=filter(lambda i :i>5,l)
print(list®)
map()
函数可迭代对象中的所有元素做指定的操作然后将其添加到一个新的对象中返回
l=[1,3,4,5,2]
r=map(lambda i :i+1,l)
print(list®)
sort()
该方法用来对列表中的元素进行排序
默认比较列表中的元素的大小
在sort()可以接收到一个关键字,key
key需要一个函数作为参数。当设置了函数作为参数
每次都会以列表中的一个元素作为参数来调用函数。并且使用函数的返回值来比较元素的大小
l=[‘a’.‘b’,‘dddd’]
l.sort(key=len)
l=[1,2,‘4’]
l.sort(key=str)
print(l)
sorted()
这个函数和sorted()的用法基本一致,但是sorted()可以对任意的序列进行排序
并且使用sorted()排序不会影响到原来的对象,而是返回一个新的对象
l=[1,2,‘4’]
sorted(l,key=int)
print(‘排序后’,l)
闭包
将函数作为返回值返回,也是一种高阶函数
这种高阶函数我们也称为闭包,通过闭包可以创建一些只有当前函数能访问的
变量
可以将一些私有的数据藏到闭包中
def fn():
a=10
def inner():
print('a',a)
return inner
r是一个函数,是调用fn()后返回的函数
这个函数是在fn()内部定义,并不是全局函数
所以这个函数总是能访问到fn()函数的变量
(1)函数嵌套
(2)将内部函数 作为函数返回值返回
(3)内部函数必须要使用到外部函数的变量
r=fn()
求多个数的平均值
nums
sum()用来创建一个列表中所有元素的和
def make_averager():
nums=[]
def averager(n):
nums.append(n)
return sum(nums)/len(nums)
return averager
averager=make_averager()
print(averager(10))
print(averager(20))
print(averager(30))
print(averager(40))
装饰器
// An highlighted block
def add(a,b):r=a+breturn r
def mul(a,b):r=a*breturn r
创建几个函数
希望函数可以在计算前,打印开始计算,计算结束后打印计算完毕
我们可以直接通过修改函数中的代码来完成这个需求,但是我们会产生以下问题
(1)如果要修改的函数过多,修改起来会比较麻烦
(2)并且这样不利于后期 维护
(3)并且这样做会违反开闭原则(OCP)
程序的设计要求开发对程序的扩展,要关闭对程序的修改
我们希望在不修改原函数的情况下,来对函数进行扩展
// An highlighted block
def fn():print('我是函数')
def fn2():print('函数开始修改')fn()
我们没扩展一个函数就要手动创建一个函数,实在太麻烦
为了解决这个问题,我们创建一个函数 让这个函数可以自动帮助我们生产函数
// An highlighted block
def begin_end(old)'''用来对其他函数进行扩展'''def new_function()result=old(*args,**kwargs)print('执行结束')return resultreturn new_functionf=begin_end(fn)
这种函数我们称为装饰器
在开发中我们都是通过装饰器来扩展函数
在定义函数时可以通过@装饰器来使用指定的装饰器,可以定义多个指定的装饰器,将会由内向外的执行
// An highlighted block
@fn
@begin_end
def fn():print('我是一个函数')
2020-12-04-----python递归,闭包及装饰器,函数式编程,及高阶函数
目录
- 递归
- 函数式编程
- 高阶函数
- filter()
- 匿名函数
- map()
- sort()
- sorted()
- 闭包
- 装饰器
递归
递归简单理解为自己去调用自己
递归式函数,在函数中自己调用自己
无穷递归,如果这个函数被调用,程序就会溢出,效果类似于死循环
,递归的整体思想
两个条件
1.基线条件
问题可以分解为最小问题,直到不能分解。当满足基线条件时,递归就不会执行了
2.递归条件
将问题继续分解的条件
例子:尝试求10的阶乘(10!)
// An highlighted block
创建一个变量,可以用来求任意数的阶乘
def factorial(n):'''该函数用来求任意数的阶乘'''
创建一个变量来保存结果
result=n
for i in range(1,n)result *= i
return result
def factorial(n):if n==1:return 1return n*factorial(n-1)
print(factorial(10))
函数式编程
在python中,函数是一个一等对象
高阶函数
接收函数作为参数,或者将函数作为返回值的函数就是高阶函数
// An highlighted block
l=[1,2,3,4,5,6]
定义一个函数可以将指定列表中的所有的偶数保存到一个新的列表中返回
def fn(list):new_list=[]for n in list:if n%2==0:new_list.append(n)return new_list
filter()
可以从序列中过滤出符合条件元素,保存到一个新的序列
参数:
1.函数,根据该函数来过滤序列(可迭代的结构)
2。需要过滤的序列(可迭代的结构)
返回值:
过滤后的新序列
fn4是作为参数传递进filter()函数中
而fn4实际只有一个作用,就是作为filter()参数
filter()调用完毕以后,fn4就已经没用了
r=filter(fn4,l)
print®
匿名函数
lambda 函数列表:返回值
def fn5(a,b):
return a+b
1.第一种调用方法
(lambda fn6 a,b:a+b)(10,20)
第二种方式
fn6 = lambda a,b :a+b
print(fn6(10,20))
第三种方式
r=filter(lambda i :i>5,l)
print(list®)
map()
函数可迭代对象中的所有元素做指定的操作然后将其添加到一个新的对象中返回
l=[1,3,4,5,2]
r=map(lambda i :i+1,l)
print(list®)
sort()
该方法用来对列表中的元素进行排序
默认比较列表中的元素的大小
在sort()可以接收到一个关键字,key
key需要一个函数作为参数。当设置了函数作为参数
每次都会以列表中的一个元素作为参数来调用函数。并且使用函数的返回值来比较元素的大小
l=[‘a’.‘b’,‘dddd’]
l.sort(key=len)
l=[1,2,‘4’]
l.sort(key=str)
print(l)
sorted()
这个函数和sorted()的用法基本一致,但是sorted()可以对任意的序列进行排序
并且使用sorted()排序不会影响到原来的对象,而是返回一个新的对象
l=[1,2,‘4’]
sorted(l,key=int)
print(‘排序后’,l)
闭包
将函数作为返回值返回,也是一种高阶函数
这种高阶函数我们也称为闭包,通过闭包可以创建一些只有当前函数能访问的
变量
可以将一些私有的数据藏到闭包中
def fn():
a=10
def inner():
print('a',a)
return inner
r是一个函数,是调用fn()后返回的函数
这个函数是在fn()内部定义,并不是全局函数
所以这个函数总是能访问到fn()函数的变量
(1)函数嵌套
(2)将内部函数 作为函数返回值返回
(3)内部函数必须要使用到外部函数的变量
r=fn()
求多个数的平均值
nums
sum()用来创建一个列表中所有元素的和
def make_averager():
nums=[]
def averager(n):
nums.append(n)
return sum(nums)/len(nums)
return averager
averager=make_averager()
print(averager(10))
print(averager(20))
print(averager(30))
print(averager(40))
装饰器
// An highlighted block
def add(a,b):r=a+breturn r
def mul(a,b):r=a*breturn r
创建几个函数
希望函数可以在计算前,打印开始计算,计算结束后打印计算完毕
我们可以直接通过修改函数中的代码来完成这个需求,但是我们会产生以下问题
(1)如果要修改的函数过多,修改起来会比较麻烦
(2)并且这样不利于后期 维护
(3)并且这样做会违反开闭原则(OCP)
程序的设计要求开发对程序的扩展,要关闭对程序的修改
我们希望在不修改原函数的情况下,来对函数进行扩展
// An highlighted block
def fn():print('我是函数')
def fn2():print('函数开始修改')fn()
我们没扩展一个函数就要手动创建一个函数,实在太麻烦
为了解决这个问题,我们创建一个函数 让这个函数可以自动帮助我们生产函数
// An highlighted block
def begin_end(old)'''用来对其他函数进行扩展'''def new_function()result=old(*args,**kwargs)print('执行结束')return resultreturn new_functionf=begin_end(fn)
这种函数我们称为装饰器
在开发中我们都是通过装饰器来扩展函数
在定义函数时可以通过@装饰器来使用指定的装饰器,可以定义多个指定的装饰器,将会由内向外的执行
// An highlighted block
@fn
@begin_end
def fn():print('我是一个函数')
发布评论