python基础知识——函数(下)

python基础知识——函数(下)


1. 高阶函数

*变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

# 接收函数作为参数,或者将别的函数作为返回值返回的函数就是高阶函数
def fun_1(i):
    if i%2 == 0:
        return True

def fun(n):
    list_1 = []
    for i in range(101):
        if n(i):
            list_1.append(i)
    return list_1

print(fun(fun_1))
  • 匿名函数
    匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。
  • lambda语法的定义如下:

lambda [arg1 [,arg2, … argN]] : expression

# 1.防止重名
# 2.不用再去定义函数,使用方便
# 3.可以作为一个传参的工具

#lambda 函数就是匿名函数
list_1 = [1,2,3,4,5,6,7,8]
#语法: lambda 参数:表达式
print((lambda a,b:a+b)(1,2))

#filter()有两个参数,第一个是过滤规则,第二个是过滤的数据
s = (lambda a:a % 2 == 0)
print(list(filter(s,list_1)))

2. 闭包

  • 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。
#   行成闭包的条件(三点缺一不可)
# • 函数嵌套
# • 将内部函数作为返回值返回
# • 内部函数必须要使用到外部函数的变量

#定义一个外部函数
def fun(num):
    #定义一个内部函数
    def fun_1(n):
        res = num + n
        # print(res)
        return res
    return fun_1
# 函数的调用等于函数的返回值
f = fun(1)   #fun(1) = fun_1 = f
#内部函数的调用
print(f(2))   #fun(1)(2) = fun_1(2) = f(2)
print(f(3))
  • 闭包的好处
#• 通过闭包可以创建一些只有当前函数能访问的变量
#• 可以将一些私有数据藏到闭包中
#保证被内部使用的外部变量不被销毁
#定义一个外部函数
def fun(num):
    #定义一个内部函数
    def fun_1(n):
        # global num   无意义
        nonlocal num   #使num为局部变量
        num = 10
        res = num + n
        # print(res)
        return res
    # print(num)
    fun_1(1)
    # print(num)
    return fun_1
# 函数的调用等于函数的返回值
f = fun(1)   #fun(1) = fun_1 = f

3. 装饰器

  • 在编程时,为了实现同样的功能,需要更改代码来实现。如果大量的修改代码,不仅增加了工作量,还不方便后期维护,更加不符合ocp规则(o:open 开放对代码的拓展,c :close 关闭对代码的修改),装饰器就是为了解决这写问题被引入的。
def fun(a,b)
    print('函数开始')
    print('函数结束')
	return a+b

def fun1(a,b):
	return a*b

'''
如果fun函数要实现fun1函数同样的输出效果,可以直接复制print进行粘贴就行,\
但是这样就出现了代码的冗余、增加工作量等情况,那是否有办法不用复制就直接那过来用呢?
'''
#例子一:
def fun(fn):
	print('函数开始')
	fn()
    print('函数结束')
def fun1():
	print('函数运行')
fun(fun1)
#例子二
def fun(fn,a,b):
    print('函数开始')
    res = fn(a,b)
    print(res)
    print('函数结束')
def add(a,b):
    return a+b
fun(add,1,2)
#例子三
'''
但是这样还是不行,因为每次还得修改参数,可以使用不定长参数进行传参
'''
def fun(fn,*args):
    print('函数开始')
    res = fn(*args)
    print(res)
    print('函数结束')
def add(a,b):
    return a+b
fun(add,1,2)

4. 装饰器的使用

  • 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
  • 在开发中,我们都是通过装饰器来扩展函数的功能的
#装饰器是一个特殊的闭包函数

#装饰器
def ch(fn):                        #定义外层函数
    def new_ch(*args,**kwargs):                #定义一个内层函数,使用不定长参数进行传参
        print('函数开始')
        fn(*args,**kwargs)                           #调用内层函数
        print('函数结束')

    return new_ch              #返回内层函数名

@ch   #@ch=ch(fun),装饰器的语法糖写法  ,必须紧贴需要用到装饰器的函数,即@ch必须在def fun():这个函数前
#函数
def fun():                       #定义一个函数
    print('我是fun函数')
    #return '我是fun函数'

#函数调用方法一:通过装饰器的语法糖写法
fun()

#函数调用方法二:
# r = ch(fun)      #此处是将函数名fun作为实参传递给fn,即fn = fun  ,ch(fn) = new_ch = ch(fun) ,\
#                  # 内层函数调用ch(fn)() = new_ch() = ch(fun)()
# r()

# 总结 本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python独角兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值