Python基础 第三章 函数
3.1 概念整理
3.1.1 def语句和参数:
在调用print()或 len()等函数时,会传入一些值放于括号中间,在此称为参数。也可以自行定义接收参数的函数。
def hello(name):
print('Hello + name')
hello('yang')
在此函数定义中,name为一个“变元”,即可以存放参数以及赋值。值得注意的是,保存在“变元”中的值,在函数返回以后就丢失了。(类似程序结束后,内部的变量会丢弃。)
3.1.2 返回值与Return语句:
若调用len()函数,并向它传入’Hello’这样的参数,函数调用求值为5。一般来说,函数调用求值的结果称为函数的“返回值”。
return语句包含以下部分:
1.return关键字;
2.函数应返回的值或表达式;
若return中使用了表达式,那么返回的值即为表达式求值的结果。
3.1.3 None值:
None是 NoneType 数据类型的唯一值,首字母必须大写。
由于print()函数没有返回值,是简单的输出函数,故print()返回None。
关键字参数和print()
关键字参数是由函数调用时加在它们前面的关键字来识别的,关键字参数通常用于可选变元。
3.1.4 局部和全局作用域
在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数以外赋值的变量,属于“全局作用域”。
一个函数被调用时,就创建了一个局部域,该函数返回值时,局部作用域就丢失了。
作用域注意点:
1.全局作用域中的代码不能使用任何局部变量;
2.局部作用域可以访问全局变量;
3.一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量。
4.如果在不同的作用域中,可以用相同的名字命名不同变量,即spam可作为局部变量和整体变量。
注意:
1.局部变量不能在全局作用域中使用;
2.局部作用域不能使用其他局部变量;
3.全局变量可在局部作用域中使用;
4.名称相同的局部变量和全局变量(示例)
def spam():
eggs = "spam local"
print(eggs)
def bacon():
eggs = "bacon local"
print(eggs)
spam()
print(eggs)
eggs = "global"
bacon()
print(eggs)
运行结果如下:
bacon local
spam local
bacon local
global
3.1.5 global语句
如果一个函数需要在全局对变量进行修改,那么就要使用global语句,例如global eggs,就是指eggs为全局变量。
若要区分一个变量是否为全局变量,有三条法则:
1.若变量在全局作用域中使用,那就是全局变量;
2.若有global语句,那就是全局变量;
3.若该变量用于函数中赋值语句,则为局部变量;
3.1.6 异常处理
对于一个函数,需要确定的即为输入值与输出值,错误可由try(可能出错的)与except函数(处理错误)进行处理。
def spam(divideBy):
try:
return 42/divideBy
except ZeroDivisionError:
print('Error:Invalid argument')
输出如下:
21.0
3.5
Error:Invalid argument
None
注:try语句中,所有发生的错误都会被捕捉,将spam放于语句块中:
def spam(divideBy):
return 42/divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error:Invalid argument.')
运行结果:
21.0
3.5
Error:Invalid argument.
其中print(spam(1))未被执行,是因为一旦执行跳到except子句的代码,就不会回到try语句,会继续照常向下执行。
3.2 习题
1、为什么在程序中加入函数会有好处?
答:函数减少了重复的代码。这让程序更短,更容易阅读,更容易修改。
2、函数中的代码何时执行: 在函数被定义时,还是在函数被调用时?
答:函数中的代码在函数被调用时执行,而不是在函数定义时。
3、什么语句创建一个函数?
答:def语句定义了(创建了)一个函数。
4、一个函数和一次函数调用有什么区别?
答:函数包含def语句和在def子句中的代码。函数调用让程序执行转到函数内,函数调用求值为该函数的返回值。
5、Python程序中有多少全局作用域?有多少局部作用域?
答:在调用一个函数时,创建了一个全局函数和一个局部作用域。
6、当函数调用返回时,局部作用域中的变量发生了什么?
答:函数返回时,局部作用域被销毁,其中所有的变量都被遗忘了。
7、什么是返回值?返回值可以作为表达式的一部分吗?
答:返回值时函数调用求值的结果。像所有值一样,返回值可以作为表达式的一部分。
8、如果函数没有返回语句,对它调用的返回值是什么?
答:如果函数没有return语句,它的返回值就是None。
9、如何强制函数中的一个变量指的是全局变量?
答:global语句强制函数中的一个变量引用该全局变量。
10、None的数据类型是什么?
答: None的数据类型是None Type。
11、import areallyourpetsnamederic语句做了什么?
答:import语句导入了areallyourpetsnamederic模块(顺便说一句,这不是一个真正的Python模块)。
12、如果在名为spam的模块中,有一个名为bacon()的函数,在引入span后,如何调用它?
答:该函数可以通过spam.bacon()调用。
13、如何防止程序在遇到错误时崩溃?
答:将可能导致错误的代码行放在一个try子句中。
14、try子句中发生了什么?except子句中发生了什么?
答:可能导致错误的代码放在try子句中。发生错误时,要执行的代码放在except子句中。