【发布时间】:2016-01-03 11:13:54
【问题描述】:
我现在正在同时阅读和学习 Python 和 C。 (不要问我为什么,这很有趣!:-)) 我使用 Mark Lutz 的“Learning Python”。以下是他写的关于 Python 函数的内容:
与 C 等编译语言不同,Python 函数不需要 在程序运行之前完全定义。更一般地说,defs 是 直到它们到达并运行后才被评估,并且 defs 中的代码 在以后调用函数之前不会计算。
我不太明白,因为在我的第二本书中,K.N.King 说您可以先声明一个函数,然后再创建一个定义。
英语不是我的母语,所以我在这里缺少什么?
我只能猜测,它与程序运行时有某种关系。在 C 中,编译器运行程序并找到函数声明。即使没有定义,编译器也会继续查找函数定义。 C 中的函数声明有助于避免函数返回类型的问题(因为它默认为 int)。另一方面,在 Python 函数中,直到在运行时到达它才会被评估。并且当它到达时,它不会评估函数的主体,直到有函数调用。但是这个猜测并不能解释上面的引用。
那么卢茨先生在说什么?我有点糊涂了……
【问题讨论】:
-
python也编译好了...
-
“defs 在到达并运行之前不会被评估”对我来说意味着(也在学习 Python :-),你甚至可以在函数体中出错,但直到执行没有达到调用该函数,错误未被注意到
-
@rolika,取决于错误。语法错误会在程序开始执行之前导致崩溃。其他错误将等到您到达问题行。
-
@ShadowRanger 在开发新程序时,没有人应该接受垃圾编译器。尤其是初学者学习当前的 C 标准而不是它的某个古老版本是非常重要的。例如,我不明白为什么人们接受 gcc 默认情况下“将您的程序编译为某种 GNU 垃圾”,而不是默认设置为“根据标准 C 编译您的程序”。
-
@Lundin:嘿,你正在向合唱团宣讲编写现代代码。可悲的是,在处理遗留代码时,你不会成为一个纯粹主义者,所以你需要知道这些怪癖。如果你的百万行应用程序是在假设非严格编译的情况下编写的,它可能会编译失败,并有 10,000 个警告(诚然,其中几千个可能指出真正的问题,其余的可能使它不可移植)如果你打开
-std=c11 -pedantic -Wall -Wextra -Werrors,并坚持停止工作直到代码库干净是不可能的。