基础篇_010_函数_前向引用

先来看这样一段代码 ===》

# 1. 正常的定义和调用函数的顺序
#    --先定义one(),再在two()中调用one()
def one():
    print("from one")

def two():
    print("from two")
    one()

two()   # 调用two():没有报错
# from two
# from one

显然可以正常运行,都说了这是正常的顺序。那再来看看这一段代码↓ ===》

# 2. 非正常顺序之"先在two()中调用one(),再定义one()"
def two():
    print("from two")
    one()

def one():
    print("from one")

two()   # 调用two():没有报错
# from two
# from one

卧槽,也可以运行,什么情况?!命名在two()的前面没有one()的定义啊!——你肯定是这样想的(我可没有在你家装摄像头[滑稽])

(C++代码混入其中,在C、C++中函数在定义前调用必须加上"前向引用声明",因为函数是以二进制代码的形式存在内存中的)
#include <iostream> using namespace std; void foo2(); // 前向引用声明 void foo1() { cout << "foo1()" << endl; foo2(); //在调用前必须有声明 } void foo2() { cout << "foo2()" << endl; } int main() { foo1(); return 0; }

别慌张,我们再来看下面一段代码 ===》

def two():
    print("from two")
    one()

two()   # 调用two():报错 ===》name 'one' is not defined
# 名为"one"的函数没有被定义

def one():
    print("from one")

what the fuck,这咋又报错了?!不就把two()函数的调用提前到one()函数定义之前了嘛,怎么就报错了呢?此事必有蹊跷,simba芳你怎么康?——此时你的内心应该是几近崩溃,或者说已经被绕晕了,但是不用怕,根据"lhf"先生的"风湿理论"即可治疗此头晕目眩的顽症。

 

----风湿理论:函数即变量

  1. "风湿理论"的根基:定义先后没有区别,只要在调用之前有声明就行 ===》

# 1. "风湿理论"的根基: 首先定义"name"还是"age"都能正常输出
name = "simba"
age = 19

print(name) # 输出:simba
print(age)  # 输出:19
# 因为程序在执行print(name)和print(age)的时候
# 已经完成了在内存中分配空间给"name"和"age"的事

  2. "函数即变量"的解释:内存中存放函数和存放变量是几乎一样的,Python会将函数体(代码块)作为整个字符串给存起来(其他语言,eg:C、C++就是将程序代码块转换为二进制代码,所以必须要前向引用声明),然后把函数名作为自己的引用。所以在函数定义的时候不管些什么都能编译过,但是在执行的时候就不一定了。===》

--(1). 执行能通过 ===》上面的第二个例子:

  step1:程序自顶向下的逐行编译,遇到def two()后将two()的函数体作为整个字符串存入内存,将地址给two,此时函数中虽然调用了未知函数one(),但是由于在内存中它仅仅是一行字符串,所以不会报错;

  step2:遇到def one(),将one()的函数体作为整个字符串存入内存,将地址给one。

  step3:此时内存中有了两个"变量":"one"和"two"。

  step4:调用two()函数,Python在内存中找two,诶,找到了,执行叭...遇到需要调用one()函数,那就再在内存中找,嘿嘿,有一个one,执行...然后结束进程。

--(2). 执行不能通过 ===》上面的第三个例子:

  step1:程序自顶向下的逐行编译,遇到def two()后将two()的函数体作为整个字符串存入内存,将地址给two,此时函数中虽然调用了未知函数one(),但是由于在内存中它仅仅是一行字符串,所以不会报错;

  step2:遇到要调用two()函数,于是在内存中寻找,发现有two,然后执行...突然发现需要调用one()函数,去内存中找呗,但是Python将内存遍历一遍后发现根本就不存在one,所以懵了,抛出异常:没有找到"one"这个函数的定义!

 

  

 

posted @ 2020-02-13 16:47  BNTU  阅读(210)  评论(0)    收藏  举报