第44课 变量的作用域
依次单击菜单栏Run→Run Module选项来运行程序,程序运行结果如下:
最大值是
:96
函数的功能是找出nums中的最大值并返回。
①创建一个变量maxNum,初始值为0。
②通过for num in nums遍历里面的数字。
③如果num>maxNum,将num赋值给maxNum,这样就保证了maxNum的值是最大的。
④遍历结束后,将maxNum作为返回值。
在主程序中通过maxNum=max([34,32,45,67,23,84,32,96,13,94,44])调用max函数,将列表参数[34,32,45,67,23,84,32,96,13,94,44]传入函数,将函数返回的最大值赋给主程序的maxNum。此时主程序的maxNum就是这串数字的最大值了。
注意
这里函数max()中的maxNum和主程序中的maxNum可不是同一个maxNum。
在求最大值的函数中,变量maxNum就是最大值,那么在主程序中为什么不直接输出函数中的maxNum,而是要在主程序中再创建一个maxNum呢?

遇到疑惑,我们尝试直接输出maxNum:

依次单击菜单栏Run→Run Module选项来运行程序,程序运行结果报错了:
NameError:name'maxNum'is not defined
意思是名称maxNum没有被定义,程序找不到maxNum。
在主程序中将maxNum直接打印出来,但是程序却提示我们变量maxNum没有定义。这就很奇怪了,函数中明明定义了maxNum。
为什么会给出这样的提示呢?

一起来学习变量的两种作用域:局部变量和全局变量。
局部变量
在求最大值的函数中,第一个maxNum称为局部变量,它的作用域是函数内部,出了函数就没人认识它了。所以我们在主程序中使用它会报错。
全局变量
全局变量在主程序中定义,不仅可以在主程序中访问它,在函数中也可以访问它。我们来尝试一下。

程序运行结果如下:
我是主程序中定义的变量
乘法的结果为:
在程序中,tip是在主程序中定义的全局变量,并且tip指向了“我是主程序中定义的变量”。
我们在函数中并没有定义tip变量,但是可以在函数中使用变量,打印tip变量指向的对象内容。
同时,我们可以在函数中修改tip的值。
同名的局部变量和全局变量

程序运行结果如下:
在函数中修改值
乘法的结果为
:
我是主程序中定义的变量
在主程序中定义了全局tip变量,并且将变量指向了”我是主程序中定义的变量”,全局变量能够在函数中访问到。
在函数中看上去是修改全局变量tip的值,将tip重新指向“在函数中修改值”,在函数中打印tip的值,因而打印出了“在函数中修改值”。
在主程序中打印tip的值,依然打印出了在主程序中定义的值“我是主函数中定义的变量”。这是为什么呢?

这是因为我们在函数内创建tip的时候,不是修改了主程序的全局变量tip,而是重新创建一个局部变量tip。它们是完全不同的变量,只是看上去名字一样而已。
强制为全局变量
在函数中,修改全局变量tip指向的值,Python就会重新创建一个局部变量,而没有使用全局变量。如果我们就是要在函数中修改全局变量的值,要怎么办呢?
我们可以使用Python中的global关键字来实现。


程序运行结果如下:
在函数中修改值
乘法的结果为
:
在函数中修改值
程序中使用global关键字将tip强制为全局变量,所以在函数中修改全局变量tip,Python没有重新创建一个局部变量,而是修改了主程序中定义的全局变量。
函数能量回收
学习内容总结:
(1)通过函数名字参数语法创建自定义的函数。
def(…)
(2)通过函数名参数调用函数。
(3)调用有一个或多个参数的函数。
(4)函数通过return返回返回值。
(5)变量作用域(局部变量和全局变量)。
函数能量小挑战
(1)定义一个函数来向家人传达节日祝福。
(2)在上一个函数的基础上,加入一个参数,可以通过参数控制向不同家庭成员传达祝福。
(3)在上一个函数的基础上,再加入一个参数,可以通过参数控制向不同家庭成员传达不同节日的祝福。
(4)再定义一个函数,通过关键字参数的形式接收各门课程期末考试的成绩,并计算总分。
(5)班上有3位同学,分别是“奇奇果”“美美果”“聪聪果”。老师要统计班上同学的家庭联系电话、家庭住址,你编写一个函数帮老师统计吧。函数的参数个数可以自己定义,返回值可以决定是否需要。
(6)指出以下代码中哪些是局部变量,哪些是全局变量。

第8章 类与对象的奥秘

我们学习了如何使用数据结构来组织数据,如何用函数来组织程序代码。本章我们要学习中的类和对象,这是一种核心思想!
Python