再说函数1

2018-08-26  本文已影响0人  言烬

函数的引用赋值和参数操作

python中的函数操作,本身也就是一个对象,常规定义语法的函数就是将一个函数对象的引用地址赋值给函数名称的变量,通过函数名称的变量调用执行函数

如果函数是对象,那么函数也可以和对象一样可以被引用赋值

#函数的引用赋值
def show():
    print("函数执行了")

#将函数的地址赋值给一个变量
a = show
#通过调用这个变量也可以执行函数
a()

输出结果:

图1.png

同样,函数也可以被当成参数传递给其他函数执行

#函数的传值操作,策略模式
def show(message):
    message()

def show_msg():
    print("函数1执行了")

def show_msg2():
    print("函数2执行了")

#调用执行参数show
show(show_msg)
show(show_msg2)

输出结果:

图2.png

装饰器函数:

软件开发原则中,有一项OCP原则((open close principle:开闭原则)

OCP原则((open close principle:开闭原则):对软件功能的扩展开放,对软件原来代码的修改关闭。

既然如此,如何在函数中添加功能但是又不修改函数的代码呢?

python提供了一种新的处理方式,可以更加友好的在符合OCP原则的情况下扩展函数的操作功能,称为装饰器函数

例如:

原函数如下,客户要求在每段函数开始和结束时添加提示语句:

  def record_info():
       print("模拟,记录用户信息")

  def show_info():
      print("模拟,展示用户信息")

#调用记录用户信息
record_info()
#调用展示用户信息

show_info()按客户需求在遵守OCP原则的情况下修改代码如下:

#定义一个装饰器函数
def decorators(fn):
    def wrapper(*args, **kwargs):
        print("函数准备执行")
        result = fn(*args, **kwargs)
        print("函数执行结束")
        return result
    return wrapper

@decorators
def record_info():
   print("模拟,记录用户信息")

@decorators
def show_info():
    print("模拟,展示用户信息")

#调用记录用户信息
record_info()
#调用展示用户信息

show_info()输出结果:

图3.png

装饰器函数执行过程:

图4.png

函数扩展内容:

1、偏函数:

引入模块 from functools import partial

通过偏函数模块可以给当前函数赋值定义一个特殊的访问函数,特殊的访问函数可以给原来的函数增加一个默认值

示例:

 引入函数工具模块中的偏函数扩展
from functools import partial

# 定义普通函数
def calculation(num1, num2, opra):
    res = None
    if opra == "+":
        res = num1 + num2
    elif opra == "-":
        res = num1 - num2
    elif opra == "*":
        res = num1 * num2
    elif opra == "/":
        res = num1 / num2
    return res

# 普通函数的调用
result = calculation(12, 10, "+")
print(result)

# 通过偏函数进行处理,添加默认操作方式
calculation2 = partial(calculation, opra="+")
result = calculation2(22, 24)
print(r输出结果:
图5.png

但是偏函数的操作,在一定程度上来说只是一个语法糖,因为python中对于函数参数的处理已经有默认值的操作,完全可以代替偏函数的复杂操作。

2、闭包函数:

因为函数的出现,变量出现了分化:全局变量,局部变量

全局变量:在声明开始的任意地方都可以访问

局部变量:在当前函数中可以操作

但在有些情况下,我们需要在函数外部直接操作函数中的数据,怎么进行操作呢:

1、将函数中的数据通过返回值进行返回

2、通过闭包函数进行操作

返回值的操作方式比较固定单一,能作为简单数据处理的手段

但更加灵活的操作方式就是闭包函数

所谓闭包函数:就是在函数中声明另一个变量

修饰器函数就是一个闭包函数

例如:

# 闭包函数
def outer():
    print("外部函数")

    def inner():
        print("内部函数:闭包函数")

    return inner


# 调用执行outer()函数时,得到一个函数对象的返回值
x = outer()
# 该返回值是一个函数,所以也可以执行
x()输出结果:
图6.png

3、匿名函数:

匿名函数,又称lambda表达式:通过一个表达式实现函数功能。主要作用是简化函数操作,将简单的处理逻辑封装在一个表达式中,而省去了定义函数的复杂的操作方式

主要起到简单处理函数的功能,所以 lambda 表达式才在很多地方被称为匿名函数

基本语法结构:

lambda 参数列表:运算表达式

lambda关键字

参数列表:用于给表达式传递数据

表达式语句:计算表达式,计算结果会自动输出

使用注意事项:

主要用于替代功能简单的函数,提高代码的简洁性

但是不要滥用,大量使用会造成代码可读性严重下降

示例:

# 匿名函数:lambda表达式
fn = lambda x, y: x + y


# 等价于
def fn2(x, y):
    return x + y


print(fn(1, 2))
print(fn2(1, 2))

输出结果:

图7.png

如有错误,敬请指出

上一篇 下一篇

猜你喜欢

热点阅读