None值:
在Python 中有一个值称为None,它表示没有值。
在幕后,对于所有没有return 语句的函数定义,Python 都会在末尾加上return None。而且,如果使用不带值的return 语句(也就是只有return 关键字本身),那么就返回None。
关键字参数和print()
“关键字参数”是由函数调用时加在它们前面的关键字来识别的。关键字参数通常用于可选变元。例如,print()函数有可选的变元end 和sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。
比如print默认是以回车结束打印,但是可以设置end关键字参数,将它变成以另一个字符串结尾。
print('Hello', end='')
类似地,如果向print()传入多个字符串值,该函数就会自动用一个空格分隔它们。在交互式环境中输入以下代码:
>>> print('cats', 'dogs', 'mice')
cats dogs mice
但是你可以传入sep关键字参数,替换掉默认的分隔字符串。在交互式环境中输入以下代码:
>>> print('cats', 'dogs', 'mice', sep=',')
cats,dogs,mice
也可以在你编写的函数中添加关键字参数,但必须先在接下来的两章中学习列表和字典数据类型。现在只要知道,某些函数有可选的关键字参数,在函数调用时可以指定。
局部和全局作用域
在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能既是局部的又是全局的。
可以将“作用域”看成是变量的容器。当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个全局作用域,它是在程序开始时创建的。如果程序终止,全局作用域就被销毁,它的所有变量就被丢弃了。
全局变量可以在局部作用域中读取
请看以下程序:
def spam():
print(eggs)
eggs = 42
spam()
print(eggs)
对于名称相同的局部变量和全局变量,要想生活简单,就要避免局部变量与全局变量或其他局部变量同名。但在技术上,在Python 中让局部变量和全局变量同名是完全合法的。
global 语句
如果需要在一个函数内修改全局变量,就使用global 语句。如果在函数的顶部有global eggs 这样的代码,它就告诉Python,“在这个函数中,eggs 指的是全局变量,所以不要用这个名字创建一个局部变量。”
def spam():
? global eggs
? eggs = 'spam'
eggs = 'global'
spam()
print(eggs)
有4 条法则,来区分一个变量是处于局部作用域还是全局作用域:
1.如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
2.如果在一个函数中,有针对该变量的global 语句,它就是全局变量。
3.否则,如果该变量用于函数中的赋值语句,它就是局部变量。
4.但是,如果该变量没有用在赋值语句中,它就是全局变量。
在一个函数中,一个变量要么总是全局变量,要么总是局部变量。函数中的代码没有办法先使用名为eggs 的局部变量,稍后又在同一个函数中使用全局eggs 变量。
在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错。
def spam():
print(eggs) # ERROR!
? eggs = 'spam local'
? eggs = 'global'
spam()
运行前面的程序,会产生出错信息。
异常处理:
错误可以由try 和except 语句来处理。那些可能出错的语句被放在try 子句中。如果错误发生,程序执行就转到接下来的except 子句开始处。
可以将前面除数为零的代码放在一个try 子句中,让except 子句包含代码,来处理该错误发生时应该做的事。
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
阅读(129061) | 评论(0) | 转发(0) |