python中的偏函数和变量作用域

China☆狼群 提交于 2020-02-18 07:37:21

1.偏函数

当一个函数有大量的参数时,调用会变得非常麻烦,我们可以通过偏函数,固定一些参数,简化函数的调用。例如,

def addaddminus(num1, num2, num3, num4):
    return num1 + num2 + num3 - num4


print(addaddminus(1, 2, 3, 4))

执行结果如下,

2

这个addaddminus()函数包含有四个参数,下面我们使用偏函数将参数num1和参数num2固定为1和2,并重新计算。

import functools

addaddminus = functools.partial(addaddminus, 1, 2)
print(addaddminus(3, 4))

执行结果如下,

2

我们也可以固定参数num2和参数num3,如下,

import functools

addaddminus = functools.partial(addaddminus, num2=2, num3=3)
print(addaddminus(num1=1, num4=4))

注意,这时我们传参时需要通过关键字传参。

执行结果如下,

2

2.变量的作用域

程序中的变量并不是在任意的位置都可以随意访问,在哪⾥可以访问取决于这个变量的作⽤域,变量的作⽤域指的是变量在那段代码中可以使⽤,可以使⽤变量的那段代码就是变量的作⽤域。

2.1.变量作用域的分类

python中的作用域有内建作用域、全局作用域、闭包作用域和局部作用域。

a = max(1, 2)  # 变量a服从全局作用域,max()函数服从内建作用域


def outer(a):
    print(a)
    a = 9  # 闭包作用域:从定义开始到外部函数结束
    print(a)
    b = 90

    def inner():
        a = 20  # 局部作用域:从定义开始到本函数结束
        print(a)

    inner()

2.1.1.内建作用域

内建作⽤域,是指系统内建的函数或常量,在系统载⼊时加载,在所有模块中都可以直接引⽤。内建作用域的范围是在所有代码。内建作用域具有最大的作用范围。

我们最常见的内建作用域是系统函数。

2.1.2.全局作用域

全局作用域是所有函数定义外的变量作用域。全局作用域的范围是从定义开始到本文件结束。全局作用域的作用范围仅次于内建作用域。

我们在函数定义外定义的变量都是在全局变量范围生效。

2.1.3.闭包作用域

闭包的外部函数中定义的变量的作用域就是闭包作用域。闭包作用域的范围是从定义开始到外部函数结束。闭包作用域的作用范围仅次于全局作用域。

2.1.4.局部作用域

内部函数中定义的变量的作用域就是局部作用域。局部作用域的范围是从定义开始到本函数结束。局部作用域的作用范围最小。

2.2.变量作用域的查找规则

我们编写大段代码的过程中可能会出现全局变量和函数中的变量重名的情况,这时我们需要仔细分辨出每个变量的值,因此,我们需要牢记变量作用域的查找规则。

变量作用域的查找规则为:从下往上查找(从里往外),找离他最近的定义(不能往里找)。

2.3.global和nonlocal

通过我们之前的学习我们知道,一般来说我们无法在函数内部对全局变量进行修改。

但是,在一些特殊的情况下,我们需要通过函数对全局变量进行修改,这时我们需要用到global和nonlocal来将闭包变量或者局部变量声明为全局变量和闭包变量。例如,我们使用global将局部变量x声明为全局变量,

def globaldemo():
    global x  # 以下引用的都是全局变量x
    x += 10
    
x = 10
globaldemo()
print(x)

执行结果如下,

20

再例如,我们使用nonlocal将局部变量声明为闭包向量,

def nonlocaldemo():
    y = 9  # 闭包变量

    def inner():
        # 不能直接修改闭包变量
        nonlocal y  # 可以修改闭包变量
        y += 10

    inner()
    print(y)


nonlocaldemo()

执行结果如下,

19
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!