python基础之函数进阶

Posted 杜杜精灵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础之函数进阶相关的知识,希望对你有一定的参考价值。

假如有一个函数,实现返回两个数中的较大值:

def my_max(x,y):
    m = x if x>y else y
    return m
bigger = my_max(10,20)
print(bigger)

之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行?

来看结果:

技术分享图片
>>> def my_max(x,y):
...     m = x if x>y else y
... 
>>> my_max(10,20)
>>> print(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name ‘m‘ is not defined
技术分享图片

报错了!错误是“name ‘m‘ is not defined”。变量m没有被定义。。。为啥?我明明定义了呀!

在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。

从python解释器开始执行之后,就在内存中开辟了一个空间

每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。

但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间

代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

命名空间和作用域

在python之禅中提到过:命名空间是一种绝妙的理念,让我们尽情的使用发挥吧!

 

命名空间一共分为三种:

  全局命名空间

  局部命名空间

  内置命名空间

*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

三种命名空间之间的加载与取值顺序:

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

 

在局部使用变量取值情况

x = 1
def f(x):
    print(x)

print(10)

在全局调用:全局命名空间->内置命名空间

在全局引用变量x
x = 1
def f(x):
    print(x)

f(10)
print(x)

在全局引用内置max
print(max)

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

globals和locals方法

在全局调用globals和locals

print(globals())
print(locals())

在局部调用globals和locals
def func():
    a = 12
    b = 20
    print(locals())
    print(globals())

func()

global关键字
a = 10
def func():
    global a
    a = 20

print(a)
func()
print(a)

函数的嵌套和作用域链

  函数的嵌套调用

技术分享图片
技术分享图片
def max2(x,y):
    m  = x if x>y else y
    return m

def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3

# max4(23,-7,31,11)
技术分享图片

  函数的嵌套定义

技术分享图片
技术分享图片
def f1():
    print("in f1")
    def f2():
        print("in f2")

    f2()
f1()
技术分享图片
技术分享图片
技术分享图片
def f1():
    def f2():
        def f3():
            print("in f3")
        print("in f2")
        f3()
    print("in f1")
    f2()
    
f1()
技术分享图片
 
 

 



















以上是关于python基础之函数进阶的主要内容,如果未能解决你的问题,请参考以下文章

python基础之函数进阶

python基础之函数进阶

1Python进阶强化训练之装饰器使用技巧进阶

Python基础之变量进阶

Python基础之面向对象进阶

python基础详解