上面那个程序hello()函数定义中,name是变元,“变元”是一个变量。
注意:
保存在变元中的值,在函数返回后就丢失了。例如前面的程序,如果你在 hello('Bob')之后添加 print(name),程序会报NameError,因为没有名为 name 的变量。在函数调用 hello('Bob')返回后,这个变量被销毁了,所以 print(name)会引用一个不存在的变量 name。
return 语句包含以下部分:
在很多时候,对于所有没有 return 语句的函数定义,Python 都会在末尾加上 return None。这类似于 while 或 for 循环隐
式地以 continue 语句结尾。而且,如果使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。
“关键字参数”是由函数调用时加在它们前面的关键字来识别的。关键字参数通常用于可选变元。print()函数有可选的变元 end 和 sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。
注意:
有 4 条法则,来区分一个变量是处于局部作用域还是全局作用域:
在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错
发生这个错误是因为,Python 看到 spam()函数中有针对 eggs 的赋值语句,因此认为 eggs 变量是局部变量。但是因为 print(eggs)的执行在 eggs 赋值之前,局部变量 eggs 并不存在。Python 不会退回到使用全局 eggs 变量。
下面的程序,它有一个“除数为零”的错误。
错误可以由 try 和 except 语句来处理。那些可能出错的语句被放在 try 子句中。如果错误发生,程序执行就转到接下来的 except 子句开始处。
print(spam(1))从未被执行是因为,一旦执行跳到 except 子句的代码,就不会回到try的子句中去。
函数是将代码逻辑分组的主要方式。因为函数中的变量存在于它们自己的局部作用域内,所以一个函数中的代码不能直接影响其他函数中变量的值。这限制了哪些代码才能改变变量的值,对于调试代码是很有帮助的。
函数是很好的工具,帮助你组织代码。你可以认为他们是黑盒。它们以参数的形式接收输入,以返回值的形式产生输出。它们内部的代码不会影响其他函数中的变量。
在前面几章中,一个错误就可能导致程序崩溃。在本章中,你学习了 try 和 except语句,它们在检测到错误时会运行代码。这让程序在面对常见错误时更有灵活性。
1.为什么在程序中加入函数会有好处?
答:函数减少了重复代码。这让程序更短,更容易阅读,更容易修改。
2.函数中的代码何时执行:在函数被定义时,还是在函数被调用时?
答:函数中的代码函数被调用时执行。
3.什么语句创建一个函数?
答:def语句
4.一个函数和一次函数调用有什么区别?
答: 函数是一个开头为def的语句,它包含函数名和函数体。如def guess()
而函数之后的guess()是一次函数调用,只有当代码执行到guess()时,才会调用函数def guess()下面的函数体。
5.Python 程序中有多少全局作用域?有多少局部作用域?
答:在调用一个函数时,创建了一个全局作用域和一个局部作用域。
6.当函数调用返回时,局部作用域中的变量发生了什么?
答:当函数调用返回时,局部作用域中的变量被销毁。
7.什么是返回值?返回值可以作为表达式的一部分吗?
答:返回值时函数调用求值的结果。像所有值一样,返回值可以作为表达式的一部分。
8.如果函数没有返回语句,对它调用的返回值是什么?
答:None
9.如何强制函数中的一个变量指的是全局变量?
答:global语句强制函数中的一个变量引用该全局变量。
10.None 的数据类型是什么?
答:
11.import areallyourpetsnamederic 语句做了什么?
答:导入(areallyourpetsnamederic)模块
12.如果在名为 spam 的模块中,有一个名为 bacon()的函数,在引入 spam 后,如何调用它?
答:spam.bacon()
13.如何防止程序在遇到错误时崩溃?
答: try
except
14.try 子句中发生了什么?except 子句中发生了什么?
答:如果try子句中的代码导致了一个错误,程序执行就立即转到except子句的代码。在运行那些代码之后,执行照常继续。
编写一个名为 collatz()的函数,它有一个名为 number 的参数。如果参数是偶数,那么 collatz()就打印出 number // 2,并返回该值。如果 number 是奇数,collatz()就打印并返回 3 * number + 1。然后编写一个程序,让用户输入一个整数,并不断对这个数调用 collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到 1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”)。
这个程序的输出看起来应该像这样:
Enter number:
3
10
5
16
8
4
2
1
在下的程序如下:
在前面的项目中添加 try 和 except 语句,检测用户是否输入了一个非整数的字符串。正常情况下,int()函数在传入一个非整数字符串时,会产生 ValueError 错误,比如 int('puppy')。在 except 子句中,向用户输出一条信息,告诉他们必须输入一个整数。