python编程入门十二:函数进阶

第十二章:函数进阶

关于python的函数,我想分两章来完成,原因就是不管是哪门语言,函数都是一个内容相当多的一个机制;上一章我们讲了函数的创建调用各类参数返回值,那本章我们再讲一下难度相对进阶的关于函数的知识。

12.1函数变量的作用域

在讲函数变量作用域时我们需要借助两种变量—局部变量全局变量的对比来进行学习,在几乎所有编程语言中都有局部变量(Local Variable)和全局变量(Global Veritable)的概念;我们先借助一段代码来区分一下哪些是局部变量?哪些是全局变量
以下为实现加法功能的函数及代码:

def sum(num1,num2):
    sum_num = num1 + num2
    return  sum_num
    
a = int(input("请输入第一个数字:"))
b = int(input("请输入第二个数字:"))
c = sum(a,b)
print("加法结果为:",c)

结果:

请输入第一个数字:3
请输入第二个数字:4
加法结果为: 7

我们分析以上代码,可以找到,整个代码中:num1、num2以及sum_num是这个代码中的局部变量而其余的a、b、c为代码中的全局变量,那这两种变量之间有什么区别呢?在代码中两种变量的位置我们可以发现区别之一:局部变量只定义在函数体之内,而全局变量则定义在函数之外。

另外一个区别则是:我们可以在函数中访问定义在函数之外的全局变量,但是在函数之外无法访问到定义在函数中的局部变量,如果这句话没有理解,那我们再看下面的代码来进行分析:

def sum(num1,num2):
    print(a)
    print(b)
    sum_num = num1 + num2
    return  sum_num
    
a = int(input("请输入第一个数字:"))
b = int(input("请输入第二个数字:"))
c = sum(a,b)
print("加法结果为:",c)

结果:

请输入第一个数字:3
请输入第二个数字:4
3
4
加法结果为: 7

同样是求和的函数,我们在函数体内通过print来输出定义在函数体之外的“a”和“b”,可以看到结果,这样是可行的,确实输出了我们键入的3和4,然后输出了加法后的结果,这可以表明:全局变量可以在函数体内进行访问,那接下来我们再通过另外一块代码来分析能否实现在函数体外调用定义在函数内的局部变量:

def sum(num1,num2):
    sum_num = num1 + num2
    return  sum_num
    
a = int(input("请输入第一个数字:"))
b = int(input("请输入第二个数字:"))
c = sum(a,b)
print("加法结果为:",c)
print(num1)

结果:

Traceback (most recent call last):
  File "/Users/lihongbo/Documents/Python Program/python_work/test2.py", line 10, in <module>
    print(num1)
NameError: name 'num1' is not defined

我们发现程序中出现了报错,“name ‘num1’ is not defined”,意思是“名称为‘name1’的变量并没有被定义”,这也就表明,作为一个局部变量,是不能够在函数外进行访问的。

既然以及证实我们无法在函数外访问局部变量,那也可以理解我们无法在函数外对局部变量进行更改;那此时我们不妨产生了一个疑问:能否实现在函数内对函数外的全局变量进行更改呢?我们再分析一下下面的代码:

def sum(num1,num2):
    a = 5
    print(a)
    sum_num = num1 + num2
    return  sum_num
    
a = int(input("请输入第一个数字:"))
b = int(input("请输入第二个数字:"))
c = sum(a,b)
print("加法结果为:",c)
print(a)

结果:

请输入第一个数字:3
请输入第二个数字:4
5
加法结果为: 7
3

结果可能会让我们产生疑问,我们能看出来,我们在函数内对“a”进行了更改以及输出,当我们给a通过输入赋值3后,确实在函数内使用print可以输出一个5,但是我们最终在函数外又一次对“a”进行输出发现,它依旧是3,这是什么原因呢?其实,在函数内对全局变量进行更改的行为我们是强烈不建议的,因为当我们在函数内对“a”进行所谓更改的过程其实是又在函数内定义了一个同名的局部变量,这样并不会起到修改全局变量的目的,所以一定一定要避免这种操作方式。

那如果我坚持要有一个可以在函数内修改全局变量的功能,这样可以实现吗?其实是可以的,我们看接下来的一个知识点。

12.2 global关键字

我们通过global关键字将上述程序进行修改:

def sum(num1,num2):
    global a
    a = 5
    print(a)
    sum_num = num1 + num2
    return  sum_num

a = int(input("请输入第一个数字:"))
b = int(input("请输入第二个数字:"))
c = sum(a,b)
print("加法结果为:",c)
print(a)

结果:

请输入第一个数字:3
请输入第二个数字:4
5
加法结果为: 7
5

变化很明显,我们在函数内使用global重新定义了a,从而使得在函数内对变量a进行修改,也影响到了函数之外的a,所以在函数内通过global来定义全局变量是可以解决我们上述问题的。

12.3 内嵌函数

回忆我们之前学过的列表,我们清楚列表的元素可以也是一个列表,也可以理解为列表的嵌套,那作为一个功能强大的函数,它也是可以实现嵌套的,这种函数叫做内嵌函数,我们下面举例说明:

def out_func():
    print("当前处于外层函数")
    def in_func():
        print("当前处于内层函数")

out_func()

结果:

当前处于外层函数

如上述代码,我们在out_func()函数的内部定一个一个名为in_func的函数,这个函数就是out_func()的内嵌函数,当我们在函数外调用out_func()函数时,发现结果只输出了外层函数体中的内容“当前处于外层函数”,但并没有输出内层函数中的内容,那我们再分析下面的代码,直接调用内层函数会得到怎样的结果。

def out_func():
    print("当前处于外层函数")
    def in_func():
        print("当前处于内层函数")

in_func()

结果:

Traceback (most recent call last):
  File "test2.py", line 8, in <module>
    in_func()
NameError: name 'in_func' is not defined

当我们运行程序后发现报出如下错误:“名为‘in_func’的函数并未定义”,这个问题就出现在,我们在函数内定义的内嵌函数,是无法在函数体外进行调用的,内嵌函数只能在外层函数体中进行使用,所以我们把代码稍作修改:

def out_func():
    print("当前处于外层函数")
    def in_func():
        print("当前处于内层函数")
    in_func()

out_func()

结果:

当前处于外层函数
当前处于内层函数

修改后的区别就在于,我们在out_func函数内直接调用了定义好的内嵌函数,然后在外层在对out_func进行调用时,外层函数同时也会调用内嵌函数in_func;所以关于内嵌函数,我们当前只需要掌握–内嵌函数只能在相邻外层函数体内进行调用。

关于python中函数的相关知识我们先讲这么两个章节,如果之后的编写中想起来有用的知识还会再稍作补充,掌握这些知识是已经足够入门python编程了,后面的困难还有很多,可谓任重而道远!

匿名

发表评论

匿名网友