为了说明观点,我们将会创建一个嵌入式函数,这个函数将会被定义在一个封闭的函数中,并被其调用,步骤如下。

(1)nested_functions.py包括一个嵌入式函数,并且以调用这个函数结尾。

>>> def first_funct():
...     x = 1
...     print(x)
...     def second_funct():
...          x = 2
...          print(x)
...     second_funct()
...

(2)调用父函数,并检查结果。

>>> first_funct()
1
2

(3)直接调用嵌入式函数,我们会收到一个错误。

>>> second_funct()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'second_funct' is not defined

(4)为了和另一个模块兼容,我们导入需要的模块。

>>> import math

(5)我们以这样的形式调用模块(module)中的sin()函数。

>>> math.sin(45)
0.8509035245341184

(6)尝试用下面的方式调用函数,不使用“.”来表明它所属的库会导致以下的错误。

>>> sin(45)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined

(7)以下的例子表明可以用“*”来代替函数所在的位置,来从一个模块中导入所有的函数。

>>> from math import *
>>> sin(45)
0.8509035245341184

(8)将模块作为脚本运行的一种常见方法是直接从命令行显式调用模块,并在必要时提供所需参数。这可以通过配置模块接受命令行参数来设置,如下所示。

def print_funct(arg):
     print(arg)
     if __name__ == "__main__":
          import sys
          print_funct(sys.argv[1])

(9)print_mult_args.py表明,如果超过一个参数需要被引用,并且值是已知的,则可以使用参数列表中各自的索引值指定每个参数。

def print_funct(arg1, arg2, arg3):
     print(arg1, arg2, arg3)
if __name__ == "__main__":
     import sys
     print_funct(sys.argv[1], sys.argv[2], sys.argv[3])

(10)如果函数可以捕获多个参数,但数量未知,则可以使用*args参数,如下所示。

>>> def print_input(*args):
...    for val, input in enumerate(args):
...         print("{}. {}".format(val, input))
...
>>> print_input("spam", "spam", "eggs", "spam")
0.spam
1.spam
2.eggs
3.spam