Python
声明与定义比较
在某些编程语言里,函数声明和函数定义区分开的,一个函数声明包括提供对函数,参数的名字(传统上还有参数的类型),但不必给出函数的任何代码,具体的代码通常属于函数定义的范畴。
在声明和定义有区别的语言中,往往是因为函数的定义可能和其声明放在不同的文件中python将这两者视为一体,函数的子句由声明的标题以及随后的定义体组成的。
前向引用
和其他高级语言类似,Python也不允许在函数未声明之前,对其进行引用或者调用。
我们下面给出几个例子来看一下:
def foo():
print("in foo()")
bar()
def bar():
print("in bar()")
foo()
猜测运行结果?
如果我们调用函数foo(),肯定会失败,因为函数bar()还没有声明:
>>>foo()
in foo()
Traceback(most recent call last):
File "<stdin>",line 1,in <module>
File "前后引用.py",line 3,in foo
bar()
NameError:name 'bar' is not defined
>>>
现在定义函数bar(),咋函数foo()前给出bar()的声明:
def bar():
print("in bar()")
def foo():
print("in foo()")
bar()
现在我们可以安全的调用foo(),而不会出现任何问题:
>>>foo()
in foo()
in bar()
事实上,我们甚至可以在函数bar()前定义函数foo():
def foo():
print("in foo()")
bar()
def bar():
print("in bar()")
Amazing!依然可以很好的运行,不会有前向引用的问题:
>>> foo()
in foo()
in bar()
>>>
这段代码是正确的因为即使(在 foo()中)对 bar()进行的调用出现在 bar()的定义之前,但 foo()本身不是在 bar()声明之前被调用的。换句话说,我们声明 foo(),然后再声明bar(),接着调用 foo(),但是到那时,bar()已经存在了,所以调用成功。
注意 ,foo()在没有错误的情况下成功输出了’in foo()’。名字错误是当访问没有初始化的标识符时才产生的异常 。
函数属性
你可以获得每个 python 模块,类,和函数中任意的名字空间。你可以在模块 foo 和 bar 里都有名为 x 的一个变量,,但是在将这两个模块导入你的程序后,仍然可以使用这两个变量。所以,即使在两个模块中使用了相同的变量名字,这也是安全的,因为句点属性标识对于两个模块意味了不同的命名空间,比如说,在这段代码中没有名字冲突:
import foo, bar
print(foo.x + bar.x)
函数属性是 python 另外一个使用了句点属性标识并拥有名字空间的领域。
def foo():
'foo()--properly created doc string'
def bar():
pass
bar._doc_='Oops,forgot the doc str above'
bar.version=0.1
上面的 foo()中,我们以常规地方式创建了我们的文档字串,比如, 在函数声明后第一个没有赋值的字串。当声明 bar()时, 我们什么都没做, 仅用了句点属性标识来增加文档字串以及其他属性。我们可以接着任意地访问属性。下面是一个使用了交互解释器的例子。(你可能已经发现,用内建函
数 help()显示会比用__doc__属性更漂亮,但是你可以选择你喜欢的方式)
>>> help(foo)
Help on function foo in module __main__:
foo()
foo() -- properly created doc string
>>> bar.version
0.1
>>> foo.__doc__
'foo() -- properly created doc string'
>>> bar.__doc__
'Oops, forgot the doc str above'
>>>
注意我们是如何在函数声明外定义一个文档字串。然而我们仍然可以就像平常一样,在运行时刻访问它。然而你不能在函数的声明中访问属性。换句话说,在函数声明中没有’self‘这样的东西让你可以进行诸如_dict_[‘version’] = 0.1 的赋值。这是因为函数体还没有被创建,但之后你有了函数对象,就可以按我们在上面描述的那样方法来访问它的字典。另外一个自由的名字空间!
内部/内嵌函数
在函数体内创建另一个函数(对象)是完全合法的,这种函数叫做内部/内嵌函数。
最明显的创造内部函数的方法是在外部函数的定义函数(用def关键字),如在:
def foo():
def bar():
print("bar() called.")
print("foo() called")
bar()
foo()
bar()
我们将以上代码置入一个模块中,如inner.py,然后运行,我们会得到如下输出:
foo().called
bar()called.
Traceback(most recent call last):
File"内嵌函数.py",line 8,in <module<